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

工作日结_2026-09-13

补记:2026-09-12 无代码改动、无提交(git log --since=2026-09-12 为空),故未单独留档。

一、今天做了什么

1. 汇总大表「四页静态」问题定位与方案确认

  • 用户反馈:导出 2026-08 汇总大表后,城市汇总、城市分市州、中口径分析、道路运输周转量 四页标题仍写「1-7月/7月」、数值也是 7 月静态值。
  • 给出三套方案(A 沿用母版 2025 缓存做同比基数的快路子 / B 等 2025 数据入库 / C 只做当月块),用户选定 方案 A。

2. 口径反推(先证后写)

  • 把母版台账页(公交/出租/网约车/轨道、轮渡/班线包车/货运)逐格聚合,反推四页口径,与四页成品**逐格 0 差异**后才动代码。
  • 确认口径:城市客运量 = 公交城市内 + 出租城市内 + 网约车城市内 + 轨道 + 轮渡;中口径 = 班线包车 + (总量 − 城市内)×(公交/出租/网约车);道路货运周转量 = 规上 + 规下;同比 = 当期 ÷ 母版台账页 2025 同期列 − 1(库中无 2025 城市客运数据,故取母版缓存)。

3. 代码实现(唯一改动文件)

  • traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java(+494 −2):
  • 新增 refreshSummaryCumulativeSheets(wb, year, month),插在 refreshSummaryRankSheets 之后、applySummaryReferenceLayout 之前;
  • 台账取数 smReadLedgerMetrics 全部**按行标签识别**(不写死行号),19 维指标位;2026 逐月列 C…Q、2025 同期列 V…AJ;
  • 写值 smSetVal 遇目标格是公式**直接跳过**(保留母版公式,打开重算)、0 且原为空格不新增;smSetTitle 先 setBlank() 再写(母版标题是 inlineStr,POI 只写 <v> 不更新 <is> 的坑)。
  • 四页随报表期写入 1056 格。

4. 编译、重启与实测

  • mvn -o -q compile 通过;start-dev.ps1 重启后端(PID 27840)与前端(PID 23416)均就绪。
  • 导出 2026-08:HTTP 200 / 950,783 字节 / 36.8 秒;日志「刷新四页…数值格数=1056、刷新排名页数值格数=711、缺数提示=[]」,最近 4MB 日志无 ERROR/WARN。
  • 归档件:docs/生成汇总大表/输出/生成_道路运输量汇总表_2026-08_四页数据驱动_2026-09-13.xlsx。

5. 独立复核(从生成件自身台账页重新聚合)

  • 新写 _v5_four.py:覆盖标题 10 格 + 城市汇总累计块 28 格 + 当月块 28 格 + 城市分市州 408 格 + 中口径 10 格 + 道路运输周转量 102 格 = 586 格,差异 0 格。
  • 另用 _verify_four.py 复核 13:06 归档件(含与母版 1-7 月静态值对照),同样 0 差异。
  • 全省行自洽:G4/L4/Q4/W4/X4/Y4 = Σ17 市州(差 ≤ 6e-11)。

6. 文档

  • 《功能测试报告_汇总大表四页数据驱动_2026-09-13.md》写入 docs/功能测试报告/。
  • 本《工作日结》。

7. 提交与发布

  • 提交 ea7cc07(ReportExportService.java + 《功能测试报告_汇总大表四页数据驱动_2026-09-13.md》 + 本《工作日结》,3 文件 +689 −2)已推送双仓库:git push gitea main(09e612a..ea7cc07)、git push origin main:master(09e612a..ea7cc07),并 git branch -f master main。
  • 推送前 git fetch gitea / git fetch origin 均无新提交(rev-list --left-right --count = 0 0),未覆盖同事代码。
  • 发布后复跑 2026-08 导出(HTTP 200 / 950,783 字节 / 29.2 秒),对发布后产物 _t4_2026-08.xlsx 再做 586 格独立复核 = 差异 0 格;与发布前产物逐 zip 条目比对,内部条目字节完全一致(MD5 差异仅来自 zip 头时间戳)。

