From fb269f6de3e6b1faa8930a36fcb89d1928a484d4 Mon Sep 17 00:00:00 2001
From: zhizhijie <zhizhijie@users.noreply.gitee.com>
Date: 星期一, 12 十月 2026 12:59:24 +0800
Subject: [PATCH] fix(汇总大表): 扩列改以当期产物为底(修 9 月丢 8 月列/累计漏月)并修体检误报 待验收

---
 traffic-audit-server/src/main/java/com/trafficaudit/reportexport/layout/SummaryLayoutExpander.java |   65 ++++++++++++++++++++++++++++++++
 1 files changed, 65 insertions(+), 0 deletions(-)

diff --git a/traffic-audit-server/src/main/java/com/trafficaudit/reportexport/layout/SummaryLayoutExpander.java b/traffic-audit-server/src/main/java/com/trafficaudit/reportexport/layout/SummaryLayoutExpander.java
index 9da5c4a..2f98afa 100644
--- a/traffic-audit-server/src/main/java/com/trafficaudit/reportexport/layout/SummaryLayoutExpander.java
+++ b/traffic-audit-server/src/main/java/com/trafficaudit/reportexport/layout/SummaryLayoutExpander.java
@@ -41,6 +41,19 @@
 
     private static final int HEADER_SCAN_ROWS = 15;
 
+    /** 鏍囬鐢辩▼搴忓湪鍑鸿〃鏃剁幇鍐欑殑 7 涓〉绛撅紙姣嶇増閲岀殑鏍囬鏂囧瓧闇�鎸夋瘝鐗堟湡娆¢噸鍐欙級銆� */
+    private static final List<String> TITLE_PAGES = Arrays.asList(
+            "璐ц繍閲忔帓鍚�", "璐ц繍鍛ㄨ浆閲忔帓鍚�", "鍩庡競姹囨��", "鍩庡競鍒嗗競宸�", "涓彛寰勬帓鍚�", "涓彛寰勫垎鏋�", "閬撹矾杩愯緭鍛ㄨ浆閲�");
+
+    /** 鏍囬璇嗗埆鏍囪锛堝懡涓叾涓�鎵嶆敼鍐欙紝閬垮厤璇激澶囨敞绛夋枃瀛楋級銆� */
+    private static final List<String> TITLE_MARKERS = Arrays.asList(
+            "鍏ㄧ渷鍒嗗競宸炵疮璁″畬鎴愬叕璺揣杩愰噺鎯呭喌", "鍏ㄧ渷鍒嗗競宸炲畬鎴愬叕璺揣杩愰噺鎯呭喌",
+            "鍏ㄧ渷鍒嗗競宸炵疮璁″畬鎴愬叕璺揣鐗╄繍杈撳懆杞噺鎯呭喌", "鍏ㄧ渷鍒嗗競宸炲畬鎴愬叕璺揣鐗╄繍杈撳懆杞噺鎯呭喌",
+            "鍏ㄧ渷绱瀹屾垚鍩庡競瀹㈣繍閲忔儏鍐�", "鍏ㄧ渷瀹屾垚鍩庡競瀹㈣繍閲忔儏鍐�",
+            "鍒嗗競宸�1-", "鍏ㄧ渷鍒嗗競宸炵疮璁″畬鎴愰亾璺杩愮敓浜ф儏鍐�", "鍏ㄧ渷鍒嗗競宸炲畬鎴愰亾璺杩愮敓浜ф儏鍐�",
+            "涓彛寰勫杩愰噺鍙婂懆杞噺",
+            "鍏ㄧ渷绱瀹屾垚浜ら�氬懆杞噺鎯呭喌", "鍏ㄧ渷瀹屾垚浜ら�氬懆杞噺鎯呭喌");
+
     /** 鍏紡閲岀殑 A1 寮曠敤锛堝彲甯﹀伐浣滆〃鍓嶇紑锛夈�� */
     private static final Pattern REF = Pattern.compile(
             "(?:('([^']+)'|([A-Za-z_\\u4e00-\\u9fff][A-Za-z0-9_.\\u4e00-\\u9fff\u3001]*))!)?(\\$?)([A-Z]{1,3})(\\$?)(\\d+)");
