考勤-加班计划流程,加班计划区间允许与休息班次区间出现重叠;修复请假、出差明细生成bug

zm_dev
sy 8 months ago
parent ad21ed944b
commit 4c91cd0ac8

@ -228,7 +228,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, DateUtil.beforeDay(startDate,1), DateUtil.AfterDay(endDate,1)) : new HashMap<>();
Map<String, List<Map<String, Object>>> scheduleInfoMap = getScheduleInfoWithEmpId(leaveEmpIdList, DateUtil.beforeDay(startDate,1), DateUtil.AfterDay(endDate,1));
//收集未关联假期余额的请假明细数据
List<Map<String, String>> simpleLeaveDetailList;

@ -134,7 +134,7 @@ public class BusinessTripsApplyServiceImpl extends Service implements BusinessTr
//出差人的出差区间内每一天的日期类型信息,来自于企业日历
Map<String, List<String>> restDayInfo = removeNonWorkDayRange ? getRestDayWithEmpId(ccEmpIdList, startDate, endDate) : new HashMap<>();
//出差人的出差区间内的排班结果
Map<String, List<Map<String, Object>>> scheduleInfoMap = (removeNonWorkDayRange || removeNonWorkTimeRange) ? getScheduleInfoWithEmpId(ccEmpIdList, DateUtil.beforeDay(startDate,1), DateUtil.AfterDay(endDate,1)) : new HashMap<>();
Map<String, List<Map<String, Object>>> scheduleInfoMap = getScheduleInfoWithEmpId(ccEmpIdList, DateUtil.beforeDay(startDate,1), DateUtil.AfterDay(endDate,1));
//生成出差明细数据
List<Map<String, String>> simpleDetailList;

@ -99,6 +99,8 @@ public class OvertimePlanServiceImpl extends Service implements OvertimePlanServ
String currentDayStartToEnd = getBcStartAndEndTime(date, currentDayBcId, workBdlxList);
String currentDayStartTime = !"".equals(currentDayStartToEnd) ? currentDayStartToEnd.split(",")[0] : "";
String currentDayEndTime = !"".equals(currentDayStartToEnd) ? currentDayStartToEnd.split(",")[1] : "";
//判断当天班次是否为休息班次、且“休息班打卡自动加班”未勾选
boolean currentDayRestBc = checkRestBc(currentDayBcId);
//获取前1天班次id
String beforeDayBcId = Util.null2String(dateToBcxxMap.get(DateUtil.beforeDay(date, 1))).split("-")[0];
@ -106,6 +108,8 @@ public class OvertimePlanServiceImpl extends Service implements OvertimePlanServ
String beforeDayStartToEnd = getBcStartAndEndTime(DateUtil.beforeDay(date, 1), beforeDayBcId, workBdlxList);
String beforeDayStartTime = !"".equals(beforeDayStartToEnd) ? beforeDayStartToEnd.split(",")[0] : "";
String beforeDayEndTime = !"".equals(beforeDayStartToEnd) ? beforeDayStartToEnd.split(",")[1] : "";
//判断前1天班次是否为休息班次、且“休息班打卡自动加班”未勾选
boolean beforeDayRestBc = checkRestBc(beforeDayBcId);
//获取次日班次id
String nextDayBcId = Util.null2String(dateToBcxxMap.get(DateUtil.AfterDay(date, 1))).split("-")[0];
@ -113,6 +117,9 @@ public class OvertimePlanServiceImpl extends Service implements OvertimePlanServ
String nextDayStartToEnd = getBcStartAndEndTime(DateUtil.AfterDay(date, 1), nextDayBcId, workBdlxList);
String nextDayStartTime = !"".equals(nextDayStartToEnd) ? nextDayStartToEnd.split(",")[0] : "";
String nextDayEndTime = !"".equals(nextDayStartToEnd) ? nextDayStartToEnd.split(",")[1] : "";
//判断次日班次是否为休息班次、且“休息班打卡自动加班”未勾选
boolean nextDayRestBc = checkRestBc(nextDayBcId);
//梳理加班时间段和班段时间段合理的情况
boolean beforeToCurrentDay = false;
boolean currentToNextDay = false;
@ -146,9 +153,23 @@ public class OvertimePlanServiceImpl extends Service implements OvertimePlanServ
belongDate = beforeDayDiffMinutes <= nextDayDiffMinutes ? DateUtil.beforeDay(date, 1) : DateUtil.AfterDay(date, 1);
}
} else {
//4-其他情况,属于不合理加班安排,返回报错
errorMessage.add(Util.null2String(empIdToNameInfo.get(empId)) + "在日期" + date + "的加班计划区间和班次班段出现时间重叠,不允许申请加班!");
continue;
//20240812需求变更休息班次允许加班计划区间和班次班段区间有重叠
boolean currentDayOverLap = !"".equals(currentDayStartToEnd) && DateUtil.isOverlapping(date + " " + startTime, realEndDate + " " + endTime, currentDayStartTime, currentDayEndTime);
boolean beforeDayOverLap = !"".equals(beforeDayStartToEnd) && DateUtil.isOverlapping(date + " " + startTime, realEndDate + " " + endTime, beforeDayStartTime, beforeDayEndTime);
boolean nextDayOverLap = !"".equals(nextDayStartToEnd) && DateUtil.isOverlapping(date + " " + startTime, realEndDate + " " + endTime, nextDayStartTime, nextDayEndTime);
if ((!currentDayRestBc && currentDayOverLap) || (!beforeDayRestBc && beforeDayOverLap) || (!nextDayRestBc && nextDayOverLap)) {
//4-非休息班次,出现重叠时间,属于不合理加班安排,返回报错
errorMessage.add(Util.null2String(empIdToNameInfo.get(empId)) + "在日期" + date + "的加班计划区间和非休息班次班段出现时间重叠,不允许申请加班!");
continue;
//5-加班区间和休息班次出现重叠,首次重叠的日期,即为归属日期
} else if (beforeDayRestBc && beforeDayOverLap) {
belongDate = DateUtil.beforeDay(date, 1);
} else if (currentDayRestBc && currentDayOverLap) {
belongDate = date;
} else if (nextDayRestBc && nextDayOverLap) {
belongDate = DateUtil.AfterDay(date, 1);
}
}
//判断归属日的日期类型,首先从排班的信息来获取
String belongDateType = dateTypeInfoFromBc.getOrDefault(belongDate, "");
@ -193,6 +214,19 @@ public class OvertimePlanServiceImpl extends Service implements OvertimePlanServ
return resultMap;
}
private boolean checkRestBc(String bcId) {
boolean restSign = false;
if (!"".equals(bcId)) {
//查询当天班次明细
String sql = "select id, sfxx, xxbdkzdjb from uf_jcl_kq_bcxx where id = " + bcId;
Map<String, Object> data = DbTools.getSqlToMap(sql);
if ("1".equals(Util.null2String(data.get("sfxx"))) && !"1".equals(Util.null2String(data.get("xxbdkzdjb")))) {
restSign = true;
}
}
return restSign;
}
private boolean checkOverlapping(List<Map<String, Object>> existOvertimePlanList, String startTimePoint, String endTimePoint) {
boolean overlappingSign = false;
if (existOvertimePlanList != null && existOvertimePlanList.size() > 0) {

Loading…
Cancel
Save