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); } } //增加加班计划中的数据,加班计划明细中的数据作为“加班计划”班段类型数据的补充