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.entity.XcdjJwjtParam; import com.engine.bjcj220907.service.OverseasAllowanceCountService; import com.engine.bjcj220907.utils.BjcjCommonUtils; import weaver.general.BaseBean; import java.util.*; 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("考勤开始日期:"+startAttendanceCal.getTime()+",考勤结束日期:"+endAttendanceCal); // 如果用户在考勤周期内存在境外常驻信息则过滤出来,并且计算当月应常驻天数 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(startAttendanceCal); baseBean.writeLog("获取所有员工考勤所属月的薪酬等级及所对应的境外津贴标准:"+usersXSDJ.size()); // } /** * @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 -> { if(czInfo.getXm().equals("1462")){ System.out.println("H"); } List czDetails = czInfo.getInfos(); // 用于存储计算到哪一天的日期 Calendar c = Calendar.getInstance(); c.setTime(endAttendanceCal.getTime()); Calendar[] countDay = {c}; int[] ycq = {0}; int[] gnycq ={0}; List details = new ArrayList<>(); 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); } else { // 开始常驻日期在 考勤开始日期前(应出勤日期为自然日) int days = BjcjCommonUtils.getDays(startAttendanceCal.getTime(), endAttendanceCal.getTime()); // czInfo.setYczDays(days); JWJT build = JWJT.builder().user(czInfo.getXm()).jwycq(days).gngzts(0.0).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 starCal = Calendar.getInstance(); starCal.setTime(detail.getJwczksrq()); while (starCal.getTime().before(detail.getJwczjsrq()) || starCal.getTime().equals(detail.getJwczjsrq())) { details.add(starCal.getTime()); starCal.add(Calendar.DAY_OF_YEAR, 1); } } if (i == czDetails.size() - 1) { // 已经将所有考勤周期内境外常驻的区间时间转换为记录 Calendar aCal = Calendar.getInstance(); aCal.setTime(countDay[0].getTime()); aCal.set(Calendar.HOUR_OF_DAY, 0); aCal.set(Calendar.MINUTE, 0); aCal.set(Calendar.SECOND, 0); aCal.set(Calendar.MILLISECOND, 0); if(details.size()==0 && countDay[0].getTime().equals(endAttendanceCal.getTime())){ // 该考勤周期内员工没有境外常驻信息 return false; } while (startAttendanceCal.getTime().before(aCal.getTime()) || startAttendanceCal.getTime().equals(aCal.getTime())){ if(details.contains(aCal.getTime())){ // 存在境外记录 ycq[0]++; aCal.add(Calendar.DATE,-1); }else{ // 没有境外记录,判断是否是工作日 if( (aCal.get(Calendar.DAY_OF_WEEK) != 1) && (aCal.get(Calendar.DAY_OF_WEEK)!=7) ){ // 是工作日 gnycq[0]++; } aCal.add(Calendar.DATE,-1); } } JWJT build = JWJT.builder().user(czInfo.getXm()).jwycq(ycq[0]).gngzts(gnycq[0]).build(); results.add(build); return true; } } return false; }).collect(Collectors.toList()); return results; } }