From 603853a1290e7d71297c9ce5b64181a090adab87 Mon Sep 17 00:00:00 2001
From: zhizhijie <zhizhijie@users.noreply.gitee.com>
Date: 星期二, 08 九月 2026 17:44:50 +0800
Subject: [PATCH] docs: 09-08 工作日结补记下班前状态(最新代码已重启就绪,明日待办8月填值/9月整链/临时文件清理)

---
 traffic-audit-server/src/main/java/com/trafficaudit/auditengine/service/AuditEngineService.java |   58 +++++++++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 43 insertions(+), 15 deletions(-)

diff --git a/traffic-audit-server/src/main/java/com/trafficaudit/auditengine/service/AuditEngineService.java b/traffic-audit-server/src/main/java/com/trafficaudit/auditengine/service/AuditEngineService.java
index 29bffc1..799c2fc 100644
--- a/traffic-audit-server/src/main/java/com/trafficaudit/auditengine/service/AuditEngineService.java
+++ b/traffic-audit-server/src/main/java/com/trafficaudit/auditengine/service/AuditEngineService.java
@@ -631,6 +631,8 @@
                     .eq(InvestmentSystem::getReportPeriod, reportPeriod))) {
             sysMap.computeIfAbsent(normInvestName(s.getProjectName()), k -> new ArrayList<>()).add(s);
         }
+        // 鍚屾姤琛ㄦ湡鎶曡祫绯荤粺鍩哄噯鏁存湡缂哄け鏃讹紝涓嶅仛"椤圭洰缂哄け鏍稿疄"锛堢己澶�=鍩哄噯鏈鍏ワ紝涓嶇瓑浜庨」鐩笉瀛樺湪锛夛紝閬垮厤鏁磋〃璇姤
+        boolean benchmarkMissing = sysMap.isEmpty();
 
         // 骞傜瓑锛氬彧娓呴櫎 INVEST 瑙勫垯鐨勬棫瀹℃牳缁撴灉
         List<Long> ruleIds = new ArrayList<>();
