# 功能测试报告_市州统一填报模板与县(市、区)解析_2026-09-20 ## 一、功能说明 | 功能 | 说明 | | --- | --- | | 市州填报模板 | 新增两份市州月报模板:`docs/投资/模板/模板_市州月报_客运站场.xlsx`、`docs/投资/模板/模板_市州月报_物流园区.xlsx`;单页签「月报」17 列单行表头 + 「填报说明」页 | | 县(市、区)列解析 | 市州单表导入新增对「县(市、区)」列的识别,写入项目主档 `county`(原先仅投资系统导出会写) | | 表头行判定收紧 | `findInvestHeader` 增加统一的关键词判定 `investHeaderKey`,并要求表头行同时满足「含项目名称」+「至少 2 个短表头字段(≤20 字)」,避免把「填报说明」页的长句当作数据表 | 改动文件:`traffic-audit-server/src/main/java/com/trafficaudit/dataimport/service/DataImportService.java` ## 二、测试环境 - 后端 Spring Boot 8090(重启后启动时间 2026-09-20 16:06:48),前端 8080,MySQL 3308 / 库 `traffic_audit` - 测试数据:以「模板_市州月报_客运站场.xlsx」为底稿生成 `武汉市_2026-09_客运站场月报.xlsx`(2 条测试项目) - 调用方式:`POST /api/import/investCityBatch?period=2026-09&category=客运站场`(本地自签 JWT) - 入库抽查:`investment_project` / `investment_monthly` 逐字段与源文件比对 ## 三、用例表 | # | 用例 | 输入 | 预期 | 实际 | 结论 | | --- | --- | --- | --- | --- | --- | | T01 | 模板结构(客运站场) | 打开模板 | 「月报」页第 4 行 17 列表头;E 列建设性质下拉;第二个页签为填报说明且含 11 条要求 | 与预期一致 | 通过 | | T02 | 模板结构(物流园区) | 打开模板 | 同 T01,标题为「交通物流(物流园区)」 | 与预期一致 | 通过 | | T03 | 正向导入(2 条项目) | 按模板填报 2 条项目(含县区、批文号) | total=2、success=2、city=武汉市 | total=2、success=2、fail=0、city=武汉市 | 通过 | | T04 | 入库抽查-主档 | 同上 | 8 个主档字段逐项等于源值 | 江岸区/测试建设单位A/新建/2026/2027/12345.67/测试工可A/测试初设A;洪山区/测试建设单位B/续建/2024/2026/20000/测试工可B/初设为空 | 通过 | | T05 | 入库抽查-月度数 | 同上 | 6 个月度字段逐项等于源值、报表期正确 | 报告期 2026-09;1000/5000/1200/300/在建/测试形象进度A;15000/8000/6000/1500/完工/测试形象进度B | 通过 | | T06 | 负向:说明页被当数据表(修复前) | 模板文件(含填报说明页) | 只解析「月报」页 | **失败**:误解析 8 条说明页长句为项目(id 233~240),city 被文件名兜底为「武汉市」 | 已修复(见 T07) | | T07 | 负向:说明页被当数据表(修复后) | 同 T06 | 说明页不再被识别为数据表 | 同一文件由 8 条降为 2 条正确记录,说明页 0 条 | 通过 | | T08 | 负向:县区列写法变体 | 表头「县(市、区)」「县(市、区)」「县市区」 | 均识别为县区列 | 归一化匹配后三种写法均命中(修复前写成「县(市,区)」带逗号,均不命中) | 通过 | | T09 | 回归:8 月真实市州文件重导 | 8 月客运 9 份、物流 16 份原始月报 | 解析条数与历史批次一致、无报错 | 客运 39 条、物流 128 条,均 fail=0(与 09-19 批次 531/532 一致) | 通过 | | T10 | 回归:8 月月度数逐值比对 | 重导前 136 行 vs 重导后 136 行 | 逐值一致 | 去主键后逐行比对:**IDENTICAL** | 通过 | ## 四、发现的问题与处置 | # | 问题 | 处置 | | --- | --- | --- | | P1 | 「填报说明」页里含「项目名称」的长句被当作表头行,整页 8 条被误建成项目 | 已修:表头行判定要求「含项目名称」+「至少 2 个短表头字段(≤20 字)」;测试数据已从库中清除 | | P2 | 县区列关键词写成 `县(市,区)`(逗号),实际表头是 `县(市、区)`(顿号),导致 county 取不到 | 已修:先归一化(全/半角括号、顿号、逗号全部去掉)再匹配「县(市区)」「县市区」「区县」 | | P3 | **回归重导 8 月物流时,《湖北省十堰交通物流基础设施投资统计汇总表(月报)》再次带出非十堰的武汉 27 + 黄石 4 = 31 个项目** | 已再次清除(`investment_project` 152 / `investment_monthly` 284 恢复原状);根治需清理 8 月源文件,**待用户确认是否由我代做** | | P4 | 真实市州月报表头里**没有**「县(市、区)」列(抽查 8 月 25 份文件,0 份含该列) | 属正常:历史数据 county 为空是数据源限制;9 月起按统一模板填报后该列才有值 | | P5 | 测试用的临时文件与临时数据 | 测试文件 `docs/投资/输入/客运(客运站)/9月/武汉市_2026-09_客运站场月报.xlsx`、测试项目 A/B、2026-09 导入批次已全部删除 | ## 五、结论 - 两份市州填报模板可用,正向链路(模板 → 解析 → 主档 + 月度数)逐字段对齐; - 表头判定收紧后,模板自带的「填报说明」页不再被误当数据表(负向用例 T06/T07); - 8 月真实市州数据重导回归无反例:条数与历史一致,月度数逐值一致; - 遗留:8 月十堰汇总表源文件的非十堰段未清理(P3),需用户确认清理方式。