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

工作日结_2026-09-20

一、今天做了什么

1.1 修复:报表生成页两张投资明细表报「未知报表类型」

  • 现象:报表生成页「客运站投资明细表」「物流站场投资明细」显示
    未知报表类型:investPassengerDetail / investLogisticsDetail,无法预览/导出。
  • 定位:报错来自 ReportExportService.checkExportReady() 的 switch (t) 兜底分支(ReportExportService.java:231)。
    前一晚只把这两个类型接进**导出**链路(exportSelected switch、REPORT_FILE_NAMES、ReportExportController 两个接口、ReportExport.vue 两项),
    漏了**就绪校验与预览**链路,isInvestType() 也没收录这两个类型。
  • 与数据无关:8 月投资月报一直在库(客运站场 39 行、物流园区 128 行)。
  • 修复:
  1. checkExportReady() 新增两个 case:按类别统计 investment_monthly 该期行数 + 校验 docs/投资/模板/ 母版是否存在(缺母版给提示);
  2. isInvestType() 收录两个类型(纳入投资分支的月度覆盖与问题清单);
  3. investPreview() 增加按类别过滤重载 (period, mode, category, summary, problems),原无参重载保留;
  4. 预览循环按类型分派到对应类别;未知类型兜底报错保持不变。

1.2 其它

  • 重启前后端加载新代码(后端 Started TrafficAuditApplication 10:49:51)。
  • 顺手核对:前一晚「合计行被当项目」修复后,客运本月完成投资由含合计行的 2130.1 收敛为 2048.1,与 SQL 逐项一致;库内已无含「计」的伪项目行。

1.3 修复:汇总大表《城市客运》8 月同比 / 累计同比算错(母版删 AJ 辅助列 + 程序按表头取数)

  • 现象:用户上报生成表城市客运 8 月同比 −86.5%、累计同比 −43.5%;且「2025年1-7月累计」列在母版删过却仍在生成表里。
  • 根因(3 个):
  1. 母版有**两本**——用户删的是《2026年7月道路运输量汇总表.xlsx》,而 8 月导出用的是《2026年8月…》,
    后者城市客运页 2025 年段插了 AJ 列「2025年1-7月累计」,把 2025年8月列挤到 AK,
    8 月同比 =Q4/AJ4-1 实际是「8月值 ÷ 2025年1-7月累计」;累计同比分母又把 1-6 月重复计、8 月漏计。
  2. 新写的列号换算 colIndexOf() 返回 1 基列号,而 POI 列号是 0 基 → 月份列查表全落空、退化成「+2 列」,
    =O5/AH5-1 被算成 =R5/AK5-1(自引用)→ 货运/网约车/中口径明细 共 360 格循环引用。
  3. POI setCellFormula 不接受带 = 前缀的公式串,异常又被 catch (Exception ignore) 吞掉,
    累计同比分母修正一直静默失败(日志只显示「修正格数=0」);另母版 3~8 月表头是 46235 这类裸序列 + General 格式,
    原按 isCellDateFormatted 判定会漏判。
  • 处置:
  1. 母版:用 Excel 16.0 COM 在《2026年8月道路运输量汇总表.xlsx》城市客运页整列删除 AJ(引用由 Excel 自动调整,
    如 W4 → =V4/AW4-1),再把删列产生的 36 处 #REF! 累计同比公式还原为 AJ;
    备份 _bak_202608母版删除AJ列前_20260920.xlsx;删列后母版与版式参照件《生成_道路运输量汇总表.xlsx》列结构一致。
  2. 代码:colIndexOf 改 0 基;setCellFormula 去掉 = 前缀并把 catch 改成 WARN 日志;
    yearMonthOf 支持裸日期序列;repairCumulativeYoyFormulas() 保留作母版兜底。
  3. 前端:ReportExport.vue 预览补齐货运量/城市客运/中口径共 8 项同比映射,修正「当月货物周转量(万吨)」单位。

1.4 清除「十堰汇总表」带出的非十堰残留(用户要求)

  • 背景:用户核对 D:\桌面\生成数据\生成_全省预安排计划进度情况汇总 (2).xls 发现武汉物流段多出 27 个项目(高桥货运站…越海华中供应链总部基地,开工年 2006-2016)。
  • 溯源:这 27 个(+黄石 4 个)来自《湖北省十堰交通物流基础设施投资统计汇总表(月报)》——文件名/填报单位是十堰,
    但一个页签里收了全省各市州;2026-08-26 11:57 随「市州单表批量导入(物流(物流园区)/7月)」按市州块入库(batch 17/25)。
    交叉核对:这 31 个项目名称在其它任何市州源文件里都**查不到**,确认为该文件带出的残留。
  • 导出为何会显示:investPlan 是「母版原位替换 + 动态插行」——母版武汉物流只预留 7 行,库里多出的项目按「市州+类别」自动补插到小节末尾
    (ReportExportService.java 动态插行段)。所以库里有多少项目,生成表就出多少行。
  • 处置:全量备份到 docs/投资/输出/清理残留_十堰汇总表带出的非十堰项目_2026-09-20.tsv(31 个项目 + 39 条月度数)后删除;
    顺带发现并清除解析「合计」行误建的伪项目(id=229 咸宁市客运站场「合   计」,13727 万元)。
    结果:物流园区项目 135 → 104,2026-08 月度数 167 → 136,客运站场项目 49 → 48。

