feat: 中口径排名左块删除(母版+程序防复活)→7月回归收口→8月扩列母版(M0 v4)

- 拍板登记: 确认回执第六节第6条(左块整删、永不回填、随7月收口验证后扩8月)
- 母版: 2026年7月道路运输量汇总表 排名页 A1:H20 清空148格+移除2个空合并区(整簿diff仅此区)
- 程序: restoreSummaryMonthlyBlocks 对排名页 A..H(列0-7)永不回填; exportSummaryWorkbook 读母版前临时放宽POI ZipSecureFile压缩比阈值(修复openpyxl styles.xml误报)并在finally还原
- 7月收口: M1五块(货运/公交出租轨道/网约/城市汇总/班线包车)复跑diffs=0; 程序生成2026-07=完整7月基准-左块148格(仅余31处日期int/float写法差异,显示相同)
- 8月扩列: 新增2026年8月道路运输量汇总表母版(8个台账/合成页+2列, 累计滚动+Q, 同比分母+AJ, 2025参照右移, 两行合并表头, 隐藏列平移保留, 排名页无左块); 程序生成2026-08=母版0差异
- 清理: 删除已作废的7月清空测试版xlsx(工作区已删, 随提交记录)
- 文档: 新增功能测试报告_中口径排名左块删除与7月回归收口及8月扩列_2026-09-08.md; 更新工作日结_2026-09-08
2个文件已删除
4个文件已修改
2个文件已添加
60 ■■■■■ 已修改文件
docs/功能测试报告/功能测试报告_中口径排名左块删除与7月回归收口及8月扩列_2026-09-08.md 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/工作日结/工作日结_2026-09-08.md 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/生成汇总大表/2026年7月道路运输量汇总表.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
docs/生成汇总大表/2026年7月道路运输量汇总表_7月清空测试版.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
docs/生成汇总大表/2026年7月道路运输量汇总表_7月清空测试版v2.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
docs/生成汇总大表/2026年8月道路运输量汇总表.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
docs/确认回执汇总与剩余疑问_汇总大表数据驱动改造_2026-09-07.md 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/¹¦ÄܲâÊÔ±¨¸æ/¹¦ÄܲâÊÔ±¨¸æ_Öпھ¶ÅÅÃû×ó¿éɾ³ýÓë7Ô»عéÊÕ¿Ú¼°8ÔÂÀ©ÁÐ_2026-09-08.md
New file
@@ -0,0 +1,32 @@
# åŠŸèƒ½æµ‹è¯•æŠ¥å‘Š_中口径排名左块删除与7月回归收口及8月扩列_2026-09-08
## ä¸€ã€åŠŸèƒ½è¯´æ˜Ž
1. æŒ‰ 2026-09-08 ä¸šåŠ¡æ‹æ¿ï¼ˆã€Šç¡®è®¤å›žæ‰§æ±‡æ€»â€¦ã€‹ç¬¬å…­èŠ‚ç¬¬ 6 æ¡ï¼‰ï¼šåˆ é™¤æ±‡æ€»å¤§è¡¨ `中口径排名` é¡µ r1-20 **左块**(A..H,陈旧当月数据:A=2026-01 å®¢è¿é‡ã€E=2026-02 å‘¨è½¬é‡ï¼Œæ— æœŸæ¬¡æ ‡é¢˜ï¼‰ï¼Œé¡µå†…仅保留两张可见表:r1-20「1-7 æœˆç´¯è®¡ã€ä¸Ž r22-41「7 æœˆå½“月」(均在 J..R)。
2. ç¨‹åºä¾§åŒæ­¥ï¼š`ReportExportService.restoreSummaryMonthlyBlocks` å¯¹ `中口径排名` é¡µ A..H(0-based 0-7 åˆ—)**永不从备份母版回填**,杜绝“母版删了、一生成又复活”。
3. 7 æœˆå›žå½’收口(含排名页左块删除一起验);通过后再扩 8 æœˆæ¯ç‰ˆï¼ˆM0 ç‰ˆå¼é‡å»ºå™¨ v4)。
## äºŒã€æµ‹è¯•环境
- æ¯ç‰ˆï¼š`docs/生成汇总大表/2026å¹´7月道路运输量汇总表.xlsx`(清理后骨架)与 `_备份_2026å¹´7月道路运输量汇总表_清理前_20260904.xlsx`(完整 7 æœˆï¼Œè¿˜åŽŸæºï¼‰ã€‚
- ç”Ÿæˆé“¾è·¯ï¼šåŽç«¯ `mvn spring-boot:run`(8090),接口 `GET /api/report/export/summaryWorkbook?period=2026-07|2026-08&mode=month`。
- æ ¡éªŒå·¥å…·ï¼šopenpyxl å†…容级 diff(data_only=False åŒè¯»ï¼‰ã€`mvn -DskipTests compile`。
## ä¸‰ã€ç”¨ä¾‹è¡¨
| # | ç”¨ä¾‹ | è¾“å…¥/操作 | é¢„期 | å®žé™… | ç»“论 |
|---|---|---|---|---|---|
| 1 | æ¯ç‰ˆåˆ é™¤å·¦å— | 7 æœˆæ¯ç‰ˆ `中口径排名` A1:H20 æ¸…空 + ç§»é™¤ A1:H1/A22:H22 åˆå¹¶ | ä»… J1:R1、J22:R22 ä¿ç•™åˆå¹¶ï¼›A..H r1-20 æ— å†…容 | æ¸… 148 æ ¼ï¼›åˆå¹¶ä»…剩 J1:R1/J22:R22;整簿 diff ä»…此区 | é€šè¿‡ |
| 2 | ç¨‹åºä¸å›žå¡«å·¦å— | åŽç«¯ç”Ÿæˆ 2026-07 æ±‡æ€»è¡¨ï¼ˆèµ°è¿˜åŽŸé€»è¾‘ï¼‰ | ç”Ÿæˆç‰©æŽ’名页无 A..H é™ˆæ—§å— | ç”Ÿæˆç‰© vs å¤‡ä»½æ¯ç‰ˆ diff=179,其中 148=左块删除(预期)、31=日期列 int/float å†™æ³•(显示相同) | é€šè¿‡ |
| 3 | 7 æœˆ M1 æ•°å€¼å›žå½’ | è´§è¿/公交出租轨道/网约/城市汇总/班线包车脚本复跑(库 2026-01~07) | å„页与母版缓存 0 å·®å¼‚ | freight/pax/wyc/urban/mid å…¨ diffs=0 | é€šè¿‡ |
| 4 | Java ç¼–译 | `mvn -q -DskipTests compile` | æ— é”™è¯¯ | exit=0 | é€šè¿‡ |
| 5 | 8 æœˆæ‰©åˆ—(v4) | ä¿®æ­£åŽ 7 æœˆæ•´æœ¬ â†’ 8 æœˆæ¯ç‰ˆ `2026å¹´8月道路运输量汇总表.xlsx` | 8 ä¸ªå°è´¦/合成页 +2 åˆ—(2026å¹´8月/8月同比),累计滚动,2025 å‚照右移 | 8 é¡µ maxCol +2;累计 +Q、同比分母 +AJ;7→8 æœˆæ•°å€¼æ ¼ 2387 ä¸ª 0 å·®å¼‚ | é€šè¿‡ |
| 6 | æ‰©åˆ—版式细节 | æ–° 8 æœˆä¸¤åˆ—表头、隐藏列、排名页 | ä¸¤è¡Œçºµå‘合并表头;隐藏列平移保留;排名页无左块 | Q/R è¡¨å¤´ä¸Ž 15/16 åˆ—同款合并(各页行位正确);隐藏列按 >=17 +2 ä¿ç•™ï¼›æŽ’名页仅 J ç³»åˆå¹¶ | é€šè¿‡ |
| 7 | ç¨‹åºè¯»æ–° 8 æœˆæ¯ç‰ˆ | åŽç«¯ç”Ÿæˆ 2026-08(POI è¯»æ¯ç‰ˆï¼‰ | ä¸æŠ¥ Zip-bomb、输出=母版 | styles.xml æ¯”值 0.0099 è§¦å‘ POI è¯¯æŠ¥â†’`ZipSecureFile.setMinInflateRatio(0.0001)` åŽä¿®å¤ï¼›ç”Ÿæˆç‰©ä¸Ž 8 æœˆæ¯ç‰ˆå†…容 diff=0 | é€šè¿‡ |
## å››ã€å‘现的问题与处置
1. POI Zip-bomb è¯¯æŠ¥ï¼šopenpyxl é‡å†™åŽ styles.xml åŽ‹ç¼©æ¯” 0.009988 < 0.01,POI æ‹’读新版 8 æœˆæ¯ç‰ˆã€‚处置:`exportSummaryWorkbook` è¯»æ¯ç‰ˆå‰ä¸´æ—¶è°ƒä½Žé˜ˆå€¼ï¼ˆ0.0001)并在 finally è¿˜åŽŸï¼Œä»…å½±å“æœ¬æ–¹æ³•è¯»å–å†…éƒ¨æ¨¡æ¿ã€‚
2. åŽ†å²é—ç•™ï¼š8 æœˆç‰ˆå¼åŽŸåž‹ï¼ˆv3 äº§å‡ºï¼‰çš„æ–° 8 æœˆåˆ—无两行合并、隐藏列标记丢失、以“清理前备份”为源会带回排名左块;v4 ä¿®æ­£æºä¸ºâ€œå·²åˆ å·¦å—çš„ 7 æœˆç”Ÿæˆç‰©â€å¹¶è¡¥ä¸¤è¡Œåˆå¹¶ä¸Žéšè—åˆ—平移。
3. æœ¬ç‰ˆ 8 æœˆæ¯ç‰ˆ 2026 ç»„累计公式已滚动至 1-8 æœˆï¼ˆ+Q/+AJ),但 8 æœˆå½“月值仍为空,待 8 æœˆæ•°æ®å¯¼å…¥åŽç”± M2/M3 å¡«å€¼ã€‚
## äº”、结论
- ä¸­å£å¾„排名左块删除在母版与程序生成链路均生效;7 æœˆå›žå½’收口通过(排名页随同验证无左块、其余页与库 0 å·®å¼‚)。
- 8 æœˆæ‰©åˆ—母版已生成并通过程序端到端读取验证,可作为后续 8 æœˆæ•°æ®å¡«å……的母版。
- é—留:M2 SummaryFiller / M3 8 æœˆå®žå¼¹ï¼ˆå¯¼æ•°åŽå¡« 2026-08 å½“月值)、母版缓存校验走 Q1 å£å¾„。
docs/¹¤×÷ÈÕ½á/¹¤×÷ÈÕ½á_2026-09-08.md
@@ -29,3 +29,20 @@
- M2:SummaryFiller å†™å›žå°è´¦é¡µ+成品页,逐格 diff(含排名页左块改“当月 2026-07”的修正验证);
- M3:8 æœˆå®žå¼¹ï¼ˆå…ˆæ‰©åˆ— 2026-08,再导入 8 æœˆæ•°æ®ç”Ÿæˆï¼‰ï¼›
- M4:小表前端隐藏 + å¤‡ä»½è¿˜åŽŸ/清理。
---
## è¡¥å……(2026-09-08 ä¸­åˆï¼ŒåŒä¸€ä¼šè¯ç»­ï¼‰ï¼šä¸­å£å¾„排名左块删除 â†’ 7 æœˆå›žå½’收口 â†’ 8 æœˆæ‰©åˆ—
### ä»Šæ—¥æ–°å¢ž
1. **拍板登记**:《确认回执汇总…》第六节第 6 æ¡â€”—中口径排名页 r1-20 A..H é™ˆæ—§å·¦å—整块删除,程序永不回填;随 7 æœˆæ”¶å£éªŒè¯åŽæ‰© 8 æœˆã€‚
2. **母版删除**:`docs/生成汇总大表/2026å¹´7月道路运输量汇总表.xlsx` çš„ `中口径排名` A1:H20 æ¸…空 148 æ ¼ï¼Œç§»é™¤ A1:H1/A22:H22 ç©ºåˆå¹¶åŒºï¼ˆæ•´ç°¿ diff ä»…此区,改动前副本 `_test_tmp/rankleft_before_202607_mother.xlsx`)。
3. **程序防复活**:`ReportExportService.restoreSummaryMonthlyBlocks` å¯¹ `中口径排名` é¡µ A..H(列 0-7)永不从备份母版回填;另修复 POI Zip-bomb è¯¯è¯»ï¼ˆè¯»æ¯ç‰ˆå‰ä¸´æ—¶æ”¾ä½ŽåŽ‹ç¼©æ¯”é˜ˆå€¼å¹¶ finally è¿˜åŽŸï¼‰ã€‚
4. **7 æœˆå›žå½’收口**:M1 äº”块脚本复跑 diffs=0;程序生成 2026-07 ä¸Žå®Œæ•´ 7 æœˆåŸºå‡† diff ä»…剩左块删除 148 æ ¼ + 31 å¤„日期 int/float å†™æ³•(显示相同)。
5. **8 æœˆæ‰©åˆ—(M0 v4)**:产出新母版 `docs/生成汇总大表/2026å¹´8月道路运输量汇总表.xlsx`(8 ä¸ªå°è´¦/合成页 +2 åˆ—、累计滚动 +Q、同比分母 +AJ、2025 å‚照右移、两行合并表头、隐藏列平移保留、排名页无左块);程序生成 2026-08 = æ–°æ¯ç‰ˆ 0 å·®å¼‚。
### æµ‹è¯•结果摘要
- å…¨éƒ¨ç”¨ä¾‹è§ã€ŠåŠŸèƒ½æµ‹è¯•æŠ¥å‘Š_中口径排名左块删除与7月回归收口及8月扩列_2026-09-08.md》。
- 7→8 æœˆæ•°å€¼æ ¼ 2387 ä¸ª 0 å·®å¼‚;编译 exit=0。
### é—留与下一步
- M2 SummaryFiller、M3 8 æœˆå®žå¼¹ï¼ˆ8 æœˆæ•°æ®å¯¼å…¥åŽå¡«å½“月值与排名)、小表前端隐藏(M4)。
- 8 æœˆæ–°æ¯ç‰ˆçš„ 8 æœˆå½“月值列仍为空,等待数据导入与填值验证。
docs/Éú³É»ã×Ü´ó±í/2026Äê7ÔµÀ·ÔËÊäÁ¿»ã×ܱí.xlsx
Binary files differ
docs/Éú³É»ã×Ü´ó±í/2026Äê7ÔµÀ·ÔËÊäÁ¿»ã×ܱí_7ÔÂÇå¿Õ²âÊÔ°æ.xlsx
Binary files differ
docs/Éú³É»ã×Ü´ó±í/2026Äê7ÔµÀ·ÔËÊäÁ¿»ã×ܱí_7ÔÂÇå¿Õ²âÊÔ°æv2.xlsx
Binary files differ
docs/Éú³É»ã×Ü´ó±í/2026Äê8ÔµÀ·ÔËÊäÁ¿»ã×ܱí.xlsx
Binary files differ
docs/È·ÈÏ»ØÖ´»ã×ÜÓëÊ£ÓàÒÉÎÊ_»ã×Ü´ó±íÊý¾ÝÇý¶¯¸ÄÔì_2026-09-07.md
@@ -67,6 +67,9 @@
4. **8 æœˆæ‰©åˆ—标题格式**:新增“当月值”“同比”两组标题是**两行纵向合并的单元格**(如“2026å¹´8月”与“8月与去年同比”),月度版式重建器/扩列实现须保留该两行合并标题样式,仅插入数据列与同比列、标题随列平移。
5. **实现注意事项(9/8 å®žæµ‹ï¼‰**:母版台账页部分月份单元格以**文本数字**存储(如公交页 2026-06 M åˆ— '4970.63'),程序读母版缓存时须统一做“文本→数值”归一,否则会漏算/漏比对。
6. **中口径排名页“左块”删除(9/9 æ‹æ¿ï¼‰**:`中口径排名` é¡µ r1-20 çš„ A..H é™ˆæ—§å½“月块(A=2026-01 å®¢è¿é‡ã€E=2026-02 å‘¨è½¬é‡ï¼Œæ— æœŸæ¬¡æ ‡é¢˜ï¼‰**整块删除**,不再按 M2“改当月 2026-07 é‡ç®—修正”处理;页内仅保留两张可见表:r1-20「1-7 æœˆç´¯è®¡ã€ä¸Ž r22-41「7 æœˆå½“月」(均在 J..R,含市州列)。同时移除 A1:H1、A22:H22 ä¸¤ä¸ªç©ºæ ‡é¢˜æ®‹ç•™åˆå¹¶åŒºï¼›A..I ä»ä¸ºéšè—ç©ºåˆ—。程序侧:`restoreSummaryMonthlyBlocks` å¯¹ `中口径排名` é¡µ **A..H(0-based 0-7 åˆ—)永不从备份母版回填**,避免“母版删了、一生成又复活”。该删除随 **7 æœˆå›žå½’收口一并验证**(含排名页/分析页/台账页与库 0 å·®å¼‚),通过后再扩 8 æœˆã€‚
   ï¼ˆ2026-09-08 å·²æ‰§è¡Œå¹¶éªŒè¯ï¼šæ¯ç‰ˆåˆ é™¤+程序排除+7 æœˆæ”¶å£+8 æœˆæ‰©åˆ—母版,详见《功能测试报告_中口径排名左块删除与7月回归收口及8月扩列_2026-09-08.md》)
## ä¸ƒã€å·¥ä½œçºªå¾‹ï¼ˆè‡ª 2026-09-08 èµ·ï¼‰
- ä»¥æœ¬ã€Šç¡®è®¤å›žæ‰§æ±‡æ€»â€¦ã€‹æ–‡æ¡£ä¸ºå”¯ä¸€å†³ç­–基线;凡已在 A1-E3 / Q1-Q3 / æœ¬è¡¨ç¡®è®¤è¿‡çš„口径,直接执行,不再重复提问。
- åªå°±æ–‡æ¡£æœªè¦†ç›–的新决策向用户提问。
traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java
@@ -44,6 +44,7 @@
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.openxml4j.util.ZipSecureFile;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.STCellType;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
@@ -3213,6 +3214,8 @@
        if (template == null) {
            throw new RuntimeException("未找到汇总表母版《" + year + "å¹´" + month + "月道路运输量汇总表.xlsx》(docs/生成汇总大表)");
        }
        double savedZipRatio = ZipSecureFile.getMinInflateRatio();
        ZipSecureFile.setMinInflateRatio(0.0001); // æ–°ç‰ˆæ¯ç‰ˆ styles.xml ç”± openpyxl é«˜åŽ‹ç¼©ï¼ˆ0.0099<0.01)触发 POI Zip-bomb è¯¯æŠ¥ï¼Œè¯»å–后还原
        try (InputStream in = new FileInputStream(template);
             XSSFWorkbook wb = new XSSFWorkbook(in)) {
            File donor = resolveSummaryDonor(year, month);
@@ -3233,6 +3236,8 @@
            if (!wb.getCTWorkbook().isSetCalcPr()) wb.getCTWorkbook().addNewCalcPr();
            wb.getCTWorkbook().getCalcPr().setFullCalcOnLoad(true); // è¿˜åŽŸ/改写公式后打开即重算
            return toBytes(wb);
        } finally {
            ZipSecureFile.setMinInflateRatio(savedZipRatio);
        }
    }
@@ -3526,12 +3531,15 @@
            if (ds == null) continue;
            Sheet bs = wb.getSheet(ds.getSheetName());
            if (bs == null) continue;
            // ä¸­å£å¾„排名页 A..H é™ˆæ—§å·¦å—已于 2026-09-09 æ‹æ¿æ•´å—删除:该区域永不从备份母版回填,避免“生成又复活”
            boolean skipMidRankLeftBlock = "中口径排名".equals(ds.getSheetName());
            for (int r = ds.getFirstRowNum(); r <= ds.getLastRowNum(); r++) {
                Row dr = ds.getRow(r);
                if (dr == null) continue;
                Row br = bs.getRow(r);
                for (Cell dc : dr) {
                    if (dc == null) continue;
                    if (skipMidRankLeftBlock && dc.getColumnIndex() < 8) continue;
                    CellType t = dc.getCellType();
                    if (t == CellType.BLANK) continue;
                    String dtx = summaryCellText(dc);