From 7f4ce79b0c1bf9ffcfe79af17eb041438253b21d Mon Sep 17 00:00:00 2001 From: Joshi <3040996759@qq.com> Date: Fri, 15 May 2026 17:05:10 +0800 Subject: [PATCH] =?UTF-8?q?feat(wms):=20=E5=AE=9E=E7=8E=B0=E8=80=83?= =?UTF-8?q?=E5=8B=A4=E6=A3=80=E6=9F=A5=E4=B8=AD=E7=9A=84=E8=B7=A8=E5=A4=A9?= =?UTF-8?q?=E7=8F=AD=E6=AC=A1=E6=97=B6=E9=97=B4=E5=A4=84=E7=90=86=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加了跨天班次的时间组合逻辑,支持多时段考勤计算 - 实现了向前和向后跨天的时间处理方法 - 重构了考勤时间段设置,区分单时段和多时段场景 - 新增了时间合并工具方法,处理工作日期与班次时间的组合 - 优化了考勤记录过滤和检查逻辑,提升跨天场景准确性 --- .../impl/WmsAttendanceCheckServiceImpl.java | 44 ++++++++++++++++--- 1 file changed, 37 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 c69278a3..33a4673f 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 @@ -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 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)); + } }