diff --git a/src/com/engine/jucailinkq/attendance/workflow/action/OvertimePlanCheckAction.java b/src/com/engine/jucailinkq/attendance/workflow/action/OvertimePlanCheckAction.java index 744dac8..586192d 100644 --- a/src/com/engine/jucailinkq/attendance/workflow/action/OvertimePlanCheckAction.java +++ b/src/com/engine/jucailinkq/attendance/workflow/action/OvertimePlanCheckAction.java @@ -15,6 +15,7 @@ import weaver.general.Util; import weaver.interfaces.workflow.action.Action; import weaver.soa.workflow.request.RequestInfo; +import java.time.ZoneOffset; import java.util.*; import java.util.stream.Collectors; @@ -35,13 +36,25 @@ public class OvertimePlanCheckAction implements Action { // 流程表单明细表数据 List> detailTableData = CommonUtil.getDetailTableInfo(requestInfo,0); log.info("OvertimePlanCheckAction_start, detailTableData_size : {}",detailTableData.size()); + log.info("detailTableData : [{}]", detailTableData); //加班人员 - String jbry = mainTableData.get("jbry"); +// String jbry = mainTableData.get("jbry"); String mainStartDate = Util.null2String(mainTableData.get("ksrq")); String mainEndDate = Util.null2String(mainTableData.get("jsrq")); try { + List startDateList = detailTableData.stream().map(map -> map.get("ksrq")).collect(Collectors.toList()); + List endDateList = detailTableData.stream().map(map -> map.get("jsrq")).collect(Collectors.toList()); + if (startDateList.size() == 0 || endDateList.size() == 0) { + log.error("明细表数据缺少加班起始或者结束日期!"); + requestInfo.getRequestManager().setMessageid("11111" + requestid + "22222"); + requestInfo.getRequestManager().setMessagecontent("明细表数据缺少加班起始或者结束日期!"); + return Action.FAILURE_AND_CONTINUE; + } + mainStartDate = startDateList.stream().min(Comparator.comparing(e->DateUtil.getTime(e).toInstant(ZoneOffset.of("+8")).toEpochMilli())).get(); + mainEndDate = endDateList.stream().max(Comparator.comparing(e->DateUtil.getTime(e).toInstant(ZoneOffset.of("+8")).toEpochMilli())).get(); //获取人员id和姓名信息 - List empIdList = Arrays.asList(jbry.split(",")); +// List empIdList = Arrays.asList(jbry.split(",")); + List empIdList = detailTableData.stream().map(map -> map.get("jbry")).collect(Collectors.toList()); Map empIdToNameInfo = CommonUtil.empIdToNameInfo(empIdList); //获取作用时段包含计划加班的加班类型的考勤项目集合 String sql = "select id,mc, bddrqlx, jbqsfzs, xzzjbsc, rzdjbxss, zzdjbxss, yzdjbxss, zysd, ccclfs from uf_jcl_kq_kqxm where xmlx = ?"; @@ -121,6 +134,36 @@ public class OvertimePlanCheckAction implements Action { if (overtimeDetailList == null || overtimeDetailList.size() == 0) { continue; } + //校验该组加班明细之间是否有时间重叠情况 + if (overtimeDetailList.size() > 1) { + boolean overlappingSign; + Map targetOvertimeDetail; + Map compareOvertimeDetail; + String targetStartTime; + String targetEndTime; + String compareStartTime; + String compareEndTime; + for (int i = 0; i < overtimeDetailList.size() - 1; i++) { + targetOvertimeDetail = overtimeDetailList.get(i); + targetStartTime = targetOvertimeDetail.get("ksrq") + " " + targetOvertimeDetail.get("kssj"); + targetEndTime = targetOvertimeDetail.get("jsrq") + " " + targetOvertimeDetail.get("jssj"); + for (int j = i + 1; j < overtimeDetailList.size(); j++) { + compareOvertimeDetail = overtimeDetailList.get(j); + compareStartTime = compareOvertimeDetail.get("ksrq") + " " + compareOvertimeDetail.get("kssj"); + compareEndTime = compareOvertimeDetail.get("jsrq") + " " + compareOvertimeDetail.get("jssj"); + //判断两组时段是否有重叠时段 + overlappingSign = DateUtil.isOverlapping(targetStartTime, targetEndTime, compareStartTime, compareEndTime); + if (overlappingSign) { + String message = Util.null2String(empIdToNameInfo.get(empId)) + "在日期" + targetOvertimeDetail.get("ksrq") + "的加班计划和本次提交的其他加班计划存在时间重叠,不允许申请加班!"; + log.error(message); + requestInfo.getRequestManager().setMessageid("11111" + requestid + "22222"); + requestInfo.getRequestManager().setMessagecontent(message); + return Action.FAILURE_AND_CONTINUE; + } + } + } + } + Map weekOvertimeInfo = new HashMap<>(); Map monthOvertimeInfo = new HashMap<>(); for (Map overtimeDetailItem : overtimeDetailList) { @@ -132,14 +175,14 @@ public class OvertimePlanCheckAction implements Action { //排班和日历都无法获取时,默认为工作日 belongDateType = "".equals(belongDateType) ? DateTypeEnum.WORK_DAY.getKey() : belongDateType; String startDate = overtimeDetailItem.get("ksrq"); - String startTime = overtimeDetailItem.get("ksrq"); + String startTime = overtimeDetailItem.get("kssj"); String endDate = overtimeDetailItem.get("jsrq"); String endTime = overtimeDetailItem.get("jssj"); String jbsc = overtimeDetailItem.get("jbsc"); double overtimeMinutes = Double.parseDouble(jbsc) * 60; String jblxId = overtimeDetailItem.getOrDefault("jblx", ""); matchItemInfo = jblxInfo.getOrDefault(jblxId, new HashMap<>()); - //判断改组明细是否与已存在的加班计划有重叠 + //判断该组明细是否与已存在的加班计划有重叠 boolean overLappingSign = checkOverlapping(existOvertimePlanList, startDate + " " +startTime, endDate + " " + endTime); if (overLappingSign) { String message = Util.null2String(empIdToNameInfo.get(empId)) + "在日期" + startDate + "的加班计划区间和已申请的加班计划(已审核/待审核)出现时间重叠,不允许申请加班!";