8. 打包部署支持(用户新需求:部署到另一台机器)

  • 新增一键打包脚本 package-deploy.py:前端 npm run build → dist 内嵌进后端 jar(拷入 resources/static)→ mvn clean package → 清空 static → 组装 deploy/traffic-audit-deploy-YYYYMMDD/ → 压缩 traffic-audit-deploy-YYYYMMDD.zip(本次 69.9 MB / 246 文件,jar 55.5 MB)。
  • 部署包结构:backend/(jar + docs + application.yml + start-backend.cmd/.sh)、frontend/(dist + nginx 示例)、db/(init.sql + sql_city_bus/taxi/wyc.sql)、README。
  • 修复部署陷阱:jwt.secret 填成非法 Base64(如中文)会让登录接口 500(jjwt 0.9.1 按 Base64 解码 secret)→ JwtUtils 新增 secretKeyBytes() 兜底(Base64 优先、否则 UTF-8 字节 + WARN)。
  • 更正 docs/打包部署说明.md 三处不实:① 不需要 Redis(pom 无依赖、代码未用);② 前端改为内嵌进 jar(旧说明称「已内置 file:./web/」,实际 jar 内无静态文件);③ 补 sql_wyc.sql 与 summary.template-dir。
  • 独立验证:把部署包 backend 拷到 _deploytest/ 用 8091 端口独立启动 → 启动成功、GET / 200 有 #app、静态 js 200、登录 200 拿到 token、导出汇总大表 200 / 950,783 字节(与开发机产物同尺寸);另测中文 secret 兜底路径同样 200。
  • 开发机后端已按新代码重启(旧 PID 27840 已停),重启后登录 200、导出 950,783 字节,无回归。
  • 报告:docs/功能测试报告/功能测试报告_部署包打包与独立启动_2026-09-13.md。

9. 数据库搬迁支持(回答「能不能直接备份数据库过去」)

  • 结论:可以,且比跑 4 个建表脚本更省事。已在《打包部署说明》里补「路线 A 空库 4 脚本 / 路线 B 整套备份还原」二选一说明,并标注 init.sql 是破坏性的(基础表都带 DROP TABLE),已有数据的库上不能重复执行。
  • 生成备份 traffic_audit_full_20260913.sql(45.5 MB,mysqldump --databases,含建库语句与全部 29 张表数据)。
  • 还原验证:把备份里的库名改成临时库 traffic_audit_vfy 导入,逐表 COUNT(*) 与源库比对 —— 29 张表 0 差异,抽查 wyc_order_monthly 2026-08 行数正确,验证后删除临时库。
  • 顺带确认:另外 3 个脚本(sql_city_bus/taxi/wyc)没有 USE 语句,必须 -D traffic_audit 执行;init.sql 自带建库语句可独立执行。

10. 备份还原的版本核查与强验证(复查发现的问题)

  • 复查发现两个此前表述不准的点:① 本机 MySQL 服务端是 8.0.29(D:\mysql\mysql-5.7.41-winx64 只是 5.7 客户端工具),昨晚按「本机是 5.7」写的说明不准确;② 29 张表的排序规则统一为 utf8mb4_0900_ai_ci,**目标机必须装 MySQL 8.0,5.7 会导入失败**。
  • 因此改用与服务端同版本的 C:\Program Files\MySQL\MySQL Server 8.0\bin\mysqldump.exe 重新导出备份 traffic_audit_full_20260913.sql(45.5 MB)。
  • 强验证(8.0 客户端):备份改库名导入临时库 traffic_audit_vfy → 表数量 29=29、表名一致、**逐表 SHOW CREATE TABLE 结构差异 0**、**逐表 COUNT(*) 行数差异 0**、抽查 wyc_order_monthly 2026-08 order_sum 一致 → 验证后删除临时库。
  • 部署说明已同步更正(环境要求表、路线 B 命令与版本说明、DROP TABLE 覆盖警告)。

