本文覆盖 2026-09-18 夜间~2026-09-19 凌晨的 6 项改动(中口径排名同比、网约车分摊回落、两张投资明细表、导入界面隐藏网约车订单、投资市州单表取列定位修复、8 月投资源数据补齐)。
markMid/midMonthHas/midCumHitMonths),loadMidClassMap() 用 passengerVolume - passengerCity 兜底跨县公交口径,midIssues 并 log.warn(不再静默 continue)。WycSplitCalc.loadMonthlyInputFromDb() 在某月 pin 缺失或 ≤0 时回落 wyc_total_monthly,source 标 db+wyc_total。/export/investPassengerDetail、/export/investLogisticsDetail。DataImport.vue 该类型置 hidden: true,入口/概览/清空三处下拉统一走 typeList() 过滤。DataImportService.findInvestHeader):表头行+3** 改为**「表头块」**:上界 = 首个真实数据行 − 1(硬上限 +12 行);desc = stage + 1 兜底(省标「项目建设阶段、进度情况」为 L/M 合并表头,部分市州只写 L 标题);合计/总计/小计 判定改为**去空白后**匹配(原 nt.contains("合计") 漏掉「合 计」)。docs\投资\输入\客运(客运站)\8月(9 个文件)、物流(物流园区)\8月(16 个文件),并重新导入。| 项 | 值 |
|---|---|
| 日期 | 2026-09-19(00:0x–01:0x) |
| 后端 | Spring Boot 8090(重启加载新代码,Started TrafficAuditApplication) |
| 前端 | Vue 8080(App running at) |
| 数据库 | MySQL 127.0.0.1:3308 traffic_audit |
| 源数据 | D:\桌面\测试数据\投资\八月源数据\{客运,物流} → 复制到 docs\投资\输入\...\8月 |
| 对照定稿 | D:\桌面\测试数据\投资\8月客运站投资明细表.xlsx、8月物流站场投资明细.xls |
| 报表期 | 2026-08(mode=month) |
| 入口 | POST /api/import/investCityBatch?period=2026-08&category=客运站场\|物流园区 |
| 编号 | 用例 | 输入 | 预期 | 实际 | 结论 |
|---|---|---|---|---|---|
| T01 | 咸宁客运「形象进度」取列(正向) | 2026年8月咸宁市客运站场投资统计月报表(1)省表.xls(L/M 标题在第 8 行,表头在第 4 行) |
M 列(形象进度)应被定位 | 库内 progress_desc 非空 0 → 7/9 行(另 2 行源文件本身为空) |
✅ 通过 |
| T02 | 宜昌客运「建设阶段/形象进度」取列(正向) | 湖北省宜昌市道路客运站场投资报表(月、年报)08月.xls(L/M 标题在第 5 行,首行数据在第 7 行) |
L=建设阶段、M=形象进度;不得被判成「竣工时间」列 | 修复前 stage 0 / desc 0 → 修复后 5/5 与 5/5(旧实现把首行数据的「竣工收尾/建成投运」当表头文本,命中「竣工/建成」分支) | ✅ 通过 |
| T03 | 物流合并表头「形象进度」兜底(正向) | 孝感 / 恩施 / 随州物流明细表(只在 L 写「项目建设阶段、进度情况」,M 直接写进度文字) | 应识别 M 列为形象进度 | desc 非空 0 → 孝感 7/7、恩施 4/6、随州 2/2(恩施另 2 行为「建成」、源文件 M 本身为空) | ✅ 通过 |
| T04 | 已正确市州回归 | 十堰/恩施/襄阳/荆门/武汉/林区客运 + 黄冈/咸宁/荆州/荆门/宜昌/襄阳/黄石物流等 | 取列与数值不变 | 逐项一致:十堰客运 4/4、恩施客运 6/6、襄阳客运 6/6、咸宁物流 9/9、荆州物流 9/9、荆门物流 8/8、宜昌物流 13/13 | ✅ 通过 |
| T05 | 合计行不得入库(负向) | 咸宁客运源文件含「合 计」行(多个空格) | 合计行被跳过 | 修复前入 40 行(含 1 条名为「合 计」的假项目)→ 修复后 39 行,假项目已消除 | ✅ 通过 |
| T06 | 入库数值抽查(与源文件逐项对齐) | 孝感物流 7 行 / 恩施物流 6 行 | 项目行求和 = 源文件市州小计行 | 孝感 H/J/K = 160378 / 116414 / 13784、恩施 = 126741 / 41574 / 2116,与源文件「 分项目投资完成情况」市州行逐项一致 | ✅ 通过 |
| T07 | 客运站投资明细表回归 | 导出 vs 8月客运站投资明细表.xlsx |
与修复前不劣化 | 汇总页 0 差异;明细页 6 处(修复前 5 处,新增的 1 处为咸宁 M85,程序按源文件写入而定稿留空,属「更完整」) | ✅ 通过 |
| T08 | 物流站场投资明细表回归 | 导出 vs 8月物流站场投资明细.xls |
与修复前不劣化 | 三页数值与修复前一致,仅新增孝感/恩施/随州形象进度;差异仍集中在武汉/十堰/荆州/天门 4 市州(见「遗留」) | ✅ 通过 |
| T09 | 中口径排名同比 | passengerMidRank(2026-08) |
与定稿一致 | 全省 5.81%、武汉 4.65%、仙桃 17.23%、林区 −34.87%,与定稿一致;黄石 7.76、十堰 2.52、宜昌 −16.17、襄阳 5.67、荆州 36.62、黄冈 7.74、咸宁 17.06、恩施 13.92、潜江 −2.84、天门 9.01(与定稿差 0.02~0.5 个百分点) | ✅ 通过 |
| T10 | 中口径明细同比 | passengerMidDetail(2026-08) |
不再出现数量级错误 | 公交行累计同比 −28577% → +13.15%、出租 +8.54%、网约车 +75.66% | ✅ 通过 |
| T11 | 导入界面隐藏网约车订单 | DataImport.vue |
入口/概览/清空三处均不可见 | wycOrder 置 hidden: true,三处 v-for 统一改用 typeList(g) |
✅ 通过 |
| T12 | 报表生成新增两张投资明细表 | ReportExport.vue |
投资报表组可导出并正确命名 | 新增两项,fileNameOf() 把「X月」替换为报表期月份(→生成_8月客运站投资明细表.xlsx、生成_8月物流站场投资明细.xls) |
✅ 通过 |
| T13 | 幂等/确定性 | 同一批源文件连续导入两次 | 行数与数值一致 | 客运 39 行、物流 128 行;两次结果完全一致 | ✅ 通过 |
| T14 | 编译回归 | mvn -q -DskipTests compile |
编译通过 | exit=0 | ✅ 通过 |
| 编号 | 问题 | 根因 | 处置 |
|---|---|---|---|
| P01 | 宜昌客运「建设阶段/形象进度」全空 | 表头扫描窗口固定 表头行+3,把**首行数据**纳入列名文本,数据里的「竣工收尾/建成投运」先命中「竣工/建成」分支 |
扫描上界改为「表头块」= 首个真实数据行 − 1,数据行不再参与列名匹配 |
| P02 | 咸宁客运「形象进度」全空 | L/M 标题写在表头下第 4 行,超出 +3 窗口 |
同上(上界扩展到硬上限 +12 行且不越过数据行) |
| P03 | 物流孝感/恩施/随州「形象进度」全空 | 省标「项目建设阶段、进度情况」是 L/M 合并表头,这些市州只在 L 写标题 | 新增 desc = stage + 1 兜底(与既有 startcum+2、yearcum+1 兜底风格一致) |
| P04 | 「合 计」行被当成项目入库 | nt.contains("合计") 不识别内部空格 |
合计/总计/小计判定统一改为去空白后匹配(解析循环 + 行数统计 + 首数据行探测三处同步) |
| P05 | 襄阳 H50/J50 生成 202.9565、定稿 203 | 源文件即 202.9565,定稿为人工取整 | 按用户「保留程序算出的数(更完整)」保留 202.9565,不改程序 |
| P06 | 咸宁 L91 建设阶段:生成(母版)「暂停施工」、定稿「在建」 | 用户已确认 L 建设阶段不动母版 | 程序不写 L 列,保持母版值 |
| P07 | 竹山 M26、咸宁 M85、林区 M116 与定稿不同 | 定稿留空或写法不同(如「建成投产」vs「建成投产。」) | 程序按源文件写入,比定稿更完整,保留 |
WycSplitCalc 武汉分母处理),未擅自调整,待确认。本轮 14 条用例全部通过:投资市州单表的「表头取列定位」缺陷(P01–P04)已修复并回归验证,
8 月客运/物流源数据已补齐入库且与源文件小计逐项对齐;
新增的两张投资明细表导出正常(汇总页 0 差异);
中口径排名/明细同比口径修复后与定稿一致;
导入界面隐藏、报表项新增均按确认口径落地。
剩余差异均为**数据源缺口或母版手工口径**,不属于程序缺陷(见第五节)。