Explorar el Código

test(workhours): 锁定离职日期过滤边界

malk hace 3 semanas
padre
commit
f2b2827d9b

+ 8 - 3
mjava-akdsbeisen/src/main/java/com/malk/service/workhours/WorkHoursCalcService.java

@@ -212,7 +212,7 @@ public class WorkHoursCalcService {
 
         // 离职时间: workDay > offlineDate 直接跳过验证
         LocalDate offlineDate = parseToLocalDate(info.get(PERSONNEL_OFFLINE_DATE));
-        if (offlineDate != null && workDay.isAfter(offlineDate)) {
+        if (isAfterOfflineDate(workDay, offlineDate)) {
             result.put("success", false);
             result.put("error", "员工已离职(offlineDate=" + offlineDate + "), 按业务规则跳过写入");
             return result;
@@ -789,6 +789,11 @@ public class WorkHoursCalcService {
         return sa.equals(sb);
     }
 
+    /** 离职日当天保留,仅离职日之后的日期视为无效。 */
+    static boolean isAfterOfflineDate(LocalDate workDay, LocalDate offlineDate) {
+        return workDay != null && offlineDate != null && workDay.isAfter(offlineDate);
+    }
+
     // ==================== 多线程并发写入 ====================
 
     /**
@@ -849,7 +854,7 @@ public class WorkHoursCalcService {
                             skippedExisting.incrementAndGet();
                             continue;
                         }
-                        if (offlineDate != null && workDay.isAfter(offlineDate)) {
+                        if (isAfterOfflineDate(workDay, offlineDate)) {
                             skippedOffline.incrementAndGet();
                             continue;
                         }
@@ -1001,7 +1006,7 @@ public class WorkHoursCalcService {
                     LocalDate workDay = parseToLocalDate(formData.get("dateField_mmd8onl5"));
                     // 离职日之后的历史工时全删 (与 concurrentUpsert 的 offline 过滤逻辑对齐);
                     // 离职日当天及之前保留 (员工在职期间工时有效, 不动)
-                    if (workDay != null && workDay.isAfter(offlineDate)) {
+                    if (isAfterOfflineDate(workDay, offlineDate)) {
                         toDelete.add(String.valueOf(instId));
                         if (samples.size() < 5) {
                             Map<String, Object> s = new LinkedHashMap<>();

+ 9 - 0
mjava-akdsbeisen/src/test/java/com/malk/service/workhours/WorkHoursCalcServiceTest.java

@@ -57,6 +57,15 @@ public class WorkHoursCalcServiceTest {
         assertEquals("workDay 在 today 之后, 按业务规则不写入未来数据", result.get("error"));
     }
 
+    @Test
+    public void isAfterOfflineDateShouldKeepOfflineDayAndRejectFollowingDay() {
+        LocalDate offlineDate = LocalDate.of(2026, 7, 15);
+
+        assertFalse(WorkHoursCalcService.isAfterOfflineDate(offlineDate, offlineDate));
+        assertEquals(true, WorkHoursCalcService.isAfterOfflineDate(offlineDate.plusDays(1), offlineDate));
+        assertFalse(WorkHoursCalcService.isAfterOfflineDate(offlineDate.plusDays(1), null));
+    }
+
     @Test
     public void cleanupFutureHoursDryRunShouldReportFutureRecordsWithoutDeleting() {
         YDClient ydClient = mock(YDClient.class);