From 208c8fc859fcde5fc42ed2802c0483aea5bbdc80 Mon Sep 17 00:00:00 2001
From: zhizhijie <zhizhijie@users.noreply.gitee.com>
Date: 星期一, 12 十月 2026 09:04:39 +0800
Subject: [PATCH] fix(汇总大表): 扩列时按母版期次重写 7 个标题页标题,并修正 8 月母版标题(待验收)
---
HANDOFF.md | 14 +++++++
traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java | 16 ++++++++
traffic-audit-server/src/main/java/com/trafficaudit/reportexport/layout/SummaryLayoutExpander.java | 65 ++++++++++++++++++++++++++++++++
traffic-audit-server/src/main/java/com/trafficaudit/reportexport/controller/ReportExportController.java | 7 +++
docs/生成汇总大表/2026年8月道路运输量汇总表.xlsx | 0
5 files changed, 101 insertions(+), 1 deletions(-)
diff --git a/HANDOFF.md b/HANDOFF.md
index 6fb70e0..8cdec2f 100644
--- a/HANDOFF.md
+++ b/HANDOFF.md
@@ -4,6 +4,20 @@
> **姣忓ぉ缁撴潫鏃�**锛氭妸褰撳ぉ杩涘睍銆佽俯杩囩殑鍧戙�佹柊闇�姹傘�佹湭瀹屾垚浜嬮」鏇存柊鍒版湰鏂囦欢锛岀劧鍚庡彲浠ユ斁蹇冨紑鏂板璇濄��
> **鍗忎綔绾﹀畾锛�2026-08-31锛�**锛氳銆屾彁浜ゃ��= 鏈湴 commit + 鎺ㄩ�佸埌杩滅 git锛坥rigin main锛孏itblit锛夛紝涓嶅啀鍙仛鏈湴 commit銆�
+## 鏈�鏂帮紙2026-10-12锛寊yj 绾匡級
+
+### 10-12锛氭墿鍒楀櫒琛ャ�屾爣棰樻寜姣嶇増鏈熸閲嶅啓銆�+ 淇 8 鏈堟瘝鐗堟爣棰樸�愬緟楠屾敹銆�
+
+- **鐢ㄦ埛鍙嶉**锛�9 鏈堢増寮忎欢涓� 8 鏈堟瘝鐗堥噷锛�7 涓〉绛剧殑鏍囬浠嶆槸 `1-7鏈� / 7鏈坄锛堣揣杩愰噺鎺掑悕銆佽揣杩愬懆杞噺鎺掑悕銆佸煄甯傛眹鎬汇�佸煄甯傚垎甯傚窞銆佷腑鍙e緞鎺掑悕銆佷腑鍙e緞鍒嗘瀽銆侀亾璺繍杈撳懆杞噺锛夈��
+- **鏍瑰洜锛堜袱鏉★級**锛氣憼 鎸夊凡纭鍙e緞杩� 7 椤垫槸 C 绫婚〉鈥斺��**鏍囬鐢辩敓鎴愮▼搴忓湪鍑鸿〃鏃剁幇鍐�**锛坄ReportExportService :969 / :1011 / :2707 / :2891 / :4446 / :4498 / :4499 / :4604` 鍧囨寜 period 鍐欙級锛屾瘝鐗堥噷鐨勬枃瀛椾笉鍙備笌鍑鸿〃锛屾墍浠ユ墿鍒楀櫒鍘熸湰娌″姩瀹冧滑锛涒憽 **鎴戠殑瀹炵幇纭疄婕忎簡"鏍囬 +1"杩欎竴姝�**鈥斺�斻�婃墿鍒楅厤缃锋牳瀵圭増銆嬪姩浣� 7 鍐欎簡"鏍囬锛氶〉闈㈡爣棰樻湀浠�+1锛堥�愰〉鏍稿锛�"锛屾垜鍙仛浜� 8 涓彴璐﹂〉鐨勮〃澶村厠闅嗐��
+- **淇**锛氭墿鍒楀櫒鏂板 `applyTitles(...)`鈥斺�旀寜**姣嶇増鏈熸**閲嶅啓鏍囬锛堢疮璁�=`1-M鏈坄銆佸綋鏈�=`M鏈坄锛夛紝鍙鐞� 7 涓爣棰橀〉銆�**鍛戒腑鏍囬鏍囪鎵嶆敼**锛堥伩鍏嶈浼� ` 璐ц繍!A1` 杩欑被澶囨敞锛夛紝4 浣嶅勾浠戒竴骞舵寜鐩爣骞撮噸鍐欙紱鏂板鍙鎺ュ彛鍙傛暟 `?titlesOnly=true`锛堝彧鏀规爣棰樹笉鎵╁垪锛夈��
+- **8 鏈堟瘝鐗堝凡淇**锛�7 椤垫爣棰� `1-7鏈�/7鏈坄 鈫� **`1-8鏈�/8鏈坄**锛堜慨姝e墠澶囦唤 `docs/鐢熸垚姹囨�诲ぇ琛�/_bak_2026骞�8鏈堟瘝鐗坃鏍囬淇鍓峗20261012.xlsx`锛夛紱19 椤电涓庡叕寮忔娊鏌ユ棤鎹燂紙`涓彛寰勬槑缁�!C5`銆乣鍏氦!C5` 鍏ㄧ渷琛屽叕寮忋�乣 璐ц繍!A1` 澶囨敞鍧囨甯革級銆�
+- **9 鏈堢増寮忛噸璺�**锛�7 椤垫爣棰� 鈫� **`1-9鏈�/9鏈坄**锛涗骇鍑� `docs/鐢熸垚姹囨�诲ぇ琛�/杈撳嚭/_鎵╁垪_2026骞�9鏈坃寰呯‘璁v2.xlsx`锛�1,037,071 B锛夈��
+- **涓庢墜宸� 9 鏈堟瘝鐗堝姣�**锛�851 鏉″樊寮� = 8 涓彴璐﹂〉 836 鏉★紙娌跨敤 10-10 鍒嗙被锛氱疮璁�/鍒嗘瘝鏄惁鎵╁埌 9 鏈� 548銆佸垎闅旂 153銆佽〃鍚嶅紩鍙� 130銆佹诞鐐瑰熬宸� 1锛夛紜 **鏍囬椤� 15 鏉�**锛堟墜宸ヤ欢鏍囬涓烘粸鍚庣殑 `1-8鏈�/7鏈坄锛夈��
+- **韪╁潙**锛氶噸璺戞椂鐩爣鏂囦欢琚� Excel/WPS 鍗犵敤锛坄being used by another process`锛夆啋 鍏堣惤 `_v2` 鍛藉悕锛涚敤鎴峰叧闂悗鍙敤鍘熷悕閲嶅啓銆�
+- **鎶ュ憡锛堟湰鍦般�佷笉鍏ュ簱锛�**锛歚docs/鍔熻兘娴嬭瘯鎶ュ憡/鍔熻兘娴嬭瘯鎶ュ憡_姹囨�诲ぇ琛ㄦ墿鍒楀櫒鏍囬淇_2026-10-12.md`锛涙棩缁� `docs/宸ヤ綔鏃ョ粨/宸ヤ綔鏃ョ粨_2026-10-12.md`銆�
+- **寰呯敤鎴烽獙鏀�/纭**锛氣憼 鏍囬鍙e緞鎸�"**鏍囬鏈熸=姣嶇増鏈熸**"锛�8鏈堚啋1-8鏈�/8鏈堛��9鏈堚啋1-9鏈�/9鏈堬級鏄惁姝g‘锛涒憽 `_鎵╁垪_2026骞�9鏈坃寰呯‘璁v2.xlsx` 鏄惁鏀瑰悕涓烘寮忓悕锛堝師鍚嶉偅浠芥槸鏃у唴瀹广�佽 WPS 瀛樿繃锛屾湭缁忓悓鎰忎笉鍔級锛涒憿 绱/绱鍚屾瘮"鏄惁鎵╁埌 9 鏈�"锛堜骇鍑�=宸叉墿銆佹墜宸ョ増鏈墿锛夈��
+- **鐘舵��**锛�**銆愬緟楠屾敹銆�**銆�
## 鏈�鏂帮紙2026-10-10锛寊yj 绾匡級
### 10-10锛歋tep 1 鎵╁垪鍣ㄨ惤鍦� + 8鈫�9 鏈堢増寮忛杞骇鍑恒�愬緟楠屾敹銆�
diff --git "a/docs/\347\224\237\346\210\220\346\261\207\346\200\273\345\244\247\350\241\250/2026\345\271\2648\346\234\210\351\201\223\350\267\257\350\277\220\350\276\223\351\207\217\346\261\207\346\200\273\350\241\250.xlsx" "b/docs/\347\224\237\346\210\220\346\261\207\346\200\273\345\244\247\350\241\250/2026\345\271\2648\346\234\210\351\201\223\350\267\257\350\277\220\350\276\223\351\207\217\346\261\207\346\200\273\350\241\250.xlsx"
index f78b3b4..7387c11 100644
--- "a/docs/\347\224\237\346\210\220\346\261\207\346\200\273\345\244\247\350\241\250/2026\345\271\2648\346\234\210\351\201\223\350\267\257\350\277\220\350\276\223\351\207\217\346\261\207\346\200\273\350\241\250.xlsx"
+++ "b/docs/\347\224\237\346\210\220\346\261\207\346\200\273\345\244\247\350\241\250/2026\345\271\2648\346\234\210\351\201\223\350\267\257\350\277\220\350\276\223\351\207\217\346\261\207\346\200\273\350\241\250.xlsx"
Binary files differ
diff --git a/traffic-audit-server/src/main/java/com/trafficaudit/reportexport/controller/ReportExportController.java b/traffic-audit-server/src/main/java/com/trafficaudit/reportexport/controller/ReportExportController.java
index 00dad87..776db52 100644
--- a/traffic-audit-server/src/main/java/com/trafficaudit/reportexport/controller/ReportExportController.java
+++ b/traffic-audit-server/src/main/java/com/trafficaudit/reportexport/controller/ReportExportController.java
@@ -91,7 +91,12 @@
/** 鐢熸垚_閬撹矾杩愯緭閲忔眹鎬昏〃.xlsx锛堟眹鎬诲伐浣滅翱 P0-P1 楠ㄦ灦锛氭暣鏈鍒舵瘝鐗堬紝椤电/鍏紡/2025 缂撳瓨淇濈暀锛� */
/** 姹囨�诲ぇ琛ㄦ寜鏈堟墿鍒楋紙Step 1锛屽彧鍋氱増寮忋�佹暟鎹暀绌猴級锛氳繑鍥炰笅涓�鏈堢増寮� xlsx銆� */
@GetMapping("/export/summaryWorkbook/expand")
- public ResponseEntity<byte[]> expandSummaryWorkbook(@RequestParam("period") String period) throws Exception {
+ public ResponseEntity<byte[]> expandSummaryWorkbook(@RequestParam("period") String period,
+ @RequestParam(value = "titlesOnly", defaultValue = "false") boolean titlesOnly) throws Exception {
+ if (titlesOnly) {
+ byte[] titled = reportService.fixSummaryTitles(period);
+ return buildResponse(titled, String.format("鏍囬淇_閬撹矾杩愯緭閲忔眹鎬昏〃_%s.xlsx", period));
+ }
byte[] data = reportService.expandSummaryWorkbook(period);
return buildResponse(data, String.format("鎵╁垪_閬撹矾杩愯緭閲忔眹鎬昏〃_%s_寰呯‘璁�.xlsx", period));
}
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;
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 1888c3d..3465473 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
@@ -3649,6 +3649,22 @@
}
}
+ /** 鍙慨姝e綋鏈熸瘝鐗堥噷 7 涓爣棰橀〉鐨勬爣棰樻枃瀛楋紙鎸夋瘝鐗堟湡娆¢噸鍐欙紝鐢ㄤ簬淇婊炲悗鏍囬锛夈�� */
+ public byte[] fixSummaryTitles(String period) throws Exception {
+ if (period == null || !period.contains("-")) {
+ throw new RuntimeException("鏍囬淇浠呮敮鎸佹寜鏈堬紝璇锋寚瀹� period=YYYY-MM");
+ }
+ int year = Integer.parseInt(period.split("-")[0]);
+ int month = monthOf(period, "month");
+ File mother = resolveSummaryMother(period, "month");
+ if (mother == null) {
+ throw new RuntimeException("鏈壘鍒版眹鎬昏〃姣嶇増锛坉ocs/鐢熸垚姹囨�诲ぇ琛級锛�" + year + "骞�" + month + "鏈堥亾璺繍杈撻噺姹囨�昏〃.xlsx");
+ }
+ try (InputStream in = new FileInputStream(mother)) {
+ return summaryLayoutExpander.fixTitles(org.apache.poi.util.IOUtils.toByteArray(in), year, month);
+ }
+ }
+
/** 鐢熸垚_閬撹矾杩愯緭閲忔眹鎬昏〃.xlsx锛圥0-P1 楠ㄦ灦锛屾敮鎸� toMonth 瑁佸壀锛夛細
* 浠ャ�奩YYY骞碝鏈堥亾璺繍杈撻噺姹囨�昏〃.xlsx銆嬶紙M 鐢� period 鍐冲畾锛変负姣嶇増锛屾寜鍚屾湡澶囦唤姣嶇増杩樺師鏈堝害鍧楋紱
* toMonth 闈炵┖涓斿皬浜� M 鏃讹紝鎶� 8 涓彴璐�/鍚堟垚椤佃鍒� toMonth 鏈堬紙toMonth+1..M 鐨勫綋鏈堝��/鍚屾瘮鍒楁竻绌恒�佷繚鐣欒〃澶达紝
--
Gitblit v1.9.1