feat(wms): 实现考勤检查中的跨天班次时间处理功能
- 添加了跨天班次的时间组合逻辑,支持多时段考勤计算 - 实现了向前和向后跨天的时间处理方法 - 重构了考勤时间段设置,区分单时段和多时段场景 - 新增了时间合并工具方法,处理工作日期与班次时间的组合 - 优化了考勤记录过滤和检查逻辑,提升跨天场景准确性
This commit is contained in:
@@ -265,6 +265,22 @@ public class WmsAttendanceCheckServiceImpl implements IWmsAttendanceCheckService
|
||||
|
||||
boolean hasPeriod2 = schedule.getShiftStartTime2() != null && schedule.getShiftEndTime2() != null;
|
||||
|
||||
boolean backward = isBackwardCrossDay(schedule);
|
||||
|
||||
if (hasPeriod2) {
|
||||
check.setP1StartTime(combineTime(schedule.getWorkDate(), schedule.getShiftStartTime()));
|
||||
check.setP1EndTime(combineTime(schedule.getWorkDate(), schedule.getShiftEndTime()));
|
||||
check.setP2StartTime(combineTime(schedule.getWorkDate(), schedule.getShiftStartTime2()));
|
||||
check.setP2EndTime(combineTime(schedule.getWorkDate(), schedule.getShiftEndTime2()));
|
||||
} else {
|
||||
check.setP1StartTime(crossDay && backward
|
||||
? combinePrevDay(schedule.getWorkDate(), schedule.getShiftStartTime())
|
||||
: combineTime(schedule.getWorkDate(), schedule.getShiftStartTime()));
|
||||
check.setP1EndTime(crossDay && !backward
|
||||
? combineNextDay(schedule.getWorkDate(), schedule.getShiftEndTime())
|
||||
: combineTime(schedule.getWorkDate(), schedule.getShiftEndTime()));
|
||||
}
|
||||
|
||||
if (records.isEmpty()) {
|
||||
check.setOverallStatus("absent_full");
|
||||
check.setAbsentType("full_day");
|
||||
@@ -289,18 +305,11 @@ public class WmsAttendanceCheckServiceImpl implements IWmsAttendanceCheckService
|
||||
}
|
||||
}
|
||||
|
||||
check.setP1StartTime(schedule.getShiftStartTime());
|
||||
check.setP1EndTime(schedule.getShiftEndTime());
|
||||
checkPeriod(check, rule, 1, p1Records, schedule.getShiftStartTime(), schedule.getShiftEndTime());
|
||||
|
||||
check.setP2StartTime(schedule.getShiftStartTime2());
|
||||
check.setP2EndTime(schedule.getShiftEndTime2());
|
||||
checkPeriod(check, rule, 2, p2Records, schedule.getShiftStartTime2(), schedule.getShiftEndTime2());
|
||||
} else {
|
||||
List<AttendanceRecords> filtered = filterWindow(records, schedule.getWorkDate(),
|
||||
schedule.getShiftStartTime(), schedule.getShiftEndTime(), crossDay);
|
||||
check.setP1StartTime(schedule.getShiftStartTime());
|
||||
check.setP1EndTime(schedule.getShiftEndTime());
|
||||
checkPeriod(check, rule, 1, filtered, schedule.getShiftStartTime(), schedule.getShiftEndTime());
|
||||
}
|
||||
|
||||
@@ -551,4 +560,25 @@ public class WmsAttendanceCheckServiceImpl implements IWmsAttendanceCheckService
|
||||
private static Date toDate(LocalDateTime ldt) {
|
||||
return Date.from(ldt.atZone(ZoneId.systemDefault()).toInstant());
|
||||
}
|
||||
|
||||
private static Date combineTime(Date workDate, Date shiftTime) {
|
||||
if (workDate == null || shiftTime == null) return null;
|
||||
LocalDate ld = toLocalDate(workDate);
|
||||
LocalTime lt = toLocalTime(shiftTime);
|
||||
return toDate(LocalDateTime.of(ld, lt));
|
||||
}
|
||||
|
||||
private static Date combineNextDay(Date workDate, Date shiftTime) {
|
||||
if (workDate == null || shiftTime == null) return null;
|
||||
LocalDate ld = toLocalDate(workDate).plusDays(1);
|
||||
LocalTime lt = toLocalTime(shiftTime);
|
||||
return toDate(LocalDateTime.of(ld, lt));
|
||||
}
|
||||
|
||||
private static Date combinePrevDay(Date workDate, Date shiftTime) {
|
||||
if (workDate == null || shiftTime == null) return null;
|
||||
LocalDate ld = toLocalDate(workDate).minusDays(1);
|
||||
LocalTime lt = toLocalTime(shiftTime);
|
||||
return toDate(LocalDateTime.of(ld, lt));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user