11. 查证 Navicat .nb3 备份格式(回答「不是可以打包成一个文件直接还原吗」)

  • 用户记忆中的「一个文件直接还原备份」= Navicat 私有格式 .nb3;本机已有 8/27 那份:D:\文档\Navicat\MySQL\Servers\mysql80\traffic_audit\20260827152017.nb3(**已过期**:27 张表、缺网约车两张、数据停在 8/27)。
  • 解析出格式:tar 容器 = 每张表 <uuid>.meta.json.gz(DDL/字段)+ <uuid>.data.000NN.sql.gz(gz 数据分片)+ 末尾未压缩 meta.json(DatabaseType/Schema/Objects[UUID,Type,Name,Rows,Metadata{Filename,Checksum}]);Checksum 经实测就是该 meta 文件的 SHA1(大写)。
  • 结论与建议:.nb3 只能由 Navicat 自身生成、也只能用「还原备份」还原,**用 .sql 点「还原备份」必然失败**;我无法在命令行侧可靠合成并验证 Navicat 是否接受,所以不提供手工拼的 .nb3,改为在文档里写清「本机 Navicat 点一次备份 → 拷到目标机同路径 → 还原备份」的傻瓜步骤。
  • docs/打包部署说明.md 5.1 节新增「路线 B2:Navicat 备份/还原(.nb3)」,并注明三种方式任选其一、不可叠加。

12. 《运距异常分析》——桌面《分析报告(出版)》重写(跨会话续作)

  • 上个会话(thread 01a08b6d-30de-7500-8c98-f6e87100e55c)按用户 23:05 的要求,依据 D:\05\_数据分类\运距异常\2026年1-8月全省规上货物周转量差异率汇总表(4).xlsx(市州汇总/企业明细副本)与 D:\桌面\副本1-6月货运量测算数据各市州.xlsx(Sheet1 分市州规上货运量、Sheet2 高速车货总重/总重里程/运距)重写 D:\桌面\分析报告(出版).docx,产出 D:\桌面\分析报告(出版)_新_20260913.docx(43045 字节,6 页,5 张表),生成脚本 _gen_report.py;结构为 一 总体情况/二 与高速公路指标对比(表1 单月、表2 累计)/三 分运输方式(表3)/四 分市州(表4)/五 企业与运力(表5)/六 下一步对市州的要求与建议(6 条)。
  • 该会话因上下文超限中断(requested 1,189,201 > 1,048,576 tokens),本会话续作;该会话结束前已渲染校验 _render_check\rp01~rp06.png。

事故与恢复(重要)
- 本会话中一条参数写反的命令把 D:\桌面\分析报告(出版)_新_20260913.docx 覆盖成**纯文本**(10508 字节,zipfile.is_zipfile=False),Word 打开即为无排版的文字流、表格被拆成一行一词——这就是用户反馈「格式全乱、内容差太多」的直接原因。
- 处置:误覆盖件已备份到 _误覆盖备份_分析报告_新_20260913_纯文本.txt;用 D:\render_src.docx(23:10:07 原样副本)还原桌面文件,**SHA256 一致**(1723594DC746BA4458F19381D893AC0A17060CCC5B20513A8A10AFB19B415373),结构校验 zip 正常、5 表 262 段。已核对:备份纯文本内容与还原件内容一致,**无内容丢失**。

已查清的残留格式缺陷(待修)
- _gen_report.py 的 borders() 把 w:tblBorders 追加在 w:tblLook 之后(合法顺序应为 tblW→jc→tblBorders→tblLayout→tblLook),且 tblW=0(type=auto)、gridCol 6 列均分 1568,列宽与内容不匹配。
- 页面尺寸:还原件为 12240×15840(Letter)+1417 twips 页边距,用户底稿《分析报告(出版).docx》为 A4(11906×16838)+1800 twips,待统一。
- 已起草修复脚本 _gen_report_v3.py(自还原件读回内容 → 重排 tblPr 顺序、tblLayout=fixed、autofit=False、按内容分配列宽、A4/25.4mm 页边距、表内行距改单倍),**本次未执行、未产出文件**,明日继续。

二、测试结果摘要(详见《功能测试报告》)

