From a9e6c0b1ddc8c2683ea604f3d5146ce8c310816e Mon Sep 17 00:00:00 2001
From: zhizhijie <zhizhijie@users.noreply.gitee.com>
Date: 星期五, 04 九月 2026 16:54:34 +0800
Subject: [PATCH] fix: 整车吨位按平均吨位口径审核、提示数字去科学计数;拆分导入按目标期取月页签(重导04-06验证);数据查看全屏可翻页 + 测试报告

---
 docs/功能测试报告/功能测试报告_审核平均吨位口径与拆分目标月导入及全屏翻页_2026-09-04.md                                          |   22 +++++++++++
 traffic-audit-server/src/main/java/com/trafficaudit/dataimport/service/DataImportService.java   |   13 +++++-
 traffic-audit-web/src/views/DataView.vue                                                        |   44 +++++++++++++++-------
 docs/生成汇总大表/数据导入现状与缺口清单_2026-09-04.md                                                           |    9 ++++
 traffic-audit-server/src/main/java/com/trafficaudit/auditengine/service/AuditEngineService.java |   30 +++++++++++---
 5 files changed, 95 insertions(+), 23 deletions(-)

diff --git "a/docs/\345\212\237\350\203\275\346\265\213\350\257\225\346\212\245\345\221\212/\345\212\237\350\203\275\346\265\213\350\257\225\346\212\245\345\221\212_\345\256\241\346\240\270\345\271\263\345\235\207\345\220\250\344\275\215\345\217\243\345\276\204\344\270\216\346\213\206\345\210\206\347\233\256\346\240\207\346\234\210\345\257\274\345\205\245\345\217\212\345\205\250\345\261\217\347\277\273\351\241\265_2026-09-04.md" "b/docs/\345\212\237\350\203\275\346\265\213\350\257\225\346\212\245\345\221\212/\345\212\237\350\203\275\346\265\213\350\257\225\346\212\245\345\221\212_\345\256\241\346\240\270\345\271\263\345\235\207\345\220\250\344\275\215\345\217\243\345\276\204\344\270\216\346\213\206\345\210\206\347\233\256\346\240\207\346\234\210\345\257\274\345\205\245\345\217\212\345\205\250\345\261\217\347\277\273\351\241\265_2026-09-04.md"
new file mode 100644
index 0000000..ad60e87
--- /dev/null
+++ "b/docs/\345\212\237\350\203\275\346\265\213\350\257\225\346\212\245\345\221\212/\345\212\237\350\203\275\346\265\213\350\257\225\346\212\245\345\221\212_\345\256\241\346\240\270\345\271\263\345\235\207\345\220\250\344\275\215\345\217\243\345\276\204\344\270\216\346\213\206\345\210\206\347\233\256\346\240\207\346\234\210\345\257\274\345\205\245\345\217\212\345\205\250\345\261\217\347\277\273\351\241\265_2026-09-04.md"
@@ -0,0 +1,22 @@
+# 鍔熻兘娴嬭瘯鎶ュ憡锛氬鏍稿叕寮忎慨姝� + 鎷嗗垎鐩爣鏈堝鍏� + 鍏ㄥ睆缈婚〉锛�2026-09-04锛�
+
+## 涓�銆佽揣杩愬鏍� RULE_006锛氭暣杞﹀惃浣嶆敼涓衡�滃钩鍧囧惃浣嶁�濆彛寰�
+- 鏀瑰姩锛歚AuditEngineService.checkOutRange` 瀵� `tonsWhole` 瀛楁鎸夆�滄暣杞﹀钩鍧囧惃浣� = 鏁磋溅鍚ㄤ綅(tonsWhole) / 鏁磋溅杞﹁締鏁�(vehicleWhole)鈥濊绠楀悗涓� 4~40 姣旇緝锛涙棤鏁磋溅鏁版椂閫�鍥炲師鍊煎垽鏂�俙h2032FieldLabel` 涓嶅彉锛屾彁绀烘枃鏈樉寮忔爣鈥滄暣杞﹀钩鍧囧惃浣�(鏁磋溅鍚ㄤ綅/鏁磋溅鏁�)鈥濄��
+- 鍘熷洜锛氬師閫昏緫鐩存帴鎷挎暣杞﹀惃浣嶆�婚噺锛堝榛勫唸鍚▼鐗╂祦 357 鍚紝23 杈嗘暣杞︼級姣� 4~40锛屾妸鎬婚噺褰撳崟鍧囪鎶ャ��
+- 楠岃瘉锛氶噸鏂版墽琛� 2026-07 H2032 瀹℃牳锛圥OST /api/audit/execute锛夛紝RULE_006 鍛戒腑 8 鏉′笖鍏ㄩ儴涓衡�滄暣杞﹀钩鍧囧惃浣�=0.92~3.93锛岃寖鍥� 4~40鈥濓紙榛勫唸鍚▼ 357/23鈮�15.52 涓嶅啀鍛戒腑锛夛紱鍏朵綑瑙勫垯姝e父锛圧ULE_001 59銆丷ULE_002 106銆丷ULE_004 6銆丷ULE_005 21銆丷ULE_003 0锛夈�傜粨璁� PASS銆�
+
+## 浜屻�佸鏍告彁绀烘暟瀛椾笉鍐嶇敤绉戝璁℃暟娉�
+- 鏀瑰姩锛歚fmt`/`fmt4` 鐢� BigDecimal.toPlainString 杈撳嚭锛屽ぇ鏁板 1.04e7 鏄剧ず涓� 10435762.52 鑰屼笉鏄� 1.043576252E7銆�
+- 楠岃瘉锛氶噸瀵煎悗 2026-07 瀹℃牳鏂囨湰鍧囦负鏅�氬崄杩涘埗鏄剧ず锛涚紪璇戦�氳繃銆傜粨璁� PASS銆�
+
+## 涓夈�佽涓婅涓嬫媶鍒嗗鍏ワ細鎸夌洰鏍囨姤琛ㄦ湡鍙彇瀵瑰簲鏈堥〉绛�
+- 鏀瑰姩锛歚DataImportService.importScaleSplit` 澧炲姞鐩爣鏈堬紙period 鐨勬湀浠斤級杩囨护锛氶〉绛惧舰濡傗�渰M}鏈堢疮璁�/M鏈堜唤鈥濆彧鍦ㄨ M=鐩爣鏈堟椂瀵煎叆锛圡鏈堢疮璁♀啋CUMULATIVE銆丮鏈堜唤鈫扢ONTH锛夛紱椤电涓衡�滃綋鏈�/绱鈥濓紙妯℃澘鏍峰紡锛変笉闄愬畾鏈堛��
+- 鍘熷洜锛�1-N 鏈堟暣鍖呮枃浠惰鏁村浼氭妸澶氫釜鏈堥〉绛惧杩涘悓涓�鎶ヨ〃鏈熼�犳垚閲嶅琛岋紙姝ゅ墠 04-07 鍒嗗埆 72/90/108/126 琛屽嵆涓烘绫昏剰鏁版嵁锛夈��
+- 楠岃瘉锛堢鍒扮锛夛細鐢ㄣ��2026骞�1-6鏈堝叕璺揣杩愰噺锛堝垎甯傚窞锛�.xlsx銆嬮噸瀵� 2026-04/05/06锛屾瘡鏈熻繑鍥炩��36 鏉¤褰曗��=褰撴湀 18 + 绱 18锛涘簱鍐呮瘡鏈熸寜 region 鍞竴锛涙姹� 2026-06 褰撴湀鍚堣鍛ㄨ浆閲� 687103.88 涓庢簮鏂囦欢閫愬�间竴鑷达紱2026-07 鏃� 126 琛岀疮璁℃暟鎹緟鐢� 1-7 鏈堟枃浠堕噸瀵间竴娆″嵆鏀舵暃涓� 36 琛屻�傜粨璁� PASS銆�
+
+## 鍥涖�佹暟鎹煡鐪嬪叏灞忔ā寮忓彲缈婚〉锛堝墠绔級
+- 鏀瑰姩锛歚DataView.vue` 鎶婅〃鏍间笌鍏朵笅鍒嗛〉鍣ㄥ寘杩涘悓涓� `.table-wrap`锛屽叏灞忕洰鏍囦粠 `.table-area` 鏀逛负 `.table-wrap`锛屽苟鍔犲叏灞� flex 甯冨眬鏍峰紡锛屽叏灞忔椂淇濈暀鍒嗛〉鏉°��
+- 楠岃瘉锛氭ā鏉跨粨鏋�/閫昏緫璋冩暣缂栬瘧鐢� vue-cli-service 鐑洿鏂帮紱娴忚鍣ㄧ闇�鐢ㄦ埛鍏ㄥ睆鏌ョ湅纭锛堣〃鏍�+鍒嗛〉鍙銆佸彲缈婚〉锛夈�傜粨璁猴細浠g爜灏辩华锛屽緟浜哄伐瑙嗚纭銆�
+
+## 鐜
+- 鍚庣 8090锛堝娆¢噸鍚嚦鏈�鏂颁唬鐮侊紝鏈�鍚庝竴娆� 16:51 灏辩华锛夛紱鍓嶇 8080 杩愯涓紱MySQL 127.0.0.1:3308銆�
diff --git "a/docs/\347\224\237\346\210\220\346\261\207\346\200\273\345\244\247\350\241\250/\346\225\260\346\215\256\345\257\274\345\205\245\347\216\260\347\212\266\344\270\216\347\274\272\345\217\243\346\270\205\345\215\225_2026-09-04.md" "b/docs/\347\224\237\346\210\220\346\261\207\346\200\273\345\244\247\350\241\250/\346\225\260\346\215\256\345\257\274\345\205\245\347\216\260\347\212\266\344\270\216\347\274\272\345\217\243\346\270\205\345\215\225_2026-09-04.md"
index 0fdc0ae..eb7f164 100644
--- "a/docs/\347\224\237\346\210\220\346\261\207\346\200\273\345\244\247\350\241\250/\346\225\260\346\215\256\345\257\274\345\205\245\347\216\260\347\212\266\344\270\216\347\274\272\345\217\243\346\270\205\345\215\225_2026-09-04.md"
+++ "b/docs/\347\224\237\346\210\220\346\261\207\346\200\273\345\244\247\350\241\250/\346\225\260\346\215\256\345\257\274\345\205\245\347\216\260\347\212\266\344\270\216\347\274\272\345\217\243\346\270\205\345\215\225_2026-09-04.md"
@@ -65,3 +65,12 @@
 3. 姣嶇増鎸夆�滄暟鎹拰鍏紡鏀瑰鍚庝綔涓烘瘝鐗堚�濆鐞嗭紙鎷嶆澘绗� 5 鏉★紝鍗充綋妫�娓呭崟鏂规 A 淇锛夈��
 4. 鐙珛灏忚〃淇濈暀涓嶅垹锛堟媿鏉跨 1 鏉★級锛屽緟澶ц〃楠岃瘉閫氳繃鍚庡啀璁笅绾裤��
 5. 鍏佽閲嶅瀵煎叆宸茬敓鏁堬紙鎸夋姤琛ㄦ湡鍏堝垹鍚庢彃锛屾媿鏉跨 3 鏉★級銆�
+
+---
+
+## 鏇存柊璁板綍锛�2026-09-04 涓嬪崍 鐢ㄦ埛绛斿鍚庯級
+- 鍏氦/鍑虹/涓綋瀹㈣繍/H203-1 宸茶ˉ瀵硷細2026-01~07锛圚203-1 鑷� 08锛夌幇宸插叏榻愶紱鎶曡祫妯″潡鏆備笉绾冲叆鏈鑼冨洿锛堢敤鎴风瓟澶嶏級銆�
+- 璐ц繍閲忓懆杞噺锛�2026-02 宸叉湁瀵煎叆琛岋紱鐢ㄦ埛绛斿鈥�7鏈堣〃鏍煎凡鍚� 1-7 鏈堟瘡鏈堟暟鎹�濅笖宸查噸鏂板鍏ワ紙2026-04~07 鍦ㄥ簱锛�01銆�03 鏃犵嫭绔嬭浣� 07 琛屽唴宓屽悇鏈堝垪鍊硷紝鍙栨暟鏃舵寜 m01~m07 浣跨敤锛夈��
+- 瑙勪笂瑙勪笅鎷嗗垎瀵煎叆宸插崌绾т负鈥滄寜鐩爣鎶ヨ〃鏈熷彇椤电鈥濓紙鍙鍏� {鐩爣鏈坿鏈堜唤/{鐩爣鏈坿绱锛屼笉鍐嶆妸 1-N 鏈堝叏閮ㄩ〉绛惧杩涘悓涓�鏈燂級锛屽苟宸茬敤銆�2026骞�1-6鏈堝叕璺揣杩愰噺锛堝垎甯傚窞锛�.xlsx銆嬮噸瀵� 2026-04/05/06 楠岃瘉锛氭瘡鏈� = 褰撴湀 18 琛� + 绱 18 琛岋紝姝︽眽 6 鏈堝綋鏈堝悎璁″懆杞噺 687103.88 涓庢簮鏂囦欢涓�鑷淬��2026-07 鐩墠浠嶄负鏃ф暟鎹紙126 琛岀疮璁★級锛屽緟鐢ㄣ��2026骞�1-7鏈堝叕璺揣杩愰噺锛堝垎甯傚窞锛�.xlsx銆嬮噸瀵间竴娆″嵆鍙彉骞插噣锛�36 琛岋級銆�
+- 瑙勪笂瑙勪笅鎷嗗垎 2026-01~03 浠嶇┖锛氬彲澶嶇敤銆�2026骞�1-6鏈堝叕璺揣杩愰噺锛堝垎甯傚窞锛夈�嬬瓑鏂囦欢锛屽鍏ラ〉閫夋姤琛ㄦ湡 01/02/03 鍗冲彲锛堢▼搴忓彧鍙栧搴旀湀椤电锛夛紝鎴栫敤鍚勬湀鑷繁鐨勫畾绋挎枃浠躲��
+- 鍘熲�滀釜浣撳杩� 2026-05 鏂囦欢鍚嶄负 (2026.3)鈥濈枒鐐瑰凡婢勬竻锛氭枃浠跺悕鍐欓敊銆佸唴瀹逛负 6 鏈堟暟鎹紝宸蹭慨鏀瑰悗瀵煎叆锛�06 鐜版湁 7 琛岋級銆�
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 8d16e0c..5d343bb 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
@@ -1679,15 +1679,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;
@@ -1805,18 +1819,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 鏃呭瀹℃牳 ==========
diff --git a/traffic-audit-server/src/main/java/com/trafficaudit/dataimport/service/DataImportService.java b/traffic-audit-server/src/main/java/com/trafficaudit/dataimport/service/DataImportService.java
index 0f0c0f6..894487e 100644
--- a/traffic-audit-server/src/main/java/com/trafficaudit/dataimport/service/DataImportService.java
+++ b/traffic-audit-server/src/main/java/com/trafficaudit/dataimport/service/DataImportService.java
@@ -924,6 +924,7 @@
         List<ScaleSplitTransport> list = new ArrayList<>();
         int failRows = 0;
         try (Workbook wb = WorkbookFactory.create(file.getInputStream())) {
+            int targetMonth = Integer.parseInt(period.split("-")[1]); // 浠呭鍏ョ洰鏍囨湡鎵�鍦ㄦ湀鐨勯〉绛撅紙1-N鏈堟枃浠舵寜鐩爣鏈熷彇褰撴湀/绱锛�
             boolean hasPeriodSheet = false;
             for (int i = 0; i < wb.getNumberOfSheets(); i++) {
                 String sn = wb.getSheetAt(i).getSheetName();
@@ -936,8 +937,16 @@
                 Sheet sheet = wb.getSheetAt(i);
                 String sheetName = sheet.getSheetName();
                 String periodType = null;
-                if (sheetName.contains("褰撴湀") || sheetName.contains("鏈堜唤")) periodType = "MONTH";
-                else if (sheetName.contains("绱")) periodType = "CUMULATIVE";
+                java.util.regex.Matcher mSheetMonth = java.util.regex.Pattern.compile("(\\d{1,2})\\u6708(\\u4efd|\\u7d2f\\u8ba1)").matcher(sheetName);
+                if (mSheetMonth.find()) {
+                    int sheetMonth = Integer.parseInt(mSheetMonth.group(1));
+                    if (sheetMonth == targetMonth) {
+                        periodType = "浠�".equals(mSheetMonth.group(2)) ? "MONTH" : "CUMULATIVE";
+                    }
+                } else {
+                    if (sheetName.contains("褰撴湀")) periodType = "MONTH";
+                    else if (sheetName.contains("绱")) periodType = "CUMULATIVE";
+                }
                 if (periodType == null) continue;
 
                 // 鏍¢獙 sheet 甯冨眬锛氱2琛屽簲鍚�屽競宸�/瑙勪笂浼佷笟杩愯緭閲忋�嶏紝绗�3琛屽瓙琛ㄥご搴斿惈銆屽懆杞噺銆嶆垨銆岃揣杩愰噺銆嶏紙鎵╁睍甯冨眬锛�
diff --git a/traffic-audit-web/src/views/DataView.vue b/traffic-audit-web/src/views/DataView.vue
index 875f9ab..8ef5b0d 100644
--- a/traffic-audit-web/src/views/DataView.vue
+++ b/traffic-audit-web/src/views/DataView.vue
@@ -45,20 +45,22 @@
         <div style="color:#909399;font-size:12px;margin-bottom:6px">
           鍏� {{ total }} 鏉¤褰曪紝褰撳墠绗� {{ page }} 椤�
         </div>
-        <div class="table-area" ref="tableArea">
-        <el-table :data="records" border v-loading="loading" size="small" style="width:100%" height="100%">
-          <el-table-column v-for="c in columns" :key="c.prop" :prop="c.prop" :label="c.label" :min-width="c.width" show-overflow-tooltip>
-            <template slot-scope="scope">
-              <span>{{ formatCell(scope.row[c.prop]) }}</span>
-            </template>
-          </el-table-column>
-        </el-table>
+        <div class="table-wrap" ref="tableWrap">
+          <div class="table-area">
+            <el-table :data="records" border v-loading="loading" size="small" style="width:100%" height="100%">
+              <el-table-column v-for="c in columns" :key="c.prop" :prop="c.prop" :label="c.label" :min-width="c.width" show-overflow-tooltip>
+                <template slot-scope="scope">
+                  <span>{{ formatCell(scope.row[c.prop]) }}</span>
+                </template>
+              </el-table-column>
+            </el-table>
+          </div>
+          <el-pagination style="margin-top:15px;text-align:right"
+            background layout="total, prev, pager, next, sizes"
+            :total="total" :current-page.sync="page" :page-size.sync="size"
+            :page-sizes="[20, 50, 100]" @current-change="loadData" @size-change="loadData">
+          </el-pagination>
         </div>
-        <el-pagination style="margin-top:15px;text-align:right"
-          background layout="total, prev, pager, next, sizes"
-          :total="total" :current-page.sync="page" :page-size.sync="size"
-          :page-sizes="[20, 50, 100]" @current-change="loadData" @size-change="loadData">
-        </el-pagination>
       </el-main>
     </el-container>
   </el-container>
@@ -110,7 +112,7 @@
       })
     },
     toggleFullscreen() {
-      const el = this.$refs.tableArea
+      const el = this.$refs.tableWrap
       if (!document.fullscreenElement) {
         if (el && el.requestFullscreen) el.requestFullscreen()
         else this.$message.warning("娴忚鍣ㄤ笉鏀寔鍏ㄥ睆")
@@ -139,4 +141,18 @@
   background: #fff;
   overflow: auto;
 }
+#app .table-wrap:fullscreen {
+  padding: 20px;
+  background: #fff;
+  overflow: auto;
+  display: flex;
+  flex-direction: column;
+}
+#app .table-wrap:fullscreen .table-area {
+  flex: 1 1 auto;
+  min-height: 0;
+}
+#app .table-wrap:fullscreen .el-pagination {
+  flex: none;
+}
 </style>
\ No newline at end of file

--
Gitblit v1.9.1