1.5 预安排汇总表:小计/合计补计「有总投资、无本期月度数」的项目(用户确认「可以」)

  • 场景:武汉 8 月物流没有单表报送(docs/投资/输入/物流(物流园区)/8月 里没有武汉文件),6 个新项目在库里没有 2026-08 月度数,
    原来小计只累加月度数据 → 武汉物流整块只显示项目行、小计空白。
  • 改动:ReportExportService.investPlan() 新增 addProjectsWithoutMonthly(...),在**市州小节/块合计/全省合计**三处累加后,
    把「本期无月度记录但主档有总投资」的项目按类别/市州补进 总投资 一列(其余列无主档数据源,保持空白)。
  • 效果:武汉物流小计 = 272476(6 个项目总投资和);块合计/全省合计 = 库内同类项目总投资之和(可逐项对 SQL 核对)。

1.6 导入结果弹窗改造(用户:弹窗太长、点不到确认、不能移动)

  • 原来用的是 Element $alert(MessageBox)承载导入结果 HTML,内容一长就把「确认」挤出屏幕,且不能拖动。
  • 改为自定义 el-dialog:v-dialog-drag 标题栏拖动、custom-class="import-result-dialog"(全局样式,圆角 + 内容区 max-height 滚动 + 底部按钮固定),
    并新增「导出明细」按钮(CSV,带 BOM,可直接 Excel 打开),用于用户自行核对/修改不一致内容。
  • 覆盖 4 处:批量导入结果、市州单表批量导入结果、单文件导入失败、投资与投资系统不一致清单。

1.7 汇总大表导出异步化 + 结果缓存(用户提问「点下载要等一会,数据多了会不会卡死」)

  • 现象:汇总大表点「导出」后要等 10~20 秒才触发下载,期间页面无任何反馈;同步请求一直占着 Web 线程。
  • 定位:14 秒里母版读取+回填 6.5s、整本约 4 万格公式重算 4.1s、写盘传输 3.4s——耗时来自 Excel 处理,**与数据库行数关系不大**,数据多了主要是 SQL 聚合变慢,不会「卡死」。
  • 改动:
  1. 新增 ReportExportTaskService(固定 1 线程池 daemon):提交即返回 taskId,前端 700ms 轮询「步骤 + 百分比 + 已用时长」;结果保留 30 分钟(内存态,进程重启失效)。
  2. 结果缓存 10 分钟 + 数据版本守卫:版本取 SELECT IFNULL(MAX(id),0) FROM import_batch,期间只要有新导入就自动失效(取不到版本时禁用缓存);同一报表期并发提交自动去重、复用同一任务。
  3. ReportExportService 新增带进度回调的 exportSummaryWorkbook(period, mode, toMonth, progress) 重载(原两个重载委托它),进度点 2%/6%/12%/22%/45%/70%/95%。
  4. ReportExportController 新增 3 个接口:/exportTask/summaryWorkbook(提交)、/exportTask/{taskId}(进度)、/exportTask/{taskId}/file(下载);原同步接口保留兼容。
  5. 前端 ReportExport.vue 进度弹窗:进度条 + 步骤 + 用时 + 缓存来源时间 + 失败原因,以及「保存文件 / 重新生成 / 后台运行 / 关闭」。
  • 实测:提交 0.07s;进度 6→22→45→70→95→100、14.4s 完成;缓存命中 0.01s;refresh=true 真实重算;临时插一条导入后缓存自动失效。
  • 同时修掉一个严重回归:本次新增的 computed 与文件中已有 computed 同名重复,JS 对象后者覆盖前者 → username/myModules/visibleModules 全部丢失,
    「报表生成」页 created() 直接抛错、**整页白屏**。接口测试发现不了,是浏览器实测才暴露的(详见测试报告第四节)。

