package com.engine.bjcj220907.service.impl; import com.engine.bjcj220907.dao.MonthBonusDAO; import com.engine.bjcj220907.dao.OverseasAllowanceDAO; import com.engine.bjcj220907.entity.JWJT; import com.engine.bjcj220907.entity.JwCZInfo; import com.engine.bjcj220907.entity.JwCZInfoDetail; import com.engine.bjcj220907.service.OverseasAllowanceCountService; import com.engine.bjcj220907.utils.BjcjCommonUtils; import weaver.general.BaseBean; import java.util.ArrayList; import java.util.Calendar; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * @author Harryxzy * @date 2022/09/26 14:03 * @description 境外津贴 */ public class OverseasAllowanceCountServiceImpl implements OverseasAllowanceCountService { BaseBean baseBean = new BaseBean(); public MonthBonusDAO getMonthBonusDAO(){ return new MonthBonusDAO(); } public OverseasAllowanceDAO getOverseasAllowanceDAO(){ return new OverseasAllowanceDAO(); } /** * @description 计算境外津贴 * @return void * @author Harryxzy * @date 2022/9/26 14:06 */ @Override public void countOverseasAllowance(Calendar countCal) { // 境外津贴包含:境外津贴(天标准)+境外工龄补贴(月标准)+艰苦地区补贴(天标准) // 获取境外津贴(天标准) --计算当月应常驻天数 // 获取所有人的境外常驻信息 List czInfos = getMonthBonusDAO().getCZInfo(); baseBean.writeLog("获取所有人的境外常驻信息,共:"+czInfos.size()); // 将境外常驻信息格式化 List jwCZInfos = MonthBonusCountServiceImpl.formatJwCZInfo(czInfos); baseBean.writeLog("将境外常驻信息格式化"); // 考勤开始日期 Calendar startAttendanceCal = BjcjCommonUtils.getStartAttendanceCal(countCal.getTime()); // 考勤结束日期 Calendar endAttendanceCal = BjcjCommonUtils.getEndAttendanceCal(countCal.getTime()); baseBean.writeLog("将境外常驻信息格式化"); // 如果用户在考勤周期内存在境外常驻信息则过滤出来,并且计算当月应常驻天数 List results = getCZInfosAndCZDays(jwCZInfos, startAttendanceCal, endAttendanceCal); baseBean.writeLog("如果用户在考勤周期内存在境外常驻信息则过滤出来,并且计算当月应常驻天数:"+results.size()); // 计算考勤所属月员工的薪酬等级 List users = results.stream().map(i -> i.getUser()).collect(Collectors.toList()); Map usersXSDJ = getOverseasAllowanceDAO().getXCDJByUsers(users,endAttendanceCal); } /** * @description 获取用户在考勤周期内存在境外常驻信息过滤出来,并且计算当月应常驻天数 * @return List * @author Harryxzy * @date 2022/9/26 16:29 */ public List getCZInfosAndCZDays(List jwCZInfos,Calendar startAttendanceCal,Calendar endAttendanceCal){ ArrayList results = new ArrayList<>(); jwCZInfos.stream().filter(czInfo -> { List czDetails = czInfo.getInfos(); // 用于存储计算到哪一天的日期 Calendar c = Calendar.getInstance(); c.setTime(endAttendanceCal.getTime()); Calendar[] countDay = {c}; int[] ycq = {0}; boolean[] flag = {false}; for (int i = 0; i < czDetails.size(); i++) { JwCZInfoDetail detail = czDetails.get(i); if (detail.getLx() == 0 && (detail.getJwczksrq().before(endAttendanceCal.getTime()) || detail.getJwczksrq().equals(endAttendanceCal.getTime()))) { // 涉及考勤周期内的开始常驻 if (detail.getJwczksrq().after(startAttendanceCal.getTime())) { // 开始常驻日期在 考勤开始日期后,结束日期前 int days = BjcjCommonUtils.getDays(detail.getJwczksrq(), endAttendanceCal.getTime()); ycq[0] += days; countDay[0].setTime(detail.getJwczksrq()); countDay[0].add(Calendar.DATE, -1); flag[0] = true; } else { // 开始常驻日期在 考勤开始日期前(应出勤日期为自然日) int days = BjcjCommonUtils.getDays(startAttendanceCal.getTime(), endAttendanceCal.getTime()); czInfo.setYczDays(days); JWJT build = JWJT.builder().user(czInfo.getXm()).ycq(days).build(); results.add(build); return true; } } if (detail.getLx() == 1 && ((detail.getJwczksrq().before(endAttendanceCal.getTime()) || detail.getJwczksrq().equals(endAttendanceCal.getTime())) && (detail.getJwczjsrq().after(startAttendanceCal.getTime()) || detail.getJwczjsrq().equals(startAttendanceCal.getTime())))) { // 涉及考勤周期内的结束常驻 // 修正境外常驻开始日期 Calendar countStartCal = Calendar.getInstance(); countStartCal.setTime(detail.getJwczksrq()); if (detail.getJwczksrq().before(startAttendanceCal.getTime())) { countStartCal.setTime(startAttendanceCal.getTime()); } // 修正境外常驻结束日期 Calendar countEndCal = Calendar.getInstance(); countEndCal.setTime(detail.getJwczjsrq()); if (detail.getJwczjsrq().after(endAttendanceCal.getTime())) { countEndCal.setTime(endAttendanceCal.getTime()); } ycq[0] += BjcjCommonUtils.getDays(countStartCal.getTime(), countEndCal.getTime()); flag[0] = true; } if (i == czDetails.size() - 1 && flag[0] == true) { // 已计算出应出勤天数 czInfo.setYczDays(ycq[0]); JWJT build = JWJT.builder().user(czInfo.getXm()).ycq(ycq[0]).build(); results.add(build); return true; } } return false; }); return results; } }