From 6b0f1e6e6cc61f20752165e17d43f43e6cf37652 Mon Sep 17 00:00:00 2001 From: sy Date: Wed, 6 Nov 2024 14:03:44 +0800 Subject: [PATCH] =?UTF-8?q?=E8=80=83=E5=8B=A4-=E8=AF=B7=E5=81=87=E3=80=81?= =?UTF-8?q?=E5=87=BA=E5=B7=AE=E6=B5=81=E7=A8=8B=EF=BC=8C=E5=85=A8=E5=B1=80?= =?UTF-8?q?=E5=94=AF=E4=B8=80=E6=80=A7=E8=A7=84=E5=88=99=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/AskForLeaveServiceImpl.java | 191 +++++++++++++++- .../impl/BusinessTripsApplyServiceImpl.java | 209 +++++++++++++++++- .../jucailinkq/common/util/CommonUtil.java | 2 +- 3 files changed, 391 insertions(+), 11 deletions(-) diff --git a/src/com/engine/jucailinkq/attendance/workflow/service/impl/AskForLeaveServiceImpl.java b/src/com/engine/jucailinkq/attendance/workflow/service/impl/AskForLeaveServiceImpl.java index 53ed9fe..d88ec39 100644 --- a/src/com/engine/jucailinkq/attendance/workflow/service/impl/AskForLeaveServiceImpl.java +++ b/src/com/engine/jucailinkq/attendance/workflow/service/impl/AskForLeaveServiceImpl.java @@ -167,6 +167,10 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic List unableUseJqyeIdList = new ArrayList<>(); //记录已编辑的请假记录,<人员id-请假类型-日期, 请假时长> Map editedLeaveInfo = new HashMap<>(); + //记录已编辑的人员请假记录,<人员id, 请假信息list> + Map>> editedEmpLeaveInfo = new HashMap<>(); + //20241029需求变更,增加单天请假“全局唯一性”约束规则,此处记录已编辑的人员相关的请假信息 + editedEmpLeaveInfo = detailTableData == null ? new HashMap<>() : detailTableData.stream().collect(Collectors.groupingBy(map -> map.get("qjr"))); //处理明细表1数据,生成触发接口之前编辑内容中已使用的假期额度信息 editedLeaveInfo = dealDetailTableData(detailTableData, leaveDateList, editedUseJqlxWithEmp, editedUseJqed, unableUseJqyeIdList, editedLeaveInfo); //处理主表数据 @@ -277,7 +281,7 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic canUseJqyeInfo.put(item.get("id").toString(), collectUsableHolidayBalance(unableUseJqyeIdList, editedUseJqed, item, startDate, entry.getKey(), empIdToName.get(entry.getKey()), modeId, errorMessage)); } List> detailListItem = matchHolidayWithPriority(editedLeaveInfo, checkAmountJqIdList, errorMessage, entry.getKey(), - empIdToName.get(entry.getKey()), canUseJqyeInfo, holidayPriorityItemList, editedUseJqed, editedUseJqlxWithEmp, entry.getValue()); + empIdToName.get(entry.getKey()), canUseJqyeInfo, holidayPriorityItemList, editedUseJqed, editedUseJqlxWithEmp, entry.getValue(), editedEmpLeaveInfo.get(entry.getKey())); if (detailListItem.size() > 0) { completeLeaveDetailList.addAll(detailListItem); } @@ -320,7 +324,8 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic * @param editedLeaveInfo 记录记录已编辑的请假记录,<人员id-请假类型-日期, 请假时长> * @return 处理明细表1数据,生成触发接口之前编辑内容中已使用的假期额度信息 */ - private Map dealDetailTableData(List> detailTableData, List leaveDateList, Map editedUseJqlxWithEmp, Map editedUseJqed, List unableUseJqyeIdList, Map editedLeaveInfo) { + private Map dealDetailTableData(List> detailTableData, List leaveDateList, Map editedUseJqlxWithEmp, + Map editedUseJqed, List unableUseJqyeIdList, Map editedLeaveInfo) { if (detailTableData != null && detailTableData.size() > 0){ for (Map detailItem : detailTableData) { if (leaveDateList.contains(Util.null2String(detailItem.get("ksrq")))) { @@ -806,7 +811,7 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic */ private List> matchHolidayWithPriority(Map editedLeaveInfo, List checkAmountJqIdList, List errorMessage, String empId, String empName, Map>> canUseJqyeInfo, List> holidayPriorityItemList, Map editedUseJqed, - Map editedUseJqlxWithEmp, List> leaveDetailList) { + Map editedUseJqlxWithEmp, List> leaveDetailList, List> editedLeaveInfoList) { List> result = new ArrayList<>(); //记录分配假期余额的结果 boolean matchResultSign = true; @@ -847,6 +852,13 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic } else{ leaveDuration = Double.parseDouble(Util.null2String(detailData.get("qjsc"))); } + //单日假期“全局唯一性”约束校验 + boolean dailyCheckSign = checkDailyLeaveLicense(empId, empName, detailData, editedLeaveInfoList, leaveDuration, errorMessage); + if (!dailyCheckSign) { + leaveDurationMap.put("totalLeaveDuration", Utils.subtract(leaveDurationMap.get("totalLeaveDuration"), leaveDuration)); + continue; + } + log.info("leaveDuration : [{}]", leaveDuration); leaveDurationMap.put("leaveDuration", leaveDuration); //20241021逻辑变更,按照假期项目级联优先级,由后往前依次分配请假时长 @@ -908,7 +920,7 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic String message = empName; if (jqlxEdited) { //人员id+日期+假期类型三种条件约束唯一性 - message = message + "_" + ksrq + "已存在一笔该请假类型的请假明细!"; + message = message + "_" + ksrq + "本流程中已存在一笔该请假类型的请假明细!"; } else if(!dealSign) { message = message + "_" + ksrq + "不存在可使用的假期余额,请检查假期余额使用次数和最小使用时长设置!"; } else { @@ -922,6 +934,177 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic return matchResultSign ? result : new ArrayList<>(); } + private boolean checkDailyLeaveLicense(String empId, String empName, Map detailData, List> editedLeaveInfoList, + double leaveDuration, List errorMessage) { + //判断当前请假信息属于哪一种请假方式(全天、半天、指定时长、指定区间) + String leaveMode = ""; + if (!"".equals(Util.null2String(detailData.get("kssj")))) { + leaveMode = AskAndEvctionWayEnum.TIME_INTERVAL.getKey(); + } else if ("1".equals(Util.null2String(detailData.get("qtj")))) { + leaveMode = AskAndEvctionWayEnum.ALLDAY.getKey(); + } else if ("1".equals(Util.null2String(detailData.get("btj")))) { + leaveMode = AskAndEvctionWayEnum.HALFDAY.getKey(); + } else { + leaveMode = AskAndEvctionWayEnum.HOUR.getKey(); + } + String ksrq = Util.null2String(detailData.get("ksrq")); + String jsrq = Util.null2String(detailData.get("jsrq")); + String kssj = Util.null2String(detailData.get("kssj")); + String jssj = Util.null2String(detailData.get("jssj")); + //查询数据库中当天存在的请假记录 + List> existLeaveInfo; + String sql = "select b.* from uf_jcl_kq_qjjl a left join uf_jcl_kq_qjjl_dt1 b on b.mainid = a.id where a.jlzt != 2 and b.cxqj = 0 and b.qjry = " + empId; + if (leaveMode.equals(AskAndEvctionWayEnum.TIME_INTERVAL.getKey())) { + sql = sql + " and ((b.ksrq >= ? and b.ksrq <= ?) or (b.jsrq >= ? and b.jsrq <= ?) or (b.ksrq <= ? and b.jsrq >= ?))"; + existLeaveInfo = DbTools.getSqlToList(sql, ksrq, jsrq, ksrq, jsrq, ksrq, jsrq); + } else { + sql = sql + " and b.ksrq <= ? and b.jsrq >= ?"; + existLeaveInfo = DbTools.getSqlToList(sql, ksrq, ksrq); + } + //分析数据库中已存在请假数据 + String message = empName; + double existLeaveSc = 0; + if (existLeaveInfo.size() > 0) { + List> timeIntervalLeaveList = new ArrayList<>(); + List> allDayLeaveList = new ArrayList<>(); + List> otherLeaveList = new ArrayList<>(); + for (Map leaveItem : existLeaveInfo) { + if (!"".equals(Util.null2String(leaveItem.get("kssj")))) { + timeIntervalLeaveList.add(leaveItem); + } else if ("1".equals(Util.null2String(leaveItem.get("qtj")))) { + allDayLeaveList.add(leaveItem); + } else { + otherLeaveList.add(leaveItem); + } + } + if (allDayLeaveList.size() > 0) { + //该日期已存在全天假时 + message = message + "_" + ksrq + "已存在全天假, 不允许再进行任何请假申请!"; + errorMessage.add(message); + return false; + } else if (leaveMode.equals(AskAndEvctionWayEnum.ALLDAY.getKey())) { + //该日期即将生成全天假 + //首先判断,是否已存在区间假信息,且区间假区间与目标日期有重叠时间段,然后判断其他请假方式是由已经存在记录 + List> overlappingList = timeIntervalLeaveList.stream().filter(f -> + DateUtil.isOverlapping(ksrq + " 00:00", ksrq + " 23:59", f.get("ksrq") + " " + f.get("kssj"), f.get("jsrq") + " " + f.get("jssj"))) + .collect(Collectors.toList()); + if (overlappingList.size() > 0 || otherLeaveList.size() > 0) { + message = message + "_" + ksrq + "已存在请假记录, 不允许再进行全天假方式的请假申请!"; + errorMessage.add(message); + return false; + } + } else if (leaveMode.equals(AskAndEvctionWayEnum.TIME_INTERVAL.getKey())) { + //该日期即将生成指定时间区间假 + //首先判断,是否已存在区间假之外的信息,然后判断是否存在区间假且存在交集 + List> overlappingList = timeIntervalLeaveList.stream().filter(f -> + DateUtil.isOverlapping(ksrq + " " + kssj, jsrq + " " + jssj, f.get("ksrq") + " " + f.get("kssj"), f.get("jsrq") + " " + f.get("jssj"))) + .collect(Collectors.toList()); + if (overlappingList.size() > 0 || otherLeaveList.size() > 0) { + message = message + "在" + ksrq + "开始的请假区间内已存在请假记录的区间重叠, 不允许再进行请假申请!"; + errorMessage.add(message); + return false; + } + } else if (leaveMode.equals(AskAndEvctionWayEnum.HALFDAY.getKey()) || leaveMode.equals(AskAndEvctionWayEnum.HOUR.getKey())) { + //该日期即将生成指定时间长度假或者半天假 + //首先判断,是否已存在区间假信息,且区间假区间与目标日期有重叠时间段 + List> overlappingList = timeIntervalLeaveList.stream().filter(f -> + DateUtil.isOverlapping(ksrq + " 00:00", ksrq + " 23:59", f.get("ksrq") + " " + f.get("kssj"), f.get("jsrq") + " " + f.get("jssj"))) + .collect(Collectors.toList()); + if (overlappingList.size() > 0) { + message = message + "_" + ksrq + "已存在指定时间区间请假记录, 不允许再其他方式的请假申请!"; + errorMessage.add(message); + return false; + } + //然后判断其他请假方式是由已经存在记录,结合该类请假记录的已有请假时长之和判断 + if (otherLeaveList.size() > 0) { + existLeaveSc = otherLeaveList.stream().mapToDouble(e->Double.parseDouble(e.getOrDefault("qjsc", "0").toString())).sum(); + if (existLeaveSc + leaveDuration > 8) { + message = message + "_" + ksrq + "已存在共计" + existLeaveSc + "小时的请假记录, 新申请假期累计后已超过8小时!"; + errorMessage.add(message); + return false; + } + } + } + } + //分析当前流程已编辑请假明细中已存在请假数据 + if (editedLeaveInfoList != null && editedLeaveInfoList.size() > 0) { + //筛选出时间范围内的 + if (leaveMode.equals(AskAndEvctionWayEnum.TIME_INTERVAL.getKey())) { + editedLeaveInfoList = editedLeaveInfoList.stream() + .filter(f -> (Util.null2String(f.get("ksrq")).compareTo(ksrq) >= 0 && Util.null2String(f.get("ksrq")).compareTo(jsrq) <= 0) + || (Util.null2String(f.get("jsrq")).compareTo(ksrq) >= 0 && Util.null2String(f.get("jsrq")).compareTo(jsrq) <= 0) + || (Util.null2String(f.get("ksrq")).compareTo(ksrq) <= 0 && Util.null2String(f.get("jsrq")).compareTo(jsrq) >= 0)) + .collect(Collectors.toList()); + } else { + editedLeaveInfoList = editedLeaveInfoList.stream() + .filter(f -> Util.null2String(f.get("ksrq")).compareTo(ksrq) <= 0 && Util.null2String(f.get("jsrq")).compareTo(ksrq) >= 0) + .collect(Collectors.toList()); + } + List> timeIntervalLeaveList = new ArrayList<>(); + List> allDayLeaveList = new ArrayList<>(); + List> otherLeaveList = new ArrayList<>(); + for (Map leaveItem : editedLeaveInfoList) { + if (!"".equals(Util.null2String(leaveItem.get("kssj")))) { + timeIntervalLeaveList.add(leaveItem); + } else if ("1".equals(Util.null2String(leaveItem.get("qtj")))) { + allDayLeaveList.add(leaveItem); + } else { + otherLeaveList.add(leaveItem); + } + } + if (allDayLeaveList.size() > 0) { + //该日期已存在全天假时 + message = message + "_" + ksrq + "在当前流程中已编辑了全天假, 不允许再进行任何请假申请!"; + errorMessage.add(message); + return false; + } else if (leaveMode.equals(AskAndEvctionWayEnum.ALLDAY.getKey())) { + //该日期即将生成全天假 + //首先判断,是否已存在区间假信息,且区间假区间与目标日期有重叠时间段,然后判断其他请假方式是由已经存在记录 + List> overlappingList = timeIntervalLeaveList.stream().filter(f -> + DateUtil.isOverlapping(ksrq + " 00:00", ksrq + " 23:59", f.get("ksrq") + " " + f.get("kssj"), f.get("jsrq") + " " + f.get("jssj"))) + .collect(Collectors.toList()); + if (overlappingList.size() > 0 || otherLeaveList.size() > 0) { + message = message + "_" + ksrq + "在当前流程中已生成了请假记录, 不允许再进行全天假方式的请假申请!"; + errorMessage.add(message); + return false; + } + } else if (leaveMode.equals(AskAndEvctionWayEnum.TIME_INTERVAL.getKey())) { + //该日期即将生成指定时间区间假 + //首先判断,是否已存在区间假之外的信息,然后判断是否存在区间假且存在交集 + List> overlappingList = timeIntervalLeaveList.stream().filter(f -> + DateUtil.isOverlapping(ksrq + " " + kssj, jsrq + " " + jssj, f.get("ksrq") + " " + f.get("kssj"), f.get("jsrq") + " " + f.get("jssj"))) + .collect(Collectors.toList()); + if (overlappingList.size() > 0 || otherLeaveList.size() > 0) { + message = message + "在" + ksrq + "开始的请假区间内已存在请假记录的区间重叠, 不允许再进行请假申请!"; + errorMessage.add(message); + return false; + } + } else if (leaveMode.equals(AskAndEvctionWayEnum.HALFDAY.getKey()) || leaveMode.equals(AskAndEvctionWayEnum.HOUR.getKey())) { + //该日期即将生成指定时间长度假或者半天假 + //首先判断,是否已存在区间假信息,且区间假区间与目标日期有重叠时间段 + List> overlappingList = timeIntervalLeaveList.stream().filter(f -> + DateUtil.isOverlapping(ksrq + " 00:00", ksrq + " 23:59", f.get("ksrq") + " " + f.get("kssj"), f.get("jsrq") + " " + f.get("jssj"))) + .collect(Collectors.toList()); + if (overlappingList.size() > 0) { + message = message + "_" + ksrq + "在当前流程中已存在指定时间区间请假记录, 不允许再其他方式的请假申请!"; + errorMessage.add(message); + return false; + } + //然后判断其他请假方式是由已经存在记录,结合该类请假记录的已有请假时长之和判断 + if (otherLeaveList.size() > 0) { + existLeaveSc = existLeaveSc + otherLeaveList.stream().mapToDouble(e->Double.parseDouble(e.getOrDefault("qjsc", "0").toString())).sum(); + if (existLeaveSc + leaveDuration > 8) { + message = message + "_" + ksrq + "已存在当天请假记录和当前流程已编辑请假明细共计" + existLeaveSc + "小时的请假记录, 新申请假期累计后已超过8小时!"; + errorMessage.add(message); + return false; + } + } + } + } + + return true; + } + private boolean dealLeaveDetailWithJqyeInfo(Map detailData, List> canUseJqyeInfo, Map editedUseJqed, Map leaveDurationMap, String ksrq, String itemId, String itemName, List> result) { diff --git a/src/com/engine/jucailinkq/attendance/workflow/service/impl/BusinessTripsApplyServiceImpl.java b/src/com/engine/jucailinkq/attendance/workflow/service/impl/BusinessTripsApplyServiceImpl.java index 1913831..5d0049f 100644 --- a/src/com/engine/jucailinkq/attendance/workflow/service/impl/BusinessTripsApplyServiceImpl.java +++ b/src/com/engine/jucailinkq/attendance/workflow/service/impl/BusinessTripsApplyServiceImpl.java @@ -79,6 +79,10 @@ public class BusinessTripsApplyServiceImpl extends Service implements BusinessTr List ccDateList = DateUtil.getDatesBetween(startDate, endDate); //记录已编辑的出差记录,<人员id-出差类型-日期, 请假时长> Map editedCcInfo = new HashMap<>(); + //记录已编辑的人员出差记录,<人员id, 出差信息list> + Map>> editedEmpCcInfo = new HashMap<>(); + //20241104需求变更,增加单天出差“全局唯一性”约束规则,此处记录已编辑的人员相关的出差信息 + editedEmpCcInfo = detailTableData == null ? new HashMap<>() : detailTableData.stream().collect(Collectors.groupingBy(map -> map.get("ccr"))); //处理明细表1数据,生成触发接口之前编辑内容中的出差信息 editedCcInfo = dealDetailTableData(detailTableData, editedCcInfo); //处理主表数据 @@ -148,19 +152,28 @@ public class BusinessTripsApplyServiceImpl extends Service implements BusinessTr Map>> ccDetailGroupByEmp = simpleDetailList.stream().collect(Collectors.groupingBy(e -> Util.null2String(e.get("ccr")))); //收集需要新建的出差明细数据 List> completeLeaveDetailList = new ArrayList<>(); - Map finalEditedCcInfo = editedCcInfo; +// Map finalEditedCcInfo = editedCcInfo; for(Map.Entry>> entry : ccDetailGroupByEmp.entrySet()) { //校验该人员的考勤周期是否正常 boolean kqCycleAllow = kqCycleCheck(entry.getKey(), entry.getValue(), errorMessage, empIdToName.get(entry.getKey())); if (!kqCycleAllow) { continue; } - List> detailListItem = entry.getValue().stream() - .filter(f -> finalEditedCcInfo.get(Util.null2String(f.get("ccr")) + "_" + Util.null2String(f.get("cclx")) + "_" + Util.null2String(f.get("ksrq"))) == null) - .collect(Collectors.toList()); - if (detailListItem.size() > 0) { - completeLeaveDetailList.addAll(detailListItem); + // + for (Map detailItem : entry.getValue()) { + //单日出差“全局唯一性”约束校验 + boolean dailyCheckSign = checkDailyBusinessTripsLicense(entry.getKey(), detailItem, editedEmpCcInfo.get(entry.getKey()), errorMessage); + if (dailyCheckSign) { + completeLeaveDetailList.add(detailItem); + } } + +// List> detailListItem = entry.getValue().stream() +// .filter(f -> finalEditedCcInfo.get(Util.null2String(f.get("ccr")) + "_" + Util.null2String(f.get("cclx")) + "_" + Util.null2String(f.get("ksrq"))) == null) +// .collect(Collectors.toList()); +// if (detailListItem.size() > 0) { +// completeLeaveDetailList.addAll(detailListItem); +// } } if (errorMessage.size() == 0) { @@ -181,6 +194,190 @@ public class BusinessTripsApplyServiceImpl extends Service implements BusinessTr return resultMap; } + private boolean checkDailyBusinessTripsLicense(String empId, Map detailData, List> editedBusinessTripsList, List errorMessage) { + //出差时间 + double ccDuration; + //判断当前请假信息属于哪一种出差方式(全天、半天、指定时长、指定区间) + String leaveMode = ""; + if (!"".equals(Util.null2String(detailData.get("kssj")))) { + leaveMode = AskAndEvctionWayEnum.TIME_INTERVAL.getKey(); + ccDuration = Double.parseDouble(Util.null2String(detailData.get("ccsc"))); + } else if ("1".equals(Util.null2String(detailData.get("qtcc")))) { + leaveMode = AskAndEvctionWayEnum.ALLDAY.getKey(); + ccDuration = 8; + } else if ("1".equals(Util.null2String(detailData.get("btcc")))) { + leaveMode = AskAndEvctionWayEnum.HALFDAY.getKey(); + ccDuration = 4; + } else { + leaveMode = AskAndEvctionWayEnum.HOUR.getKey(); + ccDuration = Double.parseDouble(Util.null2String(detailData.get("ccsc"))); + } + String ksrq = Util.null2String(detailData.get("ksrq")); + String jsrq = Util.null2String(detailData.get("jsrq")); + String kssj = Util.null2String(detailData.get("kssj")); + String jssj = Util.null2String(detailData.get("jssj")); + //查询数据库中当天存在的出差记录 + List> existLeaveInfo; + String sql = "select b.* from uf_jcl_kq_ccjl a left join uf_jcl_kq_ccjl_dt1 b on b.mainid = a.id where a.jlzt != 2 and b.cxcc= 0 and b.ccr = " + empId; + if (leaveMode.equals(AskAndEvctionWayEnum.TIME_INTERVAL.getKey())) { + sql = sql + " and ((b.ksrq >= ? and b.ksrq <= ?) or (b.jsrq >= ? and b.jsrq <= ?) or (b.ksrq <= ? and b.jsrq >= ?))"; + existLeaveInfo = DbTools.getSqlToList(sql, ksrq, jsrq, ksrq, jsrq, ksrq, jsrq); + } else { + sql = sql + " and b.ksrq <= ? and b.jsrq >= ?"; + existLeaveInfo = DbTools.getSqlToList(sql, ksrq, ksrq); + } + //分析数据库中已存在出差数据 + String message = Util.null2String(detailData.get("ccrName")); + double existCcSc = 0; + if (existLeaveInfo.size() > 0) { + List> timeIntervalCcList = new ArrayList<>(); + List> allDayCcList = new ArrayList<>(); + List> otherCcList = new ArrayList<>(); + for (Map leaveItem : existLeaveInfo) { + if (!"".equals(Util.null2String(leaveItem.get("kssj")))) { + timeIntervalCcList.add(leaveItem); + } else if ("1".equals(Util.null2String(leaveItem.get("qtcc")))) { + allDayCcList.add(leaveItem); + } else { + otherCcList.add(leaveItem); + } + } + if (allDayCcList.size() > 0) { + //该日期已存在全天出差时 + message = message + "_" + ksrq + "已存在全天出差, 不允许再进行任何出差申请!"; + errorMessage.add(message); + return false; + } else if (leaveMode.equals(AskAndEvctionWayEnum.ALLDAY.getKey())) { + //该日期即将生成全天出差 + //首先判断,是否已存在区间出差信息,且区间出差区间与目标日期有重叠时间段,然后判断其他出差方式是由已经存在记录 + List> overlappingList = timeIntervalCcList.stream().filter(f -> + DateUtil.isOverlapping(ksrq + " 00:00", ksrq + " 23:59", f.get("ksrq") + " " + f.get("kssj"), f.get("jsrq") + " " + f.get("jssj"))) + .collect(Collectors.toList()); + if (overlappingList.size() > 0 || otherCcList.size() > 0) { + message = message + "_" + ksrq + "已存在出差记录, 不允许再进行全天出差方式的出差申请!"; + errorMessage.add(message); + return false; + } + } else if (leaveMode.equals(AskAndEvctionWayEnum.TIME_INTERVAL.getKey())) { + //该日期即将生成指定时间区间出差 + //首先判断,是否已存在区间出差之外的信息,然后判断是否存在区间出差且存在交集 + List> overlappingList = timeIntervalCcList.stream().filter(f -> + DateUtil.isOverlapping(ksrq + " " + kssj, jsrq + " " + jssj, f.get("ksrq") + " " + f.get("kssj"), f.get("jsrq") + " " + f.get("jssj"))) + .collect(Collectors.toList()); + if (overlappingList.size() > 0 || otherCcList.size() > 0) { + message = message + "在" + ksrq + "到" + jsrq + "的出差区间内已存在出差记录, 不允许再进行出差申请!"; + errorMessage.add(message); + return false; + } + } else if (leaveMode.equals(AskAndEvctionWayEnum.HALFDAY.getKey()) || leaveMode.equals(AskAndEvctionWayEnum.HOUR.getKey())) { + //该日期即将生成指定时间长度出差或者半天出差 + //首先判断,是否已存在区间出差信息,且区间出差区间与目标日期有重叠时间段 + List> overlappingList = timeIntervalCcList.stream().filter(f -> + DateUtil.isOverlapping(ksrq + " 00:00", ksrq + " 23:59", f.get("ksrq") + " " + f.get("kssj"), f.get("jsrq") + " " + f.get("jssj"))) + .collect(Collectors.toList()); + if (overlappingList.size() > 0) { + message = message + "_" + ksrq + "已存在指定时间区间出差记录, 不允许再其他方式的出差申请!"; + errorMessage.add(message); + return false; + } + //然后判断其他出差方式是由已经存在记录,结合该类出差记录的已有出差时长之和判断 + if (otherCcList.size() > 0) { + existCcSc = otherCcList.stream().mapToDouble(e -> { + if ("1".equals(Util.null2String(e.get("btcc")))) { + return Double.parseDouble("4"); + } else if (!"".equals(Util.null2String(e.get("ccsc")))) { + return Double.parseDouble(e.get("ccsc").toString()); + } else { + return Double.parseDouble("0"); + } + }).sum(); + if (existCcSc + ccDuration > 8) { + message = message + "_" + ksrq + "已存在共计" + existCcSc + "小时的出差记录, 新申请出差累计后已超过8小时!"; + errorMessage.add(message); + return false; + } + } + } + } + //分析当前流程已编辑出差明细中已存在出差数据 + if (editedBusinessTripsList != null && editedBusinessTripsList.size() > 0) { + //筛选出时间范围内的 + if (leaveMode.equals(AskAndEvctionWayEnum.TIME_INTERVAL.getKey())) { + editedBusinessTripsList = editedBusinessTripsList.stream() + .filter(f -> (Util.null2String(f.get("ksrq")).compareTo(ksrq) >= 0 && Util.null2String(f.get("ksrq")).compareTo(jsrq) <= 0) + || (Util.null2String(f.get("jsrq")).compareTo(ksrq) >= 0 && Util.null2String(f.get("jsrq")).compareTo(jsrq) <= 0) + || (Util.null2String(f.get("ksrq")).compareTo(ksrq) <= 0 && Util.null2String(f.get("jsrq")).compareTo(jsrq) >= 0)) + .collect(Collectors.toList()); + } else { + editedBusinessTripsList = editedBusinessTripsList.stream() + .filter(f -> Util.null2String(f.get("ksrq")).compareTo(ksrq) <= 0 && Util.null2String(f.get("jsrq")).compareTo(ksrq) >= 0) + .collect(Collectors.toList()); + } + List> timeIntervalCcList = new ArrayList<>(); + List> allDayCcList = new ArrayList<>(); + List> otherCcList = new ArrayList<>(); + for (Map leaveItem : editedBusinessTripsList) { + if (!"".equals(Util.null2String(leaveItem.get("kssj")))) { + timeIntervalCcList.add(leaveItem); + } else if ("1".equals(Util.null2String(leaveItem.get("qtcc")))) { + allDayCcList.add(leaveItem); + } else { + otherCcList.add(leaveItem); + } + } + if (allDayCcList.size() > 0) { + //该日期已存在全天出差时 + message = message + "_" + ksrq + "在当前流程中已编辑了全天出差, 不允许再进行任何出差申请!"; + errorMessage.add(message); + return false; + } else if (leaveMode.equals(AskAndEvctionWayEnum.ALLDAY.getKey())) { + //该日期即将生成全天出差 + //首先判断,是否已存在区间出差信息,且区间出差区间与目标日期有重叠时间段,然后判断其他出差方式是由已经存在记录 + List> overlappingList = timeIntervalCcList.stream().filter(f -> + DateUtil.isOverlapping(ksrq + " 00:00", ksrq + " 23:59", f.get("ksrq") + " " + f.get("kssj"), f.get("jsrq") + " " + f.get("jssj"))) + .collect(Collectors.toList()); + if (overlappingList.size() > 0 || otherCcList.size() > 0) { + message = message + "_" + ksrq + "在当前流程中已生成了出差记录, 不允许再进行全天出差方式的出差申请!"; + errorMessage.add(message); + return false; + } + } else if (leaveMode.equals(AskAndEvctionWayEnum.TIME_INTERVAL.getKey())) { + //该日期即将生成指定时间区间出差 + //首先判断,是否已存在区间出差之外的信息,然后判断是否存在区间出差且存在交集 + List> overlappingList = timeIntervalCcList.stream().filter(f -> + DateUtil.isOverlapping(ksrq + " " + kssj, jsrq + " " + jssj, f.get("ksrq") + " " + f.get("kssj"), f.get("jsrq") + " " + f.get("jssj"))) + .collect(Collectors.toList()); + if (overlappingList.size() > 0 || otherCcList.size() > 0) { + message = message + "在" + ksrq + "到" + jsrq + "的出差区间内在当前流程中已存在出差记录, 不允许再进行出差申请!"; + errorMessage.add(message); + return false; + } + } else if (leaveMode.equals(AskAndEvctionWayEnum.HALFDAY.getKey()) || leaveMode.equals(AskAndEvctionWayEnum.HOUR.getKey())) { + //该日期即将生成指定时间长度出差或者半天出差 + //首先判断,是否已存在区间出差信息,且区间出差区间与目标日期有重叠时间段 + List> overlappingList = timeIntervalCcList.stream().filter(f -> + DateUtil.isOverlapping(ksrq + " 00:00", ksrq + " 23:59", f.get("ksrq") + " " + f.get("kssj"), f.get("jsrq") + " " + f.get("jssj"))) + .collect(Collectors.toList()); + if (overlappingList.size() > 0) { + message = message + "_" + ksrq + "在当前流程中已存在指定时间区间出差记录, 不允许再其他方式的出差申请!"; + errorMessage.add(message); + return false; + } + //然后判断其他出差方式是由已经存在记录,结合该类出差记录的已有出差时长之和判断 + if (otherCcList.size() > 0) { + existCcSc = existCcSc + otherCcList.stream().mapToDouble(e->Double.parseDouble(e.getOrDefault("ccsc", "0").toString())).sum(); + if (existCcSc + ccDuration > 8) { + message = message + "_" + ksrq + "已存在当天出差记录和当前流程已编辑出差明细共计" + existCcSc + "小时的出差记录, 新申请出差累计后已超过8小时!"; + errorMessage.add(message); + return false; + } + } + } + } + + return true; + } + /** * 出差人的出差区间内属于休息日的日期集合,企业日历角度 * @param empIdList 出差人id集合 diff --git a/src/com/engine/jucailinkq/common/util/CommonUtil.java b/src/com/engine/jucailinkq/common/util/CommonUtil.java index 453d248..460258c 100644 --- a/src/com/engine/jucailinkq/common/util/CommonUtil.java +++ b/src/com/engine/jucailinkq/common/util/CommonUtil.java @@ -813,7 +813,7 @@ public class CommonUtil { public static List getJqInfoWithAmount() { List jqIdList = new ArrayList<>(); //来自假期额度 - String sql1 = "select * from uf_jcl_kq_jqed"; + String sql1 = "select * from uf_jcl_kq_jqed where gzzt = 0"; List> data1 = DbTools.getSqlToList(sql1); for (Map map : data1) { jqIdList.add(Util.null2String(map.get("jb")));