package com.engine.bjcj220907.service.impl; import com.engine.bjcj220907.dao.MonthBonusDAO; import com.engine.bjcj220907.entity.*; import com.engine.bjcj220907.service.GetKQ4MonthBonusService; import com.engine.bjcj220907.service.MonthBonusCountService; import com.engine.bjcj220907.utils.BjcjCommonUtils; import com.engine.common.util.ServiceUtil; import com.engine.core.impl.Service; import com.engine.salary.util.SalaryEntityUtil; import weaver.general.BaseBean; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; /** * @author Harryxzy * @date 2022/09/08 16:35 * @description */ public class MonthBonusCountServiceImpl extends Service implements MonthBonusCountService { BaseBean baseBean = new BaseBean(); public MonthBonusDAO getMonthBonusDAO(){ return new MonthBonusDAO(); } private GetKQ4MonthBonusService getKQ4MonthBonusService() { return ServiceUtil.getService(GetKQ4MonthBonusServiceImpl.class,user); } /*** * @description 计算月度绩效 * @return String * @author Harryxzy * @date 2022/9/8 17:04 */ @Override public String countMonthBonus(CountMonthBonusParam param) { // 获取绩效日期的ID Integer id = getMonthBonusDAO().getydjxID(param); Date bonusMonth = param.getBonusMonth(); Date bonusSendMonth = param.getBonusSendMonth(); // 绩效所属季度 Calendar bonusCal = Calendar.getInstance(); bonusCal.setTime(bonusMonth); int bonusYear = bonusCal.get(Calendar.YEAR); int bonusSeason =bonusCal.get(Calendar.MONTH)/3+1; // 获取已经离职并且已经发放过绩效的人员信息 baseBean.writeLog("获取已经离职并且已经发放过绩效的人员信息"); List haveSendDepartureInfo = getMonthBonusDAO().getHaveSendDepartureInfo().stream().map(i->i.getXm()).collect(Collectors.toList()); baseBean.writeLog("获取已经离职并且已经发放过绩效的人员信息 共:"+haveSendDepartureInfo.size()); // 获取所有人的入职日期、离职日期、其他缺勤天数 List rybsInfo = getMonthBonusDAO().getRybsInfo(); baseBean.writeLog("获取所有人的入职日期、离职日期、其他缺勤天数"+rybsInfo.size()); Map rybsInfoMap = SalaryEntityUtil.convert2Map(rybsInfo, DepartureInfo::getXm); // 入职日期小于绩效所属月的不核算绩效 rybsInfo.stream().forEach(info -> { if(BjcjCommonUtils.isBeforeMonth(param.getBonusMonth(),info.getRzrq())){ haveSendDepartureInfo.add(info.getXm()); } }); // 获取所有人的绩效等级 --> 绩效系数 List result = getMonthBonusDAO().getJXInfo(bonusSendMonth,bonusMonth,bonusYear,bonusSeason,haveSendDepartureInfo); baseBean.writeLog("获取所有人的绩效等级、绩效系数等信息,共计:"+result.size()); // 获取所有本月(薪资发放月)离职人员信息 List departureInfo = getMonthBonusDAO().getDepartureInfo(bonusSendMonth); baseBean.writeLog("发放月离职人员信息:"+departureInfo.size()); List departureTemp = new ArrayList<>(); // 循环所属月下一个月到离职月之间的绩效等级-》绩效系数 baseBean.writeLog("获取所有离职人员所属月下一个月到离职月之间的绩效等级、绩效系数等信息"); for(int i=0;i { getMonthBonusDAO().getXCDJ(r); return r; }).collect(Collectors.toList()); baseBean.writeLog("获取所有人的薪酬等级和绩效工资"); // 获取在职员工的考勤周期(上个月29-这个月28) Calendar startAttendanceCal = BjcjCommonUtils.getStartAttendanceCal(bonusMonth); Calendar endAttendanceCal = BjcjCommonUtils.getEndAttendanceCal(bonusMonth); // 获取所有人的境外常驻信息 List czInfos = getMonthBonusDAO().getCZInfo(); baseBean.writeLog("获取所有人的境外常驻信息,共:"+czInfos.size()); // 将境外常驻信息格式化 List jwCZInfos = formatJwCZInfo(czInfos); baseBean.writeLog("将境外常驻信息格式化"); // 获取所有用户考勤模块中缺勤天数 Attend4MonthBonus p = Attend4MonthBonus.builder().beginDate(startAttendanceCal.getTime()).endDate(endAttendanceCal.getTime()).build(); Map qqDatas = getKQ4MonthBonusService().getKQDatas(p); if(qqDatas != null){ baseBean.writeLog("获取所有用户考勤模块中缺勤天数:"+qqDatas.size()); } // 循环将离职人员的各个月的缺勤天数取到 Map qqDatasDepar= new HashMap<>(); for(int i=0;i jwCZUsers = jwCZInfos.stream().map(item -> item.getXm()).collect(Collectors.toList()); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM"); // 计算考勤月内的月度绩效信息 baseBean.writeLog("计算考勤月内的月度绩效信息"); result = result.stream().map(item -> { DepartureInfo userInfo = rybsInfoMap.get(new Integer(item.getXm())); if(!jwCZUsers.contains(item.getXm())){ // 用户不存在境外常驻信息(全勤21.75) item.setYcq(21.75); double qq=0.0; if(qqDatas.containsKey( (item.getXm()+"-"+sdf.format(item.getKqyf())) )){ qq = qqDatas.get((item.getXm()+"-"+sdf.format(item.getKqyf()))); } // 是否是入职月或离职月 加上其他缺勤天数 if(userInfo != null && BjcjCommonUtils.isEqualsMonth(userInfo.getRzrq(),item.getKqyf()) ){ qq = qq + userInfo.getRzqqts(); } if(userInfo != null && BjcjCommonUtils.isEqualsMonth(userInfo.getLzrq(),item.getKqyf())){ qq = qq + userInfo.getLzqqts(); } if(qq>21.75){ // 境内员工,并且缺勤天数大于21.75,可能导致负数因此修正缺勤天数为21.75 qq = 21.75; } item.setQq(qq); // 实出勤天数 =应出勤天数-缺勤天数 double scqTemp = 21.75-qq; if (scqTemp<0){ scqTemp=0.0; } item.setScq(scqTemp); // 奖金基数(考勤)= 月度绩效奖金基数-月度绩效基数/满勤*缺勤天数 double kqjs= item.getYdjjjxjs() - item.getYdjjjxjs()/21.75*qq; item.setJjjskq(kqjs); // 奖金实发放额= 奖金基数(考勤)*个人绩效系数 item.setYfje(item.getGrjxxs() * kqjs); }else{ // 用户存在境外常驻信息,获取该用户所有常驻信息 List collect = jwCZInfos.stream().filter(i -> i.getXm().equals( item.getXm())).collect(Collectors.toList()); List infos = collect.get(0).getInfos(); double[] ycq = {0}; List details = new ArrayList<>(); // 考勤开始日期(在职、离职) Calendar s = BjcjCommonUtils.getStartAttendanceCal(item.getKqyf()); // 考勤结束日期(在职、离职) Calendar e = BjcjCommonUtils.getEndAttendanceCal(item.getKqyf()); // 用于存储计算到哪一天的日期 Calendar c = Calendar.getInstance(); c.setTime(e.getTime()); Calendar[] countDay = {c}; for(int i=0;i21.75){ // 没有境外常驻信息,并且缺勤天数大于21.75,可能导致负数因此修正缺勤天数为21.75 qq = 21.75; } item.setQq(qq); // 实出勤天数 =应出勤天数-缺勤天数 double scqTemp =ycq[0]-qq; if (scqTemp<0){ scqTemp=0.0; } item.setScq(scqTemp); // 奖金基数(考勤)= 月度绩效奖金基数-月度绩效基数/满勤*缺勤天数 double kqjs= item.getYdjjjxjs() - item.getYdjjjxjs()/ycq[0]*qq; item.setJjjskq(kqjs); // 奖金实发放额= 奖金基数(考勤)*个人绩效系数 item.setYfje(item.getGrjxxs() * kqjs); } return item; }).collect(Collectors.toList()); // 处理离职人员离职所在月份的数据 // 将离职信息转为map // baseBean.writeLog("处理离职人员离职所在月份的数据"); // Map map = departureInfo.stream().collect(Collectors.toMap(DepartureInfo::getXm,d->d.getLzrq())); // departureTemp.stream().forEach(i-> { // // 离职日期 // Date date = map.get(Integer.valueOf(i.getXm())); // Date kqyf = i.getKqyf(); // if( date.getMonth() == kqyf.getMonth()){ // // 是离职所在月份,获取离职日期重新计算该月缺勤日期以及绩效 // Calendar deparLastDay = Calendar.getInstance(); // deparLastDay.setTime(date); // deparLastDay.add(Calendar.DATE,1); // Calendar deaprAttendEndDay = BjcjCommonUtils.getEndAttendanceCal(kqyf); // double[] sqq={0.0}; // if(Math.abs(i.getYcq()-21.75) < 0.000000002){ // int[] qq={0}; // Calendar countCal = Calendar.getInstance(); // countCal.setTime(deaprAttendEndDay.getTime()); // // 均为境内,取离职日后一天-考勤最后一天的工作日 // while (deparLastDay.getTime().before(countCal.getTime()) || deparLastDay.getTime().equals(countCal.getTime())){ // if( (countCal.get(Calendar.DAY_OF_WEEK) != 1) && (countCal.get(Calendar.DAY_OF_WEEK)!=7) ){ // qq[0]++; // } // countCal.add(Calendar.DATE,-1); // } // sqq[0] = i.getQq()+qq[0]; // }else{ // // 存在境外,取离职日后一天-考勤最后一天的自然日 // sqq[0] = i.getQq()+BjcjCommonUtils.getDays(deparLastDay.getTime(), deaprAttendEndDay.getTime()); // } // DepartureInfo userRyInfo = rybsInfoMap.get(Integer.valueOf(i.getXm())); // sqq[0] = i.getQq() + userRyInfo.getQtqqts(); // // i.setQq(sqq[0]); // // 重新计算1、实出勤天数 =应出勤天数-缺勤天数 2、奖金基数(考勤)= 月度绩效奖金基数-月度绩效基数/满勤*缺勤天数 3、奖金实发放额= 奖金基数(考勤)*个人绩效系数 // double scqTemp =i.getYcq()-sqq[0]; // if (scqTemp<0){ // scqTemp=0.0; // } // i.setScq(scqTemp); // double jjjskq = i.getYdjjjxjs() - i.getYdjjjxjs() / i.getYcq() * sqq[0]; // i.setJjjskq(jjjskq); // i.setYfje(i.getGrjxxs()*jjjskq); // } // }); // 先删除建模中脏数据 getMonthBonusDAO().clear(bonusMonth,bonusSendMonth,haveSendDepartureInfo); baseBean.writeLog("先删除建模中脏数据"); // 将数据插入建模中 List departureUsers = departureInfo.stream().map(i -> i.getXm()).collect(Collectors.toList()); baseBean.writeLog("将数据插入建模中共:"+result.size()); getMonthBonusDAO().insertList(result,departureUsers,bonusSendMonth,id); return "null"; } /** * @description 境外常驻信息格式化 * @return void * @author Harryxzy * @date 2022/9/11 17:07 */ public static List formatJwCZInfo(List czInfos) { Map> groupByName = czInfos.stream().collect(Collectors.groupingBy(item -> item.getXm())); List formatJwCZInfos = new ArrayList<>(); for (Map.Entry> entry : groupByName.entrySet()) { JwCZInfo build = new JwCZInfo().builder().xm(entry.getValue().get(0).getXm()).infos(entry.getValue()).build(); formatJwCZInfos.add(build); } return formatJwCZInfos; } }