Commit 432fd2bf authored by 赵啸非's avatar 赵啸非

添加请假等异常考勤计算

parent ab109295
......@@ -4,12 +4,19 @@ 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.service.ICacheService;
import com.mortals.framework.util.DateUtils;
import com.mortals.xhx.module.attendance.model.AttendanceRecordHikEntity;
import com.mortals.xhx.module.attendance.model.vo.AttendanceSummaryQuery;
import com.mortals.xhx.module.attendance.service.AttendanceRecordHikService;
import com.mortals.xhx.utils.SpringUtils;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StopWatch;
import static com.mortals.xhx.common.key.RedisKey.KEY_ATTENDANCE_STAT_CACHE;
@AllArgsConstructor
@Slf4j
......@@ -22,6 +29,19 @@ public class AddAttendThread implements Runnable {
private Context context;
private ICacheService cacheService;
public AddAttendThread(AttendanceRecordHikService hikService, AttendanceRecordHikEntity hikEntity, Context context) {
this.hikService = hikService;
this.hikEntity = hikEntity;
this.context = context;
this.cacheService = SpringUtils.getBean(ICacheService.class);
}
public AddAttendThread() {
this.cacheService = SpringUtils.getBean(ICacheService.class);
}
@Override
public void run() {
......@@ -43,6 +63,15 @@ public class AddAttendThread implements Runnable {
stopWatch.stop();
log.info("考勤计算日期:{} 完成,耗时:{}ms", curDate.toDateStr(), stopWatch.getLastTaskTimeMillis());
}
//生成汇总信息
log.info("生成考勤汇总消息开始。。。");
AttendanceSummaryQuery query = new AttendanceSummaryQuery();
if(!ObjectUtils.isEmpty(hikEntity.getStaffId())){
query.setStaffId(hikEntity.getStaffId());
}
query.setSummaryTimeStart(attendStart.toDateStr());
query.setSummaryTimeEnd(attendEnd.toDateStr());
cacheService.lpush(KEY_ATTENDANCE_STAT_CACHE, query);
} catch (Exception e) {
log.error("考勤计算失败!", e);
}
......
package com.mortals.xhx.module.attendance.service.impl;
import cn.hutool.core.date.DateUtil;
import com.mortals.framework.service.ICacheService;
import com.mortals.framework.util.DateUtils;
import com.mortals.framework.util.ThreadPool;
import com.mortals.xhx.common.code.AuditStatusEnum;
import com.mortals.xhx.common.utils.AddAttendThread;
import com.mortals.xhx.common.utils.AttendSummaryThread;
import com.mortals.xhx.module.attendance.model.AttendanceLeaveRecordQuery;
import com.mortals.xhx.module.attendance.model.AttendanceRecordHikEntity;
import com.mortals.xhx.module.attendance.model.AttendanceRecordHikQuery;
import com.mortals.xhx.module.attendance.model.vo.AttendanceSummaryQuery;
import com.mortals.xhx.module.attendance.service.AttendanceRecordHikService;
import com.mortals.xhx.module.attendance.service.AttendanceStatService;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -36,17 +42,22 @@ public class AttendanceLeaveRecordServiceImpl extends AbstractCRUDServiceImpl<At
@Autowired
private ICacheService cacheService;
@Autowired
private AttendanceRecordHikService hikService;
@Override
protected void updateAfter(AttendanceLeaveRecordEntity entity, Context context) throws AppException {
super.updateAfter(entity, context);
//context!=null时表示页面调用的修改,自动执行处理任务调用时context为null,无需立即汇总
if (entity.getAuditResult() == 1 && context!=null) {
/* //context!=null时表示页面调用的修改,自动执行处理任务调用时context为null,无需立即汇总
if (entity.getAuditResult() == 1 && context != null) {
AttendanceSummaryQuery query = new AttendanceSummaryQuery();
query.setStaffId(entity.getLeavePersonId());
query.setSummaryTimeStart(DateUtils.getStrDate(entity.getStartTime()));
query.setSummaryTimeEnd(DateUtils.getStrDate(entity.getEndTime()));
cacheService.lpush(KEY_ATTENDANCE_STAT_CACHE, query);
}
}*/
doUpdateRecordAndSummary(entity, context);
}
@Override
......@@ -67,6 +78,44 @@ public class AttendanceLeaveRecordServiceImpl extends AbstractCRUDServiceImpl<At
}
return leaveRecordEntity;
}
}
@Override
protected void saveAfter(AttendanceLeaveRecordEntity entity, Context context) throws AppException {
super.saveAfter(entity, context);
doUpdateRecordAndSummary(entity, context);
}
/**
* 更新汇总信息
* @param entity
* @param context
*/
private void doUpdateRecordAndSummary(AttendanceLeaveRecordEntity entity, Context context) {
//请假是未来 不做处理
int compare = DateUtil.compare(entity.getStartTime(), new Date());
if (compare > 0) {
//请假未来 不做处理
return;
}
//更新考勤记录与异常记录
if (AuditStatusEnum.通过.getValue() == entity.getAuditResult()) {
AttendanceRecordHikQuery attendanceRecordHikQuery = new AttendanceRecordHikQuery();
attendanceRecordHikQuery.setStaffId(entity.getLeavePersonId());
//判断请假的开始日期与结束日期
boolean in = DateUtil.isIn(new Date(), entity.getEndTime(), new Date());
if (in) {
//当前日期在请假期间,计算考勤结束时间为当前时间;
attendanceRecordHikQuery.setAttendanceDateStart(DateUtil.formatDate(entity.getStartTime()));
attendanceRecordHikQuery.setAttendanceDateEnd(DateUtil.today());
}else{
attendanceRecordHikQuery.setAttendanceDateStart(DateUtil.formatDate(entity.getStartTime()));
attendanceRecordHikQuery.setAttendanceDateEnd(DateUtil.formatDate(entity.getEndTime()));
}
AddAttendThread addAttendThread = new AddAttendThread(hikService, attendanceRecordHikQuery, context);
ThreadPool.getInstance().execute(addAttendThread);
}
}
}
\ No newline at end of file
......@@ -45,6 +45,10 @@ public class FixWorkOtherAttendance extends AttendanceWorkAbstract {
private HolidayService holidayService;
private AttendanceLeaveRecordService attendanceLeaveRecordService;
private AttendanceRecordDetailService attendanceRecordDetailService;
public FixWorkOtherAttendance(int type) {
super(type);
......@@ -56,6 +60,8 @@ public class FixWorkOtherAttendance extends AttendanceWorkAbstract {
this.attendanceClassDetailService = SpringUtils.getBean(AttendanceClassDetailService.class);
this.errorService = SpringUtils.getBean(AttendanceRecordErrorService.class);
this.holidayService = SpringUtils.getBean(HolidayService.class);
this.attendanceLeaveRecordService = SpringUtils.getBean(AttendanceLeaveRecordService.class);
this.attendanceRecordDetailService = SpringUtils.getBean(AttendanceRecordDetailService.class);
}
@Override
......@@ -78,9 +84,6 @@ public class FixWorkOtherAttendance extends AttendanceWorkAbstract {
}
//判断当前考勤日期为周几
String week = super.getWeek(DateUtil.parseDate(commonData.getDateStr()));
//log.info("week:{}", week);
//通过考勤日期的星期拿到班次id.
//获取当前日期的详细班次
Long weekClassId = this.getWeekClassId(attendanceGroupFixedworkEntity, week);
//log.info("weekClassId:{}", weekClassId);
......@@ -91,7 +94,7 @@ public class FixWorkOtherAttendance extends AttendanceWorkAbstract {
if (weekClassId == -1L) {
//跳过本次循环
if (!checkWorkByHoliday) {
// log.info("当前日期不在考勤时间范围内,不做处理!");
// log.info("当前日期不在考勤时间范围内,不做处理!");
return;
}
} else {
......@@ -100,6 +103,40 @@ public class FixWorkOtherAttendance extends AttendanceWorkAbstract {
return;
}
}
//判断当天是否请假
AttendanceLeaveRecordQuery leaveRecordQuery = new AttendanceLeaveRecordQuery();
leaveRecordQuery.setLeavePersonId(commonData.getStaffId());
leaveRecordQuery.setAuditResult(AuditStatusEnum.通过.getValue());
leaveRecordQuery.setStartTimeStart(commonData.getDateStr());
leaveRecordQuery.setStartTimeEnd(commonData.getDateStr());
AttendanceLeaveRecordEntity attendanceLeaveRecordEntity = attendanceLeaveRecordService.selectOne(leaveRecordQuery);
if (!ObjectUtils.isEmpty(attendanceLeaveRecordEntity)) {
log.info("当天员工请假,不做考勤处理!staffId:{},name:{}", commonData.getStaffId(), attendanceLeaveRecordEntity.getLeavePerson());
//删除当日考勤记录与详细
AttendanceRecordQuery attendanceRecordQuery = new AttendanceRecordQuery();
attendanceRecordQuery.setStaffId(commonData.getStaffId());
attendanceRecordQuery.setAttendanceDateStart(commonData.getDateStr());
attendanceRecordQuery.setAttendanceDateEnd(commonData.getDateStr());
List<AttendanceRecordEntity> attendanceRecordEntities = attendanceRecordService.find(attendanceRecordQuery);
if (!ObjectUtils.isEmpty(attendanceRecordEntities)) {
//删除
Long[] delIds = attendanceRecordEntities.stream().map(AttendanceRecordEntity::getId).toArray(Long[]::new);
attendanceRecordService.remove(delIds, commonData.getContext());
AttendanceRecordDetailQuery detailQuery = new AttendanceRecordDetailQuery();
detailQuery.setRecordIdList(Arrays.asList(delIds));
List<AttendanceRecordDetailEntity> detailEntities = attendanceRecordDetailService.find(detailQuery);
if (!ObjectUtils.isEmpty(detailEntities)) {
attendanceRecordDetailService.remove(detailEntities.stream().map(AttendanceRecordDetailEntity::getId).toArray(Long[]::new), commonData.getContext());
}
}
//删除当天该员工的异常记录与打卡考勤记录
deleteErrorRecord(commonData.getDateStr(), commonData.getStaffId(), commonData.getContext());
return;
}
/* if (weekClassId == -1L) {
//跳过本次循环
return;
......@@ -330,6 +367,19 @@ public class FixWorkOtherAttendance extends AttendanceWorkAbstract {
}
private void deleteErrorRecord(String dateStr, Long staffId, Context context) {
//删除当前员工当日未处理的异常后,重新添加
AttendanceRecordErrorQuery errorQuery = new AttendanceRecordErrorQuery();
errorQuery.setErrorDateTimeStart(dateStr);
errorQuery.setErrorDateTimeEnd(dateStr);
errorQuery.setStaffId(staffId);
errorQuery.setProcessStatus(YesNoEnum.NO.getValue());
Long[] errorIds = errorService.find(errorQuery).stream().map(i -> i.getId()).toArray(Long[]::new);
if (!ObjectUtils.isEmpty(errorIds)) {
errorService.remove(errorIds, context);
}
}
public void genErrorAttendRecord(Context context, String dateStr, AttendanceRecordEntity attendanceRecordEntity, List<AttendanceRecordDetailEntity> detailEntityList) {
//处理异常打卡,所以异常打卡的 都新增一条记录
......@@ -382,7 +432,7 @@ public class FixWorkOtherAttendance extends AttendanceWorkAbstract {
errorEntity.setShiftsName(recordDetailEntity.getShiftsName());
errorEntity.setProcessStatus(YesNoEnum.NO.getValue());
errorEntity.setCreateTime(new Date());
errorEntity.setCreateUserId(context==null?1L:context.getUser().getId());
errorEntity.setCreateUserId(context == null ? 1L : context.getUser().getId());
Date offWorkDate = attendanceClassDetailEntity.getOffWorkDate();
errorEntity.setGoOffDateTime(DateUtil.parseDateTime(dateStr + " " + DateUtil.formatTime(offWorkDate)).toJdkDate());
if (!ObjectUtils.isEmpty(recordDetailEntity.getOffWorkDate())) {
......@@ -405,17 +455,8 @@ public class FixWorkOtherAttendance extends AttendanceWorkAbstract {
}
}
//删除当前员工当日未处理的异常后,重新添加
AttendanceRecordErrorQuery errorQuery = new AttendanceRecordErrorQuery();
errorQuery.setErrorDateTimeStart(dateStr);
errorQuery.setErrorDateTimeEnd(dateStr);
errorQuery.setStaffId(attendanceRecordEntity.getStaffId());
errorQuery.setProcessStatus(YesNoEnum.NO.getValue());
Long[] errorIds = errorService.find(errorQuery).stream().map(i -> i.getId()).toArray(Long[]::new);
if (!ObjectUtils.isEmpty(errorIds)) {
errorService.remove(errorIds, context);
}
deleteErrorRecord(dateStr, attendanceRecordEntity.getStaffId(), context);
AttendanceRecordErrorQuery errorQuery;
if (!ObjectUtils.isEmpty(errorEntityList)) {
for (AttendanceRecordErrorEntity errorEntity : errorEntityList) {
......
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