From ad21ed944bf0f3c258065e5737e29a2be5c2eda0 Mon Sep 17 00:00:00 2001 From: sy Date: Thu, 8 Aug 2024 17:43:48 +0800 Subject: [PATCH] =?UTF-8?q?=E8=80=83=E5=8B=A4-=E5=8A=A0=E7=8F=AD=E8=AE=A1?= =?UTF-8?q?=E5=88=92=E6=B5=81=E7=A8=8B=EF=BC=8C=E5=8A=A0=E7=8F=AD=E8=AE=A1?= =?UTF-8?q?=E5=88=92=E6=98=8E=E7=BB=86=E7=AD=9B=E9=80=89=E5=8E=BB=E9=87=8D?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E5=A2=9E=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/OvertimePlanServiceImpl.java | 45 ++++++++++++++++++- .../jucailinkq/common/util/DateUtil.java | 31 +++++++++++++ 2 files changed, 75 insertions(+), 1 deletion(-) 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 9f659f8..a76719b 100644 --- a/src/com/engine/jucailinkq/attendance/workflow/service/impl/OvertimePlanServiceImpl.java +++ b/src/com/engine/jucailinkq/attendance/workflow/service/impl/OvertimePlanServiceImpl.java @@ -59,12 +59,15 @@ public class OvertimePlanServiceImpl extends Service implements OvertimePlanServ List> jblxAttendanceList = DbTools.getSqlToList(sql, AttendanceItemTypeEnum.WORK_OVERTIME.getKey(), WorkForTimeEnum.PLAN_WORK_OVERTIME.getKey()); //获取人员id和姓名信息 Map empIdToNameInfo = CommonUtil.empIdToNameInfo(empIdList); + //获取目标人员列表已存在的加班计划 + Map>> existOvertimePlanInfo = getOvertimePlanInfo(empIdList, startDate); + List> existOvertimePlanList = new ArrayList<>(); for (String empId : empIdList) { List> scheduleInfoList = scheduleInfoMap.get(empId); Map dateToBcxxMap = scheduleInfoList == null ? new HashMap<>() : scheduleInfoList.stream().collect(Collectors.toMap(e->Util.null2String(e.get("bcrq")), e->Util.null2String(e.get("bcxx")))); Map dateTypeInfoFromBc = scheduleInfoList == null ? new HashMap<>() : scheduleInfoList.stream().collect(Collectors.toMap(e->Util.null2String(e.get("bcrq")), e->Util.null2String(e.get("rqlx")))); - + existOvertimePlanList = existOvertimePlanInfo.get(empId); for (String date : dateList) { String realEndDate = date; detailItem = new HashMap<>(); @@ -80,6 +83,12 @@ public class OvertimePlanServiceImpl extends Service implements OvertimePlanServ realEndDate = DateUtil.AfterDay(date,1); } detailItem.put("jsrq", realEndDate); + //判断改组明细是否与已存在的加班计划有重叠 + boolean overLappingSign = checkOverlapping(existOvertimePlanList, date + " " +startTime, realEndDate + " " + endTime); + if (overLappingSign) { + errorMessage.add(Util.null2String(empIdToNameInfo.get(empId)) + "在日期" + date + "的加班计划区间和已申请的加班计划(已审核/待审核)出现时间重叠,不允许申请加班!"); + continue; + } //加班时长 int overtimeMinutes = DateUtil.getBetWeenMinutes(date + " " + startTime, realEndDate + " " + endTime); detailItem.put("jbsc", String.format("%.2f", overtimeMinutes / 60.0)); @@ -184,6 +193,40 @@ public class OvertimePlanServiceImpl extends Service implements OvertimePlanServ return resultMap; } + private boolean checkOverlapping(List> existOvertimePlanList, String startTimePoint, String endTimePoint) { + boolean overlappingSign = false; + if (existOvertimePlanList != null && existOvertimePlanList.size() > 0) { + String contrastStartPoint = ""; + String contrastEndPoint = ""; + for (Map item : existOvertimePlanList) { + contrastStartPoint = item.get("ksrq") + " " + item.get("kssj"); + contrastEndPoint = item.get("jsrq") + " " + item.get("jssj"); + overlappingSign = DateUtil.isOverlapping(contrastStartPoint, contrastEndPoint, startTimePoint, endTimePoint); + if (overlappingSign) { + break; + } + } + } + return overlappingSign; + } + + /** + * 获取目标人员在加班计划表中结束日期大于等于匹配日期的数据记录 + * @param empIdList 人员id列表 + * @param matchDate 匹配日期 + * @returnd + */ + private Map>> getOvertimePlanInfo(List empIdList, String matchDate) { + Map>> result = new HashMap<>(); + if (empIdList.size() > 0 && !"".equals(matchDate)) { + String sql = "select b.id, b.jbry, b.ksrq, b.jsrq, b.kssj, b.jssj from uf_jcl_kq_jbjh a left join uf_jcl_kq_jbjh_dt1 b on b.mainid = a.id where a.jlzt != 2 and b.jsrq >= '" + + matchDate + "' and b.jbry in (" + String.join(",",empIdList) + ")"; + List> data = DbTools.getSqlToList(sql); + result = data.stream().collect(Collectors.groupingBy(e->e.get("jbry").toString())); + } + return result; + } + public String getBcStartAndEndTime(String date, String currentDayBcId, List workBdlxList) { String startToEnd = ""; if (!"".equals(currentDayBcId)) { diff --git a/src/com/engine/jucailinkq/common/util/DateUtil.java b/src/com/engine/jucailinkq/common/util/DateUtil.java index 6929f47..2c09721 100644 --- a/src/com/engine/jucailinkq/common/util/DateUtil.java +++ b/src/com/engine/jucailinkq/common/util/DateUtil.java @@ -388,4 +388,35 @@ public class DateUtil { } return dates; } + + /** + * 判断两个时间段是否有重叠部分 + */ + public static boolean isOverlapping(String startTime1, String endTime1, String startTime2, String endTime2) { + // 如果结束时间小于另一个的开始时间,则不重叠 + if (endTime1.compareTo(startTime2) <= 0) { + return false; + } + // 如果开始时间大于另一个的结束时间,则不重叠 + if (startTime1.compareTo(endTime2) >= 0) { + return false; + } + // 否则,两个时间段重叠 + return true; + } + + /** + * 获取两个时间段重叠分钟数 + */ + public static int getOverlappedMinutes(String startTime1, String endTime1, String startTime2, String endTime2) { + if (isOverlapping(startTime1, endTime1, startTime2, endTime2)) { + // 取两个段的最大开始和最小结束时间 + String start = startTime1.compareTo(startTime2) >= 0 ? startTime1 : startTime2; + String end = endTime1.compareTo(endTime2) <= 0 ? endTime1 : endTime2; + // 计算重叠的分钟数 + return getBetWeenMinutes(start, end); + } + // 如果不重叠,返回0 + return 0; + } }