From 9f12a57b261ca08145b3d20dbf4d8a1fc53df72b Mon Sep 17 00:00:00 2001 From: Joshi <3040996759@qq.com> Date: Thu, 14 May 2026 17:41:04 +0800 Subject: [PATCH] =?UTF-8?q?feat(wms):=20=E6=B7=BB=E5=8A=A0=E5=80=92?= =?UTF-8?q?=E7=8F=AD=E8=B7=A8=E5=A4=A9=E8=80=83=E5=8B=A4=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E5=A4=84=E7=90=86=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 isBackwardCrossDay 方法判断倒班跨天情况 - 修改 sliceRecordsForDay 方法支持 backward 参数 - 更新 buildCheck 方法传递 crossDay 参数 - 实现倒班跨天情况下调整考勤时间窗口逻辑 - 优化跨天班次的时间范围计算规则 --- .../impl/WmsAttendanceCheckServiceImpl.java | 25 +++++++++++++------ 1 file changed, 18 insertions(+), 7 deletions(-) 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) {