# 功能测试报告_投资系统新模板按表头解析与审核基准缺失保护_2026-09-21 ## 一、功能说明 | # | 功能 | 说明 | | --- | --- | --- | | 1 | 投资系统导出**按表头定位**解析 | 用户 2026-09-21 把「与投资系统比对的明细表」换成了新模板《2026年8月投资系统项目明细》(多一列「项目所处阶段」、少一列「自年初累计」,整体右移)。原实现写死 8 列列位,遇新模板必然报「表头与系统模板不一致」。本次改为按表头关键字实时定位列,兼容新旧两种模板 | | 2 | 审核比对「基准缺失」保护 | 新模板没有「自年初累计」列 → `investment_system.year_cum` 为 NULL。原实现用 `nvl()` 把 NULL 当 0,会把 100+ 个项目全部误判为「差异」。改为:基准为 NULL 时跳过该字段比对并记 WARN 日志 | | 3 | 十堰物流汇总表源文件清理(数据处置,非代码) | 按用户 2026-09-21「清除掉」的要求,删除该文件里的武汉段(27 个项目)与黄石段(4 个项目),只保留十堰段 | 改动文件: - `traffic-audit-server/src/main/java/com/trafficaudit/dataimport/service/DataImportService.java`(`importInvestmentSystem` 重写 + 新增 `findColByKeywords` / `headerText`) - `traffic-audit-server/src/main/java/com/trafficaudit/auditengine/service/AuditEngineService.java`(`checkInvestCrossDiff` 基准缺失保护) ## 二、测试环境 - 后端 Spring Boot 8090,重启加载新代码:`backend.log` **2026-09-21 10:20:30 Started TrafficAuditApplication**;前端 8080 - 数据库 MySQL 3308 / `traffic_audit` - 新旧模板列结构对照(`xlrd` 读取): | 列 | 老模板《模板_查询结果(投资系统-客运+物流 2026.7).xls》 | 新模板《2026年8月投资系统项目明细.xls》 | | --- | --- | --- | | 1 | 行号 | 行号 | | 2 | 单位 | **投资项目** | | 3 | 时期 | 时期 | | 4 | 计划总投资 | **项目所处阶段**(新增) | | 5 | 自开始累计 | 计划总投资 | | 6 | 本年计划投资 | 本年计划投资 | | 7 | 自年初累计 | 自开始建设至本年(月)底-累计完成投资 | | 8 | 当月完成投资 | 当月完成投资 | | — | — | **无「自年初累计」列** | ## 三、用例表 | # | 用例 | 输入 | 预期 | 实际 | 结论 | | --- | --- | --- | --- | --- | --- | | T01 | 十堰源文件清理-结构 | 原《湖北省十堰…汇总表(月报)(2026年8月).xls》 | 只保留十堰段,武汉/黄石段消失 | 行数 86 → **33**;十堰段第 10 行起、7 个项目、合计行保留;武汉/黄石段 0 行 | 通过 | | T02 | 十堰源文件清理-备份 | 同上 | 原件先备份到输出目录 | `docs/投资/输出/源文件备份/…_原始含武汉黄石_20260921.xls`(108544 字节) | 通过 | | T03 | 8 月物流重导(正向) | `POST /api/import/investCityBatch?period=2026-08&category=物流园区` | 十堰只出 7 条,不再产生武汉/黄石项目 | total=97、success=97、fail=0;十堰文件 **ok=7**(改前 38);武汉/黄石 0 条 | 通过 | | T04 | 重导后库核对 | 同上 | 项目/月度数不增不减 | `investment_project` = **152**、2026-08 月度数 = **136**、十堰物流 = 7(与清理前一致) | 通过 | | T05 | 新模板导入(正向) | 新模板 129 行数据 | 全部入库 | 返回「投资系统导出导入成功, 共 **129** 条记录」;`investment_system` 2026-08 = 129、2026-07 = 148 不受影响 | 通过 | | T06 | 字段映射抽查 | 同上 | 逐列等于源文件 | 湖北省综合运输服务站及候车亭:12721.5 / 10306.2 / 10316.1 / 93.5;汉口客运中心:315700 / 30000 / 178235.4 / 550 | 通过 | | T07 | 缺列处理(负向) | 同上(无「自年初累计」列) | year_cum 留空,**不得**把「自开始建设…」列误当自年初累计 | 129 行 year_cum 全为 NULL(未错填) | 通过 | | T08 | 老模板兼容(回归) | 老格式表头 | 仍能导入 | 老文件已不在输入目录;改为按表头定位后,老模板 8 列关键字(单位/计划总投资/自开始建设/本年计划投资/自年初/当月完成投资)全部可命中(代码审查);存量 2026-07 = 148 行未受影响 | 通过(静态) | | T09 | 审核基准缺失保护 | `POST /api/audit/execute?period=2026-08&reportType=INVEST` | 自年初累计规则不再产生误报 | RULE_I002 结果 **0 条**;日志出现「投资比对跳过(投资系统基准缺失):rule=RULE_I002 … field=自年初累计」 | 通过 | | T10 | 审核其它规则未受影响 | 同上 | 正常出结果 | RULE_I001(自开始建设累计)2 条、RULE_I003(本月完成)1 条、RULE_I004(存在性)25 条,合计 28 条 | 通过 | | T11 | 审核幂等 | 同上重复执行 | 只清 INVEST 旧结果、不重复堆积 | 两次执行结果条数一致(28 条) | 通过 | ## 四、发现的问题与处置 | # | 问题 | 处置 | | --- | --- | --- | | P1 | 新模板多出「项目所处阶段」列,但库表 `investment_system` 没有对应字段 | **本次不落库**。若业务要比对「建设阶段」,需加列并同步 `docs/init.sql`、`docs/database.md`(按项目规矩三处同步) | | P2 | 新模板**没有「自年初累计」列** → 该维度无法比对 | 已改为「基准缺失即跳过 + WARN 日志」,不产生误报。若业务仍要比对自年初累计,需新模板补回该列(或确认改用「自开始建设累计」口径) | | P3 | 老模板文件 `模板_查询结果(投资系统-客运+物流 2026.7).xls` 已不在 `docs/投资/输入/`(被用户替换) | 2026-07 的 148 行为老口径存量数据,保留不动;后续月份统一用新模板 | | P4 | 审核新增 25 条「投资系统导出中不存在」 | 多为乡镇综合运输服务站与部分物流项目(如 桂花镇/马桥镇/高桥镇综合运输服务站、郑万高铁巴东综合客运枢纽、潜江传化公路港项目…),属投资系统未收录的客观差异,供业务判断,非本次改动引入 | | P5 | 源文件为 `.xls` 且含合并单元格 | 用 Excel 16.0 COM 整行删除(第 11~63 行),保存后 `xlrd` 复核行数 86 → 33;脚本结束清理了本次新建的孤儿 EXCEL 进程 | ## 五、结论 - 新模板《2026年8月投资系统项目明细》已可正常导入(129 条),字段逐列对齐,缺列不误填; - 审核不再因「基准缺失」成片误报(RULE_I002 由 100+ 条降为 0 条),其余三条 INVEST 规则结果正常(28 条); - 十堰物流汇总表源文件已清除武汉/黄石段(备份留档),重导验证:十堰只出 7 条,库内项目/月度数不增不减,**该残留问题闭环**。 测试人:Codex(AI) 测试日期:2026-09-21