feat(wms): 实现考勤检查中的跨天班次时间处理功能

- 添加了跨天班次的时间组合逻辑,支持多时段考勤计算
- 实现了向前和向后跨天的时间处理方法
- 重构了考勤时间段设置,区分单时段和多时段场景
- 新增了时间合并工具方法,处理工作日期与班次时间的组合
- 优化了考勤记录过滤和检查逻辑,提升跨天场景准确性
This commit is contained in:
2026-05-15 17:05:10 +08:00
parent e938515efb
commit 7f4ce79b0c

View File

@@ -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));
}
}