考勤-请假、出差流程,全局唯一性规则校验

main
sy 7 months ago
parent 5680590a31
commit 6b0f1e6e6c

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

@ -79,6 +79,10 @@ public class BusinessTripsApplyServiceImpl extends Service implements BusinessTr
List<String> ccDateList = DateUtil.getDatesBetween(startDate, endDate);
//记录已编辑的出差记录,<人员id-出差类型-日期, 请假时长>
Map<String, String> editedCcInfo = new HashMap<>();
//记录已编辑的人员出差记录,<人员id, 出差信息list>
Map<String, List<Map<String, String>>> editedEmpCcInfo = new HashMap<>();
//20241104需求变更增加单天出差“全局唯一性”约束规则此处记录已编辑的人员相关的出差信息
editedEmpCcInfo = detailTableData == null ? new HashMap<>() : detailTableData.stream().collect(Collectors.groupingBy(map -> map.get("ccr")));
//处理明细表1数据生成触发接口之前编辑内容中的出差信息
editedCcInfo = dealDetailTableData(detailTableData, editedCcInfo);
//处理主表数据
@ -148,19 +152,28 @@ public class BusinessTripsApplyServiceImpl extends Service implements BusinessTr
Map<String, List<Map<String, String>>> ccDetailGroupByEmp = simpleDetailList.stream().collect(Collectors.groupingBy(e -> Util.null2String(e.get("ccr"))));
//收集需要新建的出差明细数据
List<Map<String, String>> completeLeaveDetailList = new ArrayList<>();
Map<String, String> finalEditedCcInfo = editedCcInfo;
// Map<String, String> finalEditedCcInfo = editedCcInfo;
for(Map.Entry<String,List<Map<String,String>>> entry : ccDetailGroupByEmp.entrySet()) {
//校验该人员的考勤周期是否正常
boolean kqCycleAllow = kqCycleCheck(entry.getKey(), entry.getValue(), errorMessage, empIdToName.get(entry.getKey()));
if (!kqCycleAllow) {
continue;
}
List<Map<String,String>> detailListItem = entry.getValue().stream()
.filter(f -> finalEditedCcInfo.get(Util.null2String(f.get("ccr")) + "_" + Util.null2String(f.get("cclx")) + "_" + Util.null2String(f.get("ksrq"))) == null)
.collect(Collectors.toList());
if (detailListItem.size() > 0) {
completeLeaveDetailList.addAll(detailListItem);
//
for (Map<String,String> detailItem : entry.getValue()) {
//单日出差“全局唯一性”约束校验
boolean dailyCheckSign = checkDailyBusinessTripsLicense(entry.getKey(), detailItem, editedEmpCcInfo.get(entry.getKey()), errorMessage);
if (dailyCheckSign) {
completeLeaveDetailList.add(detailItem);
}
}
// List<Map<String,String>> detailListItem = entry.getValue().stream()
// .filter(f -> finalEditedCcInfo.get(Util.null2String(f.get("ccr")) + "_" + Util.null2String(f.get("cclx")) + "_" + Util.null2String(f.get("ksrq"))) == null)
// .collect(Collectors.toList());
// if (detailListItem.size() > 0) {
// completeLeaveDetailList.addAll(detailListItem);
// }
}
if (errorMessage.size() == 0) {
@ -181,6 +194,190 @@ public class BusinessTripsApplyServiceImpl extends Service implements BusinessTr
return resultMap;
}
private boolean checkDailyBusinessTripsLicense(String empId, Map<String, String> detailData, List<Map<String, String>> editedBusinessTripsList, List<String> errorMessage) {
//出差时间
double ccDuration;
//判断当前请假信息属于哪一种出差方式(全天、半天、指定时长、指定区间)
String leaveMode = "";
if (!"".equals(Util.null2String(detailData.get("kssj")))) {
leaveMode = AskAndEvctionWayEnum.TIME_INTERVAL.getKey();
ccDuration = Double.parseDouble(Util.null2String(detailData.get("ccsc")));
} else if ("1".equals(Util.null2String(detailData.get("qtcc")))) {
leaveMode = AskAndEvctionWayEnum.ALLDAY.getKey();
ccDuration = 8;
} else if ("1".equals(Util.null2String(detailData.get("btcc")))) {
leaveMode = AskAndEvctionWayEnum.HALFDAY.getKey();
ccDuration = 4;
} else {
leaveMode = AskAndEvctionWayEnum.HOUR.getKey();
ccDuration = Double.parseDouble(Util.null2String(detailData.get("ccsc")));
}
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_ccjl a left join uf_jcl_kq_ccjl_dt1 b on b.mainid = a.id where a.jlzt != 2 and b.cxcc= 0 and b.ccr = " + 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 = Util.null2String(detailData.get("ccrName"));
double existCcSc = 0;
if (existLeaveInfo.size() > 0) {
List<Map<String, Object>> timeIntervalCcList = new ArrayList<>();
List<Map<String, Object>> allDayCcList = new ArrayList<>();
List<Map<String, Object>> otherCcList = new ArrayList<>();
for (Map<String, Object> leaveItem : existLeaveInfo) {
if (!"".equals(Util.null2String(leaveItem.get("kssj")))) {
timeIntervalCcList.add(leaveItem);
} else if ("1".equals(Util.null2String(leaveItem.get("qtcc")))) {
allDayCcList.add(leaveItem);
} else {
otherCcList.add(leaveItem);
}
}
if (allDayCcList.size() > 0) {
//该日期已存在全天出差时
message = message + "_" + ksrq + "已存在全天出差, 不允许再进行任何出差申请!";
errorMessage.add(message);
return false;
} else if (leaveMode.equals(AskAndEvctionWayEnum.ALLDAY.getKey())) {
//该日期即将生成全天出差
//首先判断,是否已存在区间出差信息,且区间出差区间与目标日期有重叠时间段,然后判断其他出差方式是由已经存在记录
List<Map<String, Object>> overlappingList = timeIntervalCcList.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 || otherCcList.size() > 0) {
message = message + "_" + ksrq + "已存在出差记录, 不允许再进行全天出差方式的出差申请!";
errorMessage.add(message);
return false;
}
} else if (leaveMode.equals(AskAndEvctionWayEnum.TIME_INTERVAL.getKey())) {
//该日期即将生成指定时间区间出差
//首先判断,是否已存在区间出差之外的信息,然后判断是否存在区间出差且存在交集
List<Map<String, Object>> overlappingList = timeIntervalCcList.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 || otherCcList.size() > 0) {
message = message + "在" + ksrq + "到" + jsrq + "的出差区间内已存在出差记录, 不允许再进行出差申请!";
errorMessage.add(message);
return false;
}
} else if (leaveMode.equals(AskAndEvctionWayEnum.HALFDAY.getKey()) || leaveMode.equals(AskAndEvctionWayEnum.HOUR.getKey())) {
//该日期即将生成指定时间长度出差或者半天出差
//首先判断,是否已存在区间出差信息,且区间出差区间与目标日期有重叠时间段
List<Map<String, Object>> overlappingList = timeIntervalCcList.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 (otherCcList.size() > 0) {
existCcSc = otherCcList.stream().mapToDouble(e -> {
if ("1".equals(Util.null2String(e.get("btcc")))) {
return Double.parseDouble("4");
} else if (!"".equals(Util.null2String(e.get("ccsc")))) {
return Double.parseDouble(e.get("ccsc").toString());
} else {
return Double.parseDouble("0");
}
}).sum();
if (existCcSc + ccDuration > 8) {
message = message + "_" + ksrq + "已存在共计" + existCcSc + "小时的出差记录, 新申请出差累计后已超过8小时";
errorMessage.add(message);
return false;
}
}
}
}
//分析当前流程已编辑出差明细中已存在出差数据
if (editedBusinessTripsList != null && editedBusinessTripsList.size() > 0) {
//筛选出时间范围内的
if (leaveMode.equals(AskAndEvctionWayEnum.TIME_INTERVAL.getKey())) {
editedBusinessTripsList = editedBusinessTripsList.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 {
editedBusinessTripsList = editedBusinessTripsList.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>> timeIntervalCcList = new ArrayList<>();
List<Map<String, String>> allDayCcList = new ArrayList<>();
List<Map<String, String>> otherCcList = new ArrayList<>();
for (Map<String, String> leaveItem : editedBusinessTripsList) {
if (!"".equals(Util.null2String(leaveItem.get("kssj")))) {
timeIntervalCcList.add(leaveItem);
} else if ("1".equals(Util.null2String(leaveItem.get("qtcc")))) {
allDayCcList.add(leaveItem);
} else {
otherCcList.add(leaveItem);
}
}
if (allDayCcList.size() > 0) {
//该日期已存在全天出差时
message = message + "_" + ksrq + "在当前流程中已编辑了全天出差, 不允许再进行任何出差申请!";
errorMessage.add(message);
return false;
} else if (leaveMode.equals(AskAndEvctionWayEnum.ALLDAY.getKey())) {
//该日期即将生成全天出差
//首先判断,是否已存在区间出差信息,且区间出差区间与目标日期有重叠时间段,然后判断其他出差方式是由已经存在记录
List<Map<String, String>> overlappingList = timeIntervalCcList.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 || otherCcList.size() > 0) {
message = message + "_" + ksrq + "在当前流程中已生成了出差记录, 不允许再进行全天出差方式的出差申请!";
errorMessage.add(message);
return false;
}
} else if (leaveMode.equals(AskAndEvctionWayEnum.TIME_INTERVAL.getKey())) {
//该日期即将生成指定时间区间出差
//首先判断,是否已存在区间出差之外的信息,然后判断是否存在区间出差且存在交集
List<Map<String, String>> overlappingList = timeIntervalCcList.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 || otherCcList.size() > 0) {
message = message + "在" + ksrq + "到" + jsrq + "的出差区间内在当前流程中已存在出差记录, 不允许再进行出差申请!";
errorMessage.add(message);
return false;
}
} else if (leaveMode.equals(AskAndEvctionWayEnum.HALFDAY.getKey()) || leaveMode.equals(AskAndEvctionWayEnum.HOUR.getKey())) {
//该日期即将生成指定时间长度出差或者半天出差
//首先判断,是否已存在区间出差信息,且区间出差区间与目标日期有重叠时间段
List<Map<String, String>> overlappingList = timeIntervalCcList.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 (otherCcList.size() > 0) {
existCcSc = existCcSc + otherCcList.stream().mapToDouble(e->Double.parseDouble(e.getOrDefault("ccsc", "0").toString())).sum();
if (existCcSc + ccDuration > 8) {
message = message + "_" + ksrq + "已存在当天出差记录和当前流程已编辑出差明细共计" + existCcSc + "小时的出差记录, 新申请出差累计后已超过8小时";
errorMessage.add(message);
return false;
}
}
}
}
return true;
}
/**
*
* @param empIdList id

@ -813,7 +813,7 @@ public class CommonUtil {
public static List<String> getJqInfoWithAmount() {
List<String> jqIdList = new ArrayList<>();
//来自假期额度
String sql1 = "select * from uf_jcl_kq_jqed";
String sql1 = "select * from uf_jcl_kq_jqed where gzzt = 0";
List<Map<String,Object>> data1 = DbTools.getSqlToList(sql1);
for (Map<String, Object> map : data1) {
jqIdList.add(Util.null2String(map.get("jb")));

Loading…
Cancel
Save