# 功能测试报告:汇总大表 1-6 月生成 + 1-7 月扩列(2026-09-04) ## 一、功能说明 - 目标:验证《道路运输量汇总表》生成程序可产出两本产物—— 1. **1-7 月扩列**(`period=2026-07`):以“1-4 月骨架”母版为底、按同期备份母版还原月度块,得到 1-7 月完整工作簿; 2. **1-6 月生成**(`period=2026-07&toMonth=6`):在上述 1-7 内容基础上,把 8 个台账/合成页裁剪到 6 月—— - 7 月当月值列(O)、7 月同比列(P)的**数据格清空,表头保留**(用户拍板口径 ①); - 累计公式(Q)去掉 7 月项,累计同比公式(R)分母去掉 2025 年 7 月列(=2025 年 1-6 月,用户拍板口径 ②)。 - 代码改动: - `ReportExportService.exportSummaryWorkbook(period, mode, toMonth)`:新增可选 `toMonth` 裁剪; - 新增 `trimSummaryMonthlySheets(wb, keepMonths)`:只处理 8 个台账/合成页(` 货运`、班线包车、城市客运、公交、出租、网约车、轨道、轮渡、中口径明细),按“含累计公式且任一 2026 月度值列非空”识别数据行; - `ReportExportController /export/summaryWorkbook` 增加可选参数 `toMonth`。 - 产物(程序实际 HTTP 生成,非手工改表): - `docs/生成汇总大表/输出/道路运输量汇总表_2026-07.xlsx`(921,070 B) - `docs/生成汇总大表/输出/道路运输量汇总表_2026-06.xlsx`(912,980 B) ## 二、测试环境 - 后端 Spring Boot 8090(`mvn spring-boot:run` 实跑,本机 MySQL 127.0.0.1:3308/traffic_audit); - 母版:`docs/生成汇总大表/2026年7月道路运输量汇总表.xlsx`(1-4 月骨架,工作区未提交版); - 备份母版(逐格对照基准):`docs/生成汇总大表/_备份_2026年7月道路运输量汇总表_清理前_20260904.xlsx`; - 校验脚本:逐格比较单元格原文(公式含 `=`、值、文本),数值按 int/float 等价归一化。 ## 三、用例与结果 | # | 用例 | 输入 | 预期 | 实际 | 结论 | |---|---|---|---|---|---| | 1 | 1-7 月扩列 | GET `/api/report/export/summaryWorkbook?period=2026-07&mode=month` | 与备份母版全簿逐格一致 | 真差异=0 | 通过 | | 2 | 1-6 月生成(正向) | 同上追加 `&toMonth=6` | 非裁剪范围(非 8 台账页 + 8 台账页 A..N 等)与备份一致;仅 O/P/Q/R 按规则变化 | 非白名单真差异=0 | 通过 | | 3 | 7 月两列清空/表头保留 | 8 台账页数据行 O/P | 数据格空、表头行 O/P 保留 | 数据格清空 1132,表头保留 24,表头异常 0 | 通过 | | 4 | 累计按 1-6 月 | 数据行 Q 列公式 | 去掉 `+O{行}` | 改写 566 处,例:`=C5+E5+...+O5`→`=C5+...+M5` | 通过 | | 5 | 累计同比分母=2025 1-6 月 | 数据行 R 列公式 | 去掉 `,AF{行}`/`+AF{行}` | 改写 566 处,例:`=Q5/SUM(T5..AF5)-1`→`=Q5/SUM(T5..AD5)-1` | 通过 | | 6 | 抽查关键格 | 货运/中口径明细 O/P/Q/R | 表头见文、数据行 O/P 空 | 07 数据行 O=3754.7823(7 月值),06 同格为空;表头一致 | 通过 | | 7 | 负向/边界 | `toMonth` 缺省或 ≥7 | 行为与旧版一致(全簿还原) | 同用例 1,真差异 0 | 通过 | ## 四、实现中发现并处置的问题 1. **POI 行号 0-based vs 公式 1-based**:初版按行索引拼接 `+O4`,匹配不上公式里的 `O5`,导致 Q/R 未改写(仅清空生效)。处置:token 行号改 `excelRow = r + 1`。 2. **2025 同月列 0-based 索引错 1**:分母列 T..AF 的 0-based 起点是 19(T),误用 20 会算出 AG(列号越 1 列),R 公式匹配不到。处置:`lastCol = 19 + 2*(m-1)`。 3. 两处修复后均重新 `mvn compile` + 重启后端复测通过(最终产物为修复后代码生成)。 ## 五、边界与已知项(本次未纳入) - **成品聚合页**(货运量排名、货运周转量排名、中口径排名、中口径分析、城市汇总、城市分市州、道路运输周转量)的单元格为**人工母版静态值(1-7 月累计口径)**,本次裁剪不触及;要随“1-6 月”自动重算需走 P2-P5 数据驱动填充(另排期)。 - 2025/2024 参考列保留母版缓存值,未改(已确认口径)。 - 隐藏页(公路总客运、2025年城市客运量、中口径客运量、中口径计算过程)未纳入裁剪,保持原样。 ## 六、结论 “先生成 1-6 月、1-7 月扩列”两本产物经程序实际生成并通过逐格对照:1-7 月产物与备份母版零差异;1-6 月产物在 8 个台账/合成页正确执行“7 月两列留空(表头保留)、累计/同比按 1-6 月”的口径,其余范围零差异。P0 项可关闭,剩余成品聚合页数据驱动重算(P2-P5)单列跟进。