# 功能测试报告_汇总表排名页刷新与同比百分数_2026-09-11 ## 一、功能说明 用户反馈《道路运输量汇总表》两个问题:**1. 所有排名表里面的数据没有更新;2. 同比应该是百分数而不是小数**。本轮定位并修复: ### 1. 排名页数据刷新(问题 1) - 现象:汇总大表母版 `2026年8月道路运输量汇总表.xlsx` 里的 `货运量排名` / `货运周转量排名` / `中口径排名` 三页是**上一报表期的静态值**(标题写「2026年1-7月 / 2026年7月」,数值也是 7 月),导出 8 月时整页不随数据变化。 - 处置:导出链路新增 `refreshSummaryRankSheets`,用程序自己的独立排名表(`生成_货运量排名.xlsx` / `生成_周转量排名.xlsx` / `生成_中口径排名.xlsx`,与用户日常核对口径一致)刷新这三页: - 数值格搬数值;源侧是公式的(RANK/占比等)按目标块偏移整体平移后写成公式(打开时按汇总表自身数据重算);目标格本身已是公式的(母版 SUM/RANK/占比)保留不动; - 块标题随报表期同步(`2026年1-7月…` → `2026年1-8月…`、`2026年7月…` → `2026年8月…`)。 ### 2. 同比列显示成小数(问题 2) - 现象:母版把新月份(8 月)的同比列做成了「普通数值 `0.00`」格式,而 7 月及以前的同比列是 `0.00%`;回填公式后 8 月同比显示成 `-0.0294` 这样的小数。 - 处置:`SummaryWorkbookFiller.ensureMonthYoyFormulas` 原来只在目标格为空时套用上月同比列样式,改为**无条件沿用上月同比列样式**(`0.00%`)。 ### 改动文件 - `traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java`:新增 `refreshSummaryRankSheets` / `copyRankValues` / `rankCell` / `shiftFormula`,在 `ensureMonthFormulas` 之后、`applySummaryReferenceLayout` 之前调用。 - `traffic-audit-server/src/main/java/com/trafficaudit/reportexport/calc/SummaryWorkbookFiller.java`:`ensureMonthYoyFormulas` 样式沿用。 ## 二、测试环境 - 后端 `http://localhost:8090`(`start-dev.ps1` 启动),导出接口 `GET /api/report/export/summaryWorkbook?period=YYYY-MM`。 - 母版:`docs/生成汇总大表/2026年8月道路运输量汇总表.xlsx`;版式参照:`docs/生成汇总大表/生成_道路运输量汇总表.xlsx`。 - 独立排名表底稿:`docs/货运/生成_货运量排名.xlsx`、`docs/货运/生成_周转量排名.xlsx`、`docs/公路旅客/生成_中口径排名.xlsx`。 - 测试时间:2026-09-11;测试产物:`_gen2_2026-08.xlsx`、`_gen2_2026-07.xlsx`、`_v2_freight_rank.xlsx`、`_v2_turnover_rank.xlsx`、`_v2_mid_rank.xlsx`。 ## 三、用例表 ### 3.1 正向用例 | 编号 | 输入 | 预期 | 实际 | 结论 | | --- | --- | --- | --- | --- | | TC-1 | 导出 `period=2026-08` | HTTP 200,正常产出文件 | 949,956 字节,23.8 秒返回 | 通过 | | TC-2 | 后端回填日志 | 有排名页刷新统计、无缺数提示 | 写入当月值格数=1659,补写当月同比公式格数=600,补写当月合计公式格数=43,**刷新排名页数值格数=711**,对齐列宽列数=422,缺数提示=[] | 通过 | | TC-3 | 货运量排名块标题 | 随报表期改为 1-8 月/8 月 | `A1=2026年1-8月全省分市州累计完成公路货运量情况`;`A22=2026年8月全省分市州完成公路货运量情况` | 通过 | | TC-4 | 货运周转量排名块标题 | 同上 | `A2=…2026年1-8月…`;`A24=…2026年8月…` | 通过 | | TC-5 | 中口径排名块标题 | 同上 | `J1=2026年1-8月全省分市州累计完成道路客运生产情况`;`J22=2026年8月…` | 通过 | | TC-6 | 标题落盘方式(原始 XML 校验) | `` 与显示一致(不能再出现 `` 新值 + `` 旧值) | `xl/worksheets/sheet2.xml`:`0`,共享串 0 = `2026年1-8月…`(旧文件是 inlineStr,``=8月、``=7月) | 通过 | | TC-7 | 货运量排名逐格入库抽查(与独立排名表比对) | 全块一致 | 累计块 + 当月块共 **454 格逐个比对,0 处不一致** | 通过 | | TC-8 | 货运周转量排名当月块抽查 | 与独立表一致 | 武汉 B28=192320.5226(源 B27)、G28=504369.61288609065(源 G27)、E28=0.3334642531154999(源 E27)、J28=-0.021161120884320206(源 J27) | 通过 | | TC-9 | 货运周转量排名母版公式保留 | 不写死值,保留 SUM/RANK/占比 | 全省 B27=`=SUM(B28:B44)`;武汉 C28=`=RANK(B28,B$28:B$44)`、D28=`=B28/B$27` | 通过 | | TC-10 | 中口径排名数值抽查 | 与独立表一致 | K4=2759.8855(源 B4)、O4=152330.9312(源 F4)、K25=349.536(源 L4)、O25=18917.1637(源 P4) | 通过 | | TC-11 | 中口径排名「增速排名」列 | 不再是静态怪值,且与页内同比自洽 | 由静态值(多行同为 1.0)改为 `=RANK(M4,M$4:M$20)`、`=RANK(M25,M$25:M$41)` 等自洽公式;缓存值与母版原值一致(L25=5、N25=10、P25=2、R25=5) | 通过 | | TC-12 | 8 月同比列格式(问题 2) | 百分数 `0.00%` | 货运 R5=`=Q5/AJ5-1` / `0.00%`;班线包车、城市客运、公交、出租、网约车、轨道轮渡、中口径明细 8 月同比列(R 列)**全部 `0.00%`** | 通过 | | TC-13 | 排名页同比列格式 | 百分数 `0.00%` | 货运量排名 E4=-0.0763 / `0.00%`、D5=0.3207… / `0.00%`;货运周转量排名、中口径排名同比列同为 `0.00%` | 通过 | | TC-14 | 打开即重算 | 仍带全量重算标记 | `` 保留 | 通过 | ### 3.2 负向用例 | 编号 | 输入 | 预期 | 实际 | 结论 | | --- | --- | --- | --- | --- | | TC-N1 | 全表扫描「表头含同比 + 数值/公式 + 格式非百分数」的格 | 不应有新引入的小数同比 | 8 月件命中 3 格,全部在隐藏页(`2025年城市客运量!E13`、`中口径计算过程!G85/G86`),母版同位置同样如此 | 通过(非本轮引入) | | TC-N2 | 独立排名表源侧同比为空时(库中无 2025 年中口径数据) | 不应把 POI 对空值的求值结果(全为 1)搬进汇总表 | 改为写公式后,该列为 `=RANK(…)` 公式,按页内同比取值,不再是 17 行全 1 | 通过 | | TC-N3 | 调试日志清理 | 导出日志不应残留 `RANKDBG` | `backend.log` 中 `RANKDBG` 计数 = 0 | 通过 | ### 3.3 历史月回归(2026-07) | 编号 | 输入 | 预期 | 实际 | 结论 | | --- | --- | --- | --- | --- | | TC-R1 | 导出 `period=2026-07` | 正常产出、当月同比仍指向 2025 年 7 月 | 941,903 字节;货运 P5=`=O5/AF5-1` / `0.00%` | 通过 | | TC-R2 | 与改动前 7 月产物(`_gen_2026-07.xlsx`)逐格 diff | 差异仅限被刷新的排名页 | 仅 `货运量排名` 51 格、`中口径排名` 133 格有差异(排名页由静态值改为按数据刷新,属预期);其余 16 页 0 差异 | 通过 | | TC-R3 | 7 月排名页标题 | 仍为 1-7 月/7 月(按报表期) | `A1=2026年1-7月…`、`A22=2026年7月…`;中口径 `J22=2026年7月…` | 通过 | | TC-R4 | 7 月同比格式 | 无新增小数同比 | 全表命中 3 格,均为隐藏页母版原有格 | 通过 | ## 四、发现的问题与处置 1. **排名页标题改了但 Excel 仍显示旧月份**:母版标题单元格是 `inlineStr`,POI 在 `t="inlineStr"` 单元格上 `setCellValue(String)` 只写 ``、不动 ``,而 Excel/WPS 优先读 ``。处置:写值前先 `setBlank()` 清掉原单元格再写(落盘为共享串,`` 不再残留旧文案)。 2. **POI 求值口径偏差**:源独立排名表里手工留空的同比会让 `RANK` 函数求值一律返回 1,直接搬值会把 17 行「增速排名」写成全 1。处置:源侧公式不再搬求值结果,而是按目标块偏移平移成公式写入,再用汇总表自身数据求值缓存。 3. **中口径排名同比列仍为母版旧值**:库中只有 2026-01~08 的客运数据(`h2031_enterprise_monthly` / `city_bus_monthly`),没有 2025 定稿数据,独立排名表算不出中口径同比 → 该列按设计保留母版值;等 2025 数据入库后随导出自动刷新。 4. **静态页待办**:`城市汇总`、`城市分市州`、`中口径分析`、`道路运输周转量` 四页在母版里是整页静态(本轮导出与母版逐格 0 差异),页标题仍写「1-7 月 / 7 月」。因整页数据未数据驱动,本轮**未**只改标题(避免标题 8 月、数据 7 月),留待后续做成数据驱动时一并处理。 ## 五、结论 - 用户反馈的两个问题均已修复并验证:三张排名页的标题与数值随报表期刷新(货运量排名 454 格逐格比对 0 差异),8 月同比列统一为百分数显示。 - 2026-08 / 2026-07 双期导出通过,7 月历史月回归差异仅限被刷新的排名页,无副作用。 - 遗留:中口径同比待 2025 年数据入库;四张静态成品页待数据驱动改造。