考勤-加班计划流程,加班计划明细筛选去重逻辑增加

zm_dev
sy 10 months ago
parent cd85db15cc
commit ad21ed944b

@ -59,12 +59,15 @@ public class OvertimePlanServiceImpl extends Service implements OvertimePlanServ
List<Map<String, Object>> jblxAttendanceList = DbTools.getSqlToList(sql, AttendanceItemTypeEnum.WORK_OVERTIME.getKey(), WorkForTimeEnum.PLAN_WORK_OVERTIME.getKey()); List<Map<String, Object>> jblxAttendanceList = DbTools.getSqlToList(sql, AttendanceItemTypeEnum.WORK_OVERTIME.getKey(), WorkForTimeEnum.PLAN_WORK_OVERTIME.getKey());
//获取人员id和姓名信息 //获取人员id和姓名信息
Map<String, String> empIdToNameInfo = CommonUtil.empIdToNameInfo(empIdList); Map<String, String> empIdToNameInfo = CommonUtil.empIdToNameInfo(empIdList);
//获取目标人员列表已存在的加班计划
Map<String, List<Map<String, Object>>> existOvertimePlanInfo = getOvertimePlanInfo(empIdList, startDate);
List<Map<String, Object>> existOvertimePlanList = new ArrayList<>();
for (String empId : empIdList) { for (String empId : empIdList) {
List<Map<String, Object>> scheduleInfoList = scheduleInfoMap.get(empId); List<Map<String, Object>> scheduleInfoList = scheduleInfoMap.get(empId);
Map<String, String> dateToBcxxMap = scheduleInfoList == null ? new HashMap<>() : scheduleInfoList.stream().collect(Collectors.toMap(e->Util.null2String(e.get("bcrq")), e->Util.null2String(e.get("bcxx")))); Map<String, String> dateToBcxxMap = scheduleInfoList == null ? new HashMap<>() : scheduleInfoList.stream().collect(Collectors.toMap(e->Util.null2String(e.get("bcrq")), e->Util.null2String(e.get("bcxx"))));
Map<String, String> dateTypeInfoFromBc = scheduleInfoList == null ? new HashMap<>() : scheduleInfoList.stream().collect(Collectors.toMap(e->Util.null2String(e.get("bcrq")), e->Util.null2String(e.get("rqlx")))); Map<String, String> dateTypeInfoFromBc = scheduleInfoList == null ? new HashMap<>() : scheduleInfoList.stream().collect(Collectors.toMap(e->Util.null2String(e.get("bcrq")), e->Util.null2String(e.get("rqlx"))));
existOvertimePlanList = existOvertimePlanInfo.get(empId);
for (String date : dateList) { for (String date : dateList) {
String realEndDate = date; String realEndDate = date;
detailItem = new HashMap<>(); detailItem = new HashMap<>();
@ -80,6 +83,12 @@ public class OvertimePlanServiceImpl extends Service implements OvertimePlanServ
realEndDate = DateUtil.AfterDay(date,1); realEndDate = DateUtil.AfterDay(date,1);
} }
detailItem.put("jsrq", realEndDate); detailItem.put("jsrq", realEndDate);
//判断改组明细是否与已存在的加班计划有重叠
boolean overLappingSign = checkOverlapping(existOvertimePlanList, date + " " +startTime, realEndDate + " " + endTime);
if (overLappingSign) {
errorMessage.add(Util.null2String(empIdToNameInfo.get(empId)) + "在日期" + date + "的加班计划区间和已申请的加班计划(已审核/待审核)出现时间重叠,不允许申请加班!");
continue;
}
//加班时长 //加班时长
int overtimeMinutes = DateUtil.getBetWeenMinutes(date + " " + startTime, realEndDate + " " + endTime); int overtimeMinutes = DateUtil.getBetWeenMinutes(date + " " + startTime, realEndDate + " " + endTime);
detailItem.put("jbsc", String.format("%.2f", overtimeMinutes / 60.0)); detailItem.put("jbsc", String.format("%.2f", overtimeMinutes / 60.0));
@ -184,6 +193,40 @@ public class OvertimePlanServiceImpl extends Service implements OvertimePlanServ
return resultMap; return resultMap;
} }
private boolean checkOverlapping(List<Map<String, Object>> existOvertimePlanList, String startTimePoint, String endTimePoint) {
boolean overlappingSign = false;
if (existOvertimePlanList != null && existOvertimePlanList.size() > 0) {
String contrastStartPoint = "";
String contrastEndPoint = "";
for (Map<String, Object> item : existOvertimePlanList) {
contrastStartPoint = item.get("ksrq") + " " + item.get("kssj");
contrastEndPoint = item.get("jsrq") + " " + item.get("jssj");
overlappingSign = DateUtil.isOverlapping(contrastStartPoint, contrastEndPoint, startTimePoint, endTimePoint);
if (overlappingSign) {
break;
}
}
}
return overlappingSign;
}
/**
*
* @param empIdList id
* @param matchDate
* @returnd
*/
private Map<String, List<Map<String, Object>>> getOvertimePlanInfo(List<String> empIdList, String matchDate) {
Map<String, List<Map<String, Object>>> result = new HashMap<>();
if (empIdList.size() > 0 && !"".equals(matchDate)) {
String sql = "select b.id, b.jbry, b.ksrq, b.jsrq, b.kssj, b.jssj from uf_jcl_kq_jbjh a left join uf_jcl_kq_jbjh_dt1 b on b.mainid = a.id where a.jlzt != 2 and b.jsrq >= '"
+ matchDate + "' and b.jbry in (" + String.join(",",empIdList) + ")";
List<Map<String, Object>> data = DbTools.getSqlToList(sql);
result = data.stream().collect(Collectors.groupingBy(e->e.get("jbry").toString()));
}
return result;
}
public String getBcStartAndEndTime(String date, String currentDayBcId, List<String> workBdlxList) { public String getBcStartAndEndTime(String date, String currentDayBcId, List<String> workBdlxList) {
String startToEnd = ""; String startToEnd = "";
if (!"".equals(currentDayBcId)) { if (!"".equals(currentDayBcId)) {

@ -388,4 +388,35 @@ public class DateUtil {
} }
return dates; return dates;
} }
/**
*
*/
public static boolean isOverlapping(String startTime1, String endTime1, String startTime2, String endTime2) {
// 如果结束时间小于另一个的开始时间,则不重叠
if (endTime1.compareTo(startTime2) <= 0) {
return false;
}
// 如果开始时间大于另一个的结束时间,则不重叠
if (startTime1.compareTo(endTime2) >= 0) {
return false;
}
// 否则,两个时间段重叠
return true;
}
/**
*
*/
public static int getOverlappedMinutes(String startTime1, String endTime1, String startTime2, String endTime2) {
if (isOverlapping(startTime1, endTime1, startTime2, endTime2)) {
// 取两个段的最大开始和最小结束时间
String start = startTime1.compareTo(startTime2) >= 0 ? startTime1 : startTime2;
String end = endTime1.compareTo(endTime2) <= 0 ? endTime1 : endTime2;
// 计算重叠的分钟数
return getBetWeenMinutes(start, end);
}
// 如果不重叠返回0
return 0;
}
} }

Loading…
Cancel
Save