package com.engine.attendance.vacation.job.holidaygeneration.tactics; import com.engine.attendance.enums.CheckBoxEnum; import com.engine.attendance.enums.QuotaChangeMethodEnum; import com.engine.attendance.enums.StartingUnitEnum; import com.engine.attendance.vacation.util.VocationCommonUtil; import com.engine.common.util.DateUtil; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import lombok.extern.slf4j.Slf4j; import weaver.general.Util; import weaver.hrm.User; import java.util.ArrayList; import java.util.Calendar; import java.util.List; import java.util.Map; /** * 循环单次发放全额 */ @Slf4j public class SinglePaymentInFullWay implements HolidayGenerationWay { @Override public boolean support(int personClassfiy) { if (personClassfiy == 0) { return true; } return false; } @Override public Map compute(Map data) { String userId = Util.null2String(data.get("userId")); String releaseDate = Util.null2String(data.get("releaseDate")); String cover = Util.null2String(data.get("cover")); String isOneTime = Util.null2String(data.get("isOneTime")); if ("".equals(releaseDate)) { releaseDate = DateUtil.getCurrentTime(); } List> vocationList = (List>) data.get("vocationList"); //起算日期 String qsrq = Util.null2String(vocationList.get(0).get("qsrqValue")); //额度有效期间 String edyxqsz = Util.null2String(vocationList.get(0).get("edyxqsz")); //额度有效期间单位 String edyxq = Util.null2String(vocationList.get(0).get("edyxq")); //累计承认工龄月份数栏位值 String ljcrglyfslwz = Util.null2String(vocationList.get(0).get("ljcrglyfslwzValue")); //依据字段 String yjzd = Util.null2String(vocationList.get(0).get("yjzdValue")); //调整起算日期策略 String dzqsrq = Util.null2String(vocationList.get(0).get("dzqsrq")); //分割日期 String fgrq = Util.null2String(vocationList.get(0).get("fgrq")); //提前执行发放操作的天数 String dqtqffts = Util.null2String(vocationList.get(0).get("dqtqffts")); //执行发放的时间点 String ffdtffsj = Util.null2String(vocationList.get(0).get("ffdtffsj")); //入职当期额度按比例折算 String rzdqedablzs = Util.null2String(vocationList.get(0).get("rzdqedablzs")); //首次获得额度按比例折算 String schdedablzs = Util.null2String(vocationList.get(0).get("schdedablzs")); //额度变更时额度处理方式 String edbgsedclfs = Util.null2String(vocationList.get(0).get("edbgsedclfs")); //额度单位 String eddw = Util.null2String(vocationList.get(0).get("edbgsedclfs")); //尾数处理 String wscl = Util.null2String(vocationList.get(0).get("wscl")); //首次获得额度控制生效日期 String schdedkzsxrq = Util.null2String(vocationList.get(0).get("schdedkzsxrq")); if (!"1".equals(isOneTime)){ qsrq = VocationCommonUtil.getAfterAdjustTime(qsrq, dzqsrq, fgrq); for (Map vocationMap : vocationList) { vocationMap.put("qsrqValue", qsrq); } } if (DateUtil.getTime(releaseDate).compareTo(DateUtil.getTime(qsrq)) < 0){ //releaseDate=qsrq; return Maps.newHashMap(); } //相差天数 int betweenDays = DateUtil.getBetWeenDays(qsrq, releaseDate.split(" ")[0]); //相差月份 int betweenMonth = DateUtil.getBetWeenMonths(qsrq, releaseDate.split(" ")[0]); //总工龄天数 int allWorkDays = Double.valueOf(ljcrglyfslwz).intValue() * 30 + betweenDays; //总月数 int allMonths = betweenMonth + Double.valueOf(ljcrglyfslwz).intValue(); Map insertHoliDayParam = VocationCommonUtil.getInsertHoliDayParam(vocationList.get(0), userId, qsrq, releaseDate); // List> dataList = VocationCommonUtil.ifexist("uf_jcl_kq_jqye", insertHoliDayParam); List> dataList = new ArrayList<>(); //已存在数据且不覆盖 if (dataList.size()>0 && !"1".equals(cover)) { return insertHoliDayParam; } String sxrq = insertHoliDayParam.get("sxrq").toString(); //实际休息时长 double restTime = 0; //工龄小于1年的新员工,且额度有效期单位为自然年 if (allMonths < 12 && edyxq.equals(StartingUnitEnum.NATURAL_YEAR.getKey())) { // Map vocationMap = VocationCommonUtil.getVocationMap(vocationList, 0, yjzd); // // //额定休息时长 // double edktsc = Double.valueOf(vocationMap.get("edktsc") == null? "0" :Util.null2String(vocationMap.get("edktsc"))); if (QuotaChangeMethodEnum.CONVERT.getKey().equals(edbgsedclfs) || CheckBoxEnum.CHECKED.getKey().equals(schdedablzs)) { // if (!sxrq.split("-")[0].equals(releaseDate.split("-")[0]) && releaseDate.split("-")[0].equals(qsrq.split("-")[0])) { // //起算年和发生日期在同一年,生成假期在下一年 // int days = DateUtil.getBetWeenDays(qsrq, qsrq.split("-")[0] + "-12-31") + 1; // int yearDays = DateUtil.getDays(qsrq, Calendar.DAY_OF_YEAR); // restTime = VocationCommonUtil.computeRestDays(days, yearDays, edktsc, wscl); // } else if (sxrq.split("-")[0].equals(releaseDate.split("-")[0]) && releaseDate.split("-")[0].equals(qsrq.split("-")[0])) { // //起算年和发生日期在同一年,生成假期为起算年的当年 // int days = Double.valueOf(ljcrglyfslwz).intValue() * 30; // int yearDays = DateUtil.getDays(DateUtil.beforeYear(releaseDate,1,DateUtil.yyyyMMdd), Calendar.DAY_OF_YEAR); // restTime = VocationCommonUtil.computeRestDays(days, yearDays, edktsc, wscl); // } else if (sxrq.split("-")[0].equals(releaseDate.split("-")[0]) && !releaseDate.split("-")[0].equals(qsrq.split("-")[0])) { // //起算年在发生日期的上一年,起算年的后一年 // int days = DateUtil.getBetWeenDays(qsrq, qsrq.split("-")[0] + "-12-31") + 1; // int yearDays = DateUtil.getDays(qsrq, Calendar.DAY_OF_YEAR); // restTime = VocationCommonUtil.computeRestDays(days, yearDays, edktsc, wscl); // } else if (!sxrq.split("-")[0].equals(releaseDate.split("-")[0]) && !releaseDate.split("-")[0].equals(qsrq.split("-")[0])) { // //起算年在发生日期的上一年,生成假期为起算年的后第二年 // restTime = edktsc; // } restTime = getRestTime(insertHoliDayParam,vocationList,QuotaChangeMethodEnum.CONVERT); } else { // restTime = edktsc; restTime = getRestTime(insertHoliDayParam,vocationList,QuotaChangeMethodEnum.NO_CONVERT); } if (CheckBoxEnum.CHECKED.getKey().equals(schdedkzsxrq)) { int seniority = "".equals(ljcrglyfslwz)?0:Double.valueOf(ljcrglyfslwz).intValue(); String divideTime = DateUtil.beforeMonth(qsrq,seniority); divideTime = sxrq.split("-")[0]+"-"+divideTime.split("-")[1]+"-"+divideTime.split("-")[2]; insertHoliDayParam.put("sxrq", divideTime); dataList = VocationCommonUtil.ifexist("uf_jcl_kq_jqye", insertHoliDayParam); //已存在数据且不覆盖 if (dataList.size()>0 && !"1".equals(cover)) { return insertHoliDayParam; } } insertHoliDayParam.put("ktsc", restTime); } else if (allMonths >= 12 && edyxq.equals(StartingUnitEnum.NATURAL_YEAR.getKey())) { //入职不满一年,且入职当期额度按比例折算 if (CheckBoxEnum.CHECKED.getKey().equals(rzdqedablzs) && betweenMonth < 12 && sxrq.split("-")[0].equals(releaseDate.split("-")[0]) && releaseDate.split("-")[0].equals(qsrq.split("-")[0])) { //起算年和发生日期在同一年,生成假期为起算年的当年 // Map vocationMap = VocationCommonUtil.getVocationMap(vocationList, Double.valueOf(ljcrglyfslwz).intValue() / 12, yjzd); // double edktsc = Double.valueOf(vocationMap.get("edktsc").toString()); // int days = DateUtil.getBetWeenDays(qsrq, releaseDate.split(" ")[0]) + 1; // int yearDays = DateUtil.getDays(qsrq, Calendar.DAY_OF_YEAR); // restTime = VocationCommonUtil.computeRestDays(days, yearDays, edktsc, wscl); restTime = getRestTime(insertHoliDayParam,vocationList,QuotaChangeMethodEnum.CONVERT); } else { // // if (!sxrq.split("-")[0].equals(releaseDate.split("-")[0]) && releaseDate.split("-")[0].equals(qsrq.split("-")[0])) { // //起算年和发生日期在同一年,生成假期在下一年 // //betweenMonth = DateUtil.getBetWeenMonths(qsrq,qsrq.split("-")[0] + "-12-31"); // betweenMonth = DateUtil.getBetWeenMonths(qsrq,sxrq); // // } else if (sxrq.split("-")[0].equals(releaseDate.split("-")[0]) && releaseDate.split("-")[0].equals(qsrq.split("-")[0])) { // //起算年和发生日期在同一年,生成假期为发生日期的当年 // betweenMonth=0; // // } else if (sxrq.split("-")[0].equals(releaseDate.split("-")[0]) && !releaseDate.split("-")[0].equals(qsrq.split("-")[0])) { // //起算年在发生日期的之前,生成假期为发生日期的当年 // //betweenMonth = DateUtil.getBetWeenMonths(qsrq,DateUtil.beforeYear(releaseDate,1,DateUtil.yyyy) + "-12-31"); // betweenMonth = DateUtil.getBetWeenMonths(qsrq,sxrq); // // } else if (!sxrq.split("-")[0].equals(releaseDate.split("-")[0]) && !releaseDate.split("-")[0].equals(qsrq.split("-")[0])) { // //起算年在发生日期的之前,生成假期为发生日期的下一年 // //betweenMonth = DateUtil.getBetWeenMonths(qsrq,releaseDate.split("-")[0] + "-12-31"); // betweenMonth = DateUtil.getBetWeenMonths(qsrq,sxrq); // // } // allMonths = betweenMonth + Double.valueOf(ljcrglyfslwz).intValue(); // int intervalYear = allMonths/12; // Map vocationMap = VocationCommonUtil.getVocationMap(vocationList, intervalYear / 12, yjzd); // double edktsc = Double.valueOf(vocationMap.get("edktsc").toString()); if (QuotaChangeMethodEnum.CONVERT.getKey().equals(edbgsedclfs)) { // Map beforeVocationMap = VocationCommonUtil.getVocationMap(vocationList, intervalYear - 1, yjzd); // if (!beforeVocationMap.get("detailid").equals(vocationMap.get("detailid"))) { // //考虑残年情况 // double beforeEdktsc = Double.valueOf(beforeVocationMap.get("edktsc").toString()); // int needBackMonths = (intervalYear - 1) * 12 - Double.valueOf(ljcrglyfslwz).intValue(); // // String middleTime = releaseDate.split("-")[0] + "-" + DateUtil.nextMonth(qsrq, needBackMonths, DateUtil.yyyyMMdd).split("-")[1] + "-" + qsrq.split("-")[2]; // int beforeDays = DateUtil.getBetWeenDays(releaseDate.split("-")[0] + "-01-01", middleTime); // int afterDays = DateUtil.getBetWeenDays(middleTime, releaseDate.split("-")[0] + "-12-31"); // // int yearDays = DateUtil.getDays(releaseDate, Calendar.DAY_OF_YEAR); // restTime = VocationCommonUtil.computeRestDays(beforeDays, yearDays, beforeEdktsc, wscl) + VocationCommonUtil.computeRestDays(afterDays, yearDays, edktsc, wscl); // } else { // restTime = edktsc; // } restTime = getRestTime(insertHoliDayParam,vocationList,QuotaChangeMethodEnum.CONVERT); } else if (QuotaChangeMethodEnum.NO_CONVERT.getKey().equals(edbgsedclfs)) { // restTime = edktsc; restTime = getRestTime(insertHoliDayParam,vocationList,QuotaChangeMethodEnum.NO_CONVERT); } } } else if (edyxq.equals(StartingUnitEnum.STARTING_YEAR.getKey())) { int betweenYear = DateUtil.getBetWeenYears(qsrq,releaseDate.split(" ")[0]); //起算年 allMonths = Double.valueOf(ljcrglyfslwz).intValue(); int intervalYear = allMonths / 12+betweenYear; Map vocationMap = VocationCommonUtil.getVocationMap(vocationList, intervalYear, yjzd); restTime = vocationMap.size()>0?Double.valueOf(vocationMap.get("edktsc").toString()):0; } else if (edyxq.equals(StartingUnitEnum.NATURAL_MONTH.getKey())){ //自然月 betweenMonth = DateUtil.getBetWeenMonths(qsrq,sxrq); if (DateUtil.getTime(sxrq).compareTo(DateUtil.getTime(qsrq)) <=0){ betweenMonth = 0; } allMonths = betweenMonth+Double.valueOf(ljcrglyfslwz).intValue(); Map vocationMap = VocationCommonUtil.getVocationMap(vocationList, allMonths, yjzd); restTime = vocationMap.size()>0?Double.valueOf(vocationMap.get("edktsc").toString()):0; } else if (edyxq.equals(StartingUnitEnum.STARTING_MONTH.getKey())){ //起算月 betweenMonth = DateUtil.getBetWeenMonths(qsrq,sxrq); allMonths = betweenMonth+Double.valueOf(ljcrglyfslwz).intValue(); Map vocationMap = VocationCommonUtil.getVocationMap(vocationList, allMonths, yjzd); restTime = vocationMap.size()>0?Double.valueOf(vocationMap.get("edktsc").toString()):0; } else if (edyxq.equals(StartingUnitEnum.NATURAL_WEEK.getKey())){ //起自然周 betweenDays = DateUtil.getBetWeenDays(qsrq,sxrq)+1; if (DateUtil.getTime(sxrq).compareTo(DateUtil.getTime(qsrq)) <=0){ betweenDays = 0; } allWorkDays = Double.valueOf(ljcrglyfslwz).intValue()*30+betweenDays; Map vocationMap = VocationCommonUtil.getVocationMap(vocationList, allWorkDays/7, yjzd); restTime = vocationMap.size()>0?Double.valueOf(vocationMap.get("edktsc").toString()):0; } else if (edyxq.equals(StartingUnitEnum.STARTING_WEEK.getKey())){ //起算周 betweenDays = DateUtil.getBetWeenDays(qsrq,sxrq)+1; if (betweenDays <=7){ betweenDays=0; } allWorkDays = Double.valueOf(ljcrglyfslwz).intValue()*30+betweenDays; Map vocationMap = VocationCommonUtil.getVocationMap(vocationList, allWorkDays/7, yjzd); restTime = vocationMap.size()>0?Double.valueOf(vocationMap.get("edktsc").toString()):0; } else if (edyxq.equals(StartingUnitEnum.NATURAL_DAY.getKey())){ //自然天 betweenDays = DateUtil.getBetWeenDays(qsrq,sxrq)+1; allWorkDays = Double.valueOf(ljcrglyfslwz).intValue()*30+betweenDays; Map vocationMap = VocationCommonUtil.getVocationMap(vocationList, allWorkDays, yjzd); restTime = vocationMap.size()>0?Double.valueOf(vocationMap.get("edktsc").toString()):0; } insertHoliDayParam.put("ktsc", restTime); if (!"1".equals(isOneTime)){ VocationCommonUtil.updateHolidayBalance("uf_jcl_kq_jqye", insertHoliDayParam,dataList); } return insertHoliDayParam; } public double getRestTime(Map insertHoliDayParam,List> vocationList,QuotaChangeMethodEnum changeMethodEnum){ String sxrq = insertHoliDayParam.get("sxrq").toString(); String qsrq = Util.null2String(vocationList.get(0).get("qsrqValue")); String nextSxrq = DateUtil.nextYear(sxrq,1,DateUtil.yyyyMMdd); //累计承认工龄月份数栏位值 String ljcrglyfslwz = Util.null2String(vocationList.get(0).get("ljcrglyfslwzValue")); //依据字段 String yjzd = Util.null2String(vocationList.get(0).get("yjzdValue")); //尾数处理 String wscl = Util.null2String(vocationList.get(0).get("wscl")); int seniority = "".equals(ljcrglyfslwz)?0:Double.valueOf(ljcrglyfslwz).intValue(); double restTime=0.0; //折算 if (changeMethodEnum == QuotaChangeMethodEnum.CONVERT){ int beginYearMonth = DateUtil.getBetWeenMonths(qsrq,sxrq); if (beginYearMonth < 0){ beginYearMonth = 0; } beginYearMonth = beginYearMonth+seniority; int endYearMonth = DateUtil.getBetWeenMonths(qsrq,nextSxrq); endYearMonth = endYearMonth+seniority; int beginYear = beginYearMonth/12; int endYear = endYearMonth/12; int endYearRemainder = endYearMonth%12; Map beginYearmap = VocationCommonUtil.getVocationMap(vocationList, beginYear, yjzd); Map endYearmap = VocationCommonUtil.getVocationMap(vocationList, endYear, yjzd); double beginEdktsc = Double.valueOf(beginYearmap.get("edktsc") == null? "0" :Util.null2String(beginYearmap.get("edktsc"))); double endEdktsc = Double.valueOf(endYearmap.get("edktsc") == null? "0" :Util.null2String(endYearmap.get("edktsc"))); //残年分割日期 String divideTime = DateUtil.beforeMonth(qsrq,seniority); divideTime = sxrq.split("-")[0]+"-"+divideTime.split("-")[1]+"-"+divideTime.split("-")[2]; int yearDays = DateUtil.getDays(sxrq, Calendar.DAY_OF_YEAR); if (beginEdktsc == endEdktsc){ //当前后额定可休时长一样时,代表没有残年情况 if (DateUtil.getTime(qsrq).compareTo(DateUtil.getTime(sxrq)) >0){ int days = DateUtil.getBetWeenDays(qsrq,nextSxrq); restTime = VocationCommonUtil.computeRestDays(days, yearDays, endEdktsc, wscl); }else { restTime = beginEdktsc; } }else { //考虑残年 if (DateUtil.getTime(qsrq).compareTo(DateUtil.getTime(sxrq)) >0){ if (DateUtil.getTime(divideTime).compareTo(DateUtil.getTime(qsrq)) >=0){ int beforeDays = DateUtil.getBetWeenDays(qsrq,divideTime); int afterDays = DateUtil.getBetWeenDays(divideTime,nextSxrq)+1; double beforeRestTime = VocationCommonUtil.computeRestDays(beforeDays, yearDays, beginEdktsc, wscl); double afterRestTime = VocationCommonUtil.computeRestDays(afterDays, yearDays, endEdktsc, wscl); restTime = beforeRestTime+afterRestTime; }else { int afterDays = DateUtil.getBetWeenDays(qsrq,nextSxrq); restTime = VocationCommonUtil.computeRestDays(afterDays, yearDays, endEdktsc, wscl); } }else { int beforeDays = DateUtil.getBetWeenDays(sxrq,divideTime); int afterDays = DateUtil.getBetWeenDays(divideTime,nextSxrq)+1; double beforeRestTime = VocationCommonUtil.computeRestDays(beforeDays, yearDays, beginEdktsc, wscl); double afterRestTime = VocationCommonUtil.computeRestDays(afterDays, yearDays, endEdktsc, wscl); restTime = beforeRestTime+afterRestTime; } } }else { //不折算 int beginYearMonth = DateUtil.getBetWeenMonths(qsrq,sxrq); if (beginYearMonth < 0){ beginYearMonth = 0; } beginYearMonth = beginYearMonth+seniority; int beginYear = beginYearMonth/12; Map beginYearmap = VocationCommonUtil.getVocationMap(vocationList, beginYear, yjzd); double beginEdktsc = Double.valueOf(beginYearmap.get("edktsc") == null? "0" :Util.null2String(beginYearmap.get("edktsc"))); restTime=beginEdktsc; } return restTime; } }