|
|
|
@ -167,6 +167,10 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic
|
|
|
|
|
List<String> unableUseJqyeIdList = new ArrayList<>();
|
|
|
|
|
//记录已编辑的请假记录,<人员id-请假类型-日期, 请假时长>
|
|
|
|
|
Map<String, String> editedLeaveInfo = new HashMap<>();
|
|
|
|
|
//记录已编辑的人员请假记录,<人员id, 请假信息list>
|
|
|
|
|
Map<String, List<Map<String, String>>> editedEmpLeaveInfo = new HashMap<>();
|
|
|
|
|
//20241029需求变更,增加单天请假“全局唯一性”约束规则,此处记录已编辑的人员相关的请假信息
|
|
|
|
|
editedEmpLeaveInfo = detailTableData == null ? new HashMap<>() : detailTableData.stream().collect(Collectors.groupingBy(map -> map.get("qjr")));
|
|
|
|
|
//处理明细表1数据,生成触发接口之前编辑内容中已使用的假期额度信息
|
|
|
|
|
editedLeaveInfo = dealDetailTableData(detailTableData, leaveDateList, editedUseJqlxWithEmp, editedUseJqed, unableUseJqyeIdList, editedLeaveInfo);
|
|
|
|
|
//处理主表数据
|
|
|
|
@ -277,7 +281,7 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic
|
|
|
|
|
canUseJqyeInfo.put(item.get("id").toString(), collectUsableHolidayBalance(unableUseJqyeIdList, editedUseJqed, item, startDate, entry.getKey(), empIdToName.get(entry.getKey()), modeId, errorMessage));
|
|
|
|
|
}
|
|
|
|
|
List<Map<String,String>> detailListItem = matchHolidayWithPriority(editedLeaveInfo, checkAmountJqIdList, errorMessage, entry.getKey(),
|
|
|
|
|
empIdToName.get(entry.getKey()), canUseJqyeInfo, holidayPriorityItemList, editedUseJqed, editedUseJqlxWithEmp, entry.getValue());
|
|
|
|
|
empIdToName.get(entry.getKey()), canUseJqyeInfo, holidayPriorityItemList, editedUseJqed, editedUseJqlxWithEmp, entry.getValue(), editedEmpLeaveInfo.get(entry.getKey()));
|
|
|
|
|
if (detailListItem.size() > 0) {
|
|
|
|
|
completeLeaveDetailList.addAll(detailListItem);
|
|
|
|
|
}
|
|
|
|
@ -320,7 +324,8 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic
|
|
|
|
|
* @param editedLeaveInfo 记录记录已编辑的请假记录,<人员id-请假类型-日期, 请假时长>
|
|
|
|
|
* @return 处理明细表1数据,生成触发接口之前编辑内容中已使用的假期额度信息
|
|
|
|
|
*/
|
|
|
|
|
private Map<String, String> dealDetailTableData(List<Map<String, String>> detailTableData, List<String> leaveDateList, Map<String, Double> editedUseJqlxWithEmp, Map<String, Double> editedUseJqed, List<String> unableUseJqyeIdList, Map<String, String> editedLeaveInfo) {
|
|
|
|
|
private Map<String, String> dealDetailTableData(List<Map<String, String>> detailTableData, List<String> leaveDateList, Map<String, Double> editedUseJqlxWithEmp,
|
|
|
|
|
Map<String, Double> editedUseJqed, List<String> unableUseJqyeIdList, Map<String, String> editedLeaveInfo) {
|
|
|
|
|
if (detailTableData != null && detailTableData.size() > 0){
|
|
|
|
|
for (Map<String, String> detailItem : detailTableData) {
|
|
|
|
|
if (leaveDateList.contains(Util.null2String(detailItem.get("ksrq")))) {
|
|
|
|
@ -806,7 +811,7 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic
|
|
|
|
|
*/
|
|
|
|
|
private List<Map<String, String>> matchHolidayWithPriority(Map<String, String> editedLeaveInfo, List<String> checkAmountJqIdList, List<String> errorMessage, String empId, String empName,
|
|
|
|
|
Map<String, List<Map<String, Object>>> canUseJqyeInfo, List<Map<String, Object>> holidayPriorityItemList, Map<String, Double> editedUseJqed,
|
|
|
|
|
Map<String, Double> editedUseJqlxWithEmp, List<Map<String, String>> leaveDetailList) {
|
|
|
|
|
Map<String, Double> editedUseJqlxWithEmp, List<Map<String, String>> leaveDetailList, List<Map<String, String>> editedLeaveInfoList) {
|
|
|
|
|
List<Map<String, String>> result = new ArrayList<>();
|
|
|
|
|
//记录分配假期余额的结果
|
|
|
|
|
boolean matchResultSign = true;
|
|
|
|
@ -847,6 +852,13 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic
|
|
|
|
|
} else{
|
|
|
|
|
leaveDuration = Double.parseDouble(Util.null2String(detailData.get("qjsc")));
|
|
|
|
|
}
|
|
|
|
|
//单日假期“全局唯一性”约束校验
|
|
|
|
|
boolean dailyCheckSign = checkDailyLeaveLicense(empId, empName, detailData, editedLeaveInfoList, leaveDuration, errorMessage);
|
|
|
|
|
if (!dailyCheckSign) {
|
|
|
|
|
leaveDurationMap.put("totalLeaveDuration", Utils.subtract(leaveDurationMap.get("totalLeaveDuration"), leaveDuration));
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
log.info("leaveDuration : [{}]", leaveDuration);
|
|
|
|
|
leaveDurationMap.put("leaveDuration", leaveDuration);
|
|
|
|
|
//20241021逻辑变更,按照假期项目级联优先级,由后往前依次分配请假时长
|
|
|
|
@ -908,7 +920,7 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic
|
|
|
|
|
String message = empName;
|
|
|
|
|
if (jqlxEdited) {
|
|
|
|
|
//人员id+日期+假期类型三种条件约束唯一性
|
|
|
|
|
message = message + "_" + ksrq + "已存在一笔该请假类型的请假明细!";
|
|
|
|
|
message = message + "_" + ksrq + "本流程中已存在一笔该请假类型的请假明细!";
|
|
|
|
|
} else if(!dealSign) {
|
|
|
|
|
message = message + "_" + ksrq + "不存在可使用的假期余额,请检查假期余额使用次数和最小使用时长设置!";
|
|
|
|
|
} else {
|
|
|
|
@ -922,6 +934,177 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic
|
|
|
|
|
return matchResultSign ? result : new ArrayList<>();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private boolean checkDailyLeaveLicense(String empId, String empName, Map<String, String> detailData, List<Map<String, String>> editedLeaveInfoList,
|
|
|
|
|
double leaveDuration, List<String> errorMessage) {
|
|
|
|
|
//判断当前请假信息属于哪一种请假方式(全天、半天、指定时长、指定区间)
|
|
|
|
|
String leaveMode = "";
|
|
|
|
|
if (!"".equals(Util.null2String(detailData.get("kssj")))) {
|
|
|
|
|
leaveMode = AskAndEvctionWayEnum.TIME_INTERVAL.getKey();
|
|
|
|
|
} else if ("1".equals(Util.null2String(detailData.get("qtj")))) {
|
|
|
|
|
leaveMode = AskAndEvctionWayEnum.ALLDAY.getKey();
|
|
|
|
|
} else if ("1".equals(Util.null2String(detailData.get("btj")))) {
|
|
|
|
|
leaveMode = AskAndEvctionWayEnum.HALFDAY.getKey();
|
|
|
|
|
} else {
|
|
|
|
|
leaveMode = AskAndEvctionWayEnum.HOUR.getKey();
|
|
|
|
|
}
|
|
|
|
|
String ksrq = Util.null2String(detailData.get("ksrq"));
|
|
|
|
|
String jsrq = Util.null2String(detailData.get("jsrq"));
|
|
|
|
|
String kssj = Util.null2String(detailData.get("kssj"));
|
|
|
|
|
String jssj = Util.null2String(detailData.get("jssj"));
|
|
|
|
|
//查询数据库中当天存在的请假记录
|
|
|
|
|
List<Map<String, Object>> existLeaveInfo;
|
|
|
|
|
String sql = "select b.* from uf_jcl_kq_qjjl a left join uf_jcl_kq_qjjl_dt1 b on b.mainid = a.id where a.jlzt != 2 and b.cxqj = 0 and b.qjry = " + empId;
|
|
|
|
|
if (leaveMode.equals(AskAndEvctionWayEnum.TIME_INTERVAL.getKey())) {
|
|
|
|
|
sql = sql + " and ((b.ksrq >= ? and b.ksrq <= ?) or (b.jsrq >= ? and b.jsrq <= ?) or (b.ksrq <= ? and b.jsrq >= ?))";
|
|
|
|
|
existLeaveInfo = DbTools.getSqlToList(sql, ksrq, jsrq, ksrq, jsrq, ksrq, jsrq);
|
|
|
|
|
} else {
|
|
|
|
|
sql = sql + " and b.ksrq <= ? and b.jsrq >= ?";
|
|
|
|
|
existLeaveInfo = DbTools.getSqlToList(sql, ksrq, ksrq);
|
|
|
|
|
}
|
|
|
|
|
//分析数据库中已存在请假数据
|
|
|
|
|
String message = empName;
|
|
|
|
|
double existLeaveSc = 0;
|
|
|
|
|
if (existLeaveInfo.size() > 0) {
|
|
|
|
|
List<Map<String, Object>> timeIntervalLeaveList = new ArrayList<>();
|
|
|
|
|
List<Map<String, Object>> allDayLeaveList = new ArrayList<>();
|
|
|
|
|
List<Map<String, Object>> otherLeaveList = new ArrayList<>();
|
|
|
|
|
for (Map<String, Object> leaveItem : existLeaveInfo) {
|
|
|
|
|
if (!"".equals(Util.null2String(leaveItem.get("kssj")))) {
|
|
|
|
|
timeIntervalLeaveList.add(leaveItem);
|
|
|
|
|
} else if ("1".equals(Util.null2String(leaveItem.get("qtj")))) {
|
|
|
|
|
allDayLeaveList.add(leaveItem);
|
|
|
|
|
} else {
|
|
|
|
|
otherLeaveList.add(leaveItem);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (allDayLeaveList.size() > 0) {
|
|
|
|
|
//该日期已存在全天假时
|
|
|
|
|
message = message + "_" + ksrq + "已存在全天假, 不允许再进行任何请假申请!";
|
|
|
|
|
errorMessage.add(message);
|
|
|
|
|
return false;
|
|
|
|
|
} else if (leaveMode.equals(AskAndEvctionWayEnum.ALLDAY.getKey())) {
|
|
|
|
|
//该日期即将生成全天假
|
|
|
|
|
//首先判断,是否已存在区间假信息,且区间假区间与目标日期有重叠时间段,然后判断其他请假方式是由已经存在记录
|
|
|
|
|
List<Map<String, Object>> overlappingList = timeIntervalLeaveList.stream().filter(f ->
|
|
|
|
|
DateUtil.isOverlapping(ksrq + " 00:00", ksrq + " 23:59", f.get("ksrq") + " " + f.get("kssj"), f.get("jsrq") + " " + f.get("jssj")))
|
|
|
|
|
.collect(Collectors.toList());
|
|
|
|
|
if (overlappingList.size() > 0 || otherLeaveList.size() > 0) {
|
|
|
|
|
message = message + "_" + ksrq + "已存在请假记录, 不允许再进行全天假方式的请假申请!";
|
|
|
|
|
errorMessage.add(message);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
} else if (leaveMode.equals(AskAndEvctionWayEnum.TIME_INTERVAL.getKey())) {
|
|
|
|
|
//该日期即将生成指定时间区间假
|
|
|
|
|
//首先判断,是否已存在区间假之外的信息,然后判断是否存在区间假且存在交集
|
|
|
|
|
List<Map<String, Object>> overlappingList = timeIntervalLeaveList.stream().filter(f ->
|
|
|
|
|
DateUtil.isOverlapping(ksrq + " " + kssj, jsrq + " " + jssj, f.get("ksrq") + " " + f.get("kssj"), f.get("jsrq") + " " + f.get("jssj")))
|
|
|
|
|
.collect(Collectors.toList());
|
|
|
|
|
if (overlappingList.size() > 0 || otherLeaveList.size() > 0) {
|
|
|
|
|
message = message + "在" + ksrq + "开始的请假区间内已存在请假记录的区间重叠, 不允许再进行请假申请!";
|
|
|
|
|
errorMessage.add(message);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
} else if (leaveMode.equals(AskAndEvctionWayEnum.HALFDAY.getKey()) || leaveMode.equals(AskAndEvctionWayEnum.HOUR.getKey())) {
|
|
|
|
|
//该日期即将生成指定时间长度假或者半天假
|
|
|
|
|
//首先判断,是否已存在区间假信息,且区间假区间与目标日期有重叠时间段
|
|
|
|
|
List<Map<String, Object>> overlappingList = timeIntervalLeaveList.stream().filter(f ->
|
|
|
|
|
DateUtil.isOverlapping(ksrq + " 00:00", ksrq + " 23:59", f.get("ksrq") + " " + f.get("kssj"), f.get("jsrq") + " " + f.get("jssj")))
|
|
|
|
|
.collect(Collectors.toList());
|
|
|
|
|
if (overlappingList.size() > 0) {
|
|
|
|
|
message = message + "_" + ksrq + "已存在指定时间区间请假记录, 不允许再其他方式的请假申请!";
|
|
|
|
|
errorMessage.add(message);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
//然后判断其他请假方式是由已经存在记录,结合该类请假记录的已有请假时长之和判断
|
|
|
|
|
if (otherLeaveList.size() > 0) {
|
|
|
|
|
existLeaveSc = otherLeaveList.stream().mapToDouble(e->Double.parseDouble(e.getOrDefault("qjsc", "0").toString())).sum();
|
|
|
|
|
if (existLeaveSc + leaveDuration > 8) {
|
|
|
|
|
message = message + "_" + ksrq + "已存在共计" + existLeaveSc + "小时的请假记录, 新申请假期累计后已超过8小时!";
|
|
|
|
|
errorMessage.add(message);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//分析当前流程已编辑请假明细中已存在请假数据
|
|
|
|
|
if (editedLeaveInfoList != null && editedLeaveInfoList.size() > 0) {
|
|
|
|
|
//筛选出时间范围内的
|
|
|
|
|
if (leaveMode.equals(AskAndEvctionWayEnum.TIME_INTERVAL.getKey())) {
|
|
|
|
|
editedLeaveInfoList = editedLeaveInfoList.stream()
|
|
|
|
|
.filter(f -> (Util.null2String(f.get("ksrq")).compareTo(ksrq) >= 0 && Util.null2String(f.get("ksrq")).compareTo(jsrq) <= 0)
|
|
|
|
|
|| (Util.null2String(f.get("jsrq")).compareTo(ksrq) >= 0 && Util.null2String(f.get("jsrq")).compareTo(jsrq) <= 0)
|
|
|
|
|
|| (Util.null2String(f.get("ksrq")).compareTo(ksrq) <= 0 && Util.null2String(f.get("jsrq")).compareTo(jsrq) >= 0))
|
|
|
|
|
.collect(Collectors.toList());
|
|
|
|
|
} else {
|
|
|
|
|
editedLeaveInfoList = editedLeaveInfoList.stream()
|
|
|
|
|
.filter(f -> Util.null2String(f.get("ksrq")).compareTo(ksrq) <= 0 && Util.null2String(f.get("jsrq")).compareTo(ksrq) >= 0)
|
|
|
|
|
.collect(Collectors.toList());
|
|
|
|
|
}
|
|
|
|
|
List<Map<String, String>> timeIntervalLeaveList = new ArrayList<>();
|
|
|
|
|
List<Map<String, String>> allDayLeaveList = new ArrayList<>();
|
|
|
|
|
List<Map<String, String>> otherLeaveList = new ArrayList<>();
|
|
|
|
|
for (Map<String, String> leaveItem : editedLeaveInfoList) {
|
|
|
|
|
if (!"".equals(Util.null2String(leaveItem.get("kssj")))) {
|
|
|
|
|
timeIntervalLeaveList.add(leaveItem);
|
|
|
|
|
} else if ("1".equals(Util.null2String(leaveItem.get("qtj")))) {
|
|
|
|
|
allDayLeaveList.add(leaveItem);
|
|
|
|
|
} else {
|
|
|
|
|
otherLeaveList.add(leaveItem);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (allDayLeaveList.size() > 0) {
|
|
|
|
|
//该日期已存在全天假时
|
|
|
|
|
message = message + "_" + ksrq + "在当前流程中已编辑了全天假, 不允许再进行任何请假申请!";
|
|
|
|
|
errorMessage.add(message);
|
|
|
|
|
return false;
|
|
|
|
|
} else if (leaveMode.equals(AskAndEvctionWayEnum.ALLDAY.getKey())) {
|
|
|
|
|
//该日期即将生成全天假
|
|
|
|
|
//首先判断,是否已存在区间假信息,且区间假区间与目标日期有重叠时间段,然后判断其他请假方式是由已经存在记录
|
|
|
|
|
List<Map<String, String>> overlappingList = timeIntervalLeaveList.stream().filter(f ->
|
|
|
|
|
DateUtil.isOverlapping(ksrq + " 00:00", ksrq + " 23:59", f.get("ksrq") + " " + f.get("kssj"), f.get("jsrq") + " " + f.get("jssj")))
|
|
|
|
|
.collect(Collectors.toList());
|
|
|
|
|
if (overlappingList.size() > 0 || otherLeaveList.size() > 0) {
|
|
|
|
|
message = message + "_" + ksrq + "在当前流程中已生成了请假记录, 不允许再进行全天假方式的请假申请!";
|
|
|
|
|
errorMessage.add(message);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
} else if (leaveMode.equals(AskAndEvctionWayEnum.TIME_INTERVAL.getKey())) {
|
|
|
|
|
//该日期即将生成指定时间区间假
|
|
|
|
|
//首先判断,是否已存在区间假之外的信息,然后判断是否存在区间假且存在交集
|
|
|
|
|
List<Map<String, String>> overlappingList = timeIntervalLeaveList.stream().filter(f ->
|
|
|
|
|
DateUtil.isOverlapping(ksrq + " " + kssj, jsrq + " " + jssj, f.get("ksrq") + " " + f.get("kssj"), f.get("jsrq") + " " + f.get("jssj")))
|
|
|
|
|
.collect(Collectors.toList());
|
|
|
|
|
if (overlappingList.size() > 0 || otherLeaveList.size() > 0) {
|
|
|
|
|
message = message + "在" + ksrq + "开始的请假区间内已存在请假记录的区间重叠, 不允许再进行请假申请!";
|
|
|
|
|
errorMessage.add(message);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
} else if (leaveMode.equals(AskAndEvctionWayEnum.HALFDAY.getKey()) || leaveMode.equals(AskAndEvctionWayEnum.HOUR.getKey())) {
|
|
|
|
|
//该日期即将生成指定时间长度假或者半天假
|
|
|
|
|
//首先判断,是否已存在区间假信息,且区间假区间与目标日期有重叠时间段
|
|
|
|
|
List<Map<String, String>> overlappingList = timeIntervalLeaveList.stream().filter(f ->
|
|
|
|
|
DateUtil.isOverlapping(ksrq + " 00:00", ksrq + " 23:59", f.get("ksrq") + " " + f.get("kssj"), f.get("jsrq") + " " + f.get("jssj")))
|
|
|
|
|
.collect(Collectors.toList());
|
|
|
|
|
if (overlappingList.size() > 0) {
|
|
|
|
|
message = message + "_" + ksrq + "在当前流程中已存在指定时间区间请假记录, 不允许再其他方式的请假申请!";
|
|
|
|
|
errorMessage.add(message);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
//然后判断其他请假方式是由已经存在记录,结合该类请假记录的已有请假时长之和判断
|
|
|
|
|
if (otherLeaveList.size() > 0) {
|
|
|
|
|
existLeaveSc = existLeaveSc + otherLeaveList.stream().mapToDouble(e->Double.parseDouble(e.getOrDefault("qjsc", "0").toString())).sum();
|
|
|
|
|
if (existLeaveSc + leaveDuration > 8) {
|
|
|
|
|
message = message + "_" + ksrq + "已存在当天请假记录和当前流程已编辑请假明细共计" + existLeaveSc + "小时的请假记录, 新申请假期累计后已超过8小时!";
|
|
|
|
|
errorMessage.add(message);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private boolean dealLeaveDetailWithJqyeInfo(Map<String, String> detailData, List<Map<String, Object>> canUseJqyeInfo,
|
|
|
|
|
Map<String, Double> editedUseJqed, Map<String, Double> leaveDurationMap,
|
|
|
|
|
String ksrq, String itemId, String itemName, List<Map<String, String>> result) {
|
|
|
|
|