1.8 市州统一填报模板(用户提问「按哪个格式来最好?要不要生成两个模板」)

  • 背景:用户提出「这几个表的更新其实很简单——按项目名称更新汇总表指标、新增项目就新增到明细表;
    预安排汇总表和明细表方式一样,剩下三张表项目固定只更新指标——为什么现在弄得有点复杂」。
  • 核对:需求文档《投资月报数据处理与多表更新需求说明》Step1/2/3 与用户描述完全一致,程序逻辑也是这么实现的。
  • 结论:复杂不在「表」,在「源」——版式不统一(27 份里 7 份有差异)、一个文件混多个市州、没有县区列、列位置靠兜底。
  • 产出:
  1. 新增两份市州填报模板 模板_市州月报_客运站场.xlsx / 模板_市州月报_物流园区.xlsx
    (「月报」页 17 列单行表头 + 建设性质下拉 + 「填报说明」页 11 条要求);
  2. 口径说明文档 docs/投资/填报口径与统一模板_2026-09-20.md(模板字段去向、复杂度来源、待定死的 3 件事、过渡安排)。
  • 配套解析改动:新增「县(市、区)」列解析(写入主档 county);表头行判定收紧为
    「含项目名称 + 至少 2 个短表头字段」,避免把模板自带的「填报说明」页当数据表。

二、测试结果摘要

《功能测试报告_投资明细表就绪与预览类型补齐_2026-09-20.md》:**7 条用例通过,1 条未实测**(缺母版提示,未临时移动用户母版文件)。

校验项 结果
/api/report/ready(两新类型) ready=true,rows=39 / 128,note 为空
/api/report/preview(两新类型) 覆盖 [8],problems 为空
摘要 vs SQL 逐项对齐 客运 2048.1 / 38648.16 / 550929.76、物流 90185.9 / 704107.7 / 2656354.31,**一致**
分类别过滤 客运 39 + 物流 128 = 167,全类别类型仍 167(未串类)
导出回归 两张明细表仍可导出(29462 / 134144 字节)
原有投资类型回归 investPlan / investBillion / investCounty / investFiveYearLogistics 均 ready=true,rows=167
未知类型负向 foo → ready=false、note=未知报表类型:foo(兜底仍有效)

《功能测试报告_城市客运月度与累计同比_2026-09-20.md》:**15 条用例通过**。

