Commit 77fdd2e0 authored by 赵啸非's avatar 赵啸非

优化考勤计算

parent 03cb182b
......@@ -4,6 +4,7 @@ import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import com.mortals.framework.model.Context;
import com.mortals.framework.model.OrderCol;
import com.mortals.framework.service.ICacheService;
import com.mortals.framework.util.DateUtils;
import com.mortals.xhx.module.attendance.model.AttendanceRecordHikEntity;
......@@ -15,6 +16,8 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StopWatch;
import java.util.Arrays;
import static com.mortals.xhx.common.key.RedisKey.KEY_ATTENDANCE_STAT_CACHE;
......@@ -53,16 +56,16 @@ public class AddAttendThread implements Runnable {
Long compare = DateUtil.between(attendEnd, attendStart, DateUnit.DAY);
StopWatch stopWatch = new StopWatch("stopwatch attend");
log.info("考勤计算天数区间:{}", compare);
stopWatch.start("执行本地方法");
for (int i = 0; i <= compare.intValue(); i++) {
stopWatch.start("执行本地方法");
DateTime curDate = DateUtil.offsetDay(attendStart, i);
log.info("考勤计算日期:{}", curDate.toDateStr());
hikEntity.setAttendanceDateStart(curDate.toDateStr());
hikEntity.setAttendanceDateEnd(curDate.toDateStr());
hikEntity.setOrderColList(Arrays.asList(new OrderCol("attendanceDate")));
hikService.addAttendanceRecordByQuery(hikEntity, context);
stopWatch.stop();
log.info("考勤计算日期:{} 完成,耗时:{}ms",curDate.toDateStr(), stopWatch.getLastTaskTimeMillis());
}
stopWatch.stop();
log.info("完成,耗时:{}ms", stopWatch.getLastTaskTimeMillis());
//生成汇总信息
log.info("生成考勤汇总消息开始。。。");
AttendanceSummaryQuery query = new AttendanceSummaryQuery();
......
......@@ -7,6 +7,7 @@ import com.alibaba.fastjson.JSON;
import com.mortals.framework.common.Rest;
import com.mortals.framework.exception.AppException;
import com.mortals.framework.model.Context;
import com.mortals.framework.model.OrderCol;
import com.mortals.framework.service.ICacheService;
import com.mortals.framework.service.ITask;
import com.mortals.framework.service.ITaskExcuteService;
......@@ -31,10 +32,7 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.*;
import java.util.stream.Collectors;
import static com.mortals.xhx.common.key.RedisKey.KEY_ATTENDANCE_STAT_CACHE;
......@@ -102,6 +100,7 @@ public class SyncDoorsEventAfterTaskImpl implements ITaskExcuteService {
AttendanceRecordHikQuery recordHikQuery = new AttendanceRecordHikQuery();
recordHikQuery.setAttendanceDateStart(DateUtil.today());
recordHikQuery.setAttendanceDateEnd(DateUtil.today());
recordHikQuery.setOrderColList(Arrays.asList(new OrderCol("attendanceDate")));
try {
recordHikService.addAttendanceRecordByQuery(recordHikQuery, context);
} catch (Exception e) {
......
......@@ -66,6 +66,10 @@ public class AttendanceRecordHikServiceImpl extends AbstractCRUDServiceImpl<Atte
private IHikDoorService hikDoorService;
@Autowired
private AttendanceClassService attendanceClassService;
@Autowired
private AttendanceGroupFixedworkSpecialService specialService;
@Autowired
private AttendanceLeaveRecordService attendanceLeaveRecordService;
@Override
......@@ -140,6 +144,13 @@ public class AttendanceRecordHikServiceImpl extends AbstractCRUDServiceImpl<Atte
Map<Long, List<AttendanceGroupStaffEntity>> groupStaffMap = attendanceGroupStaffService.find(new AttendanceGroupStaffQuery()).parallelStream().collect(Collectors.groupingBy(x -> x.getStaffId()));
Map<Long, AttendanceGroupEntity> groupMap = attendanceGroupService.find(new AttendanceGroupQuery()).parallelStream().collect(Collectors.toMap(x -> x.getId(), y -> y, (o, n) -> n));
Map<Long, AttendanceClassEntity> classEntityMap = attendanceClassService.find(new AttendanceClassQuery()).parallelStream().collect(Collectors.toMap(x -> x.getId(), y -> y, (o, n) -> n));
Map<Long, AttendanceClassDetailEntity> classDetailEntityMap = attendanceClassDetailService.find(new AttendanceClassDetailQuery()).parallelStream().collect(Collectors.toMap(x -> x.getId(), y -> y, (o, n) -> n));
Map<Long, List<AttendanceGroupFixedworkSpecialEntity>> fixedSpecialGroupMap = specialService.find(new AttendanceGroupFixedworkSpecialEntity()).parallelStream().collect(Collectors.groupingBy(x -> x.getFixedWorkId()));
AttendanceLeaveRecordQuery leaveRecordQuery = new AttendanceLeaveRecordQuery();
leaveRecordQuery.setAuditResultList(Arrays.asList(1, 4));
Map<Long, List<AttendanceLeaveRecordEntity>> leaveRecordGroupMap = attendanceLeaveRecordService.find(leaveRecordQuery).parallelStream().collect(Collectors.groupingBy(x -> x.getLeavePersonId()));
for (Map.Entry<Long, List<AttendanceRecordHikEntity>> itemEntry : listMap.entrySet()) {
//按人员
......@@ -200,6 +211,9 @@ public class AttendanceRecordHikServiceImpl extends AbstractCRUDServiceImpl<Atte
commonData.setStaffId(attendanceRecordEntity.getStaffId());
commonData.setDateStr(dateStr);
commonData.setClassEntityMap(classEntityMap);
commonData.setRecordHikEntities(recordHikEntities);
commonData.setFixedSpecialGroupMap(fixedSpecialGroupMap);
commonData.setClassDetailEntityMap(classDetailEntityMap);
workAbstract.doHandleWork(commonData);
}
......@@ -226,6 +240,9 @@ public class AttendanceRecordHikServiceImpl extends AbstractCRUDServiceImpl<Atte
commonData.setStaffId(attendanceRecordEntity.getStaffId());
commonData.setDateStr(dateStr);
commonData.setClassEntityMap(classEntityMap);
commonData.setRecordHikEntities(recordHikEntities);
commonData.setFixedSpecialGroupMap(fixedSpecialGroupMap);
commonData.setClassDetailEntityMap(classDetailEntityMap);
workAbstract.doHandleWork(commonData);
}
}
......
......@@ -2,10 +2,7 @@ package com.mortals.xhx.module.attendance.service.work;
import com.mortals.framework.model.Context;
import com.mortals.xhx.module.attendance.model.AttendanceClassEntity;
import com.mortals.xhx.module.attendance.model.AttendanceGroupEntity;
import com.mortals.xhx.module.attendance.model.AttendanceRecordDetailEntity;
import com.mortals.xhx.module.attendance.model.AttendanceRecordEntity;
import com.mortals.xhx.module.attendance.model.*;
import lombok.Data;
import java.util.Date;
......@@ -37,5 +34,11 @@ public class CommonData {
private Map<Long, AttendanceClassEntity> classEntityMap;
private List<AttendanceRecordHikEntity> recordHikEntities;
private Map<Long, AttendanceClassDetailEntity> classDetailEntityMap;
private Map<Long, List<AttendanceGroupFixedworkSpecialEntity>> fixedSpecialGroupMap;
}
......@@ -52,6 +52,8 @@ public class FixWorkOtherAttendance extends AttendanceWorkAbstract {
private AttendanceRecordDetailService attendanceRecordDetailService;
private Map<Long, AttendanceClassDetailEntity> classDetailEntityMap ;
public FixWorkOtherAttendance(int type) {
super(type);
this.attendanceGroupFixedworkService = SpringUtils.getBean(AttendanceGroupFixedworkService.class);
......@@ -81,6 +83,8 @@ public class FixWorkOtherAttendance extends AttendanceWorkAbstract {
AttendanceGroupFixedworkEntity attendanceGroupFixedworkEntity = attendanceGroupFixedworkService.selectOne(new AttendanceGroupFixedworkQuery()
.groupId(commonData.getAttendanceGroupEntity().getId()));
Map<Long, AttendanceClassEntity> classEntityMap = commonData.getClassEntityMap();
Map<Long, List<AttendanceGroupFixedworkSpecialEntity>> fixedSpecialGroupMap = commonData.getFixedSpecialGroupMap();
this.classDetailEntityMap = commonData.getClassDetailEntityMap();
if (ObjectUtils.isEmpty(attendanceGroupFixedworkEntity)) {
log.info("attendanceGroupFixedworkEntity is null ! groupId:{}", commonData.getAttendanceGroupEntity().getId());
return;
......@@ -99,9 +103,9 @@ public class FixWorkOtherAttendance extends AttendanceWorkAbstract {
if (!checkWorkByHoliday) {
// log.info("当前日期不在考勤时间范围内,不做处理!");
return;
}else{
} else {
//工作日要上班 获取配置的周六 周日班次 默认周一
weekClassId=this.getWeekClassId(attendanceGroupFixedworkEntity, "星期一");
weekClassId = this.getWeekClassId(attendanceGroupFixedworkEntity, "星期一");
}
} else {
if (checkHolidayByWorkDay) {
......@@ -114,11 +118,6 @@ public class FixWorkOtherAttendance extends AttendanceWorkAbstract {
AttendanceLeaveRecordQuery leaveRecordQuery = new AttendanceLeaveRecordQuery();
leaveRecordQuery.setLeavePersonId(commonData.getStaffId());
leaveRecordQuery.setAuditResultList(Arrays.asList(1, 4));
// leaveRecordQuery.setAuditResult(AuditStatusEnum.通过.getValue());
// leaveRecordQuery.setEndTimeEnd(commonData.getDateStr());
// leaveRecordQuery.setStartTimeStart(commonData.getDateStr());
// leaveRecordQuery.setStartTimeEnd(commonData.getDateStr());
boolean isLeave = false;
List<AttendanceLeaveRecordEntity> leaveRecordEntities = attendanceLeaveRecordService.find(leaveRecordQuery);
......@@ -167,7 +166,8 @@ public class FixWorkOtherAttendance extends AttendanceWorkAbstract {
}*/
//特殊日期考勤配置
List<AttendanceGroupFixedworkSpecialEntity> specialEntities = specialService.find(new AttendanceGroupFixedworkSpecialQuery().fixedWorkId(attendanceGroupFixedworkEntity.getId()));
//List<AttendanceGroupFixedworkSpecialEntity> specialEntities = specialService.find(new AttendanceGroupFixedworkSpecialQuery().fixedWorkId(attendanceGroupFixedworkEntity.getId()));
List<AttendanceGroupFixedworkSpecialEntity> specialEntities = fixedSpecialGroupMap.get(attendanceGroupFixedworkEntity.getId());
if (!ObjectUtils.isEmpty(specialEntities)) {
//分组 需要考勤与不需要考勤
Map<Boolean, List<AttendanceGroupFixedworkSpecialEntity>> collect = specialEntities.stream().collect(Collectors.partitioningBy(item -> item.getMust() == MustEnum..getValue()));
......@@ -216,7 +216,7 @@ public class FixWorkOtherAttendance extends AttendanceWorkAbstract {
}
//获取班次信息
// AttendanceClassEntity attendanceClassEntity = attendanceClassService.get(weekClassId);
// AttendanceClassEntity attendanceClassEntity = attendanceClassService.get(weekClassId);
AttendanceClassEntity attendanceClassEntity = classEntityMap.get(weekClassId);
if (ObjectUtils.isEmpty(attendanceClassEntity)) {
log.info("attendanceClassEntity is null ,weekClassId:{}", weekClassId);
......@@ -224,12 +224,16 @@ public class FixWorkOtherAttendance extends AttendanceWorkAbstract {
}
//查询当天,该人员的考勤记录
AttendanceRecordHikQuery recordHikQuery = new AttendanceRecordHikQuery();
/* AttendanceRecordHikQuery recordHikQuery = new AttendanceRecordHikQuery();
recordHikQuery.setAttendanceDateStart(commonData.getDateStr());
recordHikQuery.setAttendanceDateEnd(commonData.getDateStr());
recordHikQuery.setStaffId(commonData.getStaffId());
recordHikQuery.setOrderColList(Arrays.asList(new OrderCol("attendanceDate")));
List<AttendanceRecordHikEntity> recordHikEntities = recordHikService.find(recordHikQuery);
List<AttendanceRecordHikEntity> recordHikEntities = recordHikService.find(recordHikQuery);*/
List<AttendanceRecordHikEntity> recordHikEntities = commonData.getRecordHikEntities();
List<AttendanceClassDetailEntity> attendanceClassDetailEntities = attendanceClassEntity.getAttendanceClassDetailList();
Integer orderNum = 0;
......@@ -256,13 +260,13 @@ public class FixWorkOtherAttendance extends AttendanceWorkAbstract {
for (AttendanceClassDetailEntity classDetail : attendanceClassDetailEntities) {
//计算区间范围
//上班打卡前时间
Date goWorkDateBefore = DateUtil.offsetMinute(classDetail.getGoWorkDate(), -classDetail.getGoWorkDateBefore()-1);
Date goWorkDateBefore = DateUtil.offsetMinute(classDetail.getGoWorkDate(), -classDetail.getGoWorkDateBefore() - 1);
//上班打卡后时间
Date goWorkDateAfter = DateUtil.offsetMinute(classDetail.getGoWorkDate(), classDetail.getGoWorkDateAfter()+1);
Date goWorkDateAfter = DateUtil.offsetMinute(classDetail.getGoWorkDate(), classDetail.getGoWorkDateAfter() + 1);
// 下班打卡前时间
Date offWorkDateBefore = DateUtil.offsetMinute(classDetail.getOffWorkDate(), -classDetail.getOffWorkDateBefore()-1);
Date offWorkDateBefore = DateUtil.offsetMinute(classDetail.getOffWorkDate(), -classDetail.getOffWorkDateBefore() - 1);
//下班打卡后时间,默认偏移多一分钟
Date offWorkDateAfter = DateUtil.offsetMinute(classDetail.getOffWorkDate(), classDetail.getOffWorkDateAfter()+1);
Date offWorkDateAfter = DateUtil.offsetMinute(classDetail.getOffWorkDate(), classDetail.getOffWorkDateAfter() + 1);
//判断考勤时间是否在上班打卡区间内 true 在 false 不在 格式化时间
//String currDate = DateUtil.formatTime(attendanceDate);
Date curDateTime = DateUtil.parseTime(DateUtil.formatTime(attendanceDate));
......@@ -334,7 +338,8 @@ public class FixWorkOtherAttendance extends AttendanceWorkAbstract {
}
}
AttendanceClassDetailEntity attendanceClassDetailEntity = attendanceClassDetailService.get(commonData.getDetailEntityList().get(0).getShiftsId());
// AttendanceClassDetailEntity attendanceClassDetailEntity = attendanceClassDetailService.get(commonData.getDetailEntityList().get(0).getShiftsId());
AttendanceClassDetailEntity attendanceClassDetailEntity = classDetailEntityMap.get(commonData.getDetailEntityList().get(0).getShiftsId());
commonData.getAttendanceRecordEntity().setClassId(attendanceClassDetailEntity == null ? 0L : attendanceClassDetailEntity.getClassId());
commonData.getAttendanceRecordEntity().setClassName(attendanceClassDetailEntity == null ? "" : attendanceClassDetailEntity.getClassName());
}
......@@ -343,28 +348,26 @@ public class FixWorkOtherAttendance extends AttendanceWorkAbstract {
if (isLeave) {
//查看请假时间段,是否为跨天记录
for (AttendanceLeaveRecordEntity leaveRecord : leaveRecords) {
// AttendanceLeaveRecordEntity leaveRecord = leaveRecords.get(0);
long between = DateUtil.between(leaveRecord.getStartTime(), leaveRecord.getEndTime(), DateUnit.DAY);
if (between > 0) {
//跨天 判断当前日期是否在全天,没在 就
//判断日期是否在最后一天 不是的话 为全天
long betweened = DateUtil.between(DateUtil.parseDate(commonData.getDateStr()), leaveRecord.getEndTime(), DateUnit.DAY);
if (betweened > 0) {
//全天
calLeaveDate(commonData, DateUtil.parseDateTime(commonData.getDateStr()+" 00:00:00"),DateUtil.parseDateTime(commonData.getDateStr()+" 23:59:59"));
} else if (betweened == 0) {
//最后一天
calLeaveDate(commonData, DateUtil.parseDateTime(commonData.getDateStr()+" 00:00:00"),leaveRecord.getEndTime());
}
} else if (between == 0) {
calLeaveDate(commonData, leaveRecord.getStartTime(),leaveRecord.getEndTime());
} else {
//错误
}
// AttendanceLeaveRecordEntity leaveRecord = leaveRecords.get(0);
long between = DateUtil.between(leaveRecord.getStartTime(), leaveRecord.getEndTime(), DateUnit.DAY);
if (between > 0) {
//跨天 判断当前日期是否在全天,没在 就
//判断日期是否在最后一天 不是的话 为全天
long betweened = DateUtil.between(DateUtil.parseDate(commonData.getDateStr()), leaveRecord.getEndTime(), DateUnit.DAY);
if (betweened > 0) {
//全天
calLeaveDate(commonData, DateUtil.parseDateTime(commonData.getDateStr() + " 00:00:00"), DateUtil.parseDateTime(commonData.getDateStr() + " 23:59:59"));
} else if (betweened == 0) {
//最后一天
calLeaveDate(commonData, DateUtil.parseDateTime(commonData.getDateStr() + " 00:00:00"), leaveRecord.getEndTime());
}
} else if (between == 0) {
calLeaveDate(commonData, leaveRecord.getStartTime(), leaveRecord.getEndTime());
} else {
//错误
}
}
}
//生成异常记录
......@@ -373,12 +376,13 @@ public class FixWorkOtherAttendance extends AttendanceWorkAbstract {
}
/**
* 计算异常
* 计算异常
*
* @param commonData
* @param startLeaveTime
* @param endLeaveTime
*/
private void calLeaveDate(CommonData commonData, Date startLeaveTime, Date endLeaveTime) {
private void calLeaveDate(CommonData commonData, Date startLeaveTime, Date endLeaveTime) {
//当日 请假开始时间
/* Date startLeaveTime = leaveRecord.getStartTime();
Date endLeaveTime = leaveRecord.getEndTime();*/
......@@ -394,9 +398,9 @@ public class FixWorkOtherAttendance extends AttendanceWorkAbstract {
if (GoWorkResultEnum.请假.getValue() < goWorkResult) {
//判断 异常记录是否在请假时间段内
// DateUtil.between()
if(ObjectUtils.isEmpty(goWorkDate)){
if (ObjectUtils.isEmpty(goWorkDate)) {
detail.setGoWorkResult(GoWorkResultEnum.请假.getValue());
}else{
} else {
boolean in = DateUtil.isIn(goWorkDate, startLeaveTime, endLeaveTime);
if (in) {
detail.setGoWorkResult(GoWorkResultEnum.请假.getValue());
......@@ -407,9 +411,9 @@ public class FixWorkOtherAttendance extends AttendanceWorkAbstract {
if (GoWorkResultEnum.请假.getValue() < offWorkResult) {
//判断 异常记录是否在请假时间段内
// DateUtil.between()
if(ObjectUtils.isEmpty(offWorkDate)){
if (ObjectUtils.isEmpty(offWorkDate)) {
detail.setOffWorkResult(GoWorkResultEnum.请假.getValue());
}else{
} else {
boolean in = DateUtil.isIn(offWorkDate, startLeaveTime, endLeaveTime);
if (in) {
detail.setOffWorkResult(GoWorkResultEnum.请假.getValue());
......@@ -436,13 +440,14 @@ public class FixWorkOtherAttendance extends AttendanceWorkAbstract {
public void genErrorAttendRecord(Context context, String dateStr, AttendanceRecordEntity attendanceRecordEntity, List<AttendanceRecordDetailEntity> detailEntityList) {
//处理异常打卡,所以异常打卡的 都新增一条记录
List<AttendanceRecordErrorEntity> errorEntityList = new ArrayList<>();
List<AttendanceRecordErrorEntity> errorSwitchNormalList = new ArrayList<>();
// Map<Long, AttendanceClassDetailEntity> classDetailEntityMap = attendanceClassDetailService.find(new AttendanceClassDetailQuery()).stream().collect(Collectors.toMap(x -> x.getId(), y -> y, (o, n) -> n));
for (AttendanceRecordDetailEntity recordDetailEntity : detailEntityList) {
Integer goWorkResult = recordDetailEntity.getGoWorkResult();
Integer offWorkResult = recordDetailEntity.getOffWorkResult();
//判断是否是离职员工 如果是 则不添加
//判断上班
AttendanceClassDetailEntity attendanceClassDetailEntity = attendanceClassDetailService.get(recordDetailEntity.getShiftsId());
// AttendanceClassDetailEntity attendanceClassDetailEntity = attendanceClassDetailService.get(recordDetailEntity.getShiftsId());
AttendanceClassDetailEntity attendanceClassDetailEntity = classDetailEntityMap.get(recordDetailEntity.getShiftsId());
if (ObjectUtils.isEmpty(attendanceClassDetailEntity)) continue;
//判断上班
if (GoWorkResultEnum.请假.getValue() < goWorkResult) {
......@@ -514,12 +519,11 @@ public class FixWorkOtherAttendance extends AttendanceWorkAbstract {
if (!ObjectUtils.isEmpty(errorEntityList)) {
//过滤异常列表中存在相同的记录
errorEntityList= errorEntityList.stream().distinct().collect(Collectors.toList());
errorEntityList = errorEntityList.stream().distinct().collect(Collectors.toList());
for (AttendanceRecordErrorEntity errorEntity : errorEntityList) {
//查看是否存在相同的异常记录,如果存在 则不添加
errorQuery = new AttendanceRecordErrorQuery();
errorQuery.setShiftsId(errorEntity.getShiftsId());
errorQuery.setGoOffDateTime(errorEntity.getErrorDateTime());
errorQuery.setStaffId(errorEntity.getStaffId());
errorQuery.setShiftsId(errorEntity.getShiftsId());
......@@ -594,7 +598,7 @@ public class FixWorkOtherAttendance extends AttendanceWorkAbstract {
System.out.println(in);*/
System.out.println( GoWorkResultEnum.getEnumMap().keySet());
System.out.println(GoWorkResultEnum.getEnumMap().keySet());
}
......
......@@ -161,7 +161,6 @@ public class AttendanceRecordHikController extends BaseCRUDJsonBodyMappingContro
}
AddAttendThread addAttendThread = new AddAttendThread(hikService, hikEntity, getContext());
ThreadPool.getInstance().execute(addAttendThread);
//hikService.addAttendanceRecordByQuery(hikEntity, getContext());
model.put("message_info", busiDesc + "成功");
this.recordSysLog(this.request, busiDesc + " 【成功】");
} catch (Exception e) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment