Przeglądaj źródła

fix(workhours): 修复审批通过后提交工时缺失

malk 3 tygodni temu
rodzic
commit
a4862b2e3b

+ 23 - 3
mjava-akdsbeisen/src/main/java/com/malk/service/workhours/ApprovalWriteBackService.java

@@ -28,7 +28,7 @@ import java.util.concurrent.atomic.AtomicInteger;
  * 工时审批含两个明细子表(项目/非项目工时),其他工时审批含一个明细子表。
  * 明细按「填报人 + 工时日期(天) + 项目编号/Activity」1:1 对应工时汇总表(人+天一条)里的子表行:
  * - 拒绝 → 对应子表行「已提交工时」置 0
- * - 同意 → 对应子表行「已审批工时」= 该明细工时
+ * - 同意 → 对应子表行「已审批工时」= 该明细工时,且「已提交工时」不得低于已审批工时
  * 主表合计按子表行重算(幂等,撤销/重发不翻倍)。
  * <p>
  * 设计文档:后端/阿科德斯/审批结果回写工时汇总表/02-程序实现与接口.md
@@ -489,11 +489,13 @@ public class ApprovalWriteBackService {
                     log.warn("[审批回写] 子表行未匹配 cat={} key={} userId={} day={}", cat, dr.key, userId, dayText);
                     continue;
                 }
+                double submittedBefore = num(target, submittedField);
                 if (dr.approve) {
                     target.put(approvedField, dr.hours);
-                } else {
-                    target.put(submittedField, 0);
                 }
+                // fixme 拒绝仍清零;同意时兜底恢复已提交,避免补发审批只写 approved 后形成 submitted=0。
+                target.put(submittedField, resolveSubmittedAfterWriteBack(
+                        dr.approve, submittedBefore, dr.hours));
                 updated++;
             }
 
@@ -569,6 +571,24 @@ public class ApprovalWriteBackService {
         return "暂存";
     }
 
+    /**
+     * 计算审批回写后的已提交工时。
+     *
+     * @param approve 是否审批同意
+     * @param currentSubmitted 当前已提交工时
+     * @param approvedHours 本次审批明细工时
+     * @return 拒绝时为 0;同意时不低于本次审批工时且不降低当前已提交值
+     */
+    static double resolveSubmittedAfterWriteBack(
+            boolean approve,
+            double currentSubmitted,
+            double approvedHours) {
+        if (!approve) {
+            return 0d;
+        }
+        return Math.max(currentSubmitted, approvedHours);
+    }
+
     /**
      * 加载审批单某类别明细(内联子表优先,必要时递归取全)
      */

+ 18 - 0
mjava-akdsbeisen/src/test/java/com/malk/service/workhours/ApprovalWriteBackServiceTest.java

@@ -30,6 +30,24 @@ class ApprovalWriteBackServiceTest {
         assertEquals("暂存", ApprovalWriteBackService.resolveSummaryApprovalStatus(0, 0));
     }
 
+    @Test
+    void shouldRestoreSubmittedHoursWhenApprovalCompletes() {
+        assertEquals(8.0,
+                ApprovalWriteBackService.resolveSubmittedAfterWriteBack(true, 0, 8));
+    }
+
+    @Test
+    void shouldKeepLargerSubmittedHoursWhenApprovalCompletes() {
+        assertEquals(12.0,
+                ApprovalWriteBackService.resolveSubmittedAfterWriteBack(true, 12, 8));
+    }
+
+    @Test
+    void shouldClearSubmittedHoursWhenApprovalIsRejected() {
+        assertEquals(0.0,
+                ApprovalWriteBackService.resolveSubmittedAfterWriteBack(false, 8, 8));
+    }
+
     @Test
     void shouldFallBackToWholeApprovalWhenHistoricalDetailOpinionIsBlank() {
         assertEquals(true, ApprovalWriteBackService.isDetailApproved(true, ""));