Commit 3747a211 authored by 赵啸非's avatar 赵啸非

修改请假计算考勤

parent 3ca53466
package com.mortals.xhx.module.attendance.service.impl; package com.mortals.xhx.module.attendance.service.impl;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import com.mortals.framework.model.PageInfo; import com.mortals.framework.model.PageInfo;
...@@ -34,10 +35,8 @@ import org.springframework.util.ObjectUtils; ...@@ -34,10 +35,8 @@ import org.springframework.util.ObjectUtils;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.ArrayList; import java.util.*;
import java.util.Arrays; import java.util.stream.Collectors;
import java.util.Date;
import java.util.List;
import static com.mortals.xhx.common.key.RedisKey.KEY_ATTENDANCE_STAT_CACHE; import static com.mortals.xhx.common.key.RedisKey.KEY_ATTENDANCE_STAT_CACHE;
import static com.mortals.xhx.common.key.RedisKey.KEY_CHECK_SUMMARY_CACHE; import static com.mortals.xhx.common.key.RedisKey.KEY_CHECK_SUMMARY_CACHE;
...@@ -94,10 +93,10 @@ public class AttendanceRecordErrorServiceImpl extends AbstractCRUDServiceImpl<At ...@@ -94,10 +93,10 @@ public class AttendanceRecordErrorServiceImpl extends AbstractCRUDServiceImpl<At
@Override @Override
protected void updateBefore(AttendanceRecordErrorEntity entity, Context context) throws AppException { protected void updateBefore(AttendanceRecordErrorEntity entity, Context context) throws AppException {
AttendanceRecordErrorEntity temp = this.get(entity.getId()); AttendanceRecordErrorEntity temp = this.get(entity.getId());
if(temp==null){ if (temp == null) {
throw new AppException("考勤异常数据不存在"); throw new AppException("考勤异常数据不存在");
} }
if(temp.getErrorStatus().intValue()!=DataUtil.converStr2Int(entity.getProcessResult(),0)){ if (temp.getErrorStatus().intValue() != DataUtil.converStr2Int(entity.getProcessResult(), 0)) {
//异常处理结果与原来不符合时先删除已生成的考勤绩效 //异常处理结果与原来不符合时先删除已生成的考勤绩效
PerformAttendRecordQuery query = new PerformAttendRecordQuery(); PerformAttendRecordQuery query = new PerformAttendRecordQuery();
query.setStaffId(temp.getStaffId()); query.setStaffId(temp.getStaffId());
...@@ -121,19 +120,19 @@ public class AttendanceRecordErrorServiceImpl extends AbstractCRUDServiceImpl<At ...@@ -121,19 +120,19 @@ public class AttendanceRecordErrorServiceImpl extends AbstractCRUDServiceImpl<At
saveAttendPerformRecord(context, entity, ruleCode); saveAttendPerformRecord(context, entity, ruleCode);
} }
//考勤异常处理为正常后修改考勤绩效 //考勤异常处理为正常后修改考勤绩效
if(entity.getProcessResult().equals(ErrorStatusEnum.正常.getValue().toString())){ if (entity.getProcessResult().equals(ErrorStatusEnum.正常.getValue().toString())) {
CheckAttendRecordEntity checkAttendRecordQuery = new CheckAttendRecordEntity(); CheckAttendRecordEntity checkAttendRecordQuery = new CheckAttendRecordEntity();
checkAttendRecordQuery.setStaffId(entity.getStaffId()); checkAttendRecordQuery.setStaffId(entity.getStaffId());
checkAttendRecordQuery.setErrorTime(entity.getErrorDateTime()); checkAttendRecordQuery.setErrorTime(entity.getErrorDateTime());
CheckAttendRecordEntity checkAttendRecord = checkAttendRecordService.selectOne(checkAttendRecordQuery); CheckAttendRecordEntity checkAttendRecord = checkAttendRecordService.selectOne(checkAttendRecordQuery);
if(checkAttendRecord!=null){ if (checkAttendRecord != null) {
CheckAttendRecordEntity checkAttendUpdate = new CheckAttendRecordEntity(); CheckAttendRecordEntity checkAttendUpdate = new CheckAttendRecordEntity();
checkAttendUpdate.setId(checkAttendRecord.getId()); checkAttendUpdate.setId(checkAttendRecord.getId());
checkAttendUpdate.setCheckResult(CheckResultSubEnum.核查不扣分.getValue()); checkAttendUpdate.setCheckResult(CheckResultSubEnum.核查不扣分.getValue());
checkAttendUpdate.setAuditStatus(AuditStatusEnum.拒绝.getValue()); checkAttendUpdate.setAuditStatus(AuditStatusEnum.拒绝.getValue());
checkAttendUpdate.setUpdateTime(new Date()); checkAttendUpdate.setUpdateTime(new Date());
checkAttendUpdate.setCheckStatus(CheckStatusEnum.已处理.getValue()); checkAttendUpdate.setCheckStatus(CheckStatusEnum.已处理.getValue());
checkAttendRecordService.update(checkAttendUpdate,context); checkAttendRecordService.update(checkAttendUpdate, context);
} }
} }
//异常处理后重新汇总考勤 context!=null时表示页面调用的修改,自动执行处理任务调用时context为null,无需立即汇总 //异常处理后重新汇总考勤 context!=null时表示页面调用的修改,自动执行处理任务调用时context为null,无需立即汇总
...@@ -223,7 +222,6 @@ public class AttendanceRecordErrorServiceImpl extends AbstractCRUDServiceImpl<At ...@@ -223,7 +222,6 @@ public class AttendanceRecordErrorServiceImpl extends AbstractCRUDServiceImpl<At
} }
private List<String> getDatesBetween(String startDateStr, String endDateStr) { private List<String> getDatesBetween(String startDateStr, String endDateStr) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate startDate = LocalDate.parse(startDateStr, formatter); LocalDate startDate = LocalDate.parse(startDateStr, formatter);
...@@ -312,12 +310,103 @@ public class AttendanceRecordErrorServiceImpl extends AbstractCRUDServiceImpl<At ...@@ -312,12 +310,103 @@ public class AttendanceRecordErrorServiceImpl extends AbstractCRUDServiceImpl<At
} }
private static String getRuleCode(AttendanceRecordErrorEntity entity) { private String getRuleCode(AttendanceRecordErrorEntity entity) {
//请假时间段排除
//判断当天是否请假 请假分为多个区间段与请假类型。
AttendanceLeaveRecordQuery leaveRecordQuery = new AttendanceLeaveRecordQuery();
leaveRecordQuery.setLeavePersonId(entity.getStaffId());
/* leaveRecordQuery.setStartTimeStart(DateUtil.formatDate(entity.getErrorDateTime()));
leaveRecordQuery.setStartTimeEnd(DateUtil.formatDate(entity.getErrorDateTime()));*/
leaveRecordQuery.setAuditResultList(Arrays.asList(1, 4));
boolean isLeave = false;
List<AttendanceLeaveRecordEntity> leaveRecordEntities = attendanceLeaveRecordService.find(leaveRecordQuery);
List<AttendanceLeaveRecordEntity> leaveRecords = null;
if (!ObjectUtils.isEmpty(leaveRecordEntities)) {
//判断当日日期中 是否有请假记录
leaveRecords = leaveRecordEntities.stream().filter(f -> {
DateTime dateTime = DateUtil.parseDate(DateUtil.formatDate(entity.getErrorDateTime()));
DateTime start = DateUtil.parseDate(DateUtil.formatDate(f.getStartTime()));
DateTime end = DateUtil.parseDate(DateUtil.formatDate(f.getEndTime()));
boolean in = DateUtil.isIn(dateTime, start, end);
return in;
}).collect(Collectors.toList());
if (!ObjectUtils.isEmpty(leaveRecords)) {
//当前日期范围内 存在请假。判断请假计入考勤。目前只有事件计入
isLeave = true;
}
}
if (!ObjectUtils.isEmpty(leaveRecords)) {
//当前日期范围内 存在请假。判断请假计入考勤。目前只有事件计入
isLeave = true;
}
String ruleCode = ""; String ruleCode = "";
if (ErrorStatusEnum.早退.getValue() == DataUtil.converStr2Int(entity.getProcessResult(), 3)) { if (ErrorStatusEnum.早退.getValue() == DataUtil.converStr2Int(entity.getProcessResult(), 3)) {
if (!ObjectUtils.isEmpty(entity.getErrorDateTime()) && !ObjectUtils.isEmpty(entity.getGoOffDateTime())) { if (!ObjectUtils.isEmpty(entity.getErrorDateTime()) && !ObjectUtils.isEmpty(entity.getGoOffDateTime())) {
Long earlyMin = 0L;
//判断如果有请假记录记录。这计算早退时间与请假记录开始时间的差值
if (isLeave) {
List<Long> earlyMinList = new ArrayList<>();
for (AttendanceLeaveRecordEntity leaveRecord : leaveRecords) {
long between = DateUtil.between(leaveRecord.getStartTime(), leaveRecord.getEndTime(), DateUnit.DAY);
if (between == 0) {
//非跨天
// 1.判断异常时间与请假结束时间那个大。取大那个与当前班次下班时间比较差值,去正向值
int compare = DateUtil.compare(entity.getErrorDateTime(), leaveRecord.getEndTime());
if (compare < 0) {
//异常时间小于请假结束时间,早退则计算假期结束时间与班次下班时间差值
long tempEarly = DateUtil.between(leaveRecord.getEndTime(), entity.getGoOffDateTime(), DateUnit.MINUTE, false);
if (tempEarly > 0L) {
earlyMinList.add(tempEarly);
}
}
if (compare > 0) {
//异常时间大于请假结束时间,早退则计算异常时间与班次下班时间差值
long tempEarly = DateUtil.between(entity.getErrorDateTime(), entity.getGoOffDateTime(), DateUnit.MINUTE, false);
if (tempEarly > 0L) {
earlyMinList.add(tempEarly);
}
} else {
//异常时间小于请假结束时间,早退则计算异常时间与班次下班时间差值
long tempEarly = DateUtil.between(entity.getErrorDateTime(), entity.getGoOffDateTime(), DateUnit.MINUTE, false);
if (tempEarly > 0L) {
earlyMinList.add(tempEarly);
}
}
}
if (between > 0) {
//跨天 2024-07-01---2024-07-03
// 判断当前异常日期是否在请假全天,
long betweened = DateUtil.between(DateUtil.parseDate(DateUtil.formatDate(entity.getErrorDateTime())), leaveRecord.getEndTime(), DateUnit.DAY);
if (betweened == 0) {
//异常日期在请假的最后一天,计算早退与请假的开始时间的差值 todo
int compare = DateUtil.compare(entity.getErrorDateTime(), leaveRecord.getEndTime());
}
}
}
if (!ObjectUtils.isEmpty(earlyMinList)) {
//去列表中最小值赋值给earlyMin
earlyMin = earlyMinList.stream().min(Comparator.comparing(x -> x)).orElse(0L);
} else {
//请假不满足条件
earlyMin = DateUtil.between(entity.getErrorDateTime(), entity.getGoOffDateTime(), DateUnit.MINUTE);
}
} else {
//判断时间差定义 //判断时间差定义
Long earlyMin = DateUtil.between(entity.getErrorDateTime(), entity.getGoOffDateTime(), DateUnit.MINUTE); earlyMin = DateUtil.between(entity.getErrorDateTime(), entity.getGoOffDateTime(), DateUnit.MINUTE);
}
if (earlyMin >= 0L && earlyMin < 5L) { if (earlyMin >= 0L && earlyMin < 5L) {
//早退5分钟内 //早退5分钟内
...@@ -331,13 +420,23 @@ public class AttendanceRecordErrorServiceImpl extends AbstractCRUDServiceImpl<At ...@@ -331,13 +420,23 @@ public class AttendanceRecordErrorServiceImpl extends AbstractCRUDServiceImpl<At
//早退5分钟内 //早退5分钟内
ruleCode = "ATTEND1006"; ruleCode = "ATTEND1006";
} }
} else { } else {
ruleCode = "ATTEND1002"; ruleCode = "ATTEND1002";
} }
} else if (ErrorStatusEnum.迟到.getValue() == DataUtil.converStr2Int(entity.getProcessResult(), 3)) { } else if (ErrorStatusEnum.迟到.getValue() == DataUtil.converStr2Int(entity.getProcessResult(), 3)) {
if (!ObjectUtils.isEmpty(entity.getErrorDateTime()) && !ObjectUtils.isEmpty(entity.getGoOffDateTime())) { if (!ObjectUtils.isEmpty(entity.getErrorDateTime()) && !ObjectUtils.isEmpty(entity.getGoOffDateTime())) {
Long lateMin = DateUtil.between(entity.getErrorDateTime(), entity.getGoOffDateTime(), DateUnit.MINUTE); //判断如果有请假记录记录。这计算早退时间与请假记录开始时间的差值
Long lateMin = 0L;
if (isLeave) {
}
lateMin = DateUtil.between(entity.getErrorDateTime(), entity.getGoOffDateTime(), DateUnit.MINUTE);
if (lateMin >= 0L && lateMin < 5L) { if (lateMin >= 0L && lateMin < 5L) {
//迟到5分钟内 //迟到5分钟内
ruleCode = "ATTEND1001"; ruleCode = "ATTEND1001";
...@@ -363,4 +462,13 @@ public class AttendanceRecordErrorServiceImpl extends AbstractCRUDServiceImpl<At ...@@ -363,4 +462,13 @@ public class AttendanceRecordErrorServiceImpl extends AbstractCRUDServiceImpl<At
} }
return ruleCode; return ruleCode;
} }
public static void main(String[] args) {
long compare = DateUtil.compare(DateUtil.parseDateTime("2024-07-01 15:00:00"), DateUtil.parseDateTime("2024-07-01 16:00:00"));
long between = DateUtil.between(DateUtil.parseDateTime("2024-07-01 15:00:00"), DateUtil.parseDateTime("2024-07-01 16:00:00"), DateUnit.MINUTE, false);
System.out.println(compare);
System.out.println(between);
}
} }
\ No newline at end of file
...@@ -326,13 +326,11 @@ public class FixWorkOtherAttendance extends AttendanceWorkAbstract { ...@@ -326,13 +326,11 @@ public class FixWorkOtherAttendance extends AttendanceWorkAbstract {
Iterator<AttendanceRecordDetailEntity> iterator = commonData.getDetailEntityList().iterator(); Iterator<AttendanceRecordDetailEntity> iterator = commonData.getDetailEntityList().iterator();
while (iterator.hasNext()) { while (iterator.hasNext()) {
AttendanceRecordDetailEntity next = iterator.next(); AttendanceRecordDetailEntity next = iterator.next();
if (next.getGoWorkResult() == GoWorkResultEnum.缺卡.getValue()) { if (next.getGoWorkResult() == GoWorkResultEnum.缺卡.getValue()) {
if (DateUtil.compare(new Date(), next.getGoWorkDate()) < 0) { if (DateUtil.compare(new Date(), next.getGoWorkDate()) < 0) {
iterator.remove(); iterator.remove();
} }
} }
if (next.getOffWorkResult() == OffWorkResultEnum.缺卡.getValue()) { if (next.getOffWorkResult() == OffWorkResultEnum.缺卡.getValue()) {
if (DateUtil.compare(new Date(), next.getOffWorkDate()) < 0) { if (DateUtil.compare(new Date(), next.getOffWorkDate()) < 0) {
next.setOffWorkDate(null); next.setOffWorkDate(null);
...@@ -344,6 +342,7 @@ public class FixWorkOtherAttendance extends AttendanceWorkAbstract { ...@@ -344,6 +342,7 @@ 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()); AttendanceClassDetailEntity attendanceClassDetailEntity = classDetailEntityMap.get(commonData.getDetailEntityList().get(0).getShiftsId());
commonData.getAttendanceRecordEntity().setClassId(attendanceClassDetailEntity == null ? 0L : attendanceClassDetailEntity.getClassId()); commonData.getAttendanceRecordEntity().setClassId(attendanceClassDetailEntity == null ? 0L : attendanceClassDetailEntity.getClassId());
commonData.getAttendanceRecordEntity().setClassName(attendanceClassDetailEntity == null ? "" : attendanceClassDetailEntity.getClassName()); commonData.getAttendanceRecordEntity().setClassName(attendanceClassDetailEntity == null ? "" : attendanceClassDetailEntity.getClassName());
} }
...@@ -398,12 +397,24 @@ public class FixWorkOtherAttendance extends AttendanceWorkAbstract { ...@@ -398,12 +397,24 @@ public class FixWorkOtherAttendance extends AttendanceWorkAbstract {
Integer offWorkResult = detail.getOffWorkResult(); Integer offWorkResult = detail.getOffWorkResult();
Date goWorkDate = detail.getGoWorkDate(); Date goWorkDate = detail.getGoWorkDate();
Date offWorkDate = detail.getOffWorkDate(); Date offWorkDate = detail.getOffWorkDate();
AttendanceClassDetailEntity attendanceClassDetailEntity = classDetailEntityMap.get(detail.getShiftsId());
if (GoWorkResultEnum.请假.getValue() < goWorkResult) { if (GoWorkResultEnum.请假.getValue() < goWorkResult) {
//判断 异常记录是否在请假时间段内 //判断 异常记录是否在请假时间段内 如果缺卡是没有goWorkDate的
// DateUtil.between()
if (ObjectUtils.isEmpty(goWorkDate)) { if (ObjectUtils.isEmpty(goWorkDate)) {
//goWorkDate为空 缺卡状态
Date goWorkDate1 = attendanceClassDetailEntity.getGoWorkDate();
//判断请假区间是否在上班区间内 如果在 则设置为请假 格式化时间范围
DateUtil.parse(DateUtil.format(startLeaveTime, "HH:mm:ss"),"HH:mm:ss") ;
DateUtil.parse(DateUtil.format(endLeaveTime, "HH:mm:ss"),"HH:mm:ss") ;
//DateUtil.
boolean in = DateUtil.isIn(goWorkDate1, DateUtil.parse(DateUtil.format(startLeaveTime, "HH:mm:ss"), "HH:mm:ss"),
DateUtil.parse(DateUtil.format(endLeaveTime, "HH:mm:ss"), "HH:mm:ss"));
if(in){
detail.setGoWorkResult(GoWorkResultEnum.请假.getValue()); detail.setGoWorkResult(GoWorkResultEnum.请假.getValue());
}
} else { } else {
boolean in = DateUtil.isIn(goWorkDate, startLeaveTime, endLeaveTime); boolean in = DateUtil.isIn(goWorkDate, startLeaveTime, endLeaveTime);
if (in) { if (in) {
...@@ -416,7 +427,12 @@ public class FixWorkOtherAttendance extends AttendanceWorkAbstract { ...@@ -416,7 +427,12 @@ public class FixWorkOtherAttendance extends AttendanceWorkAbstract {
//判断 异常记录是否在请假时间段内 //判断 异常记录是否在请假时间段内
// DateUtil.between() // DateUtil.between()
if (ObjectUtils.isEmpty(offWorkDate)) { if (ObjectUtils.isEmpty(offWorkDate)) {
Date offWorkDate1 = attendanceClassDetailEntity.getOffWorkDate();
boolean in = DateUtil.isIn(offWorkDate1, DateUtil.parse(DateUtil.format(startLeaveTime, "HH:mm:ss"), "HH:mm:ss"),
DateUtil.parse(DateUtil.format(endLeaveTime, "HH:mm:ss"), "HH:mm:ss"));
if (in) {
detail.setOffWorkResult(GoWorkResultEnum.请假.getValue()); detail.setOffWorkResult(GoWorkResultEnum.请假.getValue());
}
} else { } else {
boolean in = DateUtil.isIn(offWorkDate, startLeaveTime, endLeaveTime); boolean in = DateUtil.isIn(offWorkDate, startLeaveTime, endLeaveTime);
if (in) { if (in) {
......
...@@ -37,8 +37,8 @@ POST {{baseUrl}}/attendance/record/hik/addAttendanceRecord ...@@ -37,8 +37,8 @@ POST {{baseUrl}}/attendance/record/hik/addAttendanceRecord
Content-Type: application/json Content-Type: application/json
{ {
"attendanceDateStart": "2024-08-01", "attendanceDateStart": "2024-07-01",
"attendanceDateEnd": "2024-08-15" "attendanceDateEnd": "2024-07-01"
} }
###海康考勤打卡记录计算1 ###海康考勤打卡记录计算1
...@@ -46,9 +46,9 @@ POST {{baseUrl}}/attendance/record/hik/addAttendanceRecord ...@@ -46,9 +46,9 @@ POST {{baseUrl}}/attendance/record/hik/addAttendanceRecord
Content-Type: application/json Content-Type: application/json
{ {
"attendanceDateStart": "2024-06-01", "attendanceDateStart": "2024-07-01",
"attendanceDateEnd": "2024-06-31", "attendanceDateEnd": "2024-07-01",
"staffIdList": [484,234,584,507,561,346,349,196,482,447] "staffId": 476
} }
......
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