diff --git a/klp-wms/src/main/java/com/klp/service/impl/WmsAttendanceCheckServiceImpl.java b/klp-wms/src/main/java/com/klp/service/impl/WmsAttendanceCheckServiceImpl.java index 45b4179d..9bd57956 100644 --- a/klp-wms/src/main/java/com/klp/service/impl/WmsAttendanceCheckServiceImpl.java +++ b/klp-wms/src/main/java/com/klp/service/impl/WmsAttendanceCheckServiceImpl.java @@ -130,11 +130,12 @@ public class WmsAttendanceCheckServiceImpl implements IWmsAttendanceCheckService List checksToInsert = new ArrayList<>(toProcess.size()); for (WmsAttendanceScheduleVo schedule : toProcess) { boolean crossDay = isCrossDayShift(schedule); + boolean backward = isBackwardCrossDay(schedule); List records = sliceRecordsForDay( recordsByEmployee.get(schedule.getEmployeeName()), schedule.getWorkDate(), - crossDay); - checksToInsert.add(buildCheck(schedule, rule, records)); + crossDay, backward); + checksToInsert.add(buildCheck(schedule, rule, records, crossDay)); } baseMapper.insertBatch(checksToInsert, BATCH_SIZE); @@ -146,6 +147,12 @@ public class WmsAttendanceCheckServiceImpl implements IWmsAttendanceCheckService return schedule.getShiftIsCrossDay() != null && schedule.getShiftIsCrossDay() == 1; } + private boolean isBackwardCrossDay(WmsAttendanceScheduleVo schedule) { + if (!isCrossDayShift(schedule)) return false; + if (schedule.getShiftStartTime() == null || schedule.getShiftEndTime() == null) return false; + return toLocalTime(schedule.getShiftStartTime()).getHour() >= 16; + } + private WmsAttendanceRule getActiveRule() { LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); wrapper.eq(WmsAttendanceRule::getDelFlag, 0); @@ -207,13 +214,13 @@ public class WmsAttendanceCheckServiceImpl implements IWmsAttendanceCheckService /** * 与原先 {@code getRecords(ename, workDate, crossDay)} 的时间窗口一致。 */ - private List sliceRecordsForDay(List prefetched, Date workDate, boolean crossDay) { + private List sliceRecordsForDay(List prefetched, Date workDate, boolean crossDay, boolean backward) { if (prefetched == null || prefetched.isEmpty()) { return new ArrayList<>(); } LocalDate ld = toLocalDate(workDate); LocalDateTime rangeStart = ld.atStartOfDay(); - LocalDateTime rangeEnd = crossDay + LocalDateTime rangeEnd = crossDay && !backward ? ld.plusDays(1).atTime(LocalTime.of(23, 59, 59)) : ld.atTime(LocalTime.of(23, 59, 59)); return prefetched.stream() @@ -238,7 +245,7 @@ public class WmsAttendanceCheckServiceImpl implements IWmsAttendanceCheckService } private WmsAttendanceCheck buildCheck(WmsAttendanceScheduleVo schedule, WmsAttendanceRule rule, - List records) { + List records, boolean crossDay) { WmsAttendanceCheck check = new WmsAttendanceCheck(); check.setScheduleId(schedule.getScheduleId()); check.setUserId(schedule.getUserId()); @@ -249,7 +256,6 @@ public class WmsAttendanceCheckServiceImpl implements IWmsAttendanceCheckService check.setShiftType(schedule.getShiftType()); boolean hasPeriod2 = schedule.getShiftStartTime2() != null && schedule.getShiftEndTime2() != null; - boolean crossDay = isCrossDayShift(schedule); if (records.isEmpty()) { check.setOverallStatus("absent_full"); @@ -303,7 +309,12 @@ public class WmsAttendanceCheckServiceImpl implements IWmsAttendanceCheckService LocalDateTime windowStart; LocalDateTime windowEnd; - if (crossDay) { + boolean backward = st != null && et != null && st.getHour() >= 16 && crossDay; + + if (crossDay && backward) { + windowStart = LocalDateTime.of(ld, et).minusHours(2); + windowEnd = LocalDateTime.of(ld, et).plusHours(2); + } else if (crossDay) { windowStart = LocalDateTime.of(ld, st).minusHours(2); windowEnd = LocalDateTime.of(ld.plusDays(1), et).plusHours(2); } else if (st != null && et != null) {