# 功能测试报告_投资明细表与导入取列定位修复_2026-09-19 > 本文覆盖 2026-09-18 夜间~2026-09-19 凌晨的 6 项改动(中口径排名同比、网约车分摊回落、两张投资明细表、导入界面隐藏网约车订单、投资市州单表取列定位修复、8 月投资源数据补齐)。 ## 一、功能说明 1. **中口径排名/明细同比口径修复(B1/B3/B5)**:原实现用「去年该月值是否为 0」判断数据是否存在,导致 - 武汉巡游出租城际/城乡业务上年恒为 0 → 同比被误判为「无基期」; - 去年缺月时被当作 0 参与计算 → 同比虚高(公交行一度出现 −28577%)。 现改为 **按「源表是否有该行」登记存在性**(`markMid`/`midMonthHas`/`midCumHitMonths`), 去年缺任一月则同比留空;同时 `loadMidClassMap()` 用 `passengerVolume - passengerCity` 兜底跨县公交口径, 解析异常改为记入 `midIssues` 并 `log.warn`(不再静默 `continue`)。 2. **网约车 2025 分摊回落(B2)**:`WycSplitCalc.loadMonthlyInputFromDb()` 在某月 pin 缺失或 ≤0 时回落 `wyc_total_monthly`,`source` 标 `db+wyc_total`。 3. **新增两张投资明细表导出**:`/export/investPassengerDetail`、`/export/investLogisticsDetail`。 口径(用户 2026-09-18 确认):只覆盖 **H 自开始建设累计 / J 自年初累计 / K 本月完成 / M 形象进度**; I 本年计划投资、L 建设阶段、G 计划总投资不动母版;库内为空保留母版原值。 物流表额外按表内数值重算渠道行/市州行/合计行,并刷新「分市州规划内外项目完成情况」「市州汇总」(渠道小计保留程序算出的数)。 4. **导入界面隐藏「网约车订单及全省总量」**:`DataImport.vue` 该类型置 `hidden: true`,入口/概览/清空三处下拉统一走 `typeList()` 过滤。 5. **投资市州单表「表头取列定位」修复**(本轮核心,`DataImportService.findInvestHeader`): - 表头文本扫描上界由**固定 `表头行+3`** 改为**「表头块」**:上界 = 首个真实数据行 − 1(硬上限 +12 行); - 新增「建设进展」关键词映射到形象进度列; - 新增 `desc = stage + 1` 兜底(省标「项目建设阶段、进度情况」为 L/M 合并表头,部分市州只写 L 标题); - `合计/总计/小计` 判定改为**去空白后**匹配(原 `nt.contains("合计")` 漏掉「合   计」)。 6. **补齐 2026-08 投资源数据**:`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「建成投产。」) | 程序按源文件写入,比定稿更完整,保留 | ## 五、遗留问题(需业务/用户确认后处理) 1. **武汉物流项目清单与定稿不一致**:库内 27 行来自《湖北省十堰交通物流基础设施投资统计汇总表(月报)》,定稿用的是《2026 年全省预安排计划进度情况汇总(8月)》(含「航发智慧物流园」等)。需确认是「替换武汉全部物流项目」还是「追加」后再导入。 2. **天门物流无数据**:源文件《8月份物流园中心建设项目(天门).xlsx》H/J/K 为空(库内 0),定稿为 16677.7 / 500,需补源文件。 3. **荆州/黄石 规划内外拆分差异**:库内合计与定稿一致(如荆州 J=46548),仅「规划内/规划外」归类不同(定稿 46548 vs 生成 38320.5),属分类口径问题。 4. **十堰物流小数差**:定稿 29482 / 1671 vs 生成 29188 / 1591(源文件本身如此)。 5. **中口径排名残差**:仅来自 2025 年网约车市州分摊算法(`WycSplitCalc` 武汉分母处理),未擅自调整,待确认。 6. **C 组**(城市客运页结构归一,需用户在 WPS 整列删除 AJ 列后执行)、**D 组**(增速排名措辞)、**B4**(导出前基数体检 + 弹窗 + 《数据缺失清单》页)待排期。 ## 六、结论 本轮 14 条用例全部通过:投资市州单表的「表头取列定位」缺陷(P01–P04)已修复并回归验证, 8 月客运/物流源数据已补齐入库且与源文件小计逐项对齐; 新增的两张投资明细表导出正常(汇总页 0 差异); 中口径排名/明细同比口径修复后与定稿一致; 导入界面隐藏、报表项新增均按确认口径落地。 剩余差异均为**数据源缺口或母版手工口径**,不属于程序缺陷(见第五节)。