@@ -647,6 +649,7 @@
             String projectName = project == null ? "鏈煡椤圭洰" : project.getProjectName();
             InvestmentSystem sys = findInvestSystem(sysMap, projectName);
             for (AuditRule rule : rules) {
+                if (benchmarkMissing && "EXISTENCE_SYS".equals(rule.getCompareType())) continue;
                 AuditResult result = checkInvestRule(rule, monthly, projectName, sys);
                 if (result != null) {
                     result.setRuleName(rule.getRuleName());
@@ -1538,6 +1541,7 @@
             case "RULE_I001":
             case "RULE_I002":
             case "RULE_I003":
+            case "RULE_I004":
                 return investSystemMapper.selectCount(new LambdaQueryWrapper<InvestmentSystem>()
                     .eq(InvestmentSystem::getReportPeriod, period)) == 0;
             default:
@@ -1641,26 +1645,34 @@
         return null;
     }
 
-    /** 璐ц繍绫诲瀷鐜瘮锛氭湰鏈堟柊澧烇紙涓婃湀涓�0銆佹湰鏈�>0锛夐渶鏍稿疄锛屽皯鐨勪笉绠� */
+    /** 璐ц繍绫诲瀷鐜瘮锛圧ULE_004锛夛細涓婃湀鏃犫啋鏈湀鏂板 鎴� 涓婃湀鏈夆啋鏈湀鏃狅紝鍧囨彁閱掓牳瀹� */
     private AuditResult checkMom(AuditRule rule, H2032EnterpriseMonthly report,
                                  Map<String, H2032EnterpriseMonthly> lastMonthMap) {
         H2032EnterpriseMonthly lastMonth = lastMonthMap.get(key(report.getEnterpriseCode()));
         if (lastMonth == null) return null;
-        List<String> hits = new ArrayList<>();
+        List<String> addHits = new ArrayList<>();
+        List<String> delHits = new ArrayList<>();
         for (String field : rule.getCheckField().split(",")) {
             double current = getH2032FieldValue(report, field);
             double last = getH2032FieldValue(lastMonth, field);
             if (current > 0 && last == 0) {
-                hits.add(h2032FieldLabel(field) + "=" + fmt(current));
+                addHits.add(h2032FieldLabel(field) + "=" + fmt(current));
+            } else if (last > 0 && current == 0) {
+                delHits.add(h2032FieldLabel(field) + "锛堜笂鏈�=" + fmt(last) + "锛屾湰鏈堟棤锛�");
             }
         }
-        if (!hits.isEmpty()) {
-            return buildResult(rule, report, "鏈湀鏂板: " + String.join("銆�", hits),
-                "涓婃湀璇ョ被鍨嬩负0", "鏈湀鏂板璐ц繍绫诲瀷锛堜笂鏈堟棤锛�");
+        if (!addHits.isEmpty() || !delHits.isEmpty()) {
+            StringBuilder msg = new StringBuilder();
+            if (!addHits.isEmpty()) msg.append("鏈湀鏂板: ").append(String.join("銆�", addHits));
+            if (!delHits.isEmpty()) {
+                if (msg.length() > 0) msg.append("锛�");
+                msg.append("鏈湀娑堝け: ").append(String.join("銆�", delHits));
+            }
+            return buildResult(rule, report, msg.toString(),
+                "涓婃湀鏃犫啋鏈湀鏂板 鎴� 涓婃湀鏈夆啋鏈湀鏃�", "璐ц繍绫诲瀷鐜瘮鏂板/娑堝け闇�鏍稿疄");
         }
         return null;
     }
-
     /** 鏈夎揣杩愰噺浣嗗搴旇溅杈嗕负0 闇�鏍稿疄锛堝 鏈夐泦瑁呯璐ц繍閲忔棤闆嗚绠辫溅杈嗭級 */
     private AuditResult checkNull(AuditRule rule, H2032EnterpriseMonthly report) {
         String[] fields = rule.getCheckField().split(",");
@@ -1675,15 +1687,29 @@
         return null;
     }
 
-    /** 鏁板�艰寖鍥存鏌ワ紙濡� 鏁磋溅鍚ㄤ綅 4鈮や笖鈮�40锛� */
+    /** 鏁板�艰寖鍥存鏌ワ紱鏁磋溅鍚ㄤ綅鎸夆�滃钩鍧囧惃浣�=鏁磋溅鍚ㄤ綅/鏁磋溅鏁扳�濆彛寰勫垽瀹� 4~40 */
     private AuditResult checkOutRange(AuditRule rule, H2032EnterpriseMonthly report) {
         String[] bounds = rule.getThreshold().split(",");
         if (bounds.length < 2) return null;
-        double value = getH2032FieldValue(report, rule.getCheckField());
+        String field = rule.getCheckField();
+        String label = h2032FieldLabel(field);
+        double value;
+        if ("tonsWhole".equals(field)) {
+            double vehicles = report.getVehicleWhole() == null ? 0.0 : report.getVehicleWhole().doubleValue();
+            double tons = nvl(report.getTonsWhole());
+            if (vehicles > 0) {
+                value = tons / vehicles;
+                label = "鏁磋溅骞冲潎鍚ㄤ綅(鏁磋溅鍚ㄤ綅/鏁磋溅鏁�)";
+            } else {
+                value = tons; // 鏃犳暣杞︽暟浣嗘湁鍚ㄤ綅鏃朵粛鎸夊師鍚ㄤ綅鍒ゅ畾
+            }
+        } else {
+            value = getH2032FieldValue(report, field);
+        }
         double low = Double.parseDouble(bounds[0].trim());
         double high = Double.parseDouble(bounds[1].trim());
         if (value > 0 && (value < low || value > high)) {
-            return buildResult(rule, report, h2032FieldLabel(rule.getCheckField()) + "=" + fmt(value),
+            return buildResult(rule, report, label + "=" + fmt(value),
                 "鑼冨洿 " + fmt(low) + "~" + fmt(high), "瓒呭嚭鑼冨洿");
         }
         return null;
@@ -1801,18 +1827,20 @@
     }
 
     private String fmt(double v) {
-        if (v == Math.floor(v) && !Double.isInfinite(v)) {
+        if (v == Math.floor(v) && !Double.isInfinite(v) && Math.abs(v) < 1e15) {
             return String.valueOf((long) v);
         }
-        return String.valueOf(Math.round(v * 100.0) / 100.0);
+        return java.math.BigDecimal.valueOf(v).setScale(2, java.math.RoundingMode.HALF_UP)
+            .stripTrailingZeros().toPlainString();
     }
 
     /** 鍗犳瘮/灏忔暟鍊硷細淇濈暀 4 浣嶅皬鏁� */
     private String fmt4(double v) {
-        if (v == Math.floor(v) && !Double.isInfinite(v)) {
+        if (v == Math.floor(v) && !Double.isInfinite(v) && Math.abs(v) < 1e15) {
             return String.valueOf((long) v);
         }
-        return String.valueOf(Math.round(v * 10000.0) / 10000.0);
+        return java.math.BigDecimal.valueOf(v).setScale(4, java.math.RoundingMode.HALF_UP)
+            .stripTrailingZeros().toPlainString();
     }
 
     // ========== H2031 鏃呭瀹℃牳 ==========
@@ -2021,4 +2049,4 @@
         result.setStatus("PENDING");
         return result;
     }
-}
\ No newline at end of file
+}

--
Gitblit v1.9.1