项 结果
导出 2026-08 HTTP 200 / 950,783 字节 / 36.8 秒;两次导出字节数一致(确定性)
四页标题 城市汇总、城市分市州(4 块)、中口径分析(2 块)、道路运输周转量(2 块)全部更新为 1-8月/8月
逐格复核 586 格,差异 0 格(从生成件自身台账页独立重算)
月份回退(回归) 导出 2026-07 时四页精确回退成母版 1-7 月权威值:城市汇总 B3=237412.33、中口径 B3=27524.4906、周转量 G4=15222118.44638293、城市分市州 B6=135474.77989442425 —— 与母版逐项一致
负向 母版公式格未被覆盖(城市分市州!B5、道路运输周转量!J4 仍为公式);2025 无库数据时同比取母版缓存、不出现 NaN/Inf;空+0 不新增
前端 http://localhost:8080/ HTTP 200(首页正常)

三、遗留问题与待办

  1. 中口径排名页「同比增速」列仍是母版旧值:库中只有 2026 年数据、没有 2025 年中口径定稿数据,算不出 8 月同比;等 2025 数据入库后自动刷新。
  2. 网约车 8 月订单数仍是 7 月副本(已查证):wyc_order_monthly 的 2026-08 行 created_at=2026-09-11 16:35:10,对应 import_batch #317、文件名 _t_wyc_aug.docx(09-11 自测时用 7 月报告改标题的临时副本);你真实的 模板_网约车订单.docx 只导入过 2026-07 期(#314/#318/#319)。该行只有 4 个全省 pin 是真实 8 月数据(来自《网约车总数》#306),17 市州订单数与 7 月完全相同。**待用户重传真实 8 月运行监测报告(报表期 2026-08)覆盖。**
  3. 根目录临时文件(本次经用户同意删除自测副本 _t_wyc_aug.docx;其余 100+ 个 _* 临时文件未动):_*.py / _*.sql / _*.xlsx / _*.txt / _bak_*.java 等 100+ 个未跟踪文件(用户未同意前不清理、不提交)。
  4. docs/生成汇总大表/生成_道路运输量汇总表.xlsx(版式参照件)与 docs/生成汇总大表/输出/ 下的历史产物均为未跟踪文件,暂按惯例不纳入提交。
  5. 2026-08 导出的「未找到同期备份母版」告警属无害提示,是否消除待用户定。
  6. 《分析报告(出版)_新_20260913.docx》表格格式未修完:tblPr 顺序、列宽、页边距待重排(脚本 _gen_report_v3.py 已起草未执行)。
  7. 报告「五、企业与运力情况」末尾注明「规上企业户数同比、自有车辆及吨位同比两项指标本次未取得数据」,但用户明确要「今年企业减少、运力下降」这一层,数据源疑似 D:\05_数据分类\货运\8月\道路货物运输月度生产情况(2026)_2026-09-13 18_24_49.xls(636 家)对比 D:\需要导入的数据\货运\2025年月报\道路货物运输月度生产情况(2025年8月).xls(664 家)——**尚未由我独立核实,不得直接写入报告**。
  8. 注意:报告原文「运力同比增长 1.92%」与用户「运力下降」的说法口径不同(前者为全省营运货车吨位,后者疑为规上企业自有车辆吨位),明日需先与用户确认口径再定稿。

四、明天计划

  1. 用户核对/重传真实 8 月网约车运行监测报告后,重导 2026-08 并复核网约车页。
  2. 按用户反馈继续核对四页成品(重点:城市分市州增速列、道路运输周转量同期列口径是否符合业务预期)。
  3. 跟进 2025 年城市客运/中口径数据入库,入库后把四页同比从「母版缓存」切到「读库」。
  4. 视用户意愿清理根目录临时文件。
  5. (优先) 完成《分析报告(出版)_新_20260913.docx》的表格格式修复:执行/修订 _gen_report_v3.py,重排 5 张表的 tblPr 顺序、tblLayout=fixed、按内容分配列宽、统一 A4 页面,产出后**自查渲染**(Word→PDF→PNG,图片只用于自查不发给用户),确认表格不越界、打开不报修复提示。
  6. 就「企业与运力」两项指标口径与用户确认(全省营运货车吨位 +1.92% vs 规上企业自有车辆吨位下降),确认后再补数、补分析。
  7. 报告定稿后按规范补《功能测试报告》(docs/功能测试报告/),再按 git 双仓库流程提交推送。