|
|
|
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<ClockPointDTO> execute(ClockPointInfo clockPointInfo) {
|
|
|
|
List<ClockPointDTO> clcokInPointList = clockPointInfo.getClcokInPointList();
|
|
|
|
List<Map<String, Object>> 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<ClockPointDTO> adjustClcokInPointList = Lists.newArrayList();
|
|
|
|
for (int i=0;i<clcokInPointList.size()-1;i++){
|
|
|
|
ClockPointDTO startPointDTO = clcokInPointList.get(i);
|
|
|
|
ClockPointDTO endPointDTO = clcokInPointList.get(i+1);
|
|
|
|
|
|
|
|
if (startPointDTO.getPointType() == ClockPointEnum.START && endPointDTO.getPointType() == ClockPointEnum.END){
|
|
|
|
int startScheduleIndex = getStartScheduleIndex(startPointDTO.getClassTime(),scheduleResult);
|
|
|
|
int endScheduleIndex = getEndScheduleIndex(endPointDTO.getClassTime(),scheduleResult);
|
|
|
|
if (startScheduleIndex == endScheduleIndex){
|
|
|
|
//同属一个班段不用合并
|
|
|
|
i = i+1;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (startPointDTO.getTimeType() == ClockPointEnum.EMPTY){
|
|
|
|
//开始漏卡
|
|
|
|
for (int j=startScheduleIndex+1;j<=endScheduleIndex;j++){
|
|
|
|
Map<String, Object> scheduleMap = scheduleResult.get(j);
|
|
|
|
if (!Utils.ifRestClassSegment(scheduleMap.get("bdlx").toString())){
|
|
|
|
ClockPointDTO clockPointDTO = ClockPointDTO.builder().classTime(Utils.getkssjTime(scheduleMap,analysisDate)).pointType(ClockPointEnum.START).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<String, Object> scheduleMap = scheduleResult.get(j);
|
|
|
|
if (!Utils.ifRestClassSegment(scheduleMap.get("bdlx").toString())){
|
|
|
|
ClockPointDTO clockPointDTO = ClockPointDTO.builder().classTime(Utils.getkssjTime(scheduleMap,analysisDate)).pointType(ClockPointEnum.START).timeType(ClockPointEnum.AFTER)
|
|
|
|
.classSegmentType(scheduleMap.get("bdlx").toString()).record(false).clockTime(startPointDTO.getClockTime()).build();
|
|
|
|
// if (j<index){
|
|
|
|
// clockPointDTO.getClockTime().put("signdate",Utils.getjssjTime(scheduleMap,analysisDate).split(" ")[0]);
|
|
|
|
// clockPointDTO.getClockTime().put("signtime",Utils.getjssjTime(scheduleMap,analysisDate).split(" ")[1]);
|
|
|
|
// }
|
|
|
|
adjustClcokInPointList.add(clockPointDTO);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// startPointDTO.getClockTime().put("signdate",Utils.getjssjTime(scheduleResult.get(startScheduleIndex),analysisDate).split(" ")[0]);
|
|
|
|
// startPointDTO.getClockTime().put("signtime",Utils.getjssjTime(scheduleResult.get(startScheduleIndex),analysisDate).split(" ")[1]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (endPointDTO.getTimeType() == ClockPointEnum.EMPTY){
|
|
|
|
//结束漏卡
|
|
|
|
for (int j=startScheduleIndex;j<endScheduleIndex;j++){
|
|
|
|
Map<String, Object> scheduleMap = scheduleResult.get(j);
|
|
|
|
if (!Utils.ifRestClassSegment(scheduleMap.get("bdlx").toString())){
|
|
|
|
ClockPointDTO clockPointDTO = ClockPointDTO.builder().classTime(Utils.getjssjTime(scheduleMap,analysisDate)).pointType(ClockPointEnum.END).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<endScheduleIndex;j++){
|
|
|
|
Map<String, Object> scheduleMap = scheduleResult.get(j);
|
|
|
|
if (!Utils.ifRestClassSegment(scheduleMap.get("bdlx").toString())){
|
|
|
|
ClockPointDTO clockPointDTO = ClockPointDTO.builder().classTime(Utils.getjssjTime(scheduleMap,analysisDate)).pointType(ClockPointEnum.END).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<Map<String, Object>> scheduleResult,int startScheduleIndex){
|
|
|
|
for (int i=startScheduleIndex+1;i<scheduleResult.size();i++){
|
|
|
|
String kssj = Utils.getkssjTime(scheduleResult.get(i),analysisDate);
|
|
|
|
String jssj = Utils.getjssjTime(scheduleResult.get(i),analysisDate);
|
|
|
|
if (DateUtil.getTime(startClockTime).compareTo(DateUtil.getTime(kssj))>=0 &&
|
|
|
|
DateUtil.getTime(startClockTime).compareTo(DateUtil.getTime(jssj)) <=0){
|
|
|
|
return i;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
return scheduleResult.size()-1;
|
|
|
|
}
|
|
|
|
/**
|
|
|
|
* 往前递归排班
|
|
|
|
* @return
|
|
|
|
*/
|
|
|
|
public int getBeforeAccordWithScheduleIndex(String endClockTime,List<Map<String, Object>> 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<Map<String, Object>> scheduleResult){
|
|
|
|
for (int i =0;i<scheduleResult.size();i++){
|
|
|
|
String dtkssj = Utils.getkssjTime(scheduleResult.get(i),analysisDate);
|
|
|
|
if (dtkssj.equals(time)){
|
|
|
|
return i;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
public int getEndScheduleIndex(String time,List<Map<String, Object>> scheduleResult){
|
|
|
|
for (int i =0;i<scheduleResult.size();i++){
|
|
|
|
String dtjssj = Utils.getjssjTime(scheduleResult.get(i),analysisDate);
|
|
|
|
if (dtjssj.equals(time)){
|
|
|
|
return i;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
}
|