校验项 结果
城市客运 R4 / T4 公式 =Q4/AJ4-1、=S4/(V4+X4+Z4+AB4+AD4+AF4+AH4+AJ4)-1(不再是 #REF!)
全省客运量 8 月同比 / 累计同比 +4.44% / +0.117%(修复前 −86.5% / −43.5%)
辅助列 生成表与母版均无「2025年1-7月累计」,城市客运页 BV→BU
循环引用 全表 0 处(修复前 360 处,含货运/网约车/中口径明细 R 列)
其它 18 个页签回归 除上述 R 列修复外逐格一致
预览接口 24 项指标含 8 项同比,1.03 秒
导出耗时 14 秒(母版读取+回填 6.5s、公式重算 4.1s、写盘传输 3.4s)

《功能测试报告_投资预安排汇总补计与导入弹窗_2026-09-20.md》:**14 条用例通过(1 条为静态/编译级验证,点击级验收待用户实测)**。

校验项 结果
残留出库 物流项目 135→104、月度数 167→136;备份 TSV 77 行
生成表武汉物流段 33 行 → 6 行(航发/中通/阳逻港/极兔/华中化学品/迈睿达)
武汉物流小计(补计) c8=272476(6 个项目总投资和),其余列空
黄石物流小计 729375.69 → 614991.69
块合计/全省合计 物流 5889737.36、客运 763632.2、全省 6653369.56,与 SQL 一致
1-8月累计(c23) 744262.86 → 733956.06,差额 = 被删项目 year_cum 之和,补计未污染该列
伪项目清除 咸宁客运小计 27454 → 13727
生成表行数 313 → 281
其它投资报表回归 investBillion/County/FiveYearLogistics 各 136 行、两张明细表 39/97 行,ready=true,均可导出
负向 types=foo → ready=false,note「未知报表类型:foo」

《功能测试报告_汇总大表异步导出与缓存_2026-09-20.md》:**17 条用例通过(接口 8 + 浏览器实测 7 + 复验 2)**。

校验项 结果
提交异步任务 0.07s 返回 taskId;进度 6→22→45→70→95→100;14.4s 完成
任务文件下载 1,325,109 字节,1.27s
10 分钟内缓存复用 fromCache=true、同 taskId、0.01s
refresh=true 强制重算 新任务号,真实重算 14.2s
运行中并发去重 两次提交返回同一 taskId(11.1s)
新增导入使缓存失效 import_batch id 533→534 后 fromCache=false(测试后已 DELETE 清回 533)
负向:不存在 / 未完成 taskId 「导出任务不存在或已过期」「尚未完成(当前状态:RUNNING)」
浏览器实测 进度弹窗采样、自动下载、缓存提示、重新生成、后台运行、失败提示 6 项全通过
产物一致性 缓存件与重算件解包后逐条目一致;三份缓存件 SHA256 相同
附带修复 computed 重复键导致报表生成页整页白屏(已修复并浏览器复验)
复验(用户问题 2) 预览同比 12 行齐全;「累计货物周转量 0%」经查库为取数源本身 total_yoy=0.00000346,非缺陷

《功能测试报告_市州统一填报模板与县市区解析_2026-09-20.md》:**10 条用例通过(正向 5 + 负向 3 + 回归 2)**。

校验项 结果
模板结构 两份模板均为「月报」17 列表头 + 建设性质下拉 + 填报说明 11 条
正向导入(模板填报) total=2、success=2、city=武汉市
主档逐字段 县区(江岸区/洪山区)、建设单位、性质、开工/竣工年、总投资、工可/初设全部对齐
月度数逐字段 自开始累计/本年计划/自年初累计/本月完成/建设阶段/形象进度全部对齐,报表期 2026-09
负向:说明页被当数据表 修复前 8 条误解析(id 233~240)→ 修复后 0 条
负向:县区列写法变体 「县(市、区)/县(市、区)/县市区」归一化后均命中
回归:8 月真实市州重导 客运 39、物流 128,与 09-19 批次一致,fail=0
回归:8 月月度数比对 重导前后 136 行逐值 IDENTICAL
数据清理 测试项目 A/B、2026-09 批次、测试文件均已删除

三、遗留问题与待办

  1. 武汉物流项目清单口径(已确认忽略)。
  2. 天门物流源文件 H/J/K 为空 → 待用户找同事要数据后导入。
  3. 荆州/黄石「规划内/规划外」拆分口径 → 待用户向同事确认。
  4. ~~C 组(城市客运页结构归一,需用户先在 WPS 整列删除 AJ 列)~~ 已完成(改用 Excel COM 整列删除 + 公式还原);
    D 组(增速排名措辞)/B4(导出前基数体检 + 弹窗 + 《数据缺失清单》页)待排期。
  5. 缺母版提示(T08)未实测,可在有测试副本时补测。
  6. ~~汇总大表导出是同步请求,建议做成异步任务 + 进度提示~~ 已完成(见 1.7)。缓存是内存态,进程重启即失效;如需跨重启/多人共用的「导出记录」页可后补。
  7. 部署包 deploy/traffic-audit-deploy-20260913/backend/docs/生成汇总大表/ 与 _deploytest/ 下仍是**带 AJ 列的旧母版** ——
    用户 2026-09-20 明确「部署包先不管」,**暂不处理**(待要发包时再同步)。
  8. 中口径明细 4 格(城际城乡巡游出租/网约车)因 2025年8月基数为 0,同比显示 #DIV/0!(不可比),如需改空白需用户确认口径。

四、明日计划

  1. 等天门源数据 / 荆州黄石口径确认后补导并复验。
  2. 推进 C/D 组与 B4。
  3. 与用户确认是否把 09-18 夜间起的本地提交一并推送到公司 gitea(用户 09-19 曾要求「今天先不推公司」)。
  4. ~~评估汇总大表导出异步化~~ 已完成(见 1.7:异步任务 + 进度弹窗 + 10 分钟结果缓存 + 数据版本守卫);部署包母版按用户要求暂不处理。
  5. 8 月版十堰汇总表未清理:用户只清了 7 月版(108032→90112 字节),8 月版(mtime 2026-08-20)仍含武汉 27 + 黄石 4 段;
    若重导 8 月物流,已删除的 31 个项目会重新建档 → 重导前需同样清理(或由我代做,待用户确认)。
    2026-09-20 下午做回归重导时已实测复现(8 月物流重导后 +31 个项目 / +31 条月度数),已再次清除,库回到 152 个项目 / 284 条月度数,2026-08 月度数逐值与重导前一致。

  6. 市州单表导入的**多市州块兜底提示**(识别一份文件含多个市州块并提示/跳过)待用户确认是否要做。
  7. 生成表武汉物流小计现在只有「总投资」,缺 8 月的自开始累计/本年计划/月完成 → 需武汉 8 月物流单表(或省厅口径)才能补齐。
  8. 两份市州填报模板待用户过目后下发市州(建议 9 月起执行);如需「模板体检 + 表头不符弹窗」,待用户确认后排期。
  9. 8 月十堰物流汇总表源文件(含武汉 27 + 黄石 4)是否由我代做清理,待用户确认(见 1.8 / 测试报告 P3)。