Commit 2cdecfeb authored by 赵啸非's avatar 赵啸非

添加请假跨天判读

parent 9db80558
......@@ -56,8 +56,8 @@ public class SyncDoorsEventAfterTaskImpl implements ITaskExcuteService {
// syncDoorEvents();
//判断时间段 不在时间段的 不做计算
//早上9点 子晚上8点 计算
Date beginDateTime = DateUtil.parseDateTime(DateUtil.today() + " 09:00:00");
Date endDateTime = DateUtil.parseDateTime(DateUtil.today() + " 20:30:00");
Date beginDateTime = DateUtil.parseDateTime(DateUtil.today() + " 07:00:00");
Date endDateTime = DateUtil.parseDateTime(DateUtil.today() + " 23:30:00");
boolean in = DateUtil.isIn(new Date(), beginDateTime, endDateTime);
if (in) {
......
......@@ -66,7 +66,7 @@ public class SyncDoorsEventTaskImpl implements ITaskExcuteService {
day = 0;
}
Date beginDateTime=DateUtil.parseDateTime(DateUtil.today()+" 08:00:00");
Date endDateTime=DateUtil.parseDateTime(DateUtil.today()+" 20:30:00");
Date endDateTime=DateUtil.parseDateTime(DateUtil.today()+" 23:30:00");
boolean in = DateUtil.isIn(new Date(), beginDateTime, endDateTime);
if(in){
......
......@@ -56,4 +56,7 @@ public interface AttendanceRecordHikService extends ICRUDService<AttendanceRecor
*/
void buildCustomHikRecord(AttendanceRecordHikQuery recordHikQuery,Context context);
void buildSourceHikRecord(AttendanceRecordHikQuery recordHikQuery,Context context);
}
......@@ -2,18 +2,25 @@ package com.mortals.xhx.module.attendance.service.impl;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.PageUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.mortals.framework.common.Rest;
import com.mortals.framework.service.IUser;
import com.mortals.framework.util.StringUtils;
import com.mortals.xhx.base.system.upload.service.UploadService;
import com.mortals.xhx.base.system.user.model.UserEntity;
import com.mortals.xhx.common.code.*;
import com.mortals.xhx.common.key.RedisKey;
import com.mortals.xhx.common.utils.BeanUtil;
import com.mortals.xhx.module.attendance.model.*;
import com.mortals.xhx.module.attendance.service.*;
import com.mortals.xhx.module.attendance.service.work.AttendanceWorkAbstract;
import com.mortals.xhx.module.attendance.service.work.CommonData;
import com.mortals.xhx.module.dept.service.DeptService;
import com.mortals.xhx.module.hik.door.model.req.door.DoorEventReq;
import com.mortals.xhx.module.hik.door.model.rsp.door.DoorEventDataInfo;
import com.mortals.xhx.module.hik.door.service.IHikDoorService;
import com.mortals.xhx.module.holiday.model.HolidayEntity;
import com.mortals.xhx.module.holiday.model.HolidayQuery;
import com.mortals.xhx.module.holiday.service.HolidayService;
......@@ -66,6 +73,8 @@ public class AttendanceRecordHikServiceImpl extends AbstractCRUDServiceImpl<Atte
private AttendanceGroupFixedworkService groupFixedworkService;
@Autowired
private HolidayService holidayService;
@Autowired
private IHikDoorService hikDoorService;
@Override
......@@ -777,7 +786,18 @@ public class AttendanceRecordHikServiceImpl extends AbstractCRUDServiceImpl<Atte
recordHikEntity.setCreateTime((DateUtil.parseDate(recordHikQuery.getAttendanceDateStart()).toJdkDate()));
recordHikEntity.setCreateUserId(1L);
try {
//查询当天是否有考勤记录,没有的才添加虚增考勤记录
AttendanceRecordHikEntity condition = new AttendanceRecordHikEntity();
condition.setStaffId(staffCache.getId());
condition.setAttendanceDateStart(recordHikQuery.getAttendanceDateStart());
condition.setAttendanceDateEnd(recordHikQuery.getAttendanceDateEnd());
AttendanceRecordHikEntity hikEntity = this.selectOne(condition);
if (ObjectUtils.isEmpty(hikEntity)) {
this.getDao().insert(recordHikEntity);
}else {
log.info("当天已有考勤记录,无需添加!");
}
} catch (Exception e) {
log.error(e.getMessage());
}
......@@ -788,391 +808,121 @@ public class AttendanceRecordHikServiceImpl extends AbstractCRUDServiceImpl<Atte
}
}
}
}
/* //map遍历.先把所有键取出来
Set<String> workNumSet = listMap.keySet();
//根据键取出value
for (String workNum : workNumSet) {
List<AttendanceRecordHikEntity> attendanceRecordHikEntities1 = listMap.get(workNum);
//对按照工号分组了的数据attendanceRecordHikEntities进行时间分组
// DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
// Map<String, List<AttendanceRecordHikEntity>> map = attendanceRecordHikEntities1.stream().collect(Collectors.groupingBy(hikEntity -> hikEntity.getAttendanceDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate().format(formatter)));
Map<String, List<AttendanceRecordHikEntity>> map = attendanceRecordHikEntities1.stream().collect(Collectors.groupingBy(hikEntity -> DateUtil.formatDate(hikEntity.getAttendanceDate())));
Set<String> dateSet = map.keySet();
for (String s : dateSet) {
List<AttendanceRecordHikEntity> attendanceRecordHikEntities = map.get(s);
//对相同工号的人员进行遍历判断考勤规则.
AttendanceRecordEntity attendanceRecordEntity = new AttendanceRecordEntity();
attendanceRecordEntity.initAttrValue();
List<AttendanceRecordDetailEntity> detailEntityList = new ArrayList<>();
for (AttendanceRecordHikEntity item : attendanceRecordHikEntities) {
//对主表的对象进行赋值
if (StringUtils.isNull(attendanceRecordEntity) || StringUtils.isEmpty(attendanceRecordEntity.getStaffName())) {
//SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
attendanceRecordEntity.setStaffId(item.getStaffId());
attendanceRecordEntity.setStaffName(item.getStaffName());
attendanceRecordEntity.setDeptId(item.getDeptId());
attendanceRecordEntity.setDeptName(item.getDeptName());
attendanceRecordEntity.setPositionId(item.getPositionId());
attendanceRecordEntity.setPositionName(item.getPositionName());
attendanceRecordEntity.setWorkNum(item.getWorkNum());
//attendanceRecordEntity.setAttendanceDate(sdf.parse(sdf.format(item.getAttendanceDate())));
attendanceRecordEntity.setAttendanceDate(item.getAttendanceDate());
attendanceRecordEntity.setCreateTime(new Date());
attendanceRecordEntity.setCreateUserId(this.getContextUserId(context));
}
//获取考勤打卡时间
Date attendanceDate = item.getAttendanceDate();
//通过工号查询员工信息
//StaffEntity staffEntity = staffService.selectOne(new StaffQuery().workNum(item.getWorkNum()));
StaffEntity staffEntity = staffService.getExtCache(StrUtil.padPre(item.getWorkNum(), 8, "0"));
if (ObjectUtils.isEmpty(staffEntity)) {
log.info("staffEntity is null ,workNum:{}", StrUtil.padPre(item.getWorkNum(), 8, "0"));
continue;
}
//通过员工id查询考勤人员信息
List<AttendanceGroupStaffEntity> attendanceGroupStaffEntities = attendanceGroupStaffService.find(new AttendanceGroupStaffQuery().staffId(staffEntity.getId()));
//查询该考勤人员,如果查出来的考勤人员信息list长度为1 则该考勤人员只有一个考勤组
if (StringUtils.isNotNull(attendanceGroupStaffEntities) && attendanceGroupStaffEntities.size() == 1) {
//查询考勤组
AttendanceGroupQuery attendanceGroupQuery = new AttendanceGroupQuery();
AttendanceGroupEntity attendanceGroupEntity = attendanceGroupService.selectOne(attendanceGroupQuery.id(attendanceGroupStaffEntities.get(0).getGroupId()));
attendanceRecordEntity.setAttendanceGroupId(attendanceGroupEntity.getId());
attendanceRecordEntity.setAttendanceGroupName(attendanceGroupEntity.getGroupName());
//log.info("attendanceGroupEntity.getId()=={}", attendanceGroupEntity.getId());
//查询考勤组详细信息获取班次
AttendanceGroupFixedworkEntity attendanceGroupFixedworkEntity = attendanceGroupFixedworkService.selectOne(new AttendanceGroupFixedworkQuery()
.groupId(attendanceGroupEntity.getId()));
//判断当前考勤日期为周几
Date attendanceDate1 = attendanceDate;
String week = this.getWeek(attendanceDate1);
//log.info("week:{}", week);
//通过考勤日期的星期拿到班次id.
if (ObjectUtils.isEmpty(attendanceGroupFixedworkEntity)) {
log.info("attendanceGroupFixedworkEntity is null ! groupId:{}", attendanceGroupEntity.getId());
continue;
}
Long weekClassId = this.getWeekClassId(attendanceGroupFixedworkEntity, week);
//log.info("weekClassId:{}", weekClassId);
//weekClassId为-1 则不在考勤
if (weekClassId == -1L) {
//跳过本次循环
continue;
}
//获取班次信息
//AttendanceClassEntity attendanceClassEntity = attendanceClassService.selectOne(new AttendanceClassQuery().id(weekClassId));
AttendanceClassEntity attendanceClassEntity = attendanceClassService.get(weekClassId);
if (ObjectUtils.isEmpty(attendanceClassEntity)) {
log.info("attendanceClassEntity is null ,weekClassId:{}", weekClassId);
continue;
}
//获取班次详细信息
AttendanceClassDetailQuery attendanceClassDetailQuery = new AttendanceClassDetailQuery();
List<AttendanceClassDetailEntity> attendanceClassDetailEntities = attendanceClassDetailService.find(attendanceClassDetailQuery.classId(attendanceClassEntity.getId()));
Integer orderNum = 0;
if (ObjectUtils.isEmpty(detailEntityList)) {
for (AttendanceClassDetailEntity classDetailEntity : attendanceClassDetailEntities) {
orderNum++;
AttendanceRecordDetailEntity recordDetailEntity = new AttendanceRecordDetailEntity();
recordDetailEntity.setShiftsId(classDetailEntity.getId());
recordDetailEntity.setShiftsName(classDetailEntity.getClassName());
recordDetailEntity.setGoWorkResult(GoWorkResultEnum.缺卡.getValue());
recordDetailEntity.setOffWorkResult(GoWorkResultEnum.缺卡.getValue());
recordDetailEntity.setOrderNum(orderNum);
detailEntityList.add(recordDetailEntity);
}
}
for (AttendanceClassDetailEntity classDetail : attendanceClassDetailEntities) {
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
//上班打卡前时间
Date goWorkDateBefore = sdf.parse(sdf.format(DateUtils.addMinutes(classDetail.getGoWorkDate(), -classDetail.getGoWorkDateBefore())));
//上班打卡后时间
Date goWorkDateAfter = sdf.parse(sdf.format(DateUtils.addMinutes(classDetail.getGoWorkDate(), classDetail.getGoWorkDateAfter())));
//下班打卡前时间
Date offWorkDateBefore = sdf.parse(sdf.format(DateUtils.addMinutes(classDetail.getOffWorkDate(), -classDetail.getOffWorkDateBefore())));
//下班打卡后时间
Date offWorkDateAfter = sdf.parse(sdf.format(DateUtils.addMinutes(classDetail.getOffWorkDate(), classDetail.getOffWorkDateAfter())));
//判断考勤时间是否在上班打卡区间内 true 在 false 不在
boolean goInTime = isInTime(sdf.parse(sdf.format(attendanceDate)), goWorkDateBefore, goWorkDateAfter);
//判断考勤时间是否在下班打卡区间内
boolean offInTime = isInTime(sdf.parse(sdf.format(attendanceDate)), offWorkDateBefore, offWorkDateAfter);
if (goInTime == false && offInTime == false) {
continue;
}
if (goInTime) {
//如果是上班打卡,判断是否迟到
boolean inTime = isInTime(sdf.parse(sdf.format(attendanceDate)), goWorkDateBefore, sdf.parse(sdf.format(classDetail.getGoWorkDate())));
if (!inTime) {
for (AttendanceRecordDetailEntity attendanceRecordDetailEntity : detailEntityList) {
if (attendanceRecordDetailEntity.getShiftsId().longValue() == classDetail.getId().longValue()) {
attendanceRecordDetailEntity.setGoWorkResult(GoWorkResultEnum.迟到.getValue());
attendanceRecordDetailEntity.setGoWorkDate(attendanceDate);
}
}
}
if (inTime) {
for (AttendanceRecordDetailEntity attendanceRecordDetailEntity : detailEntityList) {
if (attendanceRecordDetailEntity.getShiftsId().longValue() == classDetail.getId().longValue()) {
attendanceRecordDetailEntity.setGoWorkResult(GoWorkResultEnum.正常.getValue());
attendanceRecordDetailEntity.setGoWorkDate(attendanceDate);
}
}
}
}
if (offInTime) {
boolean inTime = isInTime(sdf.parse(sdf.format(attendanceDate)), sdf.parse(sdf.format(classDetail.getOffWorkDate())), offWorkDateAfter);
if (!inTime) {
for (AttendanceRecordDetailEntity attendanceRecordDetailEntity : detailEntityList) {
if (attendanceRecordDetailEntity.getShiftsId().longValue() == classDetail.getId().longValue()) {
attendanceRecordDetailEntity.setOffWorkResult(GoWorkResultEnum.早退.getValue());
attendanceRecordDetailEntity.setOffWorkDate(attendanceDate);
}
}
}
if (inTime) {
for (AttendanceRecordDetailEntity attendanceRecordDetailEntity : detailEntityList) {
if (attendanceRecordDetailEntity.getShiftsId().longValue() == classDetail.getId().longValue()) {
attendanceRecordDetailEntity.setOffWorkResult(GoWorkResultEnum.正常.getValue());
attendanceRecordDetailEntity.setOffWorkDate(attendanceDate);
}
}
}
}
}
}
//如果考勤人员信息list长度大于1 则该考勤人员有多个考勤组.
if (StringUtils.isNotNull(attendanceGroupStaffEntities) && attendanceGroupStaffEntities.size() > 1) {
for (AttendanceGroupStaffEntity groupStaffEntity : attendanceGroupStaffEntities) {
{
//查询考勤组
AttendanceGroupQuery attendanceGroupQuery = new AttendanceGroupQuery();
AttendanceGroupEntity attendanceGroupEntity = attendanceGroupService.selectOne(attendanceGroupQuery.id(groupStaffEntity.getGroupId()));
//查询考勤组详细信息获取班次
AttendanceGroupFixedworkQuery attendanceGroupFixedworkQuery = new AttendanceGroupFixedworkQuery();
AttendanceGroupFixedworkEntity attendanceGroupFixedworkEntity = attendanceGroupFixedworkService.selectOne(attendanceGroupFixedworkQuery.groupId(attendanceGroupEntity.getId()));
//判断当前考勤日期为周几
Date attendanceDate1 = attendanceDate;
String week = this.getWeek(attendanceDate1);
//通过考勤日期的星期拿到班次id.
Long weekClassId = this.getWeekClassId(attendanceGroupFixedworkEntity, week);
//weekClassId为-1 则不在考勤
if (weekClassId == -1L) {
//跳过本次循环
continue;
}
attendanceRecordEntity.setAttendanceGroupId(attendanceGroupEntity.getId());
attendanceRecordEntity.setAttendanceGroupName(attendanceGroupEntity.getGroupName());
//获取班次信息
AttendanceClassQuery attendanceClassQuery = new AttendanceClassQuery();
AttendanceClassEntity attendanceClassEntity = attendanceClassService.selectOne(attendanceClassQuery.id(weekClassId));
//获取班次详细信息
AttendanceClassDetailQuery attendanceClassDetailQuery = new AttendanceClassDetailQuery();
List<AttendanceClassDetailEntity> attendanceClassDetailEntities = attendanceClassDetailService.find(attendanceClassDetailQuery.classId(attendanceClassEntity.getId()));
Integer orderNum = 0;
if (detailEntityList != null || detailEntityList.size() == 0) {
for (AttendanceClassDetailEntity classDetailEntity : attendanceClassDetailEntities) {
orderNum++;
AttendanceRecordDetailEntity recordDetailEntity = new AttendanceRecordDetailEntity();
recordDetailEntity.setShiftsId(classDetailEntity.getId());
recordDetailEntity.setShiftsName(classDetailEntity.getClassName());
recordDetailEntity.setGoWorkResult(GoWorkResultEnum.缺卡.getValue());
recordDetailEntity.setOffWorkResult(GoWorkResultEnum.缺卡.getValue());
recordDetailEntity.setOrderNum(orderNum);
detailEntityList.add(recordDetailEntity);
}
}
for (AttendanceClassDetailEntity classDetail : attendanceClassDetailEntities) {
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
//上班打卡前时间
Date goWorkDateBefore = sdf.parse(sdf.format(DateUtils.addMinutes(classDetail.getGoWorkDate(), -classDetail.getGoWorkDateBefore())));
//上班打卡后时间
Date goWorkDateAfter = sdf.parse(sdf.format(DateUtils.addMinutes(classDetail.getGoWorkDate(), classDetail.getGoWorkDateAfter())));
//下班打卡前时间
Date offWorkDateBefore = sdf.parse(sdf.format(DateUtils.addMinutes(classDetail.getOffWorkDate(), -classDetail.getOffWorkDateBefore())));
//下班打卡后时间
Date offWorkDateAfter = sdf.parse(sdf.format(DateUtils.addMinutes(classDetail.getOffWorkDate(), classDetail.getOffWorkDateAfter())));
//判断考勤时间是否在上班打卡区间内 true 在 false 不在
boolean goInTime = isInTime(sdf.parse(sdf.format(attendanceDate)), goWorkDateBefore, goWorkDateAfter);
//判断考勤时间是否在下班打卡区间内
boolean offInTime = isInTime(sdf.parse(sdf.format(attendanceDate)), offWorkDateBefore, offWorkDateAfter);
if (goInTime == false && offInTime == false) {
continue;
}
if (goInTime) {
//如果是上班打卡,判断是否迟到
boolean inTime = isInTime(sdf.parse(sdf.format(attendanceDate)), goWorkDateBefore, sdf.parse(sdf.format(classDetail.getGoWorkDate())));
if (!inTime) {
for (AttendanceRecordDetailEntity attendanceRecordDetailEntity : detailEntityList) {
if (attendanceRecordDetailEntity.getShiftsId().equals(classDetail.getId())) {
attendanceRecordDetailEntity.setGoWorkResult(GoWorkResultEnum.迟到.getValue());
attendanceRecordDetailEntity.setGoWorkDate(attendanceDate);
}
}
}
if (inTime) {
for (AttendanceRecordDetailEntity attendanceRecordDetailEntity : detailEntityList) {
if (attendanceRecordDetailEntity.getShiftsId().equals(classDetail.getId())) {
attendanceRecordDetailEntity.setGoWorkResult(GoWorkResultEnum.正常.getValue());
attendanceRecordDetailEntity.setGoWorkDate(attendanceDate);
}
}
}
}
if (offInTime) {
boolean inTime = isInTime(sdf.parse(sdf.format(attendanceDate)), sdf.parse(sdf.format(classDetail.getOffWorkDate())), offWorkDateAfter);
if (!inTime) {
for (AttendanceRecordDetailEntity attendanceRecordDetailEntity : detailEntityList) {
if (attendanceRecordDetailEntity.getShiftsId().equals(classDetail.getId())) {
attendanceRecordDetailEntity.setOffWorkResult(GoWorkResultEnum.早退.getValue());
attendanceRecordDetailEntity.setOffWorkDate(attendanceDate);
}
}
}
if (inTime) {
for (AttendanceRecordDetailEntity attendanceRecordDetailEntity : detailEntityList) {
if (attendanceRecordDetailEntity.getShiftsId().equals(classDetail.getId())) {
attendanceRecordDetailEntity.setOffWorkResult(GoWorkResultEnum.正常.getValue());
attendanceRecordDetailEntity.setOffWorkDate(attendanceDate);
}
}
}
}
}
}
}
}
}
List<AttendanceRecordErrorEntity> errorEntityList = new ArrayList<>();
for (AttendanceRecordDetailEntity recordDetailEntity : detailEntityList) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat sdft = new SimpleDateFormat("HH:mm:ss");
Integer goWorkResult = recordDetailEntity.getGoWorkResult();
Integer offWorkResult = recordDetailEntity.getOffWorkResult();
if (GoWorkResultEnum.正常.getValue() != goWorkResult) {
AttendanceRecordErrorEntity errorEntity = new AttendanceRecordErrorEntity();
errorEntity.setStaffId(attendanceRecordEntity.getStaffId());
errorEntity.setStaffName(attendanceRecordEntity.getStaffName());
errorEntity.setWorkNum(attendanceRecordEntity.getWorkNum());
errorEntity.setDeptId(attendanceRecordEntity.getDeptId());
errorEntity.setDeptName(attendanceRecordEntity.getDeptName());
errorEntity.setPositionId(attendanceRecordEntity.getPositionId());
errorEntity.setPositionName(attendanceRecordEntity.getPositionName());
errorEntity.setShiftsId(recordDetailEntity.getShiftsId());
errorEntity.setShiftsName(recordDetailEntity.getShiftsName());
Date goWorkDate = attendanceClassDetailService.selectOne(new AttendanceClassDetailQuery().id(recordDetailEntity.getShiftsId())).getGoWorkDate();
errorEntity.setGoOffDateTime(goWorkDate);
if (recordDetailEntity.getGoWorkDate() != null && !recordDetailEntity.getGoWorkDate().equals("")) {
errorEntity.setErrorDateTime(recordDetailEntity.getGoWorkDate());
errorEntity.setActualAttendanceDateTime(recordDetailEntity.getGoWorkDate());
} else {
String s1 = s + " " + sdft.format(goWorkDate);
errorEntity.setErrorDateTime(sdf.parse(s1));
errorEntity.setActualAttendanceDateTime(sdf.parse(s1));
@Override
public void buildSourceHikRecord(AttendanceRecordHikQuery recordHikQuery, Context context) {
syncDoorEvents(recordHikQuery);
}
private void syncDoorEvents(AttendanceRecordHikQuery recordHikQuery) {
DoorEventReq doorEventReq = new DoorEventReq();
List<Integer> eventTypes = new ArrayList<>();
eventTypes.add(196885);
eventTypes.add(196887);
eventTypes.add(196893);
eventTypes.add(196888);
eventTypes.add(196889);
eventTypes.add(196890);
eventTypes.add(196891);
// eventTypes.add(196893);//人脸认证通过
doorEventReq.setEventTypes(eventTypes);
// 获取当天的开始时间
//Date todayStart = DateUtil.offsetHour(new Date(), -5).toJdkDate();
Date todayStart = DateUtil.beginOfDay(DateUtil.parseDate(recordHikQuery.getAttendanceDateStart()));
// 获取当天的结束时间
Date todayEnd = DateUtil.endOfDay(DateUtil.parseDate(recordHikQuery.getAttendanceDateEnd()));
doorEventReq.setStartTime(todayStart);
doorEventReq.setEndTime(todayEnd);
doorEventReq.setPageNo(1);
doorEventReq.setPageSize(1);
Rest<DoorEventDataInfo> doorEventsRest = hikDoorService.getDoorEvents(doorEventReq);
log.info("doorEventsRest:{} msg:{}", doorEventsRest.getCode(), doorEventsRest.getMsg());
if (doorEventsRest.getCode() == YesNoEnum.YES.getValue()) {
//分页获取考勤数据
Integer total = doorEventsRest.getData().getTotal();
int pageCount = PageUtil.totalPage(total, 1000);
for (int i = 1; i <= pageCount; i++) {
doorEventReq.setPageNo(i);
doorEventReq.setPageSize(1000);
try {
doorEventsRest = hikDoorService.getDoorEvents(doorEventReq);
log.info("doorEventsRest:{} msg:{},page:{}", doorEventsRest.getCode(), doorEventsRest.getMsg(), doorEventReq.getPageNo());
getDoorEvents(doorEventsRest);
}catch (Exception e){
log.error("分页获取考勤数据异常:{}", e.getMessage());
}
if (GoWorkResultEnum.缺卡.getValue() == recordDetailEntity.getGoWorkResult()) {
errorEntity.setErrorStatus(ErrorStatusEnum.缺卡.getValue());
}
if (GoWorkResultEnum.迟到.getValue() == recordDetailEntity.getGoWorkResult()) {
errorEntity.setErrorStatus(ErrorStatusEnum.迟到.getValue());
}
errorEntity.setProcessStatus(0);
errorEntity.setCreateTime(new Date());
errorEntity.setCreateUserId(this.getContextUserId(context));
errorEntityList.add(errorEntity);
}
if (offWorkResult != 1) {
AttendanceRecordErrorEntity errorEntity = new AttendanceRecordErrorEntity();
errorEntity.setStaffId(attendanceRecordEntity.getStaffId());
errorEntity.setStaffName(attendanceRecordEntity.getStaffName());
errorEntity.setWorkNum(attendanceRecordEntity.getWorkNum());
errorEntity.setDeptId(attendanceRecordEntity.getDeptId());
errorEntity.setDeptName(attendanceRecordEntity.getDeptName());
errorEntity.setPositionId(attendanceRecordEntity.getPositionId());
errorEntity.setPositionName(attendanceRecordEntity.getPositionName());
errorEntity.setShiftsId(recordDetailEntity.getShiftsId());
errorEntity.setShiftsName(recordDetailEntity.getShiftsName());
Date offWorkDate = attendanceClassDetailService.selectOne(new AttendanceClassDetailQuery().id(recordDetailEntity.getShiftsId())).getOffWorkDate();
errorEntity.setGoOffDateTime(offWorkDate);
if (recordDetailEntity.getOffWorkDate() != null && !recordDetailEntity.getOffWorkDate().equals("")) {
errorEntity.setErrorDateTime(recordDetailEntity.getOffWorkDate());
errorEntity.setActualAttendanceDateTime(recordDetailEntity.getOffWorkDate());
} else {
errorEntity.setErrorDateTime(sdf.parse(s + " " + sdft.format(offWorkDate)));
errorEntity.setActualAttendanceDateTime(sdf.parse(s + " " + sdft.format(offWorkDate)));
}
if (recordDetailEntity.getOffWorkResult() == 3) {
errorEntity.setErrorStatus(0);
}
if (recordDetailEntity.getOffWorkResult() == 5) {
errorEntity.setErrorStatus(1);
}
errorEntity.setProcessStatus(0);
errorEntity.setCreateTime(new Date());
errorEntity.setCreateUserId(this.getContextUserId(context));
errorEntityList.add(errorEntity);
}
}
if (detailEntityList != null && detailEntityList.size() > 0) {
if (errorEntityList != null && errorEntityList.size() > 0) {
errorService.save(errorEntityList, context);
}
attendanceRecordEntity.setShiftsName(detailEntityList.get(0).getShiftsName());
attendanceRecordEntity.setShiftsId(attendanceClassDetailService.selectOne(new AttendanceClassDetailQuery().id(detailEntityList.get(0).getShiftsId())).getClassId());
attendanceRecordEntity.setAttendanceRecordDetailList(detailEntityList);
//判断签到 只要存在一次正常打卡详细记录 就判断签到
for (AttendanceRecordDetailEntity detailEntity : detailEntityList) {
if (GoWorkResultEnum.正常.getValue() == detailEntity.getGoWorkResult() || GoWorkResultEnum.迟到.getValue() == detailEntity.getOffWorkResult()) {
attendanceRecordEntity.setSignInResult(YesNoEnum.YES.getValue());
break;
}
}
private void getDoorEvents(Rest<DoorEventDataInfo> doorEventsRest) {
//同步当前考勤数据
List<AttendanceRecordHikEntity> attRecords = doorEventsRest.getData().getList().stream().map(item -> {
AttendanceRecordHikEntity recordHikEntity = new AttendanceRecordHikEntity();
recordHikEntity.initAttrValue();
for (AttendanceRecordDetailEntity detailEntity : detailEntityList) {
if (OffWorkResultEnum.正常.getValue() == detailEntity.getOffWorkResult() || OffWorkResultEnum.早退.getValue() == detailEntity.getOffWorkResult()) {
attendanceRecordEntity.setSignOutResult(YesNoEnum.YES.getValue());
break;
if (ObjectUtils.isEmpty(item.getJobNo())) {
log.info("jobNo is null ==>{}", JSON.toJSONString(item));
return null;
}
StaffEntity staffCache = staffService.getExtCache(StrUtil.padPre(item.getJobNo(), 8, "0"));
if (ObjectUtils.isEmpty(staffCache)) {
log.info("staff is null !staffCode:{}", item.getJobNo());
return null;
}
for (AttendanceRecordDetailEntity detailEntity : detailEntityList) {
if (OffWorkResultEnum.缺卡.getValue() == detailEntity.getOffWorkResult()) {
attendanceRecordEntity.setPunchResult(YesNoEnum.NO.getValue());
break;
}
recordHikEntity.setStaffId(staffCache.getId());
recordHikEntity.setStaffName(staffCache.getName());
recordHikEntity.setWorkNum(staffCache.getWorkNum());
recordHikEntity.setDeptId(staffCache.getDeptId());
recordHikEntity.setDeptName(staffCache.getDeptName());
recordHikEntity.setSalaId(staffCache.getSalaId());
recordHikEntity.setSalaName(staffCache.getSalaName());
recordHikEntity.setPositionId(staffCache.getPositionId());
recordHikEntity.setPositionName(staffCache.getPositionName());
if (OffWorkResultEnum.缺卡.getValue() == detailEntity.getOffWorkResult()) {
attendanceRecordEntity.setPunchResult(YesNoEnum.NO.getValue());
break;
recordHikEntity.setAttendanceDate(item.getEventTime());
recordHikEntity.setAttendanceAddress(item.getDoorName());
recordHikEntity.setEventSource("门禁点");
recordHikEntity.setRemark(item.getEventId());
recordHikEntity.setCreateTime(new Date());
recordHikEntity.setCreateUserName("系统管理员");
recordHikEntity.setCreateUserId(1L);
return recordHikEntity;
}).filter(f -> f != null).collect(Collectors.toList());
log.info("attRecords size:{}", attRecords.size());
List<String> eventIds = attRecords.parallelStream().filter(f -> !ObjectUtils.isEmpty(f) && !ObjectUtils.isEmpty(f.getRemark())).map(i -> i.getRemark()).collect(Collectors.toList());
//查询当天考勤记录是否有重复的 有的 则不添加
AttendanceRecordHikQuery recordHikQuery = new AttendanceRecordHikQuery();
recordHikQuery.setAttendanceDateStart(DateUtil.format(DateUtil.beginOfDay(new Date()), "yyyy-MM-dd"));
recordHikQuery.setAttendanceDateEnd(DateUtil.format(DateUtil.beginOfDay(new Date()), "yyyy-MM-dd"));
recordHikQuery.setRemarkList(eventIds);
Set<String> eventIdSet = this.find(recordHikQuery).parallelStream().map(i -> i.getRemark()).collect(Collectors.toSet());
//去重 时分秒打卡的 也要去掉重复。
List<AttendanceRecordHikEntity> saveRecordList = attRecords.stream().filter(f -> !eventIdSet.contains(f.getRemark())).collect(Collectors.toList());
if (!ObjectUtils.isEmpty(saveRecordList)) {
//单个插入 去掉重复时间段的打卡记录
for (AttendanceRecordHikEntity recordHikEntity : saveRecordList) {
try {
this.getDao().insert(recordHikEntity);
} catch (Exception e) {
//log.error("基础考勤数据保存异常", e.getMessage());
}
}
if (YesNoEnum.YES.getValue() == attendanceRecordEntity.getSignInResult() && YesNoEnum.YES.getValue() == attendanceRecordEntity.getSignOutResult()) {
attendanceRecordEntity.setPunchResult(YesNoEnum.YES.getValue());
// recordHikService.save(saveRecordList);
}
log.info("saveRecordList size:{}", saveRecordList.size());
attendanceRecordEntity.setAttendType("现场打卡");
//判断是否存在记录 如果存在 则更新 维度 staffId attendanceDate shiftsId attendanceGroupId
/* AttendanceRecordHikQuery hikQuery = new AttendanceRecordHikQuery();
hikQuery.setAttendanceDateStart(DateUtil.beginOfMonth(new Date()).toDateStr());
hikQuery.setAttendanceDateEnd(DateUtil.today());
AttendanceRecordQuery query = new AttendanceRecordQuery();
query.setStaffId(attendanceRecordEntity.getStaffId());
query.setShiftsId(attendanceRecordEntity.getShiftsId());
query.setAttendanceGroupId(attendanceRecordEntity.getAttendanceGroupId());
query.setAttendanceDate(attendanceRecordEntity.getAttendanceDate());
Long totalCache = this.find(hikQuery).parallelStream().map(item -> item.getStaffId()).distinct().count();
*///cacheService.hset(RedisKey.KEY_ATTENC_TOTOAL_CACHE, DateUtil.format(new Date(), "yyyy-MM"), totalCache);
AttendanceRecordEntity recordEntity = attendanceRecordService.selectOne(query);
if (!ObjectUtils.isEmpty(recordEntity)) {
attendanceRecordEntity.setId(recordEntity.getId());
attendanceRecordEntity.setUpdateTime(new Date());
attendanceRecordEntity.setUpdateUserId(this.getContextUserId(context));
attendanceRecordService.update(attendanceRecordEntity, context);
} else {
attendanceRecordService.save(attendanceRecordEntity, context);
}
}
}
}*/
\ No newline at end of file
}
......@@ -207,6 +207,49 @@ public class AttendanceRecordHikController extends BaseCRUDJsonBodyMappingContro
}
@PostMapping(value = "/addAttendanceHikRecordCustom")
@UnAuth
public Rest<String> addAttendanceHikRecordCustom(@RequestBody AttendanceRecordHikQuery hikEntity) {
Rest<String> ret = new Rest();
Map<String, Object> model = new HashMap();
Context context = this.getContext();
String busiDesc = "查询" + this.getModuleDesc();
int code = 1;
try {
//天数区间分段计算
DateTime attendStart = DateUtil.parseDate(hikEntity.getAttendanceDateStart());
DateTime attendEnd = DateUtil.parseDate(hikEntity.getAttendanceDateEnd());
Long compare = DateUtil.between(attendEnd, attendStart, DateUnit.DAY);
StopWatch stopWatch = new StopWatch("stopwatch attend1");
log.info("考勤计算天数区间:{}", compare);
for (int i = 0; i <= compare.intValue(); i++) {
DateTime curDate = DateUtil.offsetDay(attendStart, i);
log.info("考勤计算日期:{}", curDate.toDateStr());
stopWatch.start("执行本地方法");
hikEntity.setAttendanceDateStart(curDate.toDateStr());
hikEntity.setAttendanceDateEnd(curDate.toDateStr());
hikService.buildSourceHikRecord(hikEntity, context);
stopWatch.stop();
log.info("考勤计算日期:{} 完成,耗时:{}ms", curDate.toDateStr(), stopWatch.getLastTaskTimeMillis());
}
model.put("message_info", busiDesc + "成功");
this.recordSysLog(this.request, busiDesc + " 【成功】");
} catch (Exception e) {
code = -1;
this.doException(this.request, busiDesc, model, e);
model.put("message_info", e.getMessage());
}
this.init(model, context);
ret.setCode(code);
ret.setMsg(model.get("message_info") == null ? "" : model.remove("message_info").toString());
return ret;
}
@Override
protected void doListBefore(AttendanceRecordHikEntity query, Map<String, Object> model, Context context) throws AppException {
if (query.getStaffName() != null && !query.getStaffName().equals("")) {
......
......@@ -61,8 +61,19 @@ Authorization: {{authToken}}
Content-Type: application/json
{
"attendanceDateStart":"2024-01-17",
"attendanceDateEnd":"2024-01-24"
"attendanceDateStart":"2023-12-01",
"attendanceDateEnd":"2024-01-25"
}
###海康考勤打卡记录原始记录同步
POST {{baseUrl}}/attendance/record/hik/addAttendanceHikRecordCustom
Authorization: {{authToken}}
Content-Type: application/json
{
"attendanceDateStart":"2024-01-01",
"attendanceDateEnd":"2024-01-25"
}
......
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