编辑 | blame | 历史 | 原始文档

导入与生成模块体检问题清单(2026-09-02)

方式:静态代码审查 + 数据库只读核对(未动模板、未重启后端)。模板文件正在由另一会话修改,涉及模板联动的问题标注【协作】。
状态含义:P0=会造成导出/导入直接失败或数据静默错误;P1=违反需求(行号提示/可追溯)或导致报表内容残缺;P2=体验/一致性/潜在误删。

一、P0(会直接挂或数据静默错)

1.【协作】城市客运 6 张导出的模板文件已被删除,代码引用未同步

  • 证据:docs/城市客运/导入模板_城市公交.xlsx、导入模板_巡游出租.xlsx、导入模板_轨道、轮渡.xlsx、导入模板_城市分市州.xlsx、导入模板_城市客运各市州明细表.xlsx、导入模板_城市汇总.xlsx 已被另一会话删除(git 显示 D),换成 生成_*.xlsx 系列。
  • 影响:ReportExportService.java 仍硬编码读取上述 6 个文件名(resolveTemplate("docs/城市客运")),文件不存在时导出抛“未找到模板文件”→ cityBusDetail/cityTaxiDetail/cityRailFerryDetail/cityPassengerCitySum/cityPassengerDetailSum/cityPassengerSummary 重启后必 500。
  • 处置:模板会话定稿时把代码引用同步为新的 生成_*.xlsx(或恢复旧文件),本会话不重复改;定稿后跑 v2 回归。

2. 数值解析非法文本静默置 0(getDecimal/getInt)

  • 证据:DataImportService.getDecimal() 捕获 NumberFormatException 后返回 0.0;getInt() 再取 intValue。运政车辆/轨迹里程/规上规下/货运量周转量等大量走 gd()/gi()。
  • 影响:源文件某格为非数字文本(如“未填”“—”)时不报错、无行号,直接入库 0,success 照计 → 报表数字悄悄错,违背“导入失败显示行号”的要求。
  • 处置建议:非空且非数字的单元格按“失败行 + 行号 + 原因”记录(与 H2032/H204 的 failDetails 一致),而不是静默 0。

二、P1

3. 6 类导入失败不记行号/原因(errorDetail=null)

  • 范围:TRANSPORT_AUTH、TRACK_MILEAGE、SCALE_SPLIT、FREIGHT_TURNOVER、INVEST_SYSTEM、CITY_TAXI_AUTH。
  • 证据:recordBatch(..., null);失败仅在插入 try/catch 中 failRows++。
  • 影响:页面“导入结果”只能看到“失败 N 条”,无失败位置/原因(前端兜底显示“该批次无失败明细”)。
  • 处置建议:与 H2032/H2031/H204 对齐,收集行号+企业名/车牌+原因;CITY_TAXI_AUTH 42636 行分批插入尤其需要行级失败收集。

4. import_batch_id 从未回填(批次与业务数据断链)

  • 证据:freight_turnover_import 18/18、scale_split_transport 36/36、h2032_enterprise_monthly 2026 年 5088/5088 行 import_batch_id 全 NULL;代码中无任何 setImportBatchId 调用。
  • 影响:无法回答“这批数据来自哪个文件/哪次导入”,无法按批次追溯与回滚;报表核对只能靠 import_type+report_period 间接猜。
  • 处置建议:recordBatch() 返回批次 id,导入方法按期回填到业务表(表结构已具备该列)。

5. 月度/基期数据缺口(决定报表完整度,非代码缺陷)

  • 证据:city_bus_monthly/city_taxi_monthly 仅 2026-06、07(142/17 行);h2031_enterprise_monthly 仅 2026-03、07(778/771);2025 基期全库无城市客运/公路旅客月度数据。
  • 影响:城市客运 1-5 月列空、同比列全空(去年基期缺失),#REF! 同比公式只能被“清空”处理;中口径/公路旅客报表多数月份无数据。先补数据,报表才有意义。
  • 处置:城市客运月度(U203/U402)与轨道/轮渡 2026 年 1-5 月、8 月…按源文件补导;公路旅客 H2031 补 1/2/4/5/6/8 月;去年同期(2025 或 2025 同期)数据补导后同比自动有值(需确认表结构支持去年列)。

三、P2

6. 前端“导入进度”易误显示“无数据”,大文件无实时进度

  • 证据:DataImport.vue loadData() 的 overview 取**每个类型最新一条批次**;空批次(0 行,#177-179/#186 等)会覆盖显示为“无数据”;批次表只展示 50 条、无分页;单文件导入仅 status='uploading',无百分比(42636 行 20-40 秒全程无反馈,体感“卡死/无进度”)。
  • 处置建议:① overview 统计改为“同类型最近一次 total>0 的批次”或合计;② 批次列表分页;③ 大文件给阶段提示或轮询进度;④ 解析到 0 行的文件明确提示“文件无有效数据行”而非静默成功批次。

7. 前端“年报”分组 11 个类型后端无实现

  • 证据:DataImport.vue groups 含 annualCompanyBasic/annualEnterpriseFinance/… 11 项;后端 DataImportService switch 与 Controller 均无 annual* 支持。
  • 处置:要么从页面移除/禁用(未开放),要么补实现;否则用户点击即“不支持的导入类型”。

8. 运政车辆/轨迹里程幂等删除审核结果范围过宽(潜在误删)

  • 证据:importTransportAuth/importTrackMileage 幂等处直接 auditResultMapper.delete(reportPeriod=period)(未按规则 reportType 过滤),其它类型均走 deleteRuleResults(类型,period)。
  • 影响:同报表期若其它类型已完成审核,再导运政车辆会连带清掉当月其它类型审核结果(当前多为测试期影响小)。
  • 处置建议:与其它类型统一为按 reportType 的规则 id 删除。

9. 生成侧模板联动风险点(供模板会话对照,勿遗漏)

  • 排名模板:标题写死 row0/row22、数据块从 row3/row25 起(freightRank/turnoverRank)→ 增删行会错位。
  • 货运分市州明细:数据区从 0-based row4 起,按“省 6 指标 + 17 市州×6 指标”连续写 108 行。
  • 能耗汇总:克隆基础 sheet 后按 0-based row2..7 写 6 种燃料(柴油/汽油/…/燃料电池),D/J/L/M 为公式列不动。
  • 中口径明细:Sheet1 按 行 5..94/99..188 五段式定位;Sheet2 去年明细页残留 #REF! 需随模板修正重新确认。
  • 城市客运:数据区 ≥75 行守卫;表头月份“地区”行定位(前 20 行);去年列从 19 起每 2 列。
  • 公式处置约定:跨簿/跨表求不出值的公式只清空结果(不删公式文本、不改列名)——模板若把 #REF! 改为真实引用,需同步确认代码写的列位置一致。

四、结论

  • 今日已验证的导入三链与 22 报表结论仍有效,但**城市客运 6 张导出依赖的模板文件已不在**,模板会话定稿后必须做引用同步 + v2 回归(脚本已留档 outputs/report_check)。
  • 代码层优先修:非法数值静默 0(P0-2)、失败行号补齐(P1-3)、批次 id 回填(P1-4)、运政/轨迹审核结果误删范围(P2-8)。
  • 数据层优先补:城市客运 1-5 月与公路旅客缺月、2025 基期(P1-5)——这是报表“月列空/同比空”的根因。
  • 前端体验:进度展示(P2-6)、年报入口(P2-7)。