From 31387ecda06d1558960d69b0c58ee872bed157b8 Mon Sep 17 00:00:00 2001 From: sy Date: Tue, 16 Jul 2024 15:15:45 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E8=80=83=E5=8B=A4-=E6=89=B9=E9=87=8F?= =?UTF-8?q?=E8=AF=B7=E5=81=87=EF=BC=8C=E7=8F=AD=E6=AC=A1=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E9=80=BB=E8=BE=91=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/service/impl/AskForLeaveServiceImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 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 9fc9bf9..6c66a35 100644 --- a/src/com/engine/jucailinkq/attendance/workflow/service/impl/AskForLeaveServiceImpl.java +++ b/src/com/engine/jucailinkq/attendance/workflow/service/impl/AskForLeaveServiceImpl.java @@ -214,9 +214,9 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic Map holidayPriorityItem = useFirstItemSign ? DbTools.getSqlToMap(sql,holidayItem.get("yxsydjb")) : null; //遍历人员、日期,生成人员+日期+请假时长的请假信息 //请假人的请假区间内每一天的日期类型信息 - Map> restDayInfo = removeNonWorkDayRange ? getRestDayWithEmpId(leaveEmpIdList, leaveType, startDate, endDate) : null; + Map> restDayInfo = removeNonWorkDayRange ? getRestDayWithEmpId(leaveEmpIdList, leaveType, startDate, endDate) : new HashMap<>(); //请假人的请假区间内的排班结果 - Map>> scheduleInfoMap = (removeNonWorkDayRange || removeNonWorkTimeRange) ? getScheduleInfoWithEmpId(leaveEmpIdList, startDate, endDate) : null; + Map>> scheduleInfoMap = (removeNonWorkDayRange || removeNonWorkTimeRange) ? getScheduleInfoWithEmpId(leaveEmpIdList, startDate, endDate) : new HashMap<>(); //收集未关联假期余额的请假明细数据 List> simpleLeaveDetailList = createSimpleLeaveDetailList(leaveEmpIdList, leaveDateList, removeNonWorkDayRange, scheduleInfoMap, From 1fb57917682cfc1dbf8a26307423a8e9134ade39 Mon Sep 17 00:00:00 2001 From: sy Date: Wed, 17 Jul 2024 16:06:06 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E8=80=83=E5=8B=A4-=E6=89=B9=E9=87=8F?= =?UTF-8?q?=E8=AF=B7=E5=81=87=EF=BC=8C=E4=BB=A5=E2=80=9C=E6=8C=87=E5=AE=9A?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E5=8C=BA=E9=97=B4=E2=80=9D=E6=96=B9=E5=BC=8F?= =?UTF-8?q?=E8=AF=B7=E5=81=87=E6=97=B6=EF=BC=8C=E5=A2=9E=E5=8A=A0=E5=AF=B9?= =?UTF-8?q?=E8=B7=A8=E5=A4=A9=E5=8C=BA=E9=97=B4=E8=AF=B7=E5=81=87=E6=97=B6?= =?UTF-8?q?=E9=95=BF=E7=9A=84=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/AskForLeaveServiceImpl.java | 73 +++++++++++++++---- .../engine/jucailinkq/common/util/Utils.java | 35 +++++++++ 2 files changed, 94 insertions(+), 14 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 6c66a35..01a41ca 100644 --- a/src/com/engine/jucailinkq/attendance/workflow/service/impl/AskForLeaveServiceImpl.java +++ b/src/com/engine/jucailinkq/attendance/workflow/service/impl/AskForLeaveServiceImpl.java @@ -216,7 +216,7 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic //请假人的请假区间内每一天的日期类型信息 Map> restDayInfo = removeNonWorkDayRange ? getRestDayWithEmpId(leaveEmpIdList, leaveType, startDate, endDate) : new HashMap<>(); //请假人的请假区间内的排班结果 - Map>> scheduleInfoMap = (removeNonWorkDayRange || removeNonWorkTimeRange) ? getScheduleInfoWithEmpId(leaveEmpIdList, startDate, endDate) : new HashMap<>(); + Map>> scheduleInfoMap = (removeNonWorkDayRange || removeNonWorkTimeRange) ? getScheduleInfoWithEmpId(leaveEmpIdList, startDate, DateUtil.AfterDay(endDate,1)) : new HashMap<>(); //收集未关联假期余额的请假明细数据 List> simpleLeaveDetailList = createSimpleLeaveDetailList(leaveEmpIdList, leaveDateList, removeNonWorkDayRange, scheduleInfoMap, @@ -373,22 +373,67 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic simpleLeaveDetailItem.put("jsrq", leaveDate); simpleLeaveDetailItem.put("kssj", startTime); simpleLeaveDetailItem.put("jssj", endTime); - //获取班次id - String bcId = Util.null2String(dateToBcxxMap.get(leaveDate)).split("-")[0]; - //需要自动移除时间区间内的非工作时长,且请假方式为“指定时间区间”时,去除当前明细中开始时间、结束时间之间的非工作时长 - if ("".equals(bcId)) { + //获取当天班次id + String currentDayBcId = Util.null2String(dateToBcxxMap.get(leaveDate)).split("-")[0]; + String sql = ""; + List> bcDetailData; + String endDate = leaveDate; + int scMinutes = 0; + //开始时时和结束时间存在跨天情况时,即开始时间大于等于结束时间 + if (startTime.compareTo(endTime) >= 0) { + String nextDay = DateUtil.AfterDay(leaveDate,1); + endDate = nextDay; + //获取次日班次id + String nextDayBcId = Util.null2String(dateToBcxxMap.get(nextDay)).split("-")[0]; + simpleLeaveDetailItem.put("jsrq", nextDay); + int currentDayScMinutes = 0; + int nextDayScMinutes = 0; + //需要自动移除时间区间内的非工作时长,且请假方式为“指定时间区间”时,去除当前明细中开始时间、结束时间之间的非工作时长 + if (!"".equals(currentDayBcId)) { + //查询当天班次明细 + sql = "select id, bdlx, gsrq, kssj as dtkssj, jssj as dtjssj from uf_jcl_kq_bcxx_dt1 where mainid = " + currentDayBcId; + bcDetailData = DbTools.getSqlToList(sql); + bcDetailData = bcDetailData.stream().filter(e -> countBdlxList.contains(Util.null2String(e.get("bdlx")))).collect(Collectors.toList()); + //获取需要累计的班段时长区间和请假区间存在交集的分钟数 + currentDayScMinutes = Utils.removeTime(leaveDate + " " + startTime, nextDay + " " + "00:00", bcDetailData, leaveDate); + } else { + currentDayScMinutes = DateUtil.getBetWeenMinutes(leaveDate + " " + startTime, nextDay + " " + "00:00"); + } + if (!"".equals(nextDayBcId)) { + //查询次日班次明细 + sql = "select id, bdlx, gsrq, kssj as dtkssj, jssj as dtjssj from uf_jcl_kq_bcxx_dt1 where mainid = " + nextDayBcId; + bcDetailData = DbTools.getSqlToList(sql); + bcDetailData = bcDetailData.stream().filter(e -> countBdlxList.contains(Util.null2String(e.get("bdlx")))).collect(Collectors.toList()); + //获取需要累计的班段时长区间和请假区间存在交集的分钟数 + nextDayScMinutes = Utils.removeTime(nextDay + " " + "00:00", nextDay + " " + endTime, bcDetailData, nextDay); + } else { + nextDayScMinutes = DateUtil.getBetWeenMinutes(nextDay + " " + "00:00", nextDay + " " + endTime); + } //组装初步的请假时长 - simpleLeaveDetailItem.put("qjsc", String.format("%.2f", DateUtil.getBetWeenMinutes(leaveDate + " " + startTime, leaveDate + " " + endTime) / 60.0)); + scMinutes = currentDayScMinutes + nextDayScMinutes; } else { - //查询班次明细 - String sql = "select id, bdlx, gsrq, kssj as dtkssj, jssj as dtjssj from uf_jcl_kq_bcxx_dt1 where mainid = " + bcId; - List> bcDetailData = DbTools.getSqlToList(sql); - bcDetailData = bcDetailData.stream().filter(e -> countBdlxList.contains(Util.null2String(e.get("bdlx")))).collect(Collectors.toList()); - //获取需要累计的班段时长区间和请假区间存在交集的分钟数 - int scMinutes = Utils.removeTime(leaveDate + " " + startTime, leaveDate + " " + endTime, bcDetailData, leaveDate); - //组装初步的请假时长 - simpleLeaveDetailItem.put("qjsc", String.format("%.2f", scMinutes / 60.0)); + //需要自动移除时间区间内的非工作时长,且请假方式为“指定时间区间”时,去除当前明细中开始时间、结束时间之间的非工作时长 + if ("".equals(currentDayBcId)) { + //组装初步的请假时长 + scMinutes = DateUtil.getBetWeenMinutes(leaveDate + " " + startTime, leaveDate + " " + endTime); + } else { + //查询班次明细 + sql = "select id, bdlx, gsrq, kssj as dtkssj, jssj as dtjssj from uf_jcl_kq_bcxx_dt1 where mainid = " + currentDayBcId; + bcDetailData = DbTools.getSqlToList(sql); + bcDetailData = bcDetailData.stream().filter(e -> countBdlxList.contains(Util.null2String(e.get("bdlx")))).collect(Collectors.toList()); + //获取需要累计的班段时长区间和请假区间存在交集的分钟数 + scMinutes = Utils.removeTime(leaveDate + " " + startTime, leaveDate + " " + endTime, bcDetailData, leaveDate); + } + } + //增加加班计划中的数据,加班计划明细中的数据作为“加班计划”班段类型数据的补充 + if (countBdlxList.contains(ClassSegmentTypeEnum.OVERTIME_PLAN.getKey())) { + sql = "select b.jbry,b.ksrq,b.kssj,b.jblx,b.jsrq,b.jssj,b.jbsc,b.gsrq from uf_jcl_kq_jbjh a left join uf_jcl_kq_jbjh_dt1 b on a.id=b.mainid where b.jbry =? and b.ksrq>=? and b.jsrq<=? and (b.jbcx=0 or b.jbcx is null) and a.jlzt=1"; + List> overtimePlanList = DbTools.getSqlToList(sql, leaveEmpId, leaveDate, leaveDate); + int scMinutesInOvertimePlan = Utils.removeTimeWithOvertimePlan(leaveDate + " " + startTime, endDate + " " + endTime, overtimePlanList); + scMinutes = scMinutes + scMinutesInOvertimePlan; } + //组装初步的请假时长 + simpleLeaveDetailItem.put("qjsc", String.format("%.2f", scMinutes / 60.0)); simpleLeaveDetailList.add(simpleLeaveDetailItem); } else if (leaveMode.equals(AskAndEvctionWayEnum.HOUR.getKey())) { simpleLeaveDetailItem = new HashMap<>(); diff --git a/src/com/engine/jucailinkq/common/util/Utils.java b/src/com/engine/jucailinkq/common/util/Utils.java index f63c3a5..d269ba0 100644 --- a/src/com/engine/jucailinkq/common/util/Utils.java +++ b/src/com/engine/jucailinkq/common/util/Utils.java @@ -424,6 +424,41 @@ public class Utils { return betweenMinutes; } + /** + * 开始时间和结束时间在所给加班计划中的占比时间 + * @param kssj + * @param jssj + * @param overtimePlanList + * @return + */ + public static int removeTimeWithOvertimePlan(String kssj,String jssj,List> overtimePlanList){ + int betweenMinutes = 0; + log.debug("removeTimeWithOvertimePlan overtimePlanList : {}", overtimePlanList); + for (Map overtimePlanItem : overtimePlanList){ + String dtkssj = overtimePlanItem.get("ksrq") + " " + overtimePlanItem.get("kssj"); + String dtjssj = overtimePlanItem.get("jsrq") + " " + overtimePlanItem.get("jssj"); + + if (DateUtil.getTime(kssj).compareTo(DateUtil.getTime(dtkssj)) <=0 && DateUtil.getTime(jssj).compareTo(DateUtil.getTime(dtjssj)) >=0){ + + betweenMinutes += DateUtil.getBetWeenMinutes(dtkssj,dtjssj); + + }else if (DateUtil.getTime(kssj).compareTo(DateUtil.getTime(dtkssj)) <=0 && DateUtil.getTime(jssj).compareTo(DateUtil.getTime(dtjssj)) <=0 && DateUtil.getTime(jssj).compareTo(DateUtil.getTime(dtkssj)) >=0){ + //休息时间在请假时间 右边 + betweenMinutes += DateUtil.getBetWeenMinutes(dtkssj,jssj); + + }else if (DateUtil.getTime(kssj).compareTo(DateUtil.getTime(dtkssj)) >=0 && DateUtil.getTime(jssj).compareTo(DateUtil.getTime(dtjssj)) >=0 && DateUtil.getTime(kssj).compareTo(DateUtil.getTime(dtjssj)) <=0){ + //休息时间在请假时间 左边 + betweenMinutes += DateUtil.getBetWeenMinutes(kssj,dtjssj); + + }else if (DateUtil.getTime(kssj).compareTo(DateUtil.getTime(dtkssj)) >=0 && DateUtil.getTime(jssj).compareTo(DateUtil.getTime(dtjssj)) <=0){ + //请假时间在休息时间中间 + betweenMinutes += DateUtil.getBetWeenMinutes(kssj,jssj);; + + } + } + return betweenMinutes; + } + /** * 开始时间和结束时间在班段类型中所占的时间 * @param kssj From fa7122f724967f9a0e021f231e1b4d583cad77ae Mon Sep 17 00:00:00 2001 From: sy Date: Fri, 19 Jul 2024 17:34:39 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E8=80=83=E5=8B=A4-=E6=89=B9=E9=87=8F?= =?UTF-8?q?=E8=AF=B7=E5=81=87=EF=BC=8C=E4=BB=A5=E2=80=9C=E6=8C=87=E5=AE=9A?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E5=8C=BA=E9=97=B4=E2=80=9D=E6=96=B9=E5=BC=8F?= =?UTF-8?q?=E8=AF=B7=E5=81=87=E6=97=B6=EF=BC=8C=E8=B7=A8=E5=A4=A9=E5=8C=BA?= =?UTF-8?q?=E9=97=B4=E8=AF=B7=E5=81=87=E6=97=B6=E9=95=BF,=E5=90=8C?= =?UTF-8?q?=E6=97=B6=E7=8F=AD=E6=AE=B5=E8=B7=A8=E5=A4=A9=E7=9A=84=E5=A4=84?= =?UTF-8?q?=E7=90=86=E9=80=BB=E8=BE=91=E6=94=B9=E9=80=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/AskForLeaveServiceImpl.java | 93 +++++++++++-------- 1 file changed, 55 insertions(+), 38 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 01a41ca..3b81a51 100644 --- a/src/com/engine/jucailinkq/attendance/workflow/service/impl/AskForLeaveServiceImpl.java +++ b/src/com/engine/jucailinkq/attendance/workflow/service/impl/AskForLeaveServiceImpl.java @@ -216,7 +216,7 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic //请假人的请假区间内每一天的日期类型信息 Map> restDayInfo = removeNonWorkDayRange ? getRestDayWithEmpId(leaveEmpIdList, leaveType, startDate, endDate) : new HashMap<>(); //请假人的请假区间内的排班结果 - Map>> scheduleInfoMap = (removeNonWorkDayRange || removeNonWorkTimeRange) ? getScheduleInfoWithEmpId(leaveEmpIdList, startDate, DateUtil.AfterDay(endDate,1)) : new HashMap<>(); + Map>> scheduleInfoMap = (removeNonWorkDayRange || removeNonWorkTimeRange) ? getScheduleInfoWithEmpId(leaveEmpIdList, DateUtil.beforeDay(startDate,1), DateUtil.AfterDay(endDate,1)) : new HashMap<>(); //收集未关联假期余额的请假明细数据 List> simpleLeaveDetailList = createSimpleLeaveDetailList(leaveEmpIdList, leaveDateList, removeNonWorkDayRange, scheduleInfoMap, @@ -344,6 +344,8 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic List> scheduleInfoList = scheduleInfoMap.get(leaveEmpId); Map dateToBcxxMap = scheduleInfoList == null ? new HashMap<>() : scheduleInfoList.stream().collect(Collectors.toMap(e->Util.null2String(e.get("bcrq")),e->Util.null2String(e.get("bcxx")))); + Map dateToHxbzMap = scheduleInfoList == null ? new HashMap<>() + : scheduleInfoList.stream().collect(Collectors.toMap(e->Util.null2String(e.get("bcrq")),e->Util.null2String(e.get("hxbz")))); if (removeNonWorkDayRange) { //排班结果中休息的日期 @@ -375,54 +377,69 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic simpleLeaveDetailItem.put("jssj", endTime); //获取当天班次id String currentDayBcId = Util.null2String(dateToBcxxMap.get(leaveDate)).split("-")[0]; + boolean currentDayHxbz = !"".equals(Util.null2String(dateToHxbzMap.get(leaveDate))); + //获取前一天班次id + String yesterday = DateUtil.beforeDay(leaveDate,1); + String yesterdayBcId = Util.null2String(dateToBcxxMap.get(DateUtil.beforeDay(leaveDate, 1))).split("-")[0]; + //获取次日班次id + String nextDay = DateUtil.AfterDay(leaveDate,1); + String nextDayBcId = Util.null2String(dateToBcxxMap.get(nextDay)).split("-")[0]; + boolean nextDayHxbz = !"".equals(Util.null2String(dateToHxbzMap.get(nextDay))); + String sql = ""; List> bcDetailData; String endDate = leaveDate; int scMinutes = 0; //开始时时和结束时间存在跨天情况时,即开始时间大于等于结束时间 if (startTime.compareTo(endTime) >= 0) { - String nextDay = DateUtil.AfterDay(leaveDate,1); endDate = nextDay; - //获取次日班次id - String nextDayBcId = Util.null2String(dateToBcxxMap.get(nextDay)).split("-")[0]; simpleLeaveDetailItem.put("jsrq", nextDay); - int currentDayScMinutes = 0; - int nextDayScMinutes = 0; - //需要自动移除时间区间内的非工作时长,且请假方式为“指定时间区间”时,去除当前明细中开始时间、结束时间之间的非工作时长 - if (!"".equals(currentDayBcId)) { - //查询当天班次明细 - sql = "select id, bdlx, gsrq, kssj as dtkssj, jssj as dtjssj from uf_jcl_kq_bcxx_dt1 where mainid = " + currentDayBcId; - bcDetailData = DbTools.getSqlToList(sql); - bcDetailData = bcDetailData.stream().filter(e -> countBdlxList.contains(Util.null2String(e.get("bdlx")))).collect(Collectors.toList()); - //获取需要累计的班段时长区间和请假区间存在交集的分钟数 - currentDayScMinutes = Utils.removeTime(leaveDate + " " + startTime, nextDay + " " + "00:00", bcDetailData, leaveDate); - } else { - currentDayScMinutes = DateUtil.getBetWeenMinutes(leaveDate + " " + startTime, nextDay + " " + "00:00"); - } - if (!"".equals(nextDayBcId)) { - //查询次日班次明细 - sql = "select id, bdlx, gsrq, kssj as dtkssj, jssj as dtjssj from uf_jcl_kq_bcxx_dt1 where mainid = " + nextDayBcId; - bcDetailData = DbTools.getSqlToList(sql); - bcDetailData = bcDetailData.stream().filter(e -> countBdlxList.contains(Util.null2String(e.get("bdlx")))).collect(Collectors.toList()); - //获取需要累计的班段时长区间和请假区间存在交集的分钟数 - nextDayScMinutes = Utils.removeTime(nextDay + " " + "00:00", nextDay + " " + endTime, bcDetailData, nextDay); - } else { - nextDayScMinutes = DateUtil.getBetWeenMinutes(nextDay + " " + "00:00", nextDay + " " + endTime); + } + String toDealStartTime = startTime; + if (!"".equals(yesterdayBcId)) { + sql = "select id, bdlx, gsrq, kssj as dtkssj, jssj as dtjssj from uf_jcl_kq_bcxx_dt1 where mainid = " + yesterdayBcId + " order by gsrq desc, kssj desc"; + bcDetailData = DbTools.getSqlToList(sql); + bcDetailData = bcDetailData.stream().filter(e -> countBdlxList.contains(Util.null2String(e.get("bdlx")))).collect(Collectors.toList()); + //获取需要累计的班段时长区间和请假区间存在交集的分钟数 + scMinutes = Utils.removeTime(leaveDate + " " + startTime, endDate + " " + endTime, bcDetailData, yesterday); + //更新可匹配请假时长开始时间 + String gsrq = Util.null2String(bcDetailData.get(0).get("gsrq")); + toDealStartTime = "2".equals(gsrq) && startTime.compareTo(Util.null2String(bcDetailData.get(0).get("dtjssj"))) < 0 + ? Util.null2String(bcDetailData.get(0).get("dtjssj")) : startTime; + } + if (!"".equals(currentDayBcId)) { + sql = "select id, bdlx, gsrq, kssj as dtkssj, jssj as dtjssj from uf_jcl_kq_bcxx_dt1 where mainid = " + currentDayBcId + " order by gsrq desc, kssj desc"; + bcDetailData = DbTools.getSqlToList(sql); + bcDetailData = bcDetailData.stream().filter(e -> countBdlxList.contains(Util.null2String(e.get("bdlx")))).collect(Collectors.toList()); + //获取需要累计的班段时长区间和请假区间存在交集的分钟数 + scMinutes = scMinutes + Utils.removeTime(leaveDate + " " + toDealStartTime, endDate + " " + endTime, bcDetailData, leaveDate); + //更新可匹配请假时长开始时间 + String gsrq = Util.null2String(bcDetailData.get(0).get("gsrq")); + + if ("2".equals(gsrq)) { + leaveDate = nextDay; + toDealStartTime = Util.null2String(bcDetailData.get(0).get("dtjssj")); + } else if ("1".equals(gsrq)) { + toDealStartTime = toDealStartTime.compareTo(Util.null2String(bcDetailData.get(0).get("dtjssj"))) < 0 + ? Util.null2String(bcDetailData.get(0).get("dtjssj")) : toDealStartTime; } - //组装初步的请假时长 - scMinutes = currentDayScMinutes + nextDayScMinutes; - } else { - //需要自动移除时间区间内的非工作时长,且请假方式为“指定时间区间”时,去除当前明细中开始时间、结束时间之间的非工作时长 + } else if (currentDayHxbz) { + scMinutes = scMinutes + DateUtil.getBetWeenMinutes(leaveDate + " " + toDealStartTime, nextDay + " " + "00:00"); + } + if (!"".equals(nextDayBcId)) { + sql = "select id, bdlx, gsrq, kssj as dtkssj, jssj as dtjssj from uf_jcl_kq_bcxx_dt1 where mainid = " + nextDayBcId + " order by gsrq desc, kssj desc"; + bcDetailData = DbTools.getSqlToList(sql); + bcDetailData = bcDetailData.stream().filter(e -> countBdlxList.contains(Util.null2String(e.get("bdlx")))).collect(Collectors.toList()); + //获取需要累计的班段时长区间和请假区间存在交集的分钟数 + scMinutes = scMinutes + Utils.removeTime(leaveDate + " " + toDealStartTime, endDate + " " + endTime, bcDetailData, nextDay); + + } else if (nextDayHxbz) { if ("".equals(currentDayBcId)) { - //组装初步的请假时长 - scMinutes = DateUtil.getBetWeenMinutes(leaveDate + " " + startTime, leaveDate + " " + endTime); + scMinutes = scMinutes + DateUtil.getBetWeenMinutes(nextDay + " " + "00:00", nextDay + " " + endTime); } else { - //查询班次明细 - sql = "select id, bdlx, gsrq, kssj as dtkssj, jssj as dtjssj from uf_jcl_kq_bcxx_dt1 where mainid = " + currentDayBcId; - bcDetailData = DbTools.getSqlToList(sql); - bcDetailData = bcDetailData.stream().filter(e -> countBdlxList.contains(Util.null2String(e.get("bdlx")))).collect(Collectors.toList()); - //获取需要累计的班段时长区间和请假区间存在交集的分钟数 - scMinutes = Utils.removeTime(leaveDate + " " + startTime, leaveDate + " " + endTime, bcDetailData, leaveDate); + int nextDayMinutes = leaveDate.compareTo(nextDay) >= 0 ? DateUtil.getBetWeenMinutes(leaveDate + " " + toDealStartTime, nextDay + " " + endTime) + : DateUtil.getBetWeenMinutes(nextDay + " " + "00:00", nextDay + " " + endTime); + scMinutes = scMinutes + Math.max(nextDayMinutes, 0); } } //增加加班计划中的数据,加班计划明细中的数据作为“加班计划”班段类型数据的补充 From e29da354b10422a52b821397352b460039ca8bc0 Mon Sep 17 00:00:00 2001 From: sy Date: Mon, 22 Jul 2024 13:17:58 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E8=80=83=E5=8B=A4-=E5=8A=A0=E7=8F=AD?= =?UTF-8?q?=E8=AE=A1=E5=88=92=E6=B5=81=E7=A8=8B=EF=BC=8C=E5=8A=A0=E7=8F=AD?= =?UTF-8?q?=E8=AE=A1=E5=88=92=E6=98=8E=E7=BB=86=E6=95=B0=E6=8D=AE=E7=94=9F?= =?UTF-8?q?=E6=88=90=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/OvertimePlanActionApi.java | 16 +++ .../service/UtilService.java | 2 + .../service/impl/UtilServiceImpl.java | 26 ++++ .../workflow/service/OvertimePlanService.java | 8 ++ .../service/impl/OvertimePlanServiceImpl.java | 133 ++++++++++++++++++ .../workflow/web/OvertimePlanApi.java | 58 ++++++++ .../jucailinkq/common/util/CommonUtil.java | 5 +- 7 files changed, 247 insertions(+), 1 deletion(-) create mode 100644 src/com/api/jucailinkq/attendance/workflow/OvertimePlanActionApi.java create mode 100644 src/com/engine/jucailinkq/attendance/workflow/service/OvertimePlanService.java create mode 100644 src/com/engine/jucailinkq/attendance/workflow/service/impl/OvertimePlanServiceImpl.java create mode 100644 src/com/engine/jucailinkq/attendance/workflow/web/OvertimePlanApi.java diff --git a/src/com/api/jucailinkq/attendance/workflow/OvertimePlanActionApi.java b/src/com/api/jucailinkq/attendance/workflow/OvertimePlanActionApi.java new file mode 100644 index 0000000..d299139 --- /dev/null +++ b/src/com/api/jucailinkq/attendance/workflow/OvertimePlanActionApi.java @@ -0,0 +1,16 @@ +package com.api.jucailinkq.attendance.workflow; + +import com.engine.jucailinkq.attendance.workflow.web.OvertimePlanApi; +import lombok.extern.slf4j.Slf4j; + +import javax.ws.rs.Path; + +/** + * @Author: sy + * @Description: 加班计划流程 + * @Date: 2024/7/19 + **/ +@Path("/attendance/overtimeplan") +@Slf4j +public class OvertimePlanActionApi extends OvertimePlanApi { +} diff --git a/src/com/engine/jucailinkq/attendance/attendanceanalysis/service/UtilService.java b/src/com/engine/jucailinkq/attendance/attendanceanalysis/service/UtilService.java index 8fa5e4a..1675f2f 100644 --- a/src/com/engine/jucailinkq/attendance/attendanceanalysis/service/UtilService.java +++ b/src/com/engine/jucailinkq/attendance/attendanceanalysis/service/UtilService.java @@ -16,6 +16,8 @@ public interface UtilService { */ Map getSchedulingInFormation(Map params); + Map>> getScheduleInfoWithEmpId(List empIdList, String startDate, String endDate); + /** * 获得指定天数的打卡时间集合 * 只支持一次工作时间段跨天,不支持多端工作时间段跨天。 diff --git a/src/com/engine/jucailinkq/attendance/attendanceanalysis/service/impl/UtilServiceImpl.java b/src/com/engine/jucailinkq/attendance/attendanceanalysis/service/impl/UtilServiceImpl.java index e61fe14..ff685d2 100644 --- a/src/com/engine/jucailinkq/attendance/attendanceanalysis/service/impl/UtilServiceImpl.java +++ b/src/com/engine/jucailinkq/attendance/attendanceanalysis/service/impl/UtilServiceImpl.java @@ -21,6 +21,7 @@ import weaver.general.Util; import java.time.ZoneOffset; import java.util.Comparator; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -42,6 +43,31 @@ public class UtilServiceImpl extends Service implements UtilService { return commandExecutor.execute(new GetScheduleResultListCmd(params)); } + /** + * 获取人员在的日期区间内的排班结果 + * @param empIdList 人员id集合 + * @param startDate 开始日期 + * @param endDate 结束日期 + */ + @Override + public Map>> getScheduleInfoWithEmpId(List empIdList, String startDate, String endDate) { + Map>> scheduleInfo = new HashMap<>(); + Map params = new HashMap<>(); + params.put("tableName", "uf_pbjg"); + params.put("startDate", startDate); + params.put("endDate", endDate); + params.put("pblx", "0"); + params.put("current", "1"); + params.put("pageSize", "9999"); + params.put("recurrence", "1"); + for (String empId : empIdList) { + params.put("pbdx", empId); + Map schedulingResultsMap = schedulingResultsService.queryDataTableActualUse(params); + scheduleInfo.put(empId, (List>) schedulingResultsMap.get("data")); + } + return scheduleInfo; + } + /** * 获得打卡数据 diff --git a/src/com/engine/jucailinkq/attendance/workflow/service/OvertimePlanService.java b/src/com/engine/jucailinkq/attendance/workflow/service/OvertimePlanService.java new file mode 100644 index 0000000..6d48af6 --- /dev/null +++ b/src/com/engine/jucailinkq/attendance/workflow/service/OvertimePlanService.java @@ -0,0 +1,8 @@ +package com.engine.jucailinkq.attendance.workflow.service; + +import java.util.Map; + +public interface OvertimePlanService { + + Map generateOvertimePlanDetails(Map params); +} diff --git a/src/com/engine/jucailinkq/attendance/workflow/service/impl/OvertimePlanServiceImpl.java b/src/com/engine/jucailinkq/attendance/workflow/service/impl/OvertimePlanServiceImpl.java new file mode 100644 index 0000000..0b1f852 --- /dev/null +++ b/src/com/engine/jucailinkq/attendance/workflow/service/impl/OvertimePlanServiceImpl.java @@ -0,0 +1,133 @@ +package com.engine.jucailinkq.attendance.workflow.service.impl; + +import com.engine.common.util.ServiceUtil; +import com.engine.core.impl.Service; +import com.engine.jucailinkq.attendance.attendanceanalysis.service.UtilService; +import com.engine.jucailinkq.attendance.attendanceanalysis.service.impl.UtilServiceImpl; +import com.engine.jucailinkq.attendance.enums.ClassSegmentTypeEnum; +import com.engine.jucailinkq.attendance.workflow.service.OvertimePlanService; +import com.engine.jucailinkq.common.util.CommonUtil; +import com.engine.jucailinkq.common.util.DateUtil; +import com.engine.jucailinkq.common.util.DbTools; +import lombok.extern.slf4j.Slf4j; +import weaver.general.Util; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Author: sy + * @Description: 加班计划流程相关方法实现类 + * @Date: 2024/7/18 + **/ +@Slf4j +public class OvertimePlanServiceImpl extends Service implements OvertimePlanService { + + private UtilService utilService = ServiceUtil.getService(UtilServiceImpl.class); + + @Override + public Map generateOvertimePlanDetails(Map params) { + Map resultMap = new HashMap<>(); + try { + // 流程表单主表数据 + Map mainTableData = (Map)params.get("mainTableData"); + log.info("mainTableData : {}", mainTableData); + //加班人员、开始日期、结束日期、开始时间、结束时间 + String jbry = Util.null2String(mainTableData.get("jbry")); + String jblx = Util.null2String(mainTableData.get("jblx")); + String startDate = Util.null2String(mainTableData.get("ksrq")); + String endDate = Util.null2String(mainTableData.get("jsrq")); + String startTime = Util.null2String(mainTableData.get("kssj")); + String endTime = Util.null2String(mainTableData.get("jssj")); + //获取加班人员列表 + List empIdList = "".equals(jbry) ? new ArrayList<>() : Arrays.asList(jbry.split(",")); + //获取加班日期集合 + List dateList = DateUtil.getDatesBetween(startDate, endDate); + //获取人员列表在日期区间的班次数据 + Map>> scheduleInfoMap = utilService.getScheduleInfoWithEmpId(empIdList, startDate, DateUtil.AfterDay(endDate,1)); + List> overtimePlanDetailList = new ArrayList<>(); + List workBdlxList = new ArrayList<>(); + workBdlxList.add(ClassSegmentTypeEnum.WORK_TIME.getKey());workBdlxList.add(ClassSegmentTypeEnum.EXTENDED_OVERTIME.getKey()); + workBdlxList.add(ClassSegmentTypeEnum.EARLY_OVERTIME.getKey());workBdlxList.add(ClassSegmentTypeEnum.OVERTIME_IN_CLASS.getKey()); + Map detailItem; + String sql = ""; + //获取加班类型信息 + sql = "select id,mc from uf_jcl_kq_kqxm where id = " + jblx; + Map jblxData = DbTools.getSqlToMap(sql); + String jblxName = Util.null2String(jblxData.get("mc")); + Map empIdToNameInfo = CommonUtil.empIdToNameInfo(empIdList); + List> bcDetailData; + 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")))); + for (String date : dateList) { + String realEndDate = date; + detailItem = new HashMap<>(); + detailItem.put("jbry", empId); + detailItem.put("jbryName", Util.null2String(empIdToNameInfo.get(empId))); + detailItem.put("jblx", jblx); + detailItem.put("jblxName", jblxName); + detailItem.put("ksrq", date); + detailItem.put("kssj", startTime); + detailItem.put("jssj", endTime); + //开始时时和结束时间存在跨天情况时,即开始时间大于等于结束时间 + if (startTime.compareTo(endTime) >= 0) { + realEndDate = DateUtil.AfterDay(date,1); + } + detailItem.put("jsrq", realEndDate); + //加班时长 + int overtimeMinutes = DateUtil.getBetWeenMinutes(date + " " + startTime, realEndDate + " " + endTime); + detailItem.put("jbsc", String.format("%.2f", overtimeMinutes / 60.0)); + //根据班次数据,设置归属日期 + //获取当天班次id + String currentDayBcId = Util.null2String(dateToBcxxMap.get(date)).split("-")[0]; + //当天比较最晚工作时段/加班时段的结束时间点和加班计划明细的开始时间点的差值 + Integer currentDayDiffMinutes = 9999; + if (!"".equals(currentDayBcId)) { + //查询当天班次明细 + sql = "select id, bdlx, gsrq, kssj, jssj from uf_jcl_kq_bcxx_dt1 where mainid = " + currentDayBcId + " order by gsrq desc, kssj desc"; + bcDetailData = DbTools.getSqlToList(sql); + bcDetailData = bcDetailData.stream().filter(e -> workBdlxList.contains(Util.null2String(e.get("bdlx")))).collect(Collectors.toList()); + if (bcDetailData.size() > 0) { + String gsrqValue = Util.null2String(bcDetailData.get(0).get("gsrq")); + String jssj = Util.null2String(bcDetailData.get(0).get("jssj")); + String matchDate = "2".equals(gsrqValue) ? DateUtil.AfterDay(date,1) : ("0".equals(gsrqValue) ? DateUtil.beforeDay(date,1) : date); + currentDayDiffMinutes = (matchDate + jssj).compareTo(date + startTime) > 0 ? DateUtil.getBetWeenMinutes(date + " " + startTime, matchDate + " " + jssj) : DateUtil.getBetWeenMinutes(matchDate + " " + jssj, date + " " + startTime); + } + } + //获取次日班次id + String nextDay = DateUtil.AfterDay(date,1); + String nextDayBcId = Util.null2String(dateToBcxxMap.get(nextDay)).split("-")[0]; + //次日比较最早工作时段/加班时段的开始时间点和加班计划明细的结束时间点的差值 + Integer nextDayDiffMinutes = 9999; + if (!"".equals(nextDayBcId)) { + //查次日班次明细 + sql = "select id, bdlx, gsrq, kssj, jssj from uf_jcl_kq_bcxx_dt1 where mainid = " + nextDayBcId + " order by gsrq, kssj"; + bcDetailData = DbTools.getSqlToList(sql); + bcDetailData = bcDetailData.stream().filter(e -> workBdlxList.contains(Util.null2String(e.get("bdlx")))).collect(Collectors.toList()); + if (bcDetailData.size() > 0) { + String gsrqValue = Util.null2String(bcDetailData.get(0).get("gsrq")); + String kssj = Util.null2String(bcDetailData.get(0).get("kssj")); + String matchDate = "2".equals(gsrqValue) ? DateUtil.AfterDay(nextDay,1) : ("0".equals(gsrqValue) ? DateUtil.beforeDay(nextDay,1) : nextDay); + nextDayDiffMinutes = (matchDate + kssj).compareTo(realEndDate + endTime) > 0 ? DateUtil.getBetWeenMinutes(realEndDate + " " + endTime, matchDate + " " + kssj) : DateUtil.getBetWeenMinutes(matchDate + " " + kssj, realEndDate + " " + endTime); + } + } + if (currentDayDiffMinutes <= nextDayDiffMinutes) { + detailItem.put("gsrq", date); + } else { + detailItem.put("gsrq", nextDay); + } + overtimePlanDetailList.add(detailItem); + } + } + resultMap.put("status", true); + resultMap.put("data", overtimePlanDetailList); + } catch (Exception e) { + log.info(e.getMessage()); + resultMap.put("status", false); + resultMap.put("errorInfo", e.getMessage()); + resultMap.put("data", null); + } + return resultMap; + } +} diff --git a/src/com/engine/jucailinkq/attendance/workflow/web/OvertimePlanApi.java b/src/com/engine/jucailinkq/attendance/workflow/web/OvertimePlanApi.java new file mode 100644 index 0000000..f4461e9 --- /dev/null +++ b/src/com/engine/jucailinkq/attendance/workflow/web/OvertimePlanApi.java @@ -0,0 +1,58 @@ +package com.engine.jucailinkq.attendance.workflow.web; + +import com.engine.common.util.ParamUtil; +import com.engine.common.util.ServiceUtil; +import com.engine.jucailinkq.attendance.workflow.service.OvertimePlanService; +import com.engine.jucailinkq.attendance.workflow.service.impl.OvertimePlanServiceImpl; +import com.engine.jucailinkq.common.util.ApiReturnTools; +import com.engine.jucailinkq.common.util.ResponseResult; +import com.google.gson.Gson; +import lombok.extern.slf4j.Slf4j; +import weaver.general.Util; +import weaver.hrm.HrmUserVarify; +import weaver.hrm.User; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.Context; +import java.lang.reflect.Type; +import java.util.Map; + +/** + * @Author: sy + * @Description: 加班计划流程相关接口 + * @Date: 2024/7/18 + **/ +@Slf4j +public class OvertimePlanApi { + + private OvertimePlanService getOvertimePlanService(User user) { + return ServiceUtil.getService(OvertimePlanServiceImpl.class,user); + } + + /** + * 加班计划-生成加班计划明细表数据 + * @return + */ + @GET + @Path("/generateOvertimePlanDetails") + @Produces({"text/plain"}) + public String generateOvertimePlanDetails(@Context HttpServletRequest request, @Context HttpServletResponse response) { + try { + Map param = ParamUtil.request2Map(request); + User user = HrmUserVarify.getUser(request, response); + String mainTableDataStr = Util.null2String(param.get("mainTableData")); + Gson gson = new Gson(); + Map mainTableData = gson.fromJson(mainTableDataStr, (Type) Map.class); + + param.put("mainTableData",mainTableData); + return new ResponseResult, Map>(user).run(getOvertimePlanService(user) :: generateOvertimePlanDetails,param); + }catch (Exception e){ + log.error("generateOvertimePlanDetails status fail,catch error: [{}]",e); + return ApiReturnTools.error("200","查询失败"); + } + } +} diff --git a/src/com/engine/jucailinkq/common/util/CommonUtil.java b/src/com/engine/jucailinkq/common/util/CommonUtil.java index 786d5b8..86af980 100644 --- a/src/com/engine/jucailinkq/common/util/CommonUtil.java +++ b/src/com/engine/jucailinkq/common/util/CommonUtil.java @@ -689,9 +689,12 @@ public class CommonUtil { * 获取人员id和姓名的映射 * @return */ - public static Map empIdToNameInfo() { + public static Map empIdToNameInfo(List empIds) { Map resultMap = new HashMap<>(); String sql = "select id,lastname from hrmresource"; + if (empIds != null && empIds.size() > 0) { + sql = sql + " where id in (" + String.join(",", empIds) + ")"; + } List> list = DbTools.getSqlToList(sql); for (Map map : list) { resultMap.put(map.get("id").toString(), Util.null2String(map.get("lastname")));