You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

499 lines
28 KiB
Java

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package com.engine.jucailinkq.attendance.attendanceanalysis.service.impl;
import com.engine.jucailinkq.attendance.attendanceanalysis.dto.clockpoint.ClockPointDTO;
import com.engine.jucailinkq.attendance.attendanceanalysis.service.ShiftService;
import com.engine.jucailinkq.attendance.attendanceanalysis.service.UtilService;
import com.engine.jucailinkq.attendance.attendanceanalysis.wrapper.UpdateAttendanceResultWrapper;
import com.engine.jucailinkq.attendance.attendanceplan.service.AttendancePlanService;
import com.engine.jucailinkq.attendance.attendanceplan.service.impl.AttendancePlanServiceImpl;
import com.engine.jucailinkq.attendance.enums.CheckBoxEnum;
import com.engine.jucailinkq.attendance.enums.ClassBelongToEnum;
import com.engine.jucailinkq.attendance.enums.ClassSegmentTypeEnum;
import com.engine.jucailinkq.attendance.enums.ClockPointEnum;
import com.engine.jucailinkq.common.util.DateUtil;
import com.engine.jucailinkq.common.util.DbTools;
import com.engine.common.util.ServiceUtil;
import com.engine.jucailinkq.common.util.Utils;
import com.engine.core.impl.Service;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import weaver.general.Util;
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.time.ZoneOffset;
import java.util.*;
import java.util.stream.Collectors;
/**
* @Author: sy
* @Description: 班次相关功能实现类
* @Date: 2024/5/11
**/
@Slf4j
public class ShiftServiceImpl extends Service implements ShiftService {
private AttendancePlanService basicsetService = ServiceUtil.getService(AttendancePlanServiceImpl.class);
private UtilService utilService = ServiceUtil.getService(UtilServiceImpl.class);
private UpdateAttendanceResultWrapper updateAttendanceResultWrapper = ServiceUtil.getService(UpdateAttendanceResultWrapper.class);
/**
* 打卡匹配班次返回班次id
* @param empId 打卡人员id
* @param pbData 排班结果
* @param clockInData 需要包含分析日期以及分析日期前后2天的3天原始打卡数据
* @return
*/
@Override
public Map<String, Object> punchMatchShift(String empId, Map<String,Object> pbData, List<Map<String, Object>> clockInData,Map<String,Map<String,Object>> clockInTimeMap) {
//查询排班结果
// String pbSql = "select * from uf_pbjg where id = " + schedulingResultId;
// Map<String, Object> pbData = DbTools.getSqlToMap(pbSql);
String shiftTeamId = Util.null2String(pbData.get("hxbz")).split("-")[0];
String punchDate = Util.null2String(pbData.get("bcrq"));
Map<String, Object> result = null;
Map<String, Object> maxPriorityResult = null;
if (!shiftTeamId.equals("")) {
//候选班次
String bcSql = "select * from uf_jcl_kq_hxbz_dt1 where mainid = " + shiftTeamId;
List<Map<String, Object>> bcData = DbTools.getSqlToList(bcSql);
if (bcData.size() > 0) {
List<Map<String, Object>> waitCompareResultList = new ArrayList<>();
//循环匹配,输出匹配结果
for (Map<String, Object> bcMap : bcData) {
//获取班次要求打卡数据和请假、出差、加班数据处理后的卡点数据
Map<String, Object> waitCompareMap = dealClockInData(empId, pbData, clockInData, bcMap.get("bcxx").toString(), clockInTimeMap);
waitCompareMap.put("priorityValue", Util.null2String(bcMap.get("yxj")));
waitCompareResultList.add(waitCompareMap);
}
//比较匹配结果
for (Map<String, Object> compareMap : waitCompareResultList) {
//分析每组数据生成对应的ABCDE
compareMap = countMatchItem(compareMap);
String compareB = Util.null2String(compareMap.get("judgePartB"));
if (compareB.equals("")) {
continue;
}
if (result == null) {
result = compareMap;
continue;
}
//1-比较各候选班次实际打卡正常的时间点个数B
String resultB = Util.null2String(result.get("judgePartB"));
if (resultB.compareTo(compareB) != 0) {
result = resultB.compareTo(compareB) < 0 ? compareMap : result;
continue;
}
//2-B相同时,比较B/A最大。各候选班次结合了请假、出差、加班等需要打卡的时间点个数A
String resultA = Util.null2String(result.get("judgePartA"));
String compareA = Util.null2String(compareMap.get("judgePartA"));
double resultBDividedA = (resultA.equals("") || resultA.equals("0")) ? 999 : Double.parseDouble(resultB) / Double.parseDouble(resultA);
double compareBDividedA = (compareA.equals("") || compareA.equals("0")) ? 999 : Double.parseDouble(compareB) / Double.parseDouble(compareA);
if (resultBDividedA != compareBDividedA) {
result = resultBDividedA < compareBDividedA ? compareMap : result;
continue;
}
//3-B/A相同时C最小。异常总分钟数C
String resultC = Util.null2String(result.get("judgePartC"));
String compareC = Util.null2String(compareMap.get("judgePartC"));
if (resultC.compareTo(compareC) != 0) {
result = resultC.compareTo(compareC) > 0 ? compareMap : result;
continue;
}
//4-C相同时D最小,冗余总分钟数D
String resultD = Util.null2String(result.get("judgePartD"));
String compareD = Util.null2String(compareMap.get("judgePartD"));
if (resultD.compareTo(compareD) != 0) {
result = resultD.compareTo(compareD) > 0 ? compareMap : result;
continue;
}
//5-D相同时E最小,班次优先级E候选班组上有各班次的优先级设置
String resultE = Util.null2String(result.get("judgePartE"));
String compareE = Util.null2String(compareMap.get("judgePartE"));
if (resultE.compareTo(compareE) != 0) {
result = resultE.compareTo(compareE) > 0 ? compareMap : result;
}
}
//全天没有打卡时,看上一个工作日的班次为优先,如果前一个工作日也没有班次,按优先级
if (result == null) {
//获取上一个工作日的班次
String lastWorkDayInfoSql = "select * from uf_jcl_kq_cqjg where rqlx = 0 and ygid = " + empId + " and rq < '" + punchDate + "' order by rq desc limit 1;";
Map<String, Object> lastWorkDayInfo = DbTools.getSqlToMap(lastWorkDayInfoSql);
String bcId = Util.null2String(lastWorkDayInfo.get("bc"));
List<Map<String, Object>> bcInfo = waitCompareResultList.stream().filter(f ->f.get("bcId").toString().equals(bcId)).collect(Collectors.toList());
if (!bcId.equals("") && bcInfo.size() > 0) {
result = bcInfo.get(0);
} else {
//上一个工作日没有班次时
maxPriorityResult = waitCompareResultList.stream().min(Comparator.comparing(e ->new Integer(String.valueOf(e.get("judgePartE"))))).get();
result = maxPriorityResult;
}
}
}
}
return result;
}
/**
* 计算卡点数据的匹配条件元素的具体数值
* 考量元素有:
* 各候选班次结合了请假、出差、加班等需要打卡的时间点个数A
* 各候选班次实际打卡正常的时间点个数B
* 异常总分钟数C
* 冗余总分钟数D
* 班次优先级E候选班组上有各班次的优先级设置
* @param compareMap 班次匹配卡点数据
* @return
*/
private Map<String, Object> countMatchItem(Map<String, Object> compareMap) {
List<ClockPointDTO> clockInTimeData = (List<ClockPointDTO>) compareMap.get("clockInTimeData");
int requireClockInNum = clockInTimeData == null ? 0 : clockInTimeData.size();
int rightClockInNum = 0;
int abnormalMinutes = 0;
int redundantMinutes = 0;
if (clockInTimeData == null || clockInTimeData.size() == 0) {
compareMap.put("judgePartA", String.valueOf(requireClockInNum));
compareMap.put("judgePartB", String.valueOf(rightClockInNum));
compareMap.put("judgePartC", String.valueOf(abnormalMinutes));
compareMap.put("judgePartD", String.valueOf(redundantMinutes));
compareMap.put("judgePartE", compareMap.get("priorityValue"));
return compareMap;
}
//班次要求打卡时间时间格式2023-11-12 09:15
String classTime = "";
//弹性要求打卡时间时间格式2023-11-12 09:15
String elasticTime = "";
String compareTime = "";
//实际打卡数据。格式为
// {2023-11-12 09:00|0|3|2023-11-12 09:15 ={signtime=09:11:00, id=48, userid=53, signdate=2023-11-12}}
// 班次时间|打卡类型(上班卡或下班卡)|打卡时间处所在位置timeType|弹性时间 = 打卡时间map集合
Map<String, Object> clockTimeMap = new HashMap<>();
//实际打卡时间
String clockTime = "";
ClockPointEnum pointType;
ClockPointEnum timeType;
for (ClockPointDTO dto : clockInTimeData) {
pointType = dto.getPointType();
timeType = dto.getTimeType();
clockTimeMap = dto.getClockTime();
clockTime = (clockTimeMap != null ? Util.null2String(clockTimeMap.get("signdate")) : "")
+ " "
+ (clockTimeMap != null ? Util.null2String(clockTimeMap.get("signtime")) : "");
classTime = dto.getClassTime();
elasticTime = dto.getElasticTime();
compareTime = Util.null2String(elasticTime).equals("") ? classTime : elasticTime;
//判断这个需要打卡的时间点,有没有正常打卡
if (ClockPointEnum.EMPTY.equals(timeType) || clockTimeMap == null || clockTime.length() < 16) {
continue;
} else if (ClockPointEnum.START.equals(pointType) && ClockPointEnum.AFTER.equals(timeType)) {
//迟到,异常打卡-记录异常分钟数
int betweenTime = DateUtil.getBetWeenMinutes(compareTime,clockTime.substring(0, 16));
abnormalMinutes = abnormalMinutes + betweenTime;
} else if (ClockPointEnum.START.equals(pointType) && ClockPointEnum.BEFORE.equals(timeType)) {
//早到,正常打卡-记录冗余分钟数、打卡正常的时间点个数
rightClockInNum++;
int betweenTime = DateUtil.getBetWeenMinutes(clockTime.substring(0, 16),compareTime);
redundantMinutes = redundantMinutes + betweenTime;
} else if (ClockPointEnum.END.equals(pointType) && ClockPointEnum.BEFORE.equals(timeType)) {
//早退,异常打卡-记录异常分钟数
int betweenTime = DateUtil.getBetWeenMinutes(clockTime.substring(0, 16),compareTime);
abnormalMinutes = abnormalMinutes + betweenTime;
} else if (ClockPointEnum.END.equals(pointType) && ClockPointEnum.AFTER.equals(timeType)) {
//晚退,正常打卡-记录冗余分钟数、打卡正常的时间点个数
rightClockInNum++;
int betweenTime = DateUtil.getBetWeenMinutes(compareTime,clockTime.substring(0, 16));
redundantMinutes = redundantMinutes + betweenTime;
} else if (ClockPointEnum.EQUAL.equals(timeType)) {
//准点打卡,正常打卡-记录打卡正常的时间点个数
rightClockInNum++;
}
}
compareMap.put("judgePartA", String.valueOf(requireClockInNum));
compareMap.put("judgePartB", String.valueOf(rightClockInNum));
compareMap.put("judgePartC", String.valueOf(abnormalMinutes));
compareMap.put("judgePartD", String.valueOf(redundantMinutes));
compareMap.put("judgePartE", compareMap.get("priorityValue"));
return compareMap;
}
/**
* 获取班次要求打卡数据和请假、出差、加班数据处理后的卡点数据
* @param empId
* @param clockInData 需要包含分析日期以及分析日期前后2天的3天打卡数据
* @return
*/
private Map<String, Object> dealClockInData(String empId, Map<String, Object> pbData, List<Map<String, Object>> clockInData, String shiftId,Map<String,Map<String,Object>> clockInTimeMap) {
Map<String, Object> clockInDataMatchInfo = new HashMap<>();
String punchDate = Util.null2String(pbData.get("bcrq"));
String startBeforeDate = DateUtil.beforeDay(punchDate,2);
String endAfterDate = DateUtil.AfterDay(punchDate,2);
//获取考勤项目
Map<String,Object> param = Maps.newHashMap();
param.put("startDate",startBeforeDate);
param.put("endDate",endAfterDate);
param.put("resourceId",empId);
Map<String,Object> dataMap = basicsetService.getAttendanceItemsByPerson(param);
List<Map<String,Object>> attendanceItems = (List<Map<String,Object>>)dataMap.get("data");
//1-组装班次数据
Map<String,List<Map<String,Object>>> schedulingResultsMap = getShiftData(empId, pbData, shiftId);
List<Map<String,Object>> shiftData = schedulingResultsMap.get(punchDate);
//2-拿到当天打卡数据
Map<String, List<Map<String,Object>>> collect = Maps.newHashMap();
if (clockInData != null && clockInData.size() >0){
collect = clockInData.stream().collect(Collectors.groupingBy(e -> Util.null2String(e.get("signdate"))));
}
// Map<String,Map<String,Object>> clockInTimeMap = Maps.newHashMap(); //
Map<String,Object> getClockTimeParam = Maps.newHashMap();
getClockTimeParam.put("date",punchDate);
getClockTimeParam.put("clockInTimeList",clockInData);
getClockTimeParam.put("schedulingResultCollect",schedulingResultsMap);
getClockTimeParam.put("clockInTimeMap",clockInTimeMap);
getClockTimeParam.put("clockInTimeCollect",collect);
getClockTimeParam.put("userId",empId);
//打卡数据
log.debug("getClockTimeParam : [{}]",getClockTimeParam);
List<Map<String, Object>> clockInTimeList = utilService.getClockInTime(getClockTimeParam);
//3-组装出差和请假的数据
Map<String,Object> workingHourparam = Maps.newHashMap();
workingHourparam.put("clockInTimeCollect",clockInTimeList);
workingHourparam.put("analysisDate",punchDate);
workingHourparam.put("userId",empId);
workingHourparam.put("attendanceItems",attendanceItems);
workingHourparam.put("scheduleResult",shiftData);
Map<String,Object> evectionDataMap = updateAttendanceResultWrapper.getEvection(workingHourparam);
Map<String,Object> askForLeaveDataMap = updateAttendanceResultWrapper.getAskForLeave(workingHourparam);
//4-调用考勤分析中的卡点数据处理方法
List<Map<String,Object>> askForLeaveAndEvctionSchedule = Lists.newArrayList();
askForLeaveAndEvctionSchedule.addAll((List<Map<String,Object>>)askForLeaveDataMap.get("askForLeaveSchedule"));
askForLeaveAndEvctionSchedule.addAll((List<Map<String,Object>>)evectionDataMap.get("evectionSchedule"));
if (askForLeaveAndEvctionSchedule.size() > 0){
askForLeaveAndEvctionSchedule = mergeAskForLeaveAndEvctionSchedule(askForLeaveAndEvctionSchedule,punchDate);
}
Map<String,Object> clockInTimeDataParam = Maps.newHashMap();
clockInTimeDataParam.put("analysisDate",punchDate);
clockInTimeDataParam.put("scheduleResult",shiftData);
clockInTimeDataParam.put("clockInTimeList",clockInTimeList);
clockInTimeDataParam.put("askForLeaveAndEvctionSchedule",askForLeaveAndEvctionSchedule);
List<ClockPointDTO> clockInTimeData = utilService.getClockInPointCmd(clockInTimeDataParam);
if(clockInTimeData != null && clockInTimeData.size() > 0) {
clockInTimeData = clockInTimeData.stream().filter(ClockPointDTO::isRecord).collect(Collectors.toList());
}
clockInDataMatchInfo.put("bcId", shiftId);
clockInDataMatchInfo.put("clockInTimeData", clockInTimeData);
clockInDataMatchInfo.put("bcData", shiftData);
clockInDataMatchInfo.put("bcrq", punchDate);
return clockInDataMatchInfo;
}
/**
* 获取班次数据
* @param empId
* @return
*/
private Map<String,List<Map<String,Object>>> getShiftData(String empId, Map<String, Object> pbData, String shiftId) {
String punchDate = Util.null2String(pbData.get("bcrq"));
String schedulingRule = Util.null2String(pbData.get("pbgl"));
String dateType = Util.null2String(pbData.get("rqlx"));
String restSign = Util.null2String(pbData.get("sfxx"));
String startBeforeDate = DateUtil.beforeDay(punchDate,2);
String endAfterDate = DateUtil.AfterDay(punchDate,2);
/** 获取人员班次*/
Map<String,Object> classesParamMap = Maps.newHashMap();
classesParamMap.put("tableName","uf_pbjg");
classesParamMap.put("startDate",startBeforeDate);
classesParamMap.put("endDate",endAfterDate);
classesParamMap.put("pblx","0");
classesParamMap.put("pbdx",empId);
classesParamMap.put("current","1");
classesParamMap.put("pageSize",10);
classesParamMap.put("recurrence",1);
classesParamMap.put("punchDate",punchDate);
classesParamMap.put("schedulingRule",schedulingRule);
classesParamMap.put("dateType",dateType);
classesParamMap.put("restSign",restSign);
classesParamMap.put("shiftId",shiftId);
Map<String,List<Map<String,Object>>> schedulMap = getSchedulingInFormation(classesParamMap);
return schedulMap;
}
private Map<String,List<Map<String,Object>>> getSchedulingInFormation(Map<String,Object> params) {
String punchDate = Util.null2String(params.get("punchDate"));
String schedulingRule = Util.null2String(params.get("schedulingRule"));
String dateType = Util.null2String(params.get("dateType"));
String restSign = Util.null2String(params.get("restSign"));
String shiftId = Util.null2String(params.get("shiftId"));
String bcSql = "select * from uf_jcl_kq_bcxx where id = " + shiftId;
Map<String, Object> bcData = DbTools.getSqlToMap(bcSql);
String bcsdxx = Util.null2String(bcData.get("bcsdxx"));
String sql = "select a.xxbdkzdjb,a.sfxx,a.id bcxx,a.edsc,a.zgzsc,a.bcsdxx,a.sfdx,a.sfkt,b.bdlx,a.btgz,a.fgsjd,a.zddxfz,a.dxhs,b.kssj dtkssj,b.jssj dtjssj,b.ksdk,b.jsdk,b.tqdkfzs,b.thdkfzs,b.edxss,b.edfzs,b.edts,b.sfdx dtsfdx,b.zddxfz dtzddxfz,b.dxhs dtdxhs,b.gsrq from uf_jcl_kq_bcxx a left join uf_jcl_kq_bcxx_dt1 b on a.id=b.mainid where a.id =" + shiftId;
List<Map<String,Object>> dataList = DbTools.getSqlToList(sql);
Map<String,List<Map<String,Object>>> resultMap = Maps.newHashMap();
List<Map<String,Object>> classs = Lists.newArrayList();
for (Map<String,Object> map:dataList){
Map<String,Object> newMap = Maps.newHashMap();
newMap.putAll(map);
newMap.put("rqlx",dateType);
newMap.put("sfxx",restSign);
classs.add(newMap);
}
resultMap.put(punchDate,classs);
/** 加班计划*/
sql = "select b.jbry,b.ksrq,b.kssj,b.jblx,b.jsrq,b.jssj,b.jbsc,b.gsrq from uf_jcl_kq_jbjh a left join uf_jcl_kq_jbjh_dt1 b on a.id=b.mainid where b.jbry =? and b.gsrq>=? and b.gsrq<=? and (b.jbcx=0 or b.jbcx is null) and a.jlzt=1";
Map<String,List<Map<String,Object>>> overtimePlanMap = DbTools.getSqlToList(sql,params.get("pbdx"),punchDate,punchDate).stream().collect(Collectors.groupingBy(e -> Util.null2String(e.get("gsrq"))));
//考勤项目
List<Map<String,Object>> attendanceItems = new ArrayList<>();
//日期集合
// Map<String,Object> dateParam = Maps.newHashMap();
// dateParam.put("nd",Util.null2String(params.get("startDate")).split("-")[0]);
// dateParam.put("glpb",schedulingRule);
// Map<String,Object> result = commandExecutor.execute(new GetDateCmd(dateParam));
// List<Map<String,Object>> list = (List<Map<String,Object>>)result.get("data");
// Map<String,String> dateMap = list.stream().collect(Collectors.toMap(e->Util.null2String(e.get("rq")),e->Util.null2String(e.get("rqlx"))));
for (Map.Entry<String,List<Map<String,Object>>> e: overtimePlanMap.entrySet()){
if (resultMap.get(e.getKey()) == null){
resultMap.put(e.getKey(),Lists.newArrayList());
}
List<Map<String,Object>> resultList = resultMap.get(e.getKey());
// List<Map<String,Object>> schedulingdateMap = schedulingMapBydate.get(e.getKey());
List<Map<String,Object>> overtimePlanList = e.getValue();
for (Map<String,Object> overtimePlan:overtimePlanList){
Map<String,Object> map = Maps.newHashMap();
if (!overtimePlan.get("ksrq").equals(overtimePlan.get("jsrq"))){
map.put("sfkt","1");
}else {
map.put("sfkt","0");
}
//查找对应的考勤项目
String querySql = "select a.id keyid,a.* from uf_jcl_kq_kqxm a where id=?";
attendanceItems = DbTools.getSqlToList(querySql,overtimePlan.get("jblx"));
map.put("bcxx", punchDate.compareTo(e.getKey()) != 0 ? "0" : shiftId);
map.put("bcsdxx", punchDate.compareTo(e.getKey()) != 0 ? "": bcsdxx);
if (resultList.size()>0){
map.putAll(resultList.get(0));
// map.put("edsc",Util.null2String(resultList.get(0).get("edsc")));
// map.put("sfdx",Util.null2String(resultList.get(0).get("sfdx")));
// map.put("zddxfz",Util.null2String(resultList.get(0).get("zddxfz")));
// map.put("dxhs",Util.null2String(resultList.get(0).get("dxhs")));
// map.put("sfxx",resultList.get(0).get("sfxx"));
// map.put("btgz",resultList.get(0).get("btgz"));
// map.put("xxbdkzdjb",resultList.get(0).get("xxbdkzdjb"));
}else {
map.put("edsc","0");
}
map.put("edts","0");
map.put("bdlx", ClassSegmentTypeEnum.OVERTIME_PLAN.getKey());
map.put("dtkssj",overtimePlan.get("kssj"));
map.put("dtjssj",overtimePlan.get("jssj"));
map.put("ksdk","0");
map.put("jsdk","0");
if (punchDate.compareTo(e.getKey()) == 0){
map.put("sfxx", restSign);
}
map.put("tqdkfzs","60");
map.put("thdkfzs","60");
map.put("rqlx",dateType);
map.put("edxss",overtimePlan.get("jbsc"));
map.put("edfzs",Double.valueOf(overtimePlan.get("jbsc").toString())*60);
map.put("jblx",attendanceItems);
if (DateUtil.getTime(overtimePlan.get("ksrq").toString()).compareTo(DateUtil.getTime(e.getKey())) < 0){
map.put("gsrq", ClassBelongToEnum.YESTERDAY.getKey());
}else if (DateUtil.getTime(overtimePlan.get("ksrq").toString()).compareTo(DateUtil.getTime(e.getKey())) == 0){
map.put("gsrq", ClassBelongToEnum.NOWDAY.getKey());
}else if (DateUtil.getTime(overtimePlan.get("ksrq").toString()).compareTo(DateUtil.getTime(e.getKey())) > 0){
map.put("gsrq", ClassBelongToEnum.NEXTDAY.getKey());
}
if (attendanceItems.size() >0){
map.put("ksdk",attendanceItems.get(0).get("ksjbbxydk"));
map.put("jsdk",attendanceItems.get(0).get("jsjbbxydk"));
map.put("tqdkfzs",attendanceItems.get(0).get("tqdkyxfzs"));
map.put("thdkfzs",attendanceItems.get(0).get("thdkyxfzs"));
map.put("jbwdhlfzs",attendanceItems.get(0).get("jbwdhlfzs"));
map.put("jbzzhlfzs",attendanceItems.get(0).get("jbzzhlfzs"));
}
if (resultList.size() > 0){
String kssjbegin = Utils.getkssjTime(resultList.get(0),e.getKey());
String kssjend = Utils.getkssjTime(resultList.get(resultList.size()-1),e.getKey());
String kssj = overtimePlan.get("ksrq")+" "+overtimePlan.get("kssj");
if (DateUtil.getTime(kssj).compareTo(DateUtil.getTime(kssjbegin)) <0){
//加班计划在开头
resultList.add(0,map);
}else if (DateUtil.getTime(kssj).compareTo(DateUtil.getTime(kssjend)) >0){
//加班计划在末尾
resultList.add(map);
}else {
if (resultList.size() > 1){
//加班计划在中间
for (int j=1;j<resultList.size();j++){
String kssj1 = Utils.getkssjTime(resultList.get(j),e.getKey());
String kssj2 = overtimePlan.get("ksrq")+" "+overtimePlan.get("kssj");
String kssj3 = Utils.getkssjTime(resultList.get(j-1),e.getKey());
if (DateUtil.getTime(kssj1).compareTo(DateUtil.getTime(kssj2)) >=0 && DateUtil.getTime(kssj3).compareTo(DateUtil.getTime(kssj2)) <=0){
resultList.add(j,map);
break;
}
}
}
}
}else {
resultList.add(map);
}
}
}
log.debug("SchedulingResults : [{}]",resultMap);
return resultMap;
}
/**
* 合并请假或出差
*
* @param askForLeaveAndEvctionSchedule
* @param analysisDate
* @return
*/
public List<Map<String, Object>> mergeAskForLeaveAndEvctionSchedule(List<Map<String, Object>> askForLeaveAndEvctionSchedule, String analysisDate) {
askForLeaveAndEvctionSchedule = askForLeaveAndEvctionSchedule.stream().sorted(Comparator.comparing(e -> DateUtil.getTime(Utils.getkssjTime(e, analysisDate)).toInstant(ZoneOffset.of("+8")).toEpochMilli())).collect(Collectors.toList());
for (int i = 0; i < askForLeaveAndEvctionSchedule.size() - 1; i++) {
String beforeDtkssj = Utils.getkssjTime(askForLeaveAndEvctionSchedule.get(i),analysisDate);
String beforeDtjssj = Utils.getjssjTime(askForLeaveAndEvctionSchedule.get(i),analysisDate);
for (int j = i + 1; j < askForLeaveAndEvctionSchedule.size(); j++) {
String dtkssj = Utils.getkssjTime(askForLeaveAndEvctionSchedule.get(j),analysisDate);
String dtjssj = Utils.getjssjTime(askForLeaveAndEvctionSchedule.get(j),analysisDate);
if (DateUtil.getTime(beforeDtjssj).compareTo(DateUtil.getTime(dtkssj)) == 0) {
askForLeaveAndEvctionSchedule.get(i).put("dtjssj", dtjssj);
askForLeaveAndEvctionSchedule.get(i).put("jsdk", askForLeaveAndEvctionSchedule.get(j).get("jsdk"));
askForLeaveAndEvctionSchedule.get(i).put("thfghlfzs", askForLeaveAndEvctionSchedule.get(j).get("thfghlfzs"));
askForLeaveAndEvctionSchedule.remove(askForLeaveAndEvctionSchedule.get(j));
j--;
i--;
}
}
}
return askForLeaveAndEvctionSchedule;
}
}