Explorar el Código

fix(timecard): 按有效审批工时校验补填

malk hace 1 semana
padre
commit
2d02a5ae76

+ 12 - 1
mjava-akdsbeisen/src/main/java/com/malk/service/workhours/TimeCardRepairService.java

@@ -427,7 +427,18 @@ public class TimeCardRepairService {
 
     private void assertSourceDateAvailable(String userId, String day) {
         List<Map> original = query(whConf.getFormUuidWorkHoursSummary(), mapOf(R_SUBMITTER, userId, R_DAY, day));
-        McException.assertAccessException(original.size() > 0, "来源日期已有原工时记录,不能补填 userId=" + userId + ", day=" + day);
+        boolean hasApprovedOrChangedHours = original.stream()
+                .anyMatch(TimeCardRepairService::hasApprovedOrChangedHours);
+        McException.assertAccessException(hasApprovedOrChangedHours,
+                "来源日期已有已审批或变更工时,不能补填 userId=" + userId + ", day=" + day);
+    }
+
+    /** 仅原汇总当天已审批与变更工时的实际合计大于 0 时禁止补填;暂存草稿不占用补填资格。 */
+    static boolean hasApprovedOrChangedHours(Map record) {
+        Object nested = record == null ? null : record.get("formData");
+        Map formData = nested instanceof Map ? (Map) nested : record;
+        if (formData == null) return false;
+        return num(formData.get(R_DAILY_APPROVED)) + num(formData.get(R_DAILY_CHANGE)) > 1e-6;
     }
 
     private void assertRepairRowMutable(String userId, String day, Map row, String category) {

+ 40 - 0
mjava-akdsbeisen/src/test/java/com/malk/service/workhours/TimeCardRepairServiceTest.java

@@ -0,0 +1,40 @@
+package com.malk.service.workhours;
+
+import org.junit.jupiter.api.Test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+class TimeCardRepairServiceTest {
+
+    @Test
+    void shouldAllowRepairWhenOriginalSummaryOnlyHasDraftHours() {
+        Map<String, Object> formData = new HashMap<>();
+        formData.put("numberField_mmd1smel", 8d);
+        Map<String, Object> record = new HashMap<>();
+        record.put("formData", formData);
+
+        assertFalse(TimeCardRepairService.hasApprovedOrChangedHours(record));
+    }
+
+    @Test
+    void shouldBlockRepairWhenApprovedAndChangedHoursRemain() {
+        Map<String, Object> formData = new HashMap<>();
+        formData.put("numberField_mmeakgi4", 8d);
+        formData.put("numberField_mmeakgi5", -2d);
+
+        assertTrue(TimeCardRepairService.hasApprovedOrChangedHours(formData));
+    }
+
+    @Test
+    void shouldAllowRepairWhenChangeFullyOffsetsApprovedHours() {
+        Map<String, Object> formData = new HashMap<>();
+        formData.put("numberField_mmeakgi4", 8d);
+        formData.put("numberField_mmeakgi5", -8d);
+
+        assertFalse(TimeCardRepairService.hasApprovedOrChangedHours(formData));
+    }
+}