diff --git a/src/com/engine/jucailinkq/attendance/workflow/service/impl/OvertimePlanServiceImpl.java b/src/com/engine/jucailinkq/attendance/workflow/service/impl/OvertimePlanServiceImpl.java index 0f4dc26..1ec7ae6 100644 --- a/src/com/engine/jucailinkq/attendance/workflow/service/impl/OvertimePlanServiceImpl.java +++ b/src/com/engine/jucailinkq/attendance/workflow/service/impl/OvertimePlanServiceImpl.java @@ -55,7 +55,7 @@ public class OvertimePlanServiceImpl extends Service implements OvertimePlanServ Map detailItem; String sql = ""; //获取作用时段包含计划加班的加班类型的考勤项目集合 - sql = "select id,mc, bddrqlx from uf_jcl_kq_kqxm where xmlx = ? and zysd = ?"; + sql = "select id,mc, bddrqlx, jbqsfzs,xzzjbsc,rzdjbxss,zzdjbxss,yzdjbxss from uf_jcl_kq_kqxm where xmlx = ? and zysd = ?"; List> jblxAttendanceList = DbTools.getSqlToList(sql, AttendanceItemTypeEnum.WORK_OVERTIME.getKey(), WorkForTimeEnum.PLAN_WORK_OVERTIME.getKey()); //获取人员id和姓名信息 Map empIdToNameInfo = CommonUtil.empIdToNameInfo(empIdList); @@ -158,9 +158,35 @@ public class OvertimePlanServiceImpl extends Service implements OvertimePlanServ boolean beforeDayOverLap = !"".equals(beforeDayStartToEnd) && DateUtil.isOverlapping(date + " " + startTime, realEndDate + " " + endTime, beforeDayStartTime, beforeDayEndTime); boolean nextDayOverLap = !"".equals(nextDayStartToEnd) && DateUtil.isOverlapping(date + " " + startTime, realEndDate + " " + endTime, nextDayStartTime, nextDayEndTime); if ((!currentDayRestBc && currentDayOverLap) || (!beforeDayRestBc && beforeDayOverLap) || (!nextDayRestBc && nextDayOverLap)) { - //4-非休息班次,出现重叠时间,属于不合理加班安排,返回报错 - errorMessage.add(Util.null2String(empIdToNameInfo.get(empId)) + "在日期" + date + "的加班计划区间和非休息班次班段出现时间重叠,不允许申请加班!"); - continue; + //20240814需求变更。非休息班次,出现重叠时间,自动调整加班开始或结束时间,并返回提示 + Map adjustInfo = new HashMap<>(); + adjustInfo.put("startWithAdjust", date + " " + startTime); + adjustInfo.put("endWithAdjust", realEndDate + " " + endTime); + //处理前一天 + if(beforeDayOverLap) { + belongDate = DateUtil.beforeDay(date, 1); + adjustInfo = doAdjust(adjustInfo, beforeDayStartTime, beforeDayEndTime); + } + //处理当天 + if(currentDayOverLap) { + belongDate = "".equals(belongDate) ? date : belongDate; + adjustInfo = doAdjust(adjustInfo, currentDayStartTime, currentDayEndTime); + } + //处理次日 + if(nextDayOverLap) { + belongDate = "".equals(belongDate) ? DateUtil.AfterDay(date, 1) : belongDate; + adjustInfo = doAdjust(adjustInfo, nextDayStartTime, nextDayEndTime); + } + //重置加班开始和结束时间、加班时长 + detailItem.put("ksrq", adjustInfo.get("startDate")); + detailItem.put("kssj", adjustInfo.get("startTime")); + detailItem.put("jssj", adjustInfo.get("endTime")); + detailItem.put("jsrq", adjustInfo.get("endDate")); + overtimeMinutes = DateUtil.getBetWeenMinutes(adjustInfo.get("startWithAdjust"), adjustInfo.get("endWithAdjust")); + detailItem.put("jbsc", String.format("%.2f", overtimeMinutes / 60.0)); + //4-非休息班次,出现重叠时间,属于不合理加班安排,返回提示”已自动调整开始和结束时间点“ + errorMessage.add(Util.null2String(empIdToNameInfo.get(empId)) + "在日期" + date + "的加班计划区间和非休息班次班段出现时间重叠,已自动调整开始和结束时间点!"); + //5-加班区间和休息班次出现重叠,首次重叠的日期,即为归属日期 } else if (beforeDayRestBc && beforeDayOverLap) { belongDate = DateUtil.beforeDay(date, 1); @@ -182,17 +208,51 @@ public class OvertimePlanServiceImpl extends Service implements OvertimePlanServ //获取人员在归属日被设置的考勤项目 List> attendanceItemSetList = CommonUtil.getAttendanceItemsByEmpIdDate(empId, belongDate); List kqxmSetIds = attendanceItemSetList.stream().map(f->f.get("keyid").toString()).collect(Collectors.toList()); - + Map matchItemInfo = new HashMap<>(); for (Map attendanceItemInfo : jblxAttendanceList) { //判断该加班类型考勤项目是否被该人员使用,且考勤项目的绑定的日期类型是否包含归属日期类型 if (kqxmSetIds.contains(Util.null2String(attendanceItemInfo.get("id"))) && Util.null2String(attendanceItemInfo.get("bddrqlx")).contains(belongDateType)) { detailItem.put("jblx", Util.null2String(attendanceItemInfo.get("id"))); detailItem.put("jblxName", Util.null2String(attendanceItemInfo.get("mc"))); + matchItemInfo = attendanceItemInfo; } } detailItem.put("gsrq", belongDate); + //20240814需求变更。增加单条明细的最小加班分钟数校验,工作日加班最大小时数、周加班最大小时数、月加班最大小时数 + if (matchItemInfo.size() == 0) { + errorMessage.add(Util.null2String(empIdToNameInfo.get(empId)) + "在日期" + date + "的加班计划未匹配到合适的加班类型!"); + continue; + } else { + String minMinutes = Util.null2String(matchItemInfo.get("jbqsfzs")); + if (!"".equals(minMinutes) && Integer.parseInt(minMinutes) > overtimeMinutes) { + //最小加班分钟数大于单条明细的加班时长分钟数 + errorMessage.add(Util.null2String(empIdToNameInfo.get(empId)) + "在日期" + date + "的加班分钟数小于加班类型-" + + Util.null2String(matchItemInfo.get("mc")) +"设置的最小加班分钟数!"); + continue; + } + String limitTotalOvertimeSc = Util.null2String(matchItemInfo.get("xzzjbsc")); + if ("1".equals(limitTotalOvertimeSc)) { + String limitWorkDayHours = Util.null2String(matchItemInfo.get("rzdjbxss")); + String limitWeekHours = Util.null2String(matchItemInfo.get("zzdjbxss")); + String limitMonthHours = Util.null2String(matchItemInfo.get("yzdjbxss")); + //判断是否满足工作日加班最大小时数 + boolean needCheckWorkDayHours = !"".equals(limitWorkDayHours) && (belongDateType.equals(DateTypeEnum.WORK_DAY.getKey()) || belongDateType.equals(DateTypeEnum.CHANGECLASS.getKey())); + if (needCheckWorkDayHours && Double.compare(Double.parseDouble(limitWorkDayHours), overtimeMinutes / 60.0) < 0) { + errorMessage.add(Util.null2String(empIdToNameInfo.get(empId)) + "在日期" + date + "的加班时长加班类型-" + + Util.null2String(matchItemInfo.get("mc")) +"设置的工作日加班最大小时数!"); + continue; + } + //判断是否满足周加班最大小时数 + if (!"".equals(limitWeekHours)) { + } + //判断是否满足月加班最大小时数 + if (!"".equals(limitMonthHours)) { + + } + } + } overtimePlanDetailList.add(detailItem); } } @@ -214,6 +274,28 @@ public class OvertimePlanServiceImpl extends Service implements OvertimePlanServ return resultMap; } + private Map doAdjust(Map adjustInfo, String bcStartTime, String bcEndTime) { + String startWithAdjust = adjustInfo.get("startWithAdjust"); + String endWithAdjust = adjustInfo.get("endWithAdjust"); + //加班区间完全包含了班次区间时 + if (bcStartTime.compareTo(startWithAdjust) > 0 && bcEndTime.compareTo(endWithAdjust) < 0) { + startWithAdjust = bcEndTime; + } else { + //加班区间与部分班次区间重叠时 + startWithAdjust = bcStartTime.compareTo(startWithAdjust) <= 0 && bcEndTime.compareTo(startWithAdjust) > 0 + ? bcEndTime : startWithAdjust; + endWithAdjust = bcStartTime.compareTo(endWithAdjust) < 0 && bcEndTime.compareTo(endWithAdjust) >= 0 + ? bcStartTime : endWithAdjust; + } + adjustInfo.put("startWithAdjust", startWithAdjust); + adjustInfo.put("endWithAdjust", endWithAdjust); + adjustInfo.put("startDate", startWithAdjust.split(" ")[0]); + adjustInfo.put("startTime", startWithAdjust.split(" ")[1]); + adjustInfo.put("endDate", endWithAdjust.split(" ")[0]); + adjustInfo.put("endTime", endWithAdjust.split(" ")[1]); + return adjustInfo; + } + private boolean checkRestBc(String bcId) { boolean restSign = false; if (!"".equals(bcId)) {