目标:让「中口径」在系统各处使用同一套口径与同一套源数据,消除「同一指标在不同页/不同导出件里对不上」的问题。
中口径定义(4 维,2026-09-18 起统一)
| 维度 | 含义 | 数据来源 |
|---|---|---|
| 1 | 公路班线客运 | h2031_enterprise_monthly(企业月报)+ passenger_individual_monthly(个体月报) |
| 2 | 城际城乡公交 | city_bus_monthly 的 passenger_chengxiang / turnover_chengxiang |
| 3 | 城际城乡巡游出租 | city_taxi_monthly:总量 − 城市内(passenger_volume - passenger_city,周转量同法) |
| 4 | 城际城乡网约车 | WycSplitCalc(订单 + 全省 pin + 巡游出租拆分):总量 − 城市内 |
loadMidClassMap 的维度 0);region_code='420000' 的全省行,该口径 1-8 月比 Σ市州多 3042.75,属业务待核项);本次改动文件:traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java
loadMidClassMap():补维度 3(巡游出租城乡)、维度 4(网约车城乡),新增 midPeriodKey();fillMidCell():去掉「出租/网约车写死 0」旁路,四维统一取库内值;fillMidYoyCell() / fillMidCumYoyColumn():同比由「只算前两维」改为四维齐全;exportPassengerMidDetail():由「只处理公式格」改为「按列遍历」,扩列出来的 7~12 月空格才填得上;扩列月份的总行值列由库内四维合计直接写入;重算改用逐格容错的 recalcWorkbookFormulas()(原 evaluateAll() 会在跨簿公式处整本中断,累计列拿不到新缓存值)。start-dev.ps1 重启,PID 11772)、前端 8080(复用已在运行实例);数据库 traffic_audit(127.0.0.1:3308);报表期 2026-08,mode=month。/api/report/export/summaryWorkbook、/api/report/export/passengerMidDetail、/api/report/export/passengerMidRank。_tmp/_qa_out/step3c_summary.xlsx、step3c_midDetail.xlsx、step3c_midRank.xlsx、chk_step3c2.txt、chk_step3c3.txt、cmp_step3bc.txt(本轮);step3b_*.xlsx(改动前基线)。| # | 类型 | 用例 | 预期 | 实际 | 结论 |
|---|---|---|---|---|---|
| 1 | 正向 | 独立《生成_中口径明细》全省 8 月总行(Q5) | = 四维合计 4003.57(原为空) | 4003.5701 | 通过 |
| 2 | 正向 | 独立件全省 7 月总行(O5) | = 4028.3213(原为空) | 4028.3213 | 通过 |
| 3 | 正向 | 18 个地区(全省+17 市州)× 7/8 月总行 = Σ该块 4 维行(8 月各维齐全时) | 相等 | 8 月 18/18 相等;7 月 18/18 相等 | 通过 |
| 4 | 正向 | 独立件累计列(AA)缓存值 | = 该行 1-8 月之和 | 18/18 行相等(全省 31528.0607,武汉 2759.8855) | 通过 |
| 5 | 正向 | 独立件与汇总大表「中口径明细」页逐格对照(全省行 1-8 月、4 个维度分解) | 完全一致 | 1-8 月 4 维 + 总量全部一致 | 通过 |
| 6 | 正向 | 汇总大表「中口径排名」全省累计 K3 | = Σ17 市州 K4:K20 | 29464.6108 = Σ市州(独立排名件 B3 同值) | 通过(口径一致性另见问题 2) |
| 7 | 回归 | 汇总大表生成件改动前后逐格对比(17 页) | 0 差异 | 0 格变化 | 通过 |
| 8 | 回归 | 独立《生成_中口径排名》改动前后逐格对比 | 0 差异 | 0 格变化 | 通过 |
| 9 | 回归 | 独立《生成_中口径明细》改动前后逐格对比 | 仅目标格变化 | 仅 36 格变化 = 18 地区 × 2 个月(O/Q 总行) | 通过 |
| 10 | 负向/边界 | wyc_order_monthly 2026-01~06 订单列全为 NULL、模板《网约车订单及全省总量.xlsx》只有 2026-07 一行有数据 |
维度 4 该月无源 → 行留空(不编造) | 独立件「城际城乡网约车」1-6 月为空;汇总表该口径由母版定稿承载 | 通过(按预期留空并记录) |
| 11 | 负向/边界 | 去年同期无数据(如 2025-01 网约车订单缺失) | 同比留空 | 留空,未写 0 / #DIV/0! | 通过 |
| 12 | 负向/边界 | 缺模板文件 | 抛「未找到模板文件」并写入后端日志 | 未触发(模板齐全) | 不适用 |
入库抽查(报表期 2026-08,与源表逐项对齐)
| 抽查项 | 库内值 | 生成件值 | 结论 |
|---|---|---|---|
city_bus_monthly 8 月 17 市州合计 |
12315.37 | 中口径维度 2 = 1436.63(城际城乡口径,非合计口径) | 口径不同,非同一指标 |
city_taxi_monthly 8 月城际城乡差(荆州 100.94 / 孝感 73.90 / 恩施 53.54 / 襄阳 49.84 / 宜昌 46.81 / 武汉 0) |
Σ = 493.90 | 维度 3 全省 = 493.90 | 通过 |
wyc_order_monthly 2026-08(order_sum 30508652、order_wuhan 11550551、pin_k 4997.74) |
— | 维度 4 全省 = 426.56 | 通过 |
keepCached 等于把格子清空;evaluateAll() 又在跨簿公式处整本中断,累计列得不到新值。loadMidClassMap() 现算(1-6 月网约车无源 → 少一块,且 2025 年基线也只有库内口径);中口径明细页走的是母版公式链 + 定稿缓存值。=公交!C13-公交!C15(应分别指向 出租!、网约车!),城市级恒为 0;而全省行 R8/R9 靠母版缓存值给出真实数(535.83 / 333.39),二者不自洽。wyc_order_monthly 2026-01~06 仅有 pin_*,order_* 全 NULL;模板文件也只有 2026-07 一行有数据 → 维度 4 的 1-6 月无源。本次改动把「中口径」从 2 维(班线+公交)统一为 4 维,并修掉了独立《生成_中口径明细》扩列月份总行为空、累计停在上一期的问题;已验证 12 条用例(6 正向 / 3 回归 / 3 负向边界)全部通过,汇总大表 17 页与《生成_中口径排名》零回归。
仍待处理:排名件与明细件的口径归一(问题 2,需业务/方案确认)、母版中口径明细城市级公式引错页(问题 3)、网约车 1-6 月订单数据缺口(问题 4)。