From 53c6f66db6352373f1fe5171dfe42ed0d716141a Mon Sep 17 00:00:00 2001
From: zhizhijie <zhizhijie@users.noreply.gitee.com>
Date: 星期五, 18 九月 2026 13:37:23 +0800
Subject: [PATCH] fix(中口径): 库内缺数据不再覆盖母版定稿值 + 跨簿重算容错 + 报表期后月份清空

---
 traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java |   50 ++++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 40 insertions(+), 10 deletions(-)

diff --git a/traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java b/traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java
index 16dd5e5..a0a48f7 100644
--- a/traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java
+++ b/traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java
@@ -2223,15 +2223,10 @@
                     if (blockOffset % 5 == 0) {
                         if (isYoy) {
                             fillMidYoyCell(c, mid, currentYear, monthOfCol(col), area, -1, volume);
-                        } else if (monthOfCol(col) > 6) {
-                            // 鎵╁垪鍑烘潵鐨� 7~12 鏈堟�昏鍊煎垪锛氭ā鏉块噷鏈棤姝ゅ垪锛屽厠闅嗗悗鏃㈡病鏈夊叕寮忎篃娌℃湁缂撳瓨鍊硷紝
-                            // 鐩存帴鍐欏簱鍐呭洓缁村悎璁★紙缁村害0锛夈��1~6 鏈堜繚鐣欐ā鏉跨紦瀛樺�硷紝閬垮厤涓㈡帀妯℃澘閲岀殑瀹氱鏁般��
-                            double total = midClassVal(mid, currentYear, monthOfCol(col), area, 0, volume);
-                            c.setBlank();
-                            if (total != 0.0) c.setCellValue(round(total, 4));
-                        } else if (c.getCellType() == CellType.FORMULA) {
-                            keepCached(c); // 1~6 鏈堟�昏鍊煎垪 = 妯℃澘缂撳瓨鍊硷紝淇濈暀
                         }
+                        // 鎬昏鍊煎垪锛氫竴寰嬩繚鐣欐ā鏉垮叕寮忥紙1~6 鏈堝師鍏紡 + 鎵╁垪鍏嬮殕鍑烘潵鐨勫叕寮忥級锛�
+                        // 鐢辩敓鎴愭敹灏剧殑 recalcWorkbookFormulas 姹傚�煎啓鍥炵紦瀛樸�傛棭鏈熺増鏈繖閲� keepCached
+                        // 浼氭妸鍒氬厠闅嗗嚭鏉ョ殑鍏紡娓呮垚绌烘牸锛屽鑷� 7 鏈堝強浠ュ悗鎬昏姘歌繙绌虹櫧銆�
                         continue;
                     }
                     int k = blockOffset % 5; // 1=鐝嚎 2=鍏氦 3=鍑虹鍩庝埂 4=缃戠害杞﹀煄涔�
@@ -2249,7 +2244,27 @@
             int[] recalc = recalcWorkbookFormulas(wb);
             log.info("涓彛寰勬槑缁嗗叕寮忛噸绠楀畬鎴愶細鎴愬姛 {} 鏍硷紝澶辫触 {} 鏍�", recalc[0], recalc[1]);
             clearFormulaErrorsAll(wb); // 鍘诲勾鍚屾湡鏄庣粏椤垫畫鐣� #REF! 鍚屾瘮鍏紡 鈫� 娓呯┖
+            blankFutureMonthColumns(sheet, fillMonths); // 鎶ヨ〃鏈熶箣鍚庣殑鏈堜唤鍒椾笉淇濈暀鍏嬮殕鍏紡/0 鍊�
             return toBytes(wb);
+        }
+    }
+
+    /**
+     * 娓呯┖銆屾姤琛ㄦ湡涔嬪悗銆嶇殑鏈堜唤鍒楋紙鎵╁垪鍏嬮殕鍑烘潵鐨� 7~12 鏈堥噷銆佸皻鏈埌鏈熺殑鏈堜唤锛夈��
+     * 涓嶆竻鐨勮瘽锛屽厠闅嗗嚭鏉ョ殑鎬昏鍏紡浼氱畻鍑� 0锛屾姤琛ㄤ笂浼氬嚭鐜�"9~12 鏈堝叏鏄� 0"鐨勫亣鏁版嵁锛�
+     * 绱鍒楋紙AA锛夌殑鍏紡/缂撳瓨鍊煎凡鍦ㄩ噸绠楅樁娈电畻濂斤紝娓呯┖鏍煎瓙涓嶅奖鍝嶅畠锛堢┖ = 0锛夈��
+     */
+    private void blankFutureMonthColumns(Sheet sheet, int filledMonths) {
+        for (int m = filledMonths + 1; m <= 12; m++) {
+            int col = 2 * m;            // 0 鍩猴細1 鏈�=2(C)銆�7 鏈�=14(O)銆�12 鏈�=24(Y)
+            for (int r = 4; r <= sheet.getLastRowNum(); r++) { // 0 鍩虹 4 琛� = 绗� 5 琛岋紙棣栦釜鏁版嵁琛岋級锛岃〃澶翠笉鍔�
+                Row row = sheet.getRow(r);
+                if (row == null) continue;
+                Cell val = row.getCell(col);
+                if (val != null) val.setBlank();
+                Cell yoy = row.getCell(col + 1);
+                if (yoy != null) yoy.setBlank();
+            }
         }
     }
 
