考勤-批量请假,以“指定时间区间”方式请假时,跨天区间请假时长,同时班段跨天的处理逻辑改造

zm_dev
sy 9 months ago
parent 1fb5791768
commit fa7122f724

@ -216,7 +216,7 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic
//请假人的请假区间内每一天的日期类型信息
Map<String, List<String>> restDayInfo = removeNonWorkDayRange ? getRestDayWithEmpId(leaveEmpIdList, leaveType, startDate, endDate) : new HashMap<>();
//请假人的请假区间内的排班结果
Map<String, List<Map<String, Object>>> scheduleInfoMap = (removeNonWorkDayRange || removeNonWorkTimeRange) ? getScheduleInfoWithEmpId(leaveEmpIdList, startDate, DateUtil.AfterDay(endDate,1)) : new HashMap<>();
Map<String, List<Map<String, Object>>> scheduleInfoMap = (removeNonWorkDayRange || removeNonWorkTimeRange) ? getScheduleInfoWithEmpId(leaveEmpIdList, DateUtil.beforeDay(startDate,1), DateUtil.AfterDay(endDate,1)) : new HashMap<>();
//收集未关联假期余额的请假明细数据
List<Map<String, String>> simpleLeaveDetailList = createSimpleLeaveDetailList(leaveEmpIdList, leaveDateList, removeNonWorkDayRange, scheduleInfoMap,
@ -344,6 +344,8 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic
List<Map<String, Object>> scheduleInfoList = scheduleInfoMap.get(leaveEmpId);
Map<String, String> dateToBcxxMap = scheduleInfoList == null ? new HashMap<>()
: scheduleInfoList.stream().collect(Collectors.toMap(e->Util.null2String(e.get("bcrq")),e->Util.null2String(e.get("bcxx"))));
Map<String, String> 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<Map<String, Object>> 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);
}
}
//增加加班计划中的数据,加班计划明细中的数据作为“加班计划”班段类型数据的补充

Loading…
Cancel
Save