工作日结_2026-09-22
一、今天做了什么
1. 数据查看页补齐网约车与个体客运类型("能导入就能看")
用户诉求:数据查看的数据类型应做到"能导入什么数据就能看到什么数据",用于核对导入是否完整。
原先网约车总数、网约车订单、个体客运三张表**有导入接口和模板但没有查看入口**,导入后只能查数据库。
- 后端
DataViewController:新增 wycTotal / wycOrder / passengerIndividual 三个分支 + 三组列定义 + 三个 Mapper 注入;
passengerIndividual 用 RegionUtil.cityByCode 把 6 位区划代码派生为"市州"列(如 420900 → 孝感市)。
- 前端
DataView.vue:公路旅客模块加"个体客运量/周转量",城市客运模块加"网约车总数""网约车订单及全省总量"(订单表 23 列,17 市州各一列,保持与导入文件列序一致)。
2. 跨期"按市州汇总"的口径调研 + 样例
- 生成样例
D:\桌面\按市州汇总_2026年1-8月累计_样例.xlsx:公交、巡游出租、货运规上企业三张表,17 市州 + 全省合计行 + "口径说明"页。
- 核实各表月值口径为**当月值**(公交 2025 各月全省 1.2~1.5 亿人次量级),故跨期汇总按列性质分三类:
- 流量类(客运量/周转量/货运量/订单数)→ 求和;
- 时点类(运营车辆数/营运车辆数/企业数)→ 取期末(武汉公交 2026 各月 8476→7861,逐月相加得 64879 辆,实际 8 月末仅 7861 辆);
- 比率类(环比/同比/平均运距/占比)→ 按累计口径重算。
- 货运企业表的市州由 6 位区划代码前 4 位归并(4290xx 直管市按 6 位优先),17 市州全部识别,无"未识别"。
3. 核查"数据查看已加汇总功能"的现状
用户在别处看到"汇总"按钮,实际核查:前端 DataView.vue 全文无"汇总/导出"(ReportExport.vue 才有),后端只有 /api/data/list,全仓 + traffic-audit-web/dist + 部署 jar + gitea 远端 main 均无相关代码。已向用户说明,按"尚未实现、由本仓实现"推进。
4. 汇总大表进度弹窗优化(用户:"保存"会导致再下载一次)
- 根因:任务完成时会自动下载一次,但弹窗底部仍挂着「保存文件」按钮,点它会再次请求后端拿同一份文件并第二次下载;同时标题/按钮文案不随状态变化。
- 改动(
traffic-audit-web/src/views/ReportExport.vue):
- 完成后显示「已自动下载:<文件名>(<大小>)」+ 提示可点「再次下载」(本地缓存,不再请求服务器);
- 按钮文案随状态:再次下载 / 下载 / 保存文件(生成中禁用);
- 首次下载后把 Blob 存内存,重复保存 0 请求;
- 弹窗标题随状态:正在生成 / 已生成 / 生成失败;完成态主按钮改为「关闭」;
- 每次新任务重置
taskDownloaded/taskFileName/taskFileSize/taskBlob。
- 浏览器实测(admin/123456,2026-08):生成 13.5 秒、产物 1.15 MB;完成后标题「汇总大表已生成」、提示「已自动下载:生成_道路运输量汇总表_2026-08.xlsx (1.15 MB)」;控制台 0 报错。
- 用户反馈后改 v2:「已经下载过了就不需要再次下载」→ 删掉「再次下载」按钮与内存缓存,**完成后底部只留「重新生成 / 关闭」**;仅当自动下载失败时才出现「保存文件」兜底。复验:生成中「重新生成(禁用)/后台运行」→ 完成后「重新生成/关闭」,提示语为「已自动下载:…,文件在浏览器默认下载目录。」,13.6 秒、控制台 0 报错。
5. 数据查看体验优化(第二轮,用户当日反馈)
用户三点反馈:①跨期汇总时点列怎么处理——决定**不放时点列**;②横向滚动时看不到企业名称;③数据类型做成下拉框更简洁。
- 数据类型改为分组单下拉框:去掉"模块单选按钮 + 类型下拉"两级结构,合并为一个
el-select(按 5 个模块分组、支持输入搜索),切换类型时同步 activeModule。
- 左侧冻结标识列:
renderColumns 按表自适应冻结 报表期/所属地区/市州/企业名称 等前导列(此实现 09:56 已落在工作区但未提交,本次真机验证后一并提交)。
- 跨期汇总口径定稿:流量列求和、时点列不参与汇总且不显示、比率列按累计口径重算。
6. 数据查看展示优化(第三轮,用户复核反馈 4 点)
- 下拉分组标题:改成 13px/700/深色+浅底(原为 Element UI 默认 12px 灰字),
popper-class 精确命中;
- 隐藏报表期与所属地区,冻结区收窄为"市州/地区 + 企业名称/项目名称 + 口径"(最多 3 列);后端为企业类表(h2032/h2031/h204 车辆能耗)补派生市州列;
- 规上规下拆分空值定性:源文件《模板_规上规下拆分运输量.xlsx》只有"周转量"列,无货运量列 → 三列空属源数据形态;周转量单位核对为**万吨公里**(1,235,760.72×10000=12,357,607,239 吨公里,与 h2032 武汉 1-6 月完全一致);列名已标注单位;
- 网约车订单改按市州竖排:地区(全省+17 市州)× 指标(期间/订单数/订单占比/客运量/旅客周转量/城市内两项/说明);客运量与周转量复用
WycSplitCalc 拆分口径,全省行取台账 pin;
- 市州月报进度:连
investment_project 补项目名称与市州(原表只有 project_id,页面显示数字无法辨识);
- 数值显示规范:底层全精度不变,显示层千分位+两位小数、比率类转百分比、排名字段整数。
7. 数据查看:口径上移筛选、空列隐藏、表头补单位(第四轮)
- 空列不显示:拆分表"规上/规下/合计货运量"(源文件未提供、库内全空)不再展示,字段保留;
- 口径上移:拆分表"口径"从表格列改为工具栏下拉(全部/当月/累计),后端
/api/data/list 新增 periodType 参数;切换类型自动复位;
- 表头补单位:12 类表 60 余列按库内注释/源文件核对补齐(万人次、万人公里、吨、吨公里、万吨、万吨公里、人、人公里、辆、座、公里、车次、万元、平方米、名、%);
能耗燃料三项库内无单位注释,标注"(按燃料单位)"未臆造。
8. 数据查看「按市州汇总 + 导出 Excel」落地(第五轮,主线功能)
- 新增
CityRollupService + 三个接口:/api/data/rollupTypes、/api/data/summary、/api/data/export;
- 支持 7 类:公交、巡游出租、货运企业、公路旅客企业、个体客运、网约车(拆分口径)、货运量周转量;
- 口径:任意起止月;流量求和、**时点列不参与**、比率按累计重算(累计同比自动取上年同期);排名可选「留空 / 按累计值重排」;结果 = 17 市州 + 全省合计;
- 前端:工具栏加「视图:明细 / 按市州汇总」,汇总模式提供起止月、排名、汇总、导出 Excel;
- 修复两个口径坑:货运量周转量表的"行内累计 + 湖北省合计行"重复计算(1,149,579 → 130,311.89 万吨)、结束月无数据自动回退;
- 与手工核算一致:公交 1-8 月 110776.34 万人次、货运企业 313,998,248 吨、货运量周转量 130,311.89 万吨。
- 收尾:按用户要求把「全省合计」行提到最前面(武汉市之上),导出 Excel 中合计行加粗。
5. 汇总大表导出结果落盘缓存(用户:"下载过就不该再等很久,能不能记住上次结果")
- 背景:原来只有「10 分钟内 + 期间无新导入」的**内存**缓存,窗口短、重启即失效 → 第二次下载还要等 13~17 秒。
- 改动(
ReportExportTaskService.java 为主):
- 结果**落盘**到
docs/生成汇总大表/_cache/,文件名 <key>_v<数据版本>.xlsx(数据版本=MAX(import_batch.id)),已加 .gitignore;
- 提交顺序:内存缓存 → 落盘缓存(同报表期 + 同数据版本 + 7 天内)→ 真算;生成成功后写盘并删除同 key 旧版本;
- 前端文案:命中缓存显示「本次直接沿用 <时间> 生成的结果(期间没有新的数据导入)」,元信息改为「上次生成于 …」。
- 顺带修 bug:落盘命中时
elapsedMs 为负数(任务起点用现在、结束时间是历史生成时间)→ 已改为以生成时间作起点。
- 实测:首次 12.4 s 写缓存;再次提交 164 ms 命中内存;**重启后端后提交 1.19 s 命中落盘**;临时插一条导入记录后
fromCache=false 重新生成(验证「有新导入即失效」);浏览器点导出秒出、文案与按钮正确、控制台 0 报错。
6. 导出缓存守卫升级为「数据指纹」+ 失效提示(用户:按你说的做)
- 背景:上一版缓存守卫用全局
MAX(import_batch.id),①导入投资/能耗等无关数据会白失效;②**不含母版文件**,换母版时会错误命中旧结果(正确性漏洞)。
- 改动(
ReportExportTaskService.java):
- 指纹 =「依赖源表
CHECKSUM TABLE 校验和(能捕捉原地 UPDATE)」+「母版目录全部文件 + 网约车订单 xlsx 的名称/大小/修改时间」,SHA-256 前 8 字节写进缓存文件名;
- 源表范围用**排除法**:排除投资 3 / 能耗 2 / 审核 4 / 系统 6 /
import_batch,其余全纳入(宁可多算不可出错);
- 失效提示(第 3 步提示版):没命中且有旧结果时,进度弹窗显示「上次生成的结果已因数据或母版变化失效,本次按最新数据重算。」
- 实测:无关导入(投资项目 + 导入记录各插一行)**仍命中**缓存;相关源表原地 UPDATE、改母版 mtime 必定失效并重算;命中缓存时不再残留提示;浏览器实测提示行显示正常、控制台 0 报错;测试数据已全部还原(419 批次 / 152 项目)。
二、测试结果摘要
- 报告:
docs/功能测试报告/功能测试报告_数据查看补齐网约车与个体客运类型_2026-09-22.md
- 报告:
docs/功能测试报告/功能测试报告_数据查看冻结列与数据类型下拉框_2026-09-22.md(冻结列/下拉框真机用例 12 条全通过)
- 报告:
docs/功能测试报告/功能测试报告_数据查看展示优化与网约车按市州竖排_2026-09-22.md(接口 6 条 + 真机 6 条全通过)
- 报告:
docs/功能测试报告/功能测试报告_数据查看口径筛选与表头单位_2026-09-22.md(接口 7 条 + 真机 2 条全通过)
- 报告:
docs/功能测试报告/功能测试报告_数据查看按市州汇总与导出_2026-09-22.md(接口 10 条 + 真机 4 条全通过)
- 报告:
docs/功能测试报告/功能测试报告_汇总大表进度弹窗优化_2026-09-22.md(6 条用例通过:生成中状态 / 完成提示 / 再次下载走缓存 / 关闭 / 无控制台报错 / 其它导出未受影响)
- 报告:
docs/功能测试报告/功能测试报告_汇总大表导出结果落盘缓存复用_2026-09-22.md(10 条用例通过:首次生成写缓存 / 内存命中 164ms / 重启后落盘命中 1.19s / 有新导入即失效 / 同 key 只留最新版本 / 时长显示修复 / 浏览器端到端)
- 报告:
docs/功能测试报告/功能测试报告_导出缓存改用数据指纹_2026-09-22.md(12 条用例通过:无关导入仍命中 / 相关源表原地 UPDATE 必失效 / 换母版必失效 / 失效提示显示 / 命中无提示 / 数据还原核对)
- 环境:后端
mvn spring-boot:run(8090,Started TrafficAuditApplication);前端 npm run serve(8080,Compiled successfully in 4769ms);MySQL localhost:3308/traffic_audit;登录 admin/123456 取 JWT。
- 结果:3 个新类型正向(含期间/关键字筛选)、负向(未知类型、无数据期、无 token)全部通过;入库抽查条数与库内一致(20 / 20 / 139);原有 15 类回归正常。
三、遗留问题与待办
- 【已完成】数据查看"按市州汇总 + 导出 Excel"(见第 8 节与《功能测试报告_数据查看按市州汇总与导出_2026-09-22.md》)。
- 汇总口径细则待业务确认:排名字段跨期需重新排名(先留空);累计同比需要自动取上年同期期间。
- 关键字框对无名称列的表(网约车总数、网约车订单)无效,待优化。
- 冻结列依赖"标识列连续排在前面"的列序假设,若以后调整列序/新增类型需同步维护
stickyProps/nameProps。
scale_split_transport(规上/规下拆分)288 行数值全为 NULL,若哪张报表依赖它按市州出数会取不到值,建议与同事确认导入来源。
- Codex 桌面端模型显示(09-21 晚遗留):已写
model_catalog_json 清单,待用户重启客户端确认界面显示 deepseek-flash。
四、明天计划
- 开工"按市州汇总 + 导出 Excel":后端加
/api/data/summary 与 /api/data/export,前端加"明细/汇总"切换与导出按钮。
- 汇总结果与报表/手工作业抽样核对(1-8 月公交、巡游出租、货运规上企业)。
五、Codex 桌面端输入卡顿复核(2026-09-22)
- 按 09-21 的修复方案,用户重启电脑和 Codex 后复核。
- 进程:ChatGPT 于 2026-09-22 12:54 新启动;修复脚本
fix-codex-typing-retry-storm.js 存在且 user_scripts.json 仍为 enabled=true。
- 性能:主渲染进程(PID 7044)连续 10 秒采样约
13.28% 单核;修复前约 115% 单核。
- 守卫:调试端口 9229 读取
window.__codexPlusRetryTimerGuardInstalled=true,本次会话 window.__codexPlusRetryTimerGuardDropped=16。
- 结论:输入卡顿修复在重启后仍生效,问题已解决。