@@ -2274,12 +2289,19 @@
         return (col - 1) / 2;
     }
 
-    /** 濉腑鍙e緞鏁版嵁鍗曞厓鏍硷細鐝嚎/鍏氦/鍑虹鍩庝埂/缃戠害杞﹀煄涔� 鍥涚淮缁熶竴鍙栧簱鍐呭�硷紙鏃犲�兼竻绌猴級 */
+    /**
+     * 濉腑鍙e緞鏁版嵁鍗曞厓鏍硷細鐝嚎/鍏氦/鍑虹鍩庝埂/缃戠害杞﹀煄涔� 鍥涚淮缁熶竴鍙栧簱鍐呭�笺��
+     * 搴撳唴璇ユ湀璇ョ淮鏃犳簮锛堝彇鍊间负 0锛夋椂**淇濈暀姣嶇増/妯℃澘鍘熷��**鈥斺�旂粷涓嶅啓绌恒�佷篃涓嶅啓 0銆�
+     * 渚濇嵁锛氭ā鏉跨殑鍩庡競绾у煄涔¤鏄�屽彴璐﹂〉 鎬婚噺 鈭� 鍩庡競鍐呫�嶇殑寮曠敤銆佸苟宸蹭笟鍔″畾绋匡紱
+     * 鐢ㄥ簱鍐呯己澶卞�艰鐩栦細鎶婂畾绋挎暟娓呮帀锛堝 2026-01~06 缃戠害杞﹁鍗曠己澶辨椂锛�
+     * 鍏ㄧ渷缃戠害杞﹀煄涔� 333.39 涓庡悇甯傚窞鍊间細琚竻绌猴級銆�
+     */
     private void fillMidCell(Cell c, Map<Integer, Map<String, double[][]>> mid, int year, int month, String area, int k, boolean volume) {
         double v = midClassVal(mid, year, month, area, k, volume);
+        if (v == 0.0) return; // 搴撳唴鏃犳簮锛氫繚鐣欐瘝鐗�/瀹氱鍘熷�硷紝缂烘暟鎹笉瑕嗙洊
         // POI setCellValue(double) 瀵瑰叕寮忓崟鍏冩牸鍙洿鏂扮紦瀛樹笉绉婚櫎鍏紡锛屽繀椤诲厛 setBlank 鍐嶅啓鍊�
         c.setBlank();
-        if (v != 0.0) c.setCellValue(round(v, 4));
+        c.setCellValue(round(v, 4));
     }
 
     /** 鏄惧紡鍐欏叆 0锛圥OI setCellValue(0.0) 浼氳浆 blank锛岄渶鎿嶄綔搴曞眰 XML锛� */
@@ -3445,6 +3467,14 @@
             log.warn("姹囨�诲伐浣滅翱鍏紡閲嶇畻锛氬垱寤烘眰鍊煎櫒澶辫触锛岃烦杩囷紙{}锛�", e.getMessage());
             return new int[]{0, 0};
         }
+        try {
+            // 璺ㄧ翱鍏紡锛圼1]鍑虹!C13 涔嬬被锛夊湪澶栭儴宸ヤ綔绨跨己澶辨椂榛樿鎶涘紓甯革紝浼氳寮曠敤瀹冪殑
+            // 鎬昏/绱/娲剧敓鍏紡杩為攣澶辫触锛堣〃鐜颁负銆屽叕寮忚繕鍦ㄤ絾娌℃湁缂撳瓨鍊笺�嶏級銆�
+            // 缃� true 鍚庢敼鐢ㄥ叕寮忔牸鑷韩鐨勭紦瀛樺�硷紙鍗冲畾绋垮�硷級鍙備笌璁$畻銆�
+            ev.setIgnoreMissingWorkbooks(true);
+        } catch (Exception ignore) {
+            // 涓埆瀹炵幇涓嶆敮鎸佽寮�鍏筹紝蹇界暐鍗冲彲
+        }
         int ok = 0, fail = 0;
         java.util.List<String> samples = new java.util.ArrayList<>();
         for (int i = 0; i < wb.getNumberOfSheets(); i++) {

--
Gitblit v1.9.1