考勤-加班计划流程,加班最小分钟数校验逻辑

zm_dev
sy 8 months ago
parent 59d2142327
commit 11798f0260

@ -55,7 +55,7 @@ public class OvertimePlanServiceImpl extends Service implements OvertimePlanServ
Map<String, String> detailItem;
String sql = "";
//获取作用时段包含计划加班的加班类型的考勤项目集合
sql = "select id,mc, bddrqlx from uf_jcl_kq_kqxm where xmlx = ? and zysd = ?";
sql = "select id,mc, bddrqlx, jbqsfzs,xzzjbsc,rzdjbxss,zzdjbxss,yzdjbxss from uf_jcl_kq_kqxm where xmlx = ? and zysd = ?";
List<Map<String, Object>> jblxAttendanceList = DbTools.getSqlToList(sql, AttendanceItemTypeEnum.WORK_OVERTIME.getKey(), WorkForTimeEnum.PLAN_WORK_OVERTIME.getKey());
//获取人员id和姓名信息
Map<String, String> empIdToNameInfo = CommonUtil.empIdToNameInfo(empIdList);
@ -158,9 +158,35 @@ public class OvertimePlanServiceImpl extends Service implements OvertimePlanServ
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;
//20240814需求变更。非休息班次出现重叠时间自动调整加班开始或结束时间并返回提示
Map<String, String> adjustInfo = new HashMap<>();
adjustInfo.put("startWithAdjust", date + " " + startTime);
adjustInfo.put("endWithAdjust", realEndDate + " " + endTime);
//处理前一天
if(beforeDayOverLap) {
belongDate = DateUtil.beforeDay(date, 1);
adjustInfo = doAdjust(adjustInfo, beforeDayStartTime, beforeDayEndTime);
}
//处理当天
if(currentDayOverLap) {
belongDate = "".equals(belongDate) ? date : belongDate;
adjustInfo = doAdjust(adjustInfo, currentDayStartTime, currentDayEndTime);
}
//处理次日
if(nextDayOverLap) {
belongDate = "".equals(belongDate) ? DateUtil.AfterDay(date, 1) : belongDate;
adjustInfo = doAdjust(adjustInfo, nextDayStartTime, nextDayEndTime);
}
//重置加班开始和结束时间、加班时长
detailItem.put("ksrq", adjustInfo.get("startDate"));
detailItem.put("kssj", adjustInfo.get("startTime"));
detailItem.put("jssj", adjustInfo.get("endTime"));
detailItem.put("jsrq", adjustInfo.get("endDate"));
overtimeMinutes = DateUtil.getBetWeenMinutes(adjustInfo.get("startWithAdjust"), adjustInfo.get("endWithAdjust"));
detailItem.put("jbsc", String.format("%.2f", overtimeMinutes / 60.0));
//4-非休息班次,出现重叠时间,属于不合理加班安排,返回提示”已自动调整开始和结束时间点“
errorMessage.add(Util.null2String(empIdToNameInfo.get(empId)) + "在日期" + date + "的加班计划区间和非休息班次班段出现时间重叠,已自动调整开始和结束时间点!");
//5-加班区间和休息班次出现重叠,首次重叠的日期,即为归属日期
} else if (beforeDayRestBc && beforeDayOverLap) {
belongDate = DateUtil.beforeDay(date, 1);
@ -182,17 +208,51 @@ public class OvertimePlanServiceImpl extends Service implements OvertimePlanServ
//获取人员在归属日被设置的考勤项目
List<Map<String, Object>> attendanceItemSetList = CommonUtil.getAttendanceItemsByEmpIdDate(empId, belongDate);
List<String> kqxmSetIds = attendanceItemSetList.stream().map(f->f.get("keyid").toString()).collect(Collectors.toList());
Map<String, Object> matchItemInfo = new HashMap<>();
for (Map<String, Object> attendanceItemInfo : jblxAttendanceList) {
//判断该加班类型考勤项目是否被该人员使用,且考勤项目的绑定的日期类型是否包含归属日期类型
if (kqxmSetIds.contains(Util.null2String(attendanceItemInfo.get("id")))
&& Util.null2String(attendanceItemInfo.get("bddrqlx")).contains(belongDateType)) {
detailItem.put("jblx", Util.null2String(attendanceItemInfo.get("id")));
detailItem.put("jblxName", Util.null2String(attendanceItemInfo.get("mc")));
matchItemInfo = attendanceItemInfo;
}
}
detailItem.put("gsrq", belongDate);
//20240814需求变更。增加单条明细的最小加班分钟数校验工作日加班最大小时数、周加班最大小时数、月加班最大小时数
if (matchItemInfo.size() == 0) {
errorMessage.add(Util.null2String(empIdToNameInfo.get(empId)) + "在日期" + date + "的加班计划未匹配到合适的加班类型!");
continue;
} else {
String minMinutes = Util.null2String(matchItemInfo.get("jbqsfzs"));
if (!"".equals(minMinutes) && Integer.parseInt(minMinutes) > overtimeMinutes) {
//最小加班分钟数大于单条明细的加班时长分钟数
errorMessage.add(Util.null2String(empIdToNameInfo.get(empId)) + "在日期" + date + "的加班分钟数小于加班类型-"
+ Util.null2String(matchItemInfo.get("mc")) +"设置的最小加班分钟数!");
continue;
}
String limitTotalOvertimeSc = Util.null2String(matchItemInfo.get("xzzjbsc"));
if ("1".equals(limitTotalOvertimeSc)) {
String limitWorkDayHours = Util.null2String(matchItemInfo.get("rzdjbxss"));
String limitWeekHours = Util.null2String(matchItemInfo.get("zzdjbxss"));
String limitMonthHours = Util.null2String(matchItemInfo.get("yzdjbxss"));
//判断是否满足工作日加班最大小时数
boolean needCheckWorkDayHours = !"".equals(limitWorkDayHours) && (belongDateType.equals(DateTypeEnum.WORK_DAY.getKey()) || belongDateType.equals(DateTypeEnum.CHANGECLASS.getKey()));
if (needCheckWorkDayHours && Double.compare(Double.parseDouble(limitWorkDayHours), overtimeMinutes / 60.0) < 0) {
errorMessage.add(Util.null2String(empIdToNameInfo.get(empId)) + "在日期" + date + "的加班时长加班类型-"
+ Util.null2String(matchItemInfo.get("mc")) +"设置的工作日加班最大小时数!");
continue;
}
//判断是否满足周加班最大小时数
if (!"".equals(limitWeekHours)) {
}
//判断是否满足月加班最大小时数
if (!"".equals(limitMonthHours)) {
}
}
}
overtimePlanDetailList.add(detailItem);
}
}
@ -214,6 +274,28 @@ public class OvertimePlanServiceImpl extends Service implements OvertimePlanServ
return resultMap;
}
private Map<String, String> doAdjust(Map<String, String> adjustInfo, String bcStartTime, String bcEndTime) {
String startWithAdjust = adjustInfo.get("startWithAdjust");
String endWithAdjust = adjustInfo.get("endWithAdjust");
//加班区间完全包含了班次区间时
if (bcStartTime.compareTo(startWithAdjust) > 0 && bcEndTime.compareTo(endWithAdjust) < 0) {
startWithAdjust = bcEndTime;
} else {
//加班区间与部分班次区间重叠时
startWithAdjust = bcStartTime.compareTo(startWithAdjust) <= 0 && bcEndTime.compareTo(startWithAdjust) > 0
? bcEndTime : startWithAdjust;
endWithAdjust = bcStartTime.compareTo(endWithAdjust) < 0 && bcEndTime.compareTo(endWithAdjust) >= 0
? bcStartTime : endWithAdjust;
}
adjustInfo.put("startWithAdjust", startWithAdjust);
adjustInfo.put("endWithAdjust", endWithAdjust);
adjustInfo.put("startDate", startWithAdjust.split(" ")[0]);
adjustInfo.put("startTime", startWithAdjust.split(" ")[1]);
adjustInfo.put("endDate", endWithAdjust.split(" ")[0]);
adjustInfo.put("endTime", endWithAdjust.split(" ")[1]);
return adjustInfo;
}
private boolean checkRestBc(String bcId) {
boolean restSign = false;
if (!"".equals(bcId)) {

Loading…
Cancel
Save