package com.engine.attendance.attendanceanalysis.cmd.getclockInpoint; import com.engine.attendance.attendanceanalysis.cmd.getclockInpoint.biz.AbstractAdjustClockPointAction; import com.engine.attendance.attendanceanalysis.cmd.getclockInpoint.biz.AdjustClockPointActionInterface; import com.engine.attendance.attendanceanalysis.dto.clockpoint.ClockPointDTO; import com.engine.attendance.attendanceanalysis.dto.clockpoint.ClockPointInfo; import com.engine.attendance.enums.ClockPointEnum; import com.engine.common.util.DateUtil; import com.engine.common.util.Utils; import com.google.common.collect.Lists; import lombok.extern.slf4j.Slf4j; import java.time.ZoneOffset; import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * 当卡点成对出现时合并对应的班段 */ @Slf4j public class MergeApairClockPoint extends AbstractAdjustClockPointAction { private String analysisDate; @Override public List execute(ClockPointInfo clockPointInfo) { List clcokInPointList = clockPointInfo.getClcokInPointList(); List> scheduleResult = clockPointInfo.getScheduleResult(); analysisDate = clockPointInfo.getAnalysisDate(); clcokInPointList = clcokInPointList.stream().sorted(Comparator.comparing(e-> DateUtil.getTime(e.getClassTime()).toInstant(ZoneOffset.of("+8")).toEpochMilli())).collect(Collectors.toList()); if (clcokInPointList.size() <= 1){ return clcokInPointList; } List adjustClcokInPointList = Lists.newArrayList(); for (int i=0;i scheduleMap = scheduleResult.get(j); if (!Utils.ifRestClassSegment(scheduleMap.get("bdlx").toString())){ ClockPointEnum pointType = ClockPointEnum.START; if (Utils.ifAskforOrEvctionClassSegment(scheduleMap.get("bdlx").toString())){ //当为请假出差时 pointType = ClockPointEnum.END; } ClockPointDTO clockPointDTO = ClockPointDTO.builder().classTime(Utils.getkssjTime(scheduleMap,analysisDate)).pointType(pointType).timeType(ClockPointEnum.EMPTY) .classSegmentType(scheduleMap.get("bdlx").toString()).record(false).build(); adjustClcokInPointList.add(clockPointDTO); } } } if (startPointDTO.getTimeType() == ClockPointEnum.AFTER){ //迟到 //打卡时间 String startClockTime = startPointDTO.getClockTime().get("signdate")+" "+startPointDTO.getClockTime().get("signtime"); if (DateUtil.getTime(startClockTime).compareTo(DateUtil.getTime(Utils.getjssjTime(scheduleResult.get(startScheduleIndex),analysisDate))) > 0){ int index = getAfterAccordWithScheduleIndex(startClockTime,scheduleResult,startScheduleIndex); for (int j=startScheduleIndex+1;j<=index;j++){ Map scheduleMap = scheduleResult.get(j); if (!Utils.ifRestClassSegment(scheduleMap.get("bdlx").toString())){ ClockPointEnum pointType = ClockPointEnum.START; if (Utils.ifAskforOrEvctionClassSegment(scheduleMap.get("bdlx").toString())){ //当为请假出差时 pointType = ClockPointEnum.END; } ClockPointDTO clockPointDTO = ClockPointDTO.builder().classTime(Utils.getkssjTime(scheduleMap,analysisDate)).pointType(pointType).timeType(ClockPointEnum.AFTER) .classSegmentType(scheduleMap.get("bdlx").toString()).record(false).clockTime(startPointDTO.getClockTime()).build(); // if (j scheduleMap = scheduleResult.get(j); if (!Utils.ifRestClassSegment(scheduleMap.get("bdlx").toString())){ ClockPointEnum pointType = ClockPointEnum.END; if (Utils.ifAskforOrEvctionClassSegment(scheduleMap.get("bdlx").toString())){ //当为请假出差时 pointType = ClockPointEnum.START; } ClockPointDTO clockPointDTO = ClockPointDTO.builder().classTime(Utils.getjssjTime(scheduleMap,analysisDate)).pointType(pointType).timeType(ClockPointEnum.EMPTY) .classSegmentType(scheduleMap.get("bdlx").toString()).record(false).build(); adjustClcokInPointList.add(clockPointDTO); } } } if (endPointDTO.getTimeType() == ClockPointEnum.BEFORE){ //早退 //打卡时间 String endClockTime = endPointDTO.getClockTime().get("signdate")+" "+endPointDTO.getClockTime().get("signtime"); if (DateUtil.getTime(endClockTime).compareTo(DateUtil.getTime(Utils.getkssjTime(scheduleResult.get(endScheduleIndex),analysisDate))) < 0){ int index = getBeforeAccordWithScheduleIndex(endClockTime,scheduleResult,endScheduleIndex); for (int j=index;j scheduleMap = scheduleResult.get(j); if (!Utils.ifRestClassSegment(scheduleMap.get("bdlx").toString())){ ClockPointEnum pointType = ClockPointEnum.END; if (Utils.ifAskforOrEvctionClassSegment(scheduleMap.get("bdlx").toString())){ //当为请假出差时 pointType = ClockPointEnum.START; } ClockPointDTO clockPointDTO = ClockPointDTO.builder().classTime(Utils.getjssjTime(scheduleMap,analysisDate)).pointType(pointType).timeType(ClockPointEnum.BEFORE) .classSegmentType(scheduleMap.get("bdlx").toString()).record(false).clockTime(endPointDTO.getClockTime()).build(); // if (j>index){ // clockPointDTO.getClockTime().put("signdate",Utils.getkssjTime(scheduleMap,analysisDate).split(" ")[0]); // clockPointDTO.getClockTime().put("signtime",Utils.getkssjTime(scheduleMap,analysisDate).split(" ")[1]); // } adjustClcokInPointList.add(clockPointDTO); } } // endPointDTO.getClockTime().put("signdate",Utils.getkssjTime(scheduleResult.get(endScheduleIndex),analysisDate).split(" ")[0]); // endPointDTO.getClockTime().put("signtime",Utils.getkssjTime(scheduleResult.get(endScheduleIndex),analysisDate).split(" ")[1]); } } i = i+1; } } adjustClcokInPointList.addAll(clcokInPointList); log.info("MergeApairClockPoint : [{}]",adjustClcokInPointList); return adjustClcokInPointList; } /** * 往后递归排班 * @return */ public int getAfterAccordWithScheduleIndex(String startClockTime,List> scheduleResult,int startScheduleIndex){ for (int i=startScheduleIndex+1;i=0 && DateUtil.getTime(startClockTime).compareTo(DateUtil.getTime(jssj)) <=0){ return i; } } return scheduleResult.size()-1; } /** * 往前递归排班 * @return */ public int getBeforeAccordWithScheduleIndex(String endClockTime,List> scheduleResult,int endScheduleIndex){ for (int i=endScheduleIndex-1;i>=0;i--){ String kssj = Utils.getkssjTime(scheduleResult.get(i),analysisDate); String jssj = Utils.getjssjTime(scheduleResult.get(i),analysisDate); if (DateUtil.getTime(endClockTime).compareTo(DateUtil.getTime(kssj))>=0 && DateUtil.getTime(endClockTime).compareTo(DateUtil.getTime(jssj)) <=0){ return i; } } return 0; } public int getStartScheduleIndex(String time,List> scheduleResult){ for (int i =0;i> scheduleResult){ for (int i =0;i