考勤-批量请假,以“指定时间区间”方式请假时,增加对跨天区间请假时长的处理逻辑

zm_dev
sy 9 months ago
parent 0c6fb3f1c4
commit 1fb5791768

@ -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<String>> restDayInfo = removeNonWorkDayRange ? getRestDayWithEmpId(leaveEmpIdList, leaveType, startDate, endDate) : new HashMap<>();
//请假人的请假区间内的排班结果 //请假人的请假区间内的排班结果
Map<String, List<Map<String, Object>>> scheduleInfoMap = (removeNonWorkDayRange || removeNonWorkTimeRange) ? getScheduleInfoWithEmpId(leaveEmpIdList, startDate, endDate) : new HashMap<>(); Map<String, List<Map<String, Object>>> scheduleInfoMap = (removeNonWorkDayRange || removeNonWorkTimeRange) ? getScheduleInfoWithEmpId(leaveEmpIdList, startDate, DateUtil.AfterDay(endDate,1)) : new HashMap<>();
//收集未关联假期余额的请假明细数据 //收集未关联假期余额的请假明细数据
List<Map<String, String>> simpleLeaveDetailList = createSimpleLeaveDetailList(leaveEmpIdList, leaveDateList, removeNonWorkDayRange, scheduleInfoMap, List<Map<String, String>> simpleLeaveDetailList = createSimpleLeaveDetailList(leaveEmpIdList, leaveDateList, removeNonWorkDayRange, scheduleInfoMap,
@ -373,22 +373,67 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic
simpleLeaveDetailItem.put("jsrq", leaveDate); simpleLeaveDetailItem.put("jsrq", leaveDate);
simpleLeaveDetailItem.put("kssj", startTime); simpleLeaveDetailItem.put("kssj", startTime);
simpleLeaveDetailItem.put("jssj", endTime); simpleLeaveDetailItem.put("jssj", endTime);
//获取班次id //获取当天班次id
String bcId = Util.null2String(dateToBcxxMap.get(leaveDate)).split("-")[0]; String currentDayBcId = Util.null2String(dateToBcxxMap.get(leaveDate)).split("-")[0];
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(bcId)) { 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 {
//需要自动移除时间区间内的非工作时长,且请假方式为“指定时间区间”时,去除当前明细中开始时间、结束时间之间的非工作时长
if ("".equals(currentDayBcId)) {
//组装初步的请假时长
scMinutes = DateUtil.getBetWeenMinutes(leaveDate + " " + startTime, leaveDate + " " + endTime);
} else { } else {
//查询班次明细 //查询班次明细
String sql = "select id, bdlx, gsrq, kssj as dtkssj, jssj as dtjssj from uf_jcl_kq_bcxx_dt1 where mainid = " + bcId; sql = "select id, bdlx, gsrq, kssj as dtkssj, jssj as dtjssj from uf_jcl_kq_bcxx_dt1 where mainid = " + currentDayBcId;
List<Map<String, Object>> bcDetailData = DbTools.getSqlToList(sql); bcDetailData = DbTools.getSqlToList(sql);
bcDetailData = bcDetailData.stream().filter(e -> countBdlxList.contains(Util.null2String(e.get("bdlx")))).collect(Collectors.toList()); 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); 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<Map<String,Object>> 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)); simpleLeaveDetailItem.put("qjsc", String.format("%.2f", scMinutes / 60.0));
}
simpleLeaveDetailList.add(simpleLeaveDetailItem); simpleLeaveDetailList.add(simpleLeaveDetailItem);
} else if (leaveMode.equals(AskAndEvctionWayEnum.HOUR.getKey())) { } else if (leaveMode.equals(AskAndEvctionWayEnum.HOUR.getKey())) {
simpleLeaveDetailItem = new HashMap<>(); simpleLeaveDetailItem = new HashMap<>();

@ -424,6 +424,41 @@ public class Utils<T> {
return betweenMinutes; return betweenMinutes;
} }
/**
*
* @param kssj
* @param jssj
* @param overtimePlanList
* @return
*/
public static int removeTimeWithOvertimePlan(String kssj,String jssj,List<Map<String, Object>> overtimePlanList){
int betweenMinutes = 0;
log.debug("removeTimeWithOvertimePlan overtimePlanList : {}", overtimePlanList);
for (Map<String, Object> 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 * @param kssj

Loading…
Cancel
Save