@@ -67,6 +80,10 @@
                 if (sh == null || expanded.contains(sh.getSheetName())) continue;
                 shiftQualifiedRefs(sh, insertColOf);
             }
+            int titleFixed = applyTitles(wb, year, targetMonth);
+            if (titleFixed > 0) {
+                log.info("鎵╁垪锛氭爣棰樻寜 {}骞磠}鏈� 閲嶅啓 {} 鏍�", year, targetMonth, titleFixed);
+            }
             wb.setForceFormulaRecalculation(true);
             ByteArrayOutputStream out = new ByteArrayOutputStream();
             wb.write(out);
@@ -76,6 +93,54 @@
         }
     }
 
+    /** 鍙妸 7 涓爣棰橀〉鐨勬爣棰樻寜缁欏畾鏈熸閲嶅啓锛堢敤浜庝慨姝f瘝鐗堥噷婊炲悗鐨勬爣棰橈級銆� */
+    public byte[] fixTitles(byte[] source, int year, int month) {
+        try (XSSFWorkbook wb = new XSSFWorkbook(new ByteArrayInputStream(source))) {
+            int n = applyTitles(wb, year, month);
+            wb.setForceFormulaRecalculation(true);
+            ByteArrayOutputStream out = new ByteArrayOutputStream();
+            wb.write(out);
+            log.info("姹囨�诲ぇ琛ㄦ爣棰樹慨姝e畬鎴愶細{}骞磠}鏈堬紝鏀瑰啓 {} 鏍�", year, month, n);
+            return out.toByteArray();
+        } catch (Exception e) {
+            throw new IllegalStateException("姹囨�诲ぇ琛ㄦ爣棰樹慨姝eけ璐�: " + e.getMessage(), e);
+        }
+    }
+
+    /** 鎶� 7 涓〉绛剧殑鏍囬鏂囧瓧鎸夈�岀疮璁�=1-M鏈堛�佸綋鏈�=M鏈堛�嶉噸鍐欙紱鍛戒腑鏍囪鎵嶆敼锛岄伩鍏嶈浼ゅ娉ㄣ�� */
+    private int applyTitles(XSSFWorkbook wb, int year, int month) {
+        int changed = 0;
+        for (String page : TITLE_PAGES) {
+            Sheet sh = wb.getSheet(page);
+            if (sh == null) continue;
+            int lastRow = Math.min(sh.getLastRowNum(), 40);
+            for (int r = 0; r <= lastRow; r++) {
+                Row row = sh.getRow(r);
+                if (row == null) continue;
+                for (int c = 0; c <= 1; c++) {
+                    Cell cell = row.getCell(c);
+                    if (cell == null || cell.getCellType() != CellType.STRING) continue;
+                    String t = cell.getStringCellValue();
+                    if (t == null || !looksLikeTitle(t)) continue;
+                    String nt = t.replaceAll("(\\d{4})骞�", year + "骞�")
+                                 .replaceAll("(\\d{1,2})鏈�", month + "鏈�");
+                    if (!nt.equals(t)) {
+                        cell.setCellValue(nt);
+                        changed++;
+                    }
+                }
+            }
+        }
+        return changed;
+    }
+
+    private boolean looksLikeTitle(String t) {
+        for (String m : TITLE_MARKERS) {
+            if (t.contains(m)) return true;
+        }
+        return false;
+    }
+
     /** 瀵瑰崟椤垫墿鍒楋紝杩斿洖鎻掑叆浣嶇疆锛�0 鍩哄垪鍙凤級銆� */
     private int expandSheet(Sheet sh, int year, int targetMonth) {
         int lastMonth = targetMonth - 1;

--
Gitblit v1.9.1