|
|
|
@ -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)) {
|
|
|
|
|