From 4208d755adf215899a0007ab09bba2a63e819b27 Mon Sep 17 00:00:00 2001 From: sy Date: Sun, 28 Apr 2024 10:13:46 +0800 Subject: [PATCH] =?UTF-8?q?=E8=80=83=E5=8B=A4=EF=BC=8C=E5=87=BA=E5=8B=A4?= =?UTF-8?q?=E6=B4=A5=E8=B4=B4=E6=95=B0=E6=8D=AE=E7=94=9F=E6=88=90=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E5=8F=98=E6=9B=B4=EF=BC=8C=E9=80=82=E9=85=8D=E5=87=BA?= =?UTF-8?q?=E5=8B=A4=E7=BB=93=E6=9E=9C=E4=B8=AD=E8=BF=9B=E5=87=BA=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E6=A0=BC=E5=BC=8F=E5=8F=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/AllowanceServiceImpl.java | 275 +++++++----------- 1 file changed, 112 insertions(+), 163 deletions(-) diff --git a/src/com/engine/attendance/workflow/service/impl/AllowanceServiceImpl.java b/src/com/engine/attendance/workflow/service/impl/AllowanceServiceImpl.java index f77cbd4..8f4a680 100644 --- a/src/com/engine/attendance/workflow/service/impl/AllowanceServiceImpl.java +++ b/src/com/engine/attendance/workflow/service/impl/AllowanceServiceImpl.java @@ -13,7 +13,9 @@ import weaver.general.BaseBean; import weaver.general.Util; import java.time.Duration; -import java.time.LocalTime; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; @@ -29,6 +31,12 @@ public class AllowanceServiceImpl extends Service implements AllowanceService { Map result = new HashMap<>(); try { + //获取指定生成的人员id列表,如果没有则生成所有人 + String checkEmpIds = Util.null2String(params.get("empIds")); + List checkEmpIdList = new ArrayList<>(); + if (!checkEmpIds.equals("")) { + checkEmpIdList = Arrays.asList(checkEmpIds.split(",")); + } //获取modeId,考勤方案的modeId Map formmodeIdMap = Utils.getFormmodeIdMap(); String modeId = formmodeIdMap.get("uf_jcl_kq_kqfa"); @@ -55,9 +63,6 @@ public class AllowanceServiceImpl extends Service implements AllowanceService { String dataId = map.get("id").toString(); //获取方案适用的人员id列表 List empIdList = CommonUtil.getEmpIds(dataId, modeId); - bs.writeLog("dataId : " + dataId); - bs.writeLog("modeId : " + modeId); - bs.writeLog("empIdList : " + empIdList); //获取津贴类型的考勤项目 String dtSql = "select * from uf_jcl_kq_kqfa_dt1 a left join uf_jcl_kq_kqxm b on b.id = a.kqxm where a.mainid = " + dataId + " and b.xmlx = " + AttendanceItemTypeEnum.ALLOWANCE.getKey(); @@ -113,15 +118,15 @@ public class AllowanceServiceImpl extends Service implements AllowanceService { }); } } - - bs.writeLog("targetEmpIdList : " + targetEmpIdList); - bs.writeLog("targetAllowanceIdList : " + targetAllowanceIdList); - bs.writeLog("targetBcIdList : " + targetBcIdList); - //获取出勤结果,遍历处理津贴信息 String startDate = Util.null2String(params.get("startDate")); String endDate = Util.null2String(params.get("endDate")); List> cqData = new ArrayList<>(); + //如果入参中选中了人员,则只处理选中的人 + if (checkEmpIdList.size() > 0) { + List finalCheckEmpIdList = checkEmpIdList; + targetEmpIdList = targetEmpIdList.stream().filter(f -> finalCheckEmpIdList.contains(f)).collect(Collectors.toList()); + } if (targetEmpIdList.size() > 0 && targetBcIdList.size() > 0) { //去重 targetBcIdList = targetBcIdList.stream().distinct().collect(Collectors.toList()); @@ -131,9 +136,6 @@ public class AllowanceServiceImpl extends Service implements AllowanceService { cqData = DbTools.getSqlToList(cqSql); } bs.writeLog("cqData_size : " + cqData.size()); - bs.writeLog("empIdWithAllowanceInfo : " + empIdWithAllowanceInfo); - bs.writeLog("bcWithAllowanceInfo : " + bcWithAllowanceInfo); - bs.writeLog("allowanceIdWithKqxmInfo : " + allowanceIdWithKqxmInfo); //获取待新增的津贴数据 List> allowanceInfoList = createAllowanceInfo(cqData, empIdWithAllowanceInfo, bcWithAllowanceInfo, allowanceIdWithKqxmInfo); bs.writeLog("allowanceInfoList_size : " + allowanceInfoList.size()); @@ -188,13 +190,10 @@ public class AllowanceServiceImpl extends Service implements AllowanceService { Map allowanceInfoItem; //获取加班类型的考勤项目,并构建项目id和核算单位映射关系 Map jbKqxmUnitInfo = collectKqxmUnitInfo(AttendanceItemTypeEnum.WORK_OVERTIME.getKey()); - bs.writeLog("jbKqxmUnitInfo : " + jbKqxmUnitInfo); //获取津贴类型的考勤项目,并构建项目id和核算单位映射关系 Map jtKqxmUnitInfo = collectKqxmUnitInfo(AttendanceItemTypeEnum.ALLOWANCE.getKey()); - bs.writeLog("jtKqxmUnitInfo : " + jtKqxmUnitInfo); //获取津贴类型的考勤项目,并构建项目id和核算量映射关系 Map jtKqxmCountScaleInfo = collectKqxmCountScaleInfo(AttendanceItemTypeEnum.ALLOWANCE.getKey()); - bs.writeLog("jtKqxmCountScaleInfo : " + jtKqxmCountScaleInfo); //遍历出勤结果 for (Map map : cqData) { String empId = map.get("ygid").toString(); @@ -214,10 +213,8 @@ public class AllowanceServiceImpl extends Service implements AllowanceService { } //收集下出勤结果中项目1-8存在的项目id List kqxmIdsWithCq = collectKqxmIdsByCq(map); - bs.writeLog("kqxmIdsWithCq : " + kqxmIdsWithCq); //收集下出勤结果中进出时间,仅收集进出两个时间点都有的数据 List> jcInfoList = collectJcInfoByCq(map); - bs.writeLog("jcInfoList : " + jcInfoList); //收集下出勤结果中,项目1-8中累积的加班时长,处理成分钟数 Integer overtimeMinutes = collectOvertimeMinutes(map, jbKqxmUnitInfo); bs.writeLog("overtimeMinutes : " + overtimeMinutes); @@ -227,23 +224,25 @@ public class AllowanceServiceImpl extends Service implements AllowanceService { double cqsc = Util.null2String(map.get("cqsc")).equals("") ? 0 : Double.parseDouble(map.get("cqsc").toString()); //获取班次班段时间范围 List> bcTimeRangeList = collectBcTimeRangeInfo(Util.null2String(map.get("bcbdxx"))); - bs.writeLog("bcTimeRangeList : " + bcTimeRangeList); //遍历该出勤结果中班次、人员都关联的津贴项目 for(String allowanceId : allowanceIdsByBc) { Map allowanceInfo = allowanceIdWithKqxmInfo.get(allowanceId); - bs.writeLog("allowanceInfo : " + allowanceInfo); //项目1-8中出现以下考勤项目时,津贴失效 String banKqxm = Util.null2String(allowanceInfo.get("bxsdxm")); List banKqxmList = new ArrayList<>(); if (!banKqxm.equals("")) { banKqxmList = Arrays.asList(banKqxm.split(",")); } + //出勤日期 + String cqRq = Util.null2String(map.get("rq")); //正常工作时长计入核算量_标识,0-否,1-是 String includeDailyWorkHours = Util.null2String(allowanceInfo.get("ljbcngzsj")); //检查特定时间点是否在岗_标识,0-否,1-是 String checkOneTimeOnDuty = Util.null2String(allowanceInfo.get("xysjd")); //特定在岗时间点 String onDutyTime = Util.null2String(allowanceInfo.get("sjd")); + //判断特定在岗时间点指向日期 + String onDutyDate = getOnDutyDate(bcTimeRangeList, onDutyTime, cqRq); //时间点之前的时长也计入核算量_标识,0-否,1-是 String includeHoursBeforeDutyTime = Util.null2String(allowanceInfo.get("jljxysjdzqdsc")); //起算分钟数(不包含) @@ -267,8 +266,10 @@ public class AllowanceServiceImpl extends Service implements AllowanceService { //2-如果勾选“检查特定时间点是否在岗”,则需要判断员工当天“须要在岗的时间点”所设置的时间员工是否在岗 if (checkOneTimeOnDuty.equals("1") && !onDutyTime.equals("")) { boolean onDuty = false; + //将特殊在岗时间点拼接上日期 + String onDutyTimeWithDate = onDutyDate + " " + onDutyTime; for (Map jcInfo : jcInfoList) { - if (onDutyTime.compareTo(jcInfo.get("signIn")) >= 0 && onDutyTime.compareTo(jcInfo.get("signOut")) <= 0) { + if (onDutyTimeWithDate.compareTo(jcInfo.get("signIn")) >= 0 && onDutyTimeWithDate.compareTo(jcInfo.get("signOut")) <= 0) { onDuty = true; break; } @@ -289,7 +290,7 @@ public class AllowanceServiceImpl extends Service implements AllowanceService { countMinutes = countMinutes + cqsc * 60; } } else { - countMinutes = getMinutesWithAfterPointTime(bcTimeRangeList, jcInfoList, overtimeMinutes, onDutyTime, includeDailyWorkHours); + countMinutes = getMinutesWithAfterPointTime(cqRq, bcTimeRangeList, jcInfoList, overtimeMinutes, onDutyTimeWithDate, includeDailyWorkHours); } } else { //未勾选“检查特定时间点是否在岗” @@ -331,13 +332,13 @@ public class AllowanceServiceImpl extends Service implements AllowanceService { allowanceInfoItem = new HashMap<>(); allowanceInfoItem.put("szjg", Util.null2String(map.get("szjg"))); allowanceInfoItem.put("yg", Util.null2String(map.get("ygid"))); - allowanceInfoItem.put("rq", Util.null2String(map.get("rq"))); + allowanceInfoItem.put("rq", cqRq); allowanceInfoItem.put("bc", Util.null2String(map.get("bc"))); allowanceInfoItem.put("jtlx", allowanceId); if (!allowanceUnit.equals(AccountingUnitEnum.ONCE.getKey())) { allowanceInfoItem.put("sc", String.format("%.2f", sc)); } else { - allowanceInfoItem.put("sc", "0"); + allowanceInfoItem.put("sc", "1"); } allowanceInfoList.add(allowanceInfoItem); } @@ -348,17 +349,49 @@ public class AllowanceServiceImpl extends Service implements AllowanceService { return allowanceInfoList; } + + /** + * 获取当前出勤数据指向的津贴所属日期 + * @param bcTimeRangeList 班次班段时间区间 + * @param onDutyTime 特殊在岗时间点 + * @param cqRq 出勤结果中出勤日期 + * @return + */ + private String getOnDutyDate(List> bcTimeRangeList, String onDutyTime, String cqRq) { + boolean currentDateSign = false; + if (!onDutyTime.equals("")) { + for (Map bcTime : bcTimeRangeList) { + if (currentDateSign) { + break; + } + if (onDutyTime.compareTo(bcTime.get("startTime")) >= 0) { + currentDateSign = true; + } + } + } else { + return cqRq; + } + if (currentDateSign) { + return cqRq; + } else { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); // 时间格式 + LocalDate date = LocalDate.parse(cqRq, formatter); // 解析为LocalDate对象 + LocalDate nextDay = date.plusDays(1); // 将日期加一天 + return nextDay.format(formatter); + } + } + /** * 获取考虑特殊在岗时间点情况下的考核时长分钟数 * 勾选在岗时间点时, * 1-处于班次工作时间段时,结合进出时间和班次班段判断班段时间内实际工作分钟数 * 2-处于加班时间段内,结合进出时间记录,累加 * @param overtimeMinutes - * @param onDutyTime + * @param onDutyTimeWithDate * @return */ - private double getMinutesWithAfterPointTime(List> bcTimeRangeList, List> jcInfoList, - Integer overtimeMinutes, String onDutyTime, String includeDailyWorkHours) { + private double getMinutesWithAfterPointTime(String cqRq, List> bcTimeRangeList, List> jcInfoList, + Integer overtimeMinutes, String onDutyTimeWithDate, String includeDailyWorkHours) { double bcOnDutyMinutes = 0; double realOverWorkMinutes = 0; if (includeDailyWorkHours.equals("1")) { @@ -369,8 +402,9 @@ public class AllowanceServiceImpl extends Service implements AllowanceService { for (Map bcTime : bcTimeRangeList) { String realStartTime = ""; String realEndTime = ""; - String startTime = bcTime.get("startTime"); - String endTime = bcTime.get("endTime"); + //给班次时间拼接下出勤日期 + String startTime = cqRq + " " + bcTime.get("startTime"); + String endTime = cqRq + " " + bcTime.get("endTime"); for (Map jcTime : jcInfoList) { String signInTime = jcTime.get("signIn"); String signOutTime = jcTime.get("signOut"); @@ -400,19 +434,19 @@ public class AllowanceServiceImpl extends Service implements AllowanceService { } //遍历获取班次班段时间内的累计时长(某一在岗时间点之后的时间) for (Map bcRealTimeInfo : bcRealOnDutyTimeRange) { - if (onDutyTime.compareTo(bcRealTimeInfo.get("startTime")) <= 0) { + if (onDutyTimeWithDate.compareTo(bcRealTimeInfo.get("startTime")) <= 0) { bcOnDutyMinutes = bcOnDutyMinutes + getMinutesByTwo(bcRealTimeInfo.get("startTime"), bcRealTimeInfo.get("endTime")); - } else if (onDutyTime.compareTo(bcRealTimeInfo.get("startTime")) >= 0 && onDutyTime.compareTo(bcRealTimeInfo.get("endTime")) <= 0) { - bcOnDutyMinutes = bcOnDutyMinutes + getMinutesByTwo(onDutyTime, bcRealTimeInfo.get("endTime")); + } else if (onDutyTimeWithDate.compareTo(bcRealTimeInfo.get("startTime")) >= 0 && onDutyTimeWithDate.compareTo(bcRealTimeInfo.get("endTime")) <= 0) { + bcOnDutyMinutes = bcOnDutyMinutes + getMinutesByTwo(onDutyTimeWithDate, bcRealTimeInfo.get("endTime")); } } } //判断在岗时间点和加班时间区间的关系,即进出打卡记录是否与在岗时间点有包含关系,分情况累计时间 for (Map jcInfo : jcInfoList) { - if (onDutyTime.compareTo(jcInfo.get("signIn")) <= 0) { + if (onDutyTimeWithDate.compareTo(jcInfo.get("signIn")) <= 0) { realOverWorkMinutes = realOverWorkMinutes + getMinutesByTwo(jcInfo.get("signIn"), jcInfo.get("signOut")); - } else if (onDutyTime.compareTo(jcInfo.get("signIn")) >= 0 && onDutyTime.compareTo(jcInfo.get("signOut")) <= 0) { - realOverWorkMinutes = realOverWorkMinutes + getMinutesByTwo(onDutyTime, jcInfo.get("signOut")); + } else if (onDutyTimeWithDate.compareTo(jcInfo.get("signIn")) >= 0 && onDutyTimeWithDate.compareTo(jcInfo.get("signOut")) <= 0) { + realOverWorkMinutes = realOverWorkMinutes + getMinutesByTwo(onDutyTimeWithDate, jcInfo.get("signOut")); } } //实际加班时长累计的核算分钟数,不可以超过项目1-8累计的加班时长分钟数 @@ -423,12 +457,31 @@ public class AllowanceServiceImpl extends Service implements AllowanceService { } private double getMinutesByTwo(String startTime, String endTime) { - LocalTime time1 = LocalTime.of(Integer.parseInt(startTime.split(":")[0]), Integer.parseInt(startTime.split(":")[1])); - LocalTime time2 = LocalTime.of(Integer.parseInt(endTime.split(":")[0]), Integer.parseInt(endTime.split(":")[1])); - Duration duration = Duration.between(time1, time2); + List startInfoList = Arrays.asList(startTime.split("\\s+|-|:")); + List endInfoList = Arrays.asList(endTime.split("\\s+|-|:")); + + LocalDateTime dateTime1 = LocalDateTime.of(Integer.parseInt(startInfoList.get(0)), + Integer.parseInt(replaceFirstChar(startInfoList.get(1),"0", "")), + Integer.parseInt(replaceFirstChar(startInfoList.get(2),"0", "")), + Integer.parseInt(replaceFirstChar(startInfoList.get(3),"0", "")), + Integer.parseInt(replaceFirstChar(startInfoList.get(4),"0", ""))); + LocalDateTime dateTime2 = LocalDateTime.of(Integer.parseInt(endInfoList.get(0)), + Integer.parseInt(replaceFirstChar(endInfoList.get(1),"0", "")), + Integer.parseInt(replaceFirstChar(endInfoList.get(2),"0", "")), + Integer.parseInt(replaceFirstChar(endInfoList.get(3),"0", "")), + Integer.parseInt(replaceFirstChar(endInfoList.get(4),"0", ""))); + + Duration duration = Duration.between(dateTime1, dateTime2); // 获取分钟数 return duration.toMinutes(); } + public static String replaceFirstChar(String original, String target, String replacement) { + int index = original.indexOf(target); + if (index == -1) { + return original; // 如果没有找到目标字符,返回原字符串 + } + return original.substring(0, index) + replacement + original.substring(index + 1); + } private List> collectBcTimeRangeInfo(String bcbdxx) { List> timeRangeInfo = new ArrayList<>(); @@ -489,140 +542,36 @@ public class AllowanceServiceImpl extends Service implements AllowanceService { private List> collectJcInfoByCq(Map cqMap) { List> jcInfoList = new ArrayList<>(); - String j1 = Util.null2String(cqMap.get("j1")); - String j2 = Util.null2String(cqMap.get("j2")); - String j3 = Util.null2String(cqMap.get("j3")); - String j4 = Util.null2String(cqMap.get("j4")); - String j5 = Util.null2String(cqMap.get("j5")); - String j6 = Util.null2String(cqMap.get("j6")); - String j7 = Util.null2String(cqMap.get("j7")); - String j8 = Util.null2String(cqMap.get("j8")); - String c1 = Util.null2String(cqMap.get("c1")); - String c2 = Util.null2String(cqMap.get("c2")); - String c3 = Util.null2String(cqMap.get("c3")); - String c4 = Util.null2String(cqMap.get("c4")); - String c5 = Util.null2String(cqMap.get("c5")); - String c6 = Util.null2String(cqMap.get("c6")); - String c7 = Util.null2String(cqMap.get("c7")); - String c8 = Util.null2String(cqMap.get("c8")); + String singIn = ""; + String signOut = ""; Map itemMap; - if (!j1.equals("") && !c1.equals("")) { - itemMap = new HashMap<>(); - itemMap.put("signIn", j1.substring(0, 5)); - itemMap.put("signOut", c1.substring(0, 5)); - jcInfoList.add(itemMap); - } else { - return jcInfoList; - } - if (!j2.equals("") && !c2.equals("")) { - itemMap = new HashMap<>(); - itemMap.put("signIn", j2.substring(0, 5)); - itemMap.put("signOut", c2.substring(0, 5)); - jcInfoList.add(itemMap); - } else { - return jcInfoList; - } - if (!j3.equals("") && !c3.equals("")) { - itemMap = new HashMap<>(); - itemMap.put("signIn", j3.substring(0, 5)); - itemMap.put("signOut", c3.substring(0, 5)); - jcInfoList.add(itemMap); - } else { - return jcInfoList; - } - if (!j4.equals("") && !c4.equals("")) { - itemMap = new HashMap<>(); - itemMap.put("signIn", j4.substring(0, 5)); - itemMap.put("signOut", c4.substring(0, 5)); - jcInfoList.add(itemMap); - } else { - return jcInfoList; - } - if (!j5.equals("") && !c5.equals("")) { - itemMap = new HashMap<>(); - itemMap.put("signIn", j5.substring(0, 5)); - itemMap.put("signOut", c5.substring(0, 5)); - jcInfoList.add(itemMap); - } else { - return jcInfoList; - } - if (!j6.equals("") && !c6.equals("")) { - itemMap = new HashMap<>(); - itemMap.put("signIn", j6.substring(0, 5)); - itemMap.put("signOut", c6.substring(0, 5)); - jcInfoList.add(itemMap); - } else { - return jcInfoList; - } - if (!j7.equals("") && !c7.equals("")) { - itemMap = new HashMap<>(); - itemMap.put("signIn", j7.substring(0, 5)); - itemMap.put("signOut", c7.substring(0, 5)); - jcInfoList.add(itemMap); - } else { - return jcInfoList; - } - if (!j8.equals("") && !c8.equals("")) { - itemMap = new HashMap<>(); - itemMap.put("signIn", j8.substring(0, 5)); - itemMap.put("signOut", c8.substring(0, 5)); - jcInfoList.add(itemMap); - } else { - return jcInfoList; + for (int i = 1; i <= 8; i++) { + singIn = Util.null2String(cqMap.get("j" + i)); + signOut = Util.null2String(cqMap.get("c" + i)); + if (!singIn.equals("") && !signOut.equals("")) { + itemMap = new HashMap<>(); + itemMap.put("signIn", singIn.substring(0, 16)); + itemMap.put("signOut", signOut.substring(0, 16)); + jcInfoList.add(itemMap); + } else if (singIn.equals("") && signOut.equals("")){ + break; + } } return jcInfoList; } private List collectKqxmIdsByCq(Map cqMap) { List kqxmIdsWithCq = new ArrayList<>(); - String xm1 = Util.null2String(cqMap.get("xm1")); - String xm2 = Util.null2String(cqMap.get("xm2")); - String xm3 = Util.null2String(cqMap.get("xm3")); - String xm4 = Util.null2String(cqMap.get("xm4")); - String xm5 = Util.null2String(cqMap.get("xm5")); - String xm6 = Util.null2String(cqMap.get("xm6")); - String xm7 = Util.null2String(cqMap.get("xm7")); - String xm8 = Util.null2String(cqMap.get("xm8")); - if (!xm1.equals("")) { - kqxmIdsWithCq.add(xm1); - } else { - return kqxmIdsWithCq; - } - if (!xm2.equals("")) { - kqxmIdsWithCq.add(xm2); - } else { - return kqxmIdsWithCq; - } - if (!xm3.equals("")) { - kqxmIdsWithCq.add(xm3); - } else { - return kqxmIdsWithCq; - } - if (!xm4.equals("")) { - kqxmIdsWithCq.add(xm4); - } else { - return kqxmIdsWithCq; - } - if (!xm5.equals("")) { - kqxmIdsWithCq.add(xm5); - } else { - return kqxmIdsWithCq; - } - if (!xm6.equals("")) { - kqxmIdsWithCq.add(xm6); - } else { - return kqxmIdsWithCq; - } - if (!xm7.equals("")) { - kqxmIdsWithCq.add(xm7); - } else { - return kqxmIdsWithCq; - } - if (!xm8.equals("")) { - kqxmIdsWithCq.add(xm8); - } else { - return kqxmIdsWithCq; + String xmId = ""; + for (int i = 1; i <= 8; i++) { + xmId = Util.null2String(cqMap.get("xm" + i)); + if (!xmId.equals("")) { + kqxmIdsWithCq.add(xmId); + } else { + break; + } } return kqxmIdsWithCq; + } }