# 工作日结_2026-09-21 ## 一、今天做了什么 ### 1. 定位「汇总大表中口径排名累计同比 7.74% vs 中口径明细 7.64%」根因(用户 09-21 提问) **现象**:`D:\桌面\生成数据\生成_道路运输量汇总表 (3).xlsx` 中, 「中口径排名」M13 黄冈 1-8 月累计同比 7.744917%,「中口径明细」T55 同一格 7.641733%; 两页当月累计值相同(3480.930066022),差的只是去年同期基数(3230.713965 vs 3233.810859,差 3.096894)。 **排查过程与结论**(全部用库内数据 + 7 份母版历史版本逐格验证): 1. 四个中口径维度分别复算 2025 年 1-8 月:班线+个体、城际城乡公交、城际城乡巡游出租**逐位一致**; 只有**城际城乡网约车**一维不同,且只有 **2025 年 3、4 月**不同(其余 6 个月逐位一致): - 2025-03 黄冈:母版 5.203089147 / 库现算 3.938965484(差 1.264123663) - 2025-04 黄冈:母版 6.585331252 / 库现算 4.752560757(差 1.832770495) - 合计差 3.096894158,与两页基数差完全吻合。 2. 用**母版自己的出租列**(与库逐格一致,17 市州 × 8 月全对)+ 订单 + pin 套现算法复算: 1/2/5/6/7/8 月**逐位复现(偏差 0.000000000)**,3/4 月复现不出来 → 算法无误,是那两格另有来源。 3. **否定「9/16 出租补录导致」**:9/8 程序改动前的原始母版 (`docs/生成汇总大表/_bak_202608母版修改前_20260916/2026年8月道路运输量汇总表.xlsx`) 这两格**本来就是** 5.203089147 / 6.585331252,同月出租列也已与现库一致 → 矛盾在 9/8 之前就存在。 4. 反推那两格隐含输入(前提已验证:母版 17 市州城市内加总 = 2504.28 = 全省 pin 城市内,分毫不差,武汉自留 → 分摊规则与现算法完全相同):隐含的「巡游出租城市内客运量」16 个市州里 15 个都比现在低 (荆州 -41.38、恩施 -34.65、黄冈 -26.13、十堰 -20.31,仅宜昌 +2.27)。 5. **最终结论**:母版 2025 年 3、4 月的网约车拆分,是用**另一份出租城市内口径**算出来的,与母版自带的出租列自相矛盾; 9/16 出租入库后,排名页一现算才把矛盾显性化。属**「排行页按库现算 vs 明细页用母版静态历史」的双轨制**问题。 6. **影响面**:除武汉外 16 个市州全有差(宜昌 +0.55pp、十堰 -0.35pp、荆州 -0.32pp、鄂州 -0.30pp、荆门 -0.25pp、 恩施 -0.13pp、黄冈 -0.10pp…);**全省行两页完全一致**,因为这是市州之间的分摊差异,加总抵消。 ### 2. 产出《汇总大表问题交接说明》(面向接手同事) - 仓库:`docs/问题汇总/汇总大表问题交接_2026-09-21.md`(250 行) - 桌面副本:`D:\桌面\汇总大表问题交接_2026-09-21.md` - 内容:现状一句话 / 前置阅读 5 篇 / 生成原理 6 步 / 问题总览表(P0~P2)/ P0-1 历史基数双轨制完整根因与方案 A、B / P0-2 母版依赖与「每月换母版」三处必改点及方案 / 已修复的 6 个历史坑(避免改回去)/ P2 待办 / 关键代码地图(文件:行号)/ 数据与环境 / 证据文件清单 / 待业务确认清单 / 建议接手顺序。 ### 3. 临时证据文件(项目根目录,未清理) `_chk_wyc4~7.txt`(网约车逐市逐月复算)、`_chk_backsolve.txt`(反推出租输入)、`_chk_lineage*.txt`(母版血缘)、 `_chk_rule.txt`(候选公式排除)、`_chk_all_pref.txt`(17 市州差异清单)、`_chk_orig.txt`(9/8 原始母版)等。 ### 4. 产出《总交接文档》(用户要求「把存在的问题和没做完的工作都写进去,越详细越好」) - 仓库:`docs/交接文档_2026-09-21.md`(约 14.6 KB)。 - 定位:**全系统唯一入口**。汇总大表那条线不重抄,只做摘要 + 指向已有 `docs/问题汇总/汇总大表问题交接_2026-09-21.md`,避免两份文档写同一份内容后互相打架(用户问「汇总也在写要不要写一块」时确认的口径)。 - 内容:接手第 1 小时清单 / 现状快照(服务·数据库·仓库,均为 09-21 上午实测)/ 系统结构与代码地图 / 五条数据链(货运周转量、H203-1、城市客运、汇总大表、投资 5 张表)/ **未完成工作 P0·P1·P2 共 27 条**(现象·影响·证据·下一步·状态)/ 待业务确认清单 10 条 / 历史坑索引与「最容易被改回去的 6 个点」/ 操作手册(启停·DB·本机特有的坑·交付规矩)/ 接手第一小时 checklist。 - 本次核实并写入文档的关键事实: 1. 后端 8090、前端 8080 **当前均在运行**(接口探活 200); 2. 库内 `investment_project` 152 / `investment_monthly` 284(2026-08 = 136); 3. **2026-09 脏期已清理干净**(此前 09-16 记录的 1284/31/2061/3 行已不存在); 4. 母版只有 2026年7月 / 2026年8月 两本(缺 2026-06 / 2026-09); 5. 投资两处未实现:**《亿元投资项目》月份列每月覆盖上月**(Q7 要求的「新增一列」未做)、 **导出「按月分目录 + 自动备份 + 运行日志/校验报错」未实现**(Q10 已答同意); 6. 导出前基数体检(B4)只做了一半:后端 `getLastMidIssues()` **无任何调用方**,前端未消费、无《数据缺失清单》页。 ### 5. 十堰物流源文件清理(用户「清除掉」)+ 投资系统新模板支持 - **十堰源文件清理(数据处置)**:`docs/投资/输入/物流(物流园区)/8月/湖北省十堰交通物流基础设施投资统计汇总表(月报)(2026年8月).xls` 里的武汉段(27 个项目)与黄石段(4 个项目)用 Excel COM 整行删除(第 11~63 行),只留十堰段(7 个项目); 原件先备份到 `docs/投资/输出/源文件备份/…_原始含武汉黄石_20260921.xls`。 重导验证:该文件由 **38 条 → 7 条**,8 月物流 total 128 → 97,库内仍是 152 个项目 / 136 条 2026-08 月度数(不增不减)→ **残留问题闭环**。 - **投资系统导出新模板**:用户把比对明细表换成《2026年8月投资系统项目明细》(多「项目所处阶段」、少「自年初累计」,列位整体右移)。 原实现写死 8 列 → 改为**按表头关键字定位**(`findColByKeywords`),兼容新旧模板;缺列时 `year_cum` 留空而不是错填。 新模板 129 条已入库(`investment_system` 2026-08 = 129,2026-07 = 148 不受影响),字段逐列抽查一致。 - **审核「基准缺失」保护**:新模板没有「自年初累计」,原 `nvl()` 会把 NULL 当 0 → 100+ 条误报。改为基准为 NULL 时跳过并记 WARN 日志。 实测:RULE_I002 由「每个项目一条」降为 **0 条**;RULE_I001 2 条、RULE_I003 1 条、RULE_I004(存在性)25 条,合计 28 条均为真实差异。 ## 二、测试结果摘要 - 见《功能测试报告_投资系统新模板按表头解析与审核基准缺失保护_2026-09-21.md》:**11 条用例通过**(正向 6 / 负向 1 / 回归 4)。 - 上半日(汇总大表双轨制定位):本次**无代码改动**,无《功能测试报告》(仅有数据核查)。 - 数据核查口径:全部结果与库内 `h2031_enterprise_monthly` / `passenger_individual_monthly` / `city_bus_monthly` / `city_taxi_monthly` / `wyc_order_monthly` 现算值逐位比对,17 市州 × 8 个月, 一致性达 1e-9;复现脚本与中间输出已留档(见上)。 ## 三、遗留问题与待办 1. **P0-1 已解决**:用户选择方案 A(排名页改用母版 2025 静态列),已于 2026-09-21 实施并回归通过,见本文件第六节。 2. **P0-2**:母版依赖 —— 9 月出表需先有新母版;方案 A(程序自动扩列,2-3 天)/ 方案 B(Excel 小工具,1 天)待拍板。 3. P2:B4 导出前基数体检 + 《数据缺失清单》页、D 组增速排名措辞、中口径明细 4 格 `#DIV/0!`、 缺母版提示实测、部署包旧母版(用户明确暂不处理)。 4. 本次产出的交接文档是否归档进 gitea / 是否推送本地未推提交(09-18 起的本地提交尚未推公司 gitea),待用户确认。 ## 四、明日计划 1. 按用户拍板的方案实施 P0-1(方案 A)并出《功能测试报告》+ 双页同比一致性回归。 2. P0-2 先出 9 月母版(方案 B 应急),再排方案 A 的扩列器与「7 月母版扩 8 月」逐格 diff 验证。 3. 配合接手同事过一遍《汇总大表问题交接说明》,答疑并补充遗漏。 --- ## 五、下午追加:全库数据备份(交付给同事) 用户要求「把我的数据备份出来,拷贝给同事」,产出交付包 `_给同事_2026-09-21\`(仓库根,已用包内 `.gitignore` 整包排除入库): | 文件 | 说明 | | --- | --- | | `traffic_audit_full_20260921.sql` | 全库备份,52,010,797 字节(约 49.6 MB),`mysqldump` 8.0.29 导出,含 `CREATE DATABASE` + 全 29 表结构与数据,共 128,803 行 | | `还原说明_2026-09-21.md` | 备份信息 / 还原步骤(A 整库还原、B 已有库补数据)/ 验证明细 / 注意事项 | | `交接文档_2026-09-21.md` | 总交接文档副本(一并发给同事) | **导出命令**(服务端同版本 mysqldump): ``` mysqldump --host=127.0.0.1 --port=3308 --user=root --default-character-set=utf8mb4 \ --single-transaction --routines --triggers --events --hex-blob \ --databases traffic_audit --result-file=...\traffic_audit_full_20260921.sql ``` **验证**(沿用 2026-09-13 的验证口径):把备份里的库名换成临时库 `traffic_audit_vfy` → 完整导入 → 与源库逐表 `COUNT(*)` 比对 → 比对后 `DROP DATABASE traffic_audit_vfy`。 结论:**29 张表全部一致,0 差异**(合计 128,803 行)。关键表:`city_taxi_auth` 85,272 / `h2031_enterprise_monthly` 15,811 / `h2032_enterprise_monthly` 13,056 / `audit_result` 3,393 / `city_bus_monthly` 2,860 / `investment_project` 152 / `investment_monthly` 284 / `freight_turnover_import` 234 —— 与交接文档 §1.2 记录一致。 **留下的临时文件**(未删):`_tmp/_verify_20260921.sql`(改名后的验证副本,52 MB)、`_tmp/_verify_counts.tsv`(逐表比对结果)、`_tmp/_mk_pkg_20260921.py`、`_tmp/_fix_pkg_doc.py`。 **本次无代码改动**,属数据类工作,故不另出《功能测试报告》。 **待用户确认**:① 交付包是否需要压缩 zip(50 MB → 便于微信/网盘传输);② 同事环境若为 MySQL 5.7,需另出一份 5.7 专用导出;③ 是否需要把 `docs/`(母版、投资源文件)一并打包 —— 该部分已在 git 仓库内,clone 即可获得。 ### 五之补充:10:34 复查发现备份已过期,已重新导出 - 用 `CHECKSUM TABLE` 复检 10:17 那份备份时发现 4 张表校验和不一致,进一步查 `COUNT(*)`:`audit_result` 3393→3421、`import_batch` 417→419、`investment_system` 148→277、`investment_monthly` 284→284(行数同但内容变),最后写入时间 10:20~10:22 → 即 **10:17 导出之后,另一个会话(提交 2e6830b)又往库里导入了投资系统数据**,旧备份已过期。 - 已重新导出:**10:34:57,52,030,977 字节,合计 128,962 行**(旧份 128,803 行),《还原说明》已按新数据重写(含文件 SHA256)。 - 重新验证(三层,全过):结构 `CREATE TABLE` 29/29;逐表 `COUNT(*)` 29/29 一致;`CHECKSUM TABLE` 29/29 一致;`mysqldump --order-by-primary` 有序导出两份数据文件 **SHA256 完全相同**(逐行内容一致)。 - **经验**:备份只是某一时刻的快照,导完之后只要还在导数据/跑审核就旧了;交付前必须最后再导一次。 - 新增文档:`docs/工具/数据库备份与还原操作步骤.md`(备份参数说明 / 三步验证 / 还原 / 常见问题,命令可直接复制)。 ## 六、追加:P0-1 历史同比基数双轨制按方案 A 修复 用户选择 **方案 A**(排名页改用母版《中口径明细》2025 静态列),已完成代码、回归与文档更新。 - 代码:`ReportExportService.exportPassengerMidRank()` 增加母版工作簿上下文重载;汇总导出复用内存母版,独立排名表导出打开对应母版;按表头识别 2025 年逐月列,读取「总客运量 / 总旅客周转量」并按 1..N 月累计;全省基数由 17 市州求和;静态基数不完整时回退库内现算并写 WARN。 - 编译:`mvn -DskipTests compile` 通过。 - 生成回归:2026-08 汇总大表;黄冈客运量累计同比排名/明细均为 `7.641733%`(原 7.744917%)。 - 双页一致性:17 市州 × 客运量/周转量的累计值与同比共 68 个数值对全部一致,最大绝对差 `2.91e-11`;全省累计值 = Σ17 市州;8 月当月同比 34 个数值对最大差 `5.48e-15`。 - 独立《生成_中口径排名.xlsx》也按同一静态口径导出,结果与明细页一致。 - 测试产物:`_tmp/qa_plan_a_20260921/生成_道路运输量汇总表_202608_方案A.xlsx`、`_tmp/qa_plan_a_20260921/生成_中口径排名_202608_方案A.xlsx`(按约定保留)。 - 测试报告:`docs/功能测试报告/功能测试报告_中口径排名同比基数方案A_2026-09-21.md`。 ## 七、追加:同事《汇总大表软件输出与手工定稿差异》人工核对 同事(xyc)推送差异报告(提交 `47a8734`)并口头要求「人工检查一下报的差异」,本次完成核对: - 产出回执:`docs/问题汇总/汇总大表差异核对回执_2026-09-21.md`(按对方编号逐条回答)。 - 复核方式:本地母版 `2026年8月道路运输量汇总表.xlsx` + 生成件 `生成_道路运输量汇总表.xlsx`(9/18)逐格读公式与缓存值(内联 Python,未落盘)。 - 结论: 1. `公交/出租/网约车` `U5:U76`(报告 §4.1):业务口径确认**可清空留空**。根因是母版自相矛盾——`U5` 只算到 2025 年 6 月,而同页累计同比 `T5` 的分母含 1-8 月;补 7、8 月后与手工值逐位吻合(公交 114285.68 / 出租 52461.16 / 网约车 22474.11),影响 3 页 × 72 行。 2. `轨道、轮渡` `R2/R11`:确认差异(软件「8月与去年同比」vs 人工「同比」)→ 按人工措辞改。 3. `中口径排名`:人工那份隐藏表数据不对、展示仅 1-8 月累计 → 以软件输出为准。 4. `班线包车`(§4.2):2021 年 3 月起累计同比大量 `#DIV/0!`,且两边列区间不一致(生成 `DU:EP` / 手工 `TD:EO`);报告里 220 个 `#VALUE!` 本机复现不出来(本地母版与 9/18 生成件均为 `#DIV/0! 228 + #REF! 8`,与报告「软件输出」两项完全一致),判为读缓存值产生的假错值,待对方用 9/21 原件复核。 5. ` 货运` 2022 年累计同比(§4.3):软件对。 - 待对方回复:`货运周转量排名` 的「标题」指哪一格、`城市客运` 差异格在哪、并把两份源文件放共享位置以便同源复核。 - 本次无代码改动,属核对/文档类工作,不另出《功能测试报告》;上述回执即核对记录。 ## 八、追加:修正《2026年8月道路运输量汇总表_版式原型》班线包车页文本数值 用户手工把该原型文件「班线包车」页里文本格式的数值单元格改成数值格式,核对后提交。 - 文件:`docs/生成汇总大表/2026年8月道路运输量汇总表_版式原型.xlsx`(1,487,539 → 1,354,428 字节) - 改动范围:`班线包车` 页第 8-57 行 × `FV:IX` 列,共 **196 格 `文本 → 数值`**(如 `'33,437.0000'` → `33437`);逐格比对数值**完全等价,0 处不匹配**。 - 其余页差异属 Excel 另存归一化,非业务改动:`公路总客运` 104 格、`城市客运` 126 格是公式去掉工作表名引号(`'轨道、轮渡'` → `轨道、轮渡`,语义不变);` 货运` 23、`货运周转量排名` 3、`城市汇总` 4、`城市分市州` 17、`中口径排名` 11、`中口径分析` 3 格是浮点重写(15 位有效数字,相对差约 1e-15)。 - 背景:对应同事差异报告 §4.2 中「数值 vs 同值文本」这一类差异。 - 该原型文件在代码中无引用(`rg 版式原型` 无命中),属参考件;本次无代码改动。 - 核对方式:用 `git show HEAD:` 取出旧版到 `_tmp_proto_head.xlsx`,再用 openpyxl 逐格比对类型与值(临时文件保留,未删)。 ## 九、追加:汇总大表「软件输出 vs 手工定稿」全量逐格比对(用户 09-21 傍晚任务) 用户给定两份文件,要求「比较软件输出与手工计算的结果,列出所有不一致的地方(两者格式可能略有不同)」: - 程序(软件输出):`D:\桌面\生成数据\生成_道路运输量汇总表_2026-08 (2).xlsx`(09-21 16:49) - 手工(手工计算/定稿):`D:\05_数据分类\汇总表\8月汇总定稿\2026年8月客运量、货运量定稿.xlsx`(09-13) **产出** - `docs/问题汇总/汇总大表_软件输出与手工定稿差异清单_2026-08.md`(分类清单:数值/结构/文字) - `docs/问题汇总/汇总大表_差异明细_2026-08.csv`(943 条逐格明细) **比对方法**(可复现,脚本 `_tmp_cmpG.py` 保留在项目根) 1. openpyxl 双读(缓存值 + 公式);按「块标题(累计/当月)+ 行标签 + 列头」语义对齐。 2. 先用表头文本序列求列偏移:` 货运` 从 V 列起 +1、`城市客运` 从 AJ 列起 +1、`班线包车` 尾部 2015/2016 区 −3;三页表头校验均 0 处不一致。 3. 行按「市州(列 A 前向填充)+ 指标(列 B)」匹配,市州名去「市/州」后缀;标签列单独做文字核对(避免合并单元格假差异)。 4. 判定分档:相对差 ≤1e-12 视为同值、1e-12~1e-6 记「取整差异」、>1e-6 记「数值差异」。 **结果(943 条)** | 类别 | 条数 | | --- | ---: | | 数值差异(>1e-6) | 315 | | 文本型数字(值相同、格式不同) | 286 | | 取整差异(≤1e-6) | 207 | | 仅程序有值 | 129 | | 错误值差异 | 4 | | 文本不同 | 2 | 关键结论: 1. **304 条数值差异是同一个母版问题**:`公交/出租/网约车` `U5:U76`(各 72 格)与 `中口径明细` `U99:U188`(88 格)——程序沿用母版公式只累加到 6/7 月,手工累加到 8 月。与第七节回执口径一致(该列可清空留空)。 2. ` 货运` `EA92:EA112` 10 格 2022 年累计同比(仙桃/潜江/天门/林区)差异较大,此前业务已确认「软件对」。 3. ` 货运`「2021 年累计」`EO5:EO112` 74 格:程序有值、手工**该列数据区全空**(表头 `EP4` 有「累计」)。 4. `班线包车` `IL4:IL57` 34 格:手工该列 31 格空白、2 格 `#REF!`(公式 `=(IK4-#REF!)/#REF!`)、1 格是杂字符「`」。 5. ` 货运` 历史月份(2021-2024)139 格小数尾数差异,相对偏差最大 7.7e-7(手工取整),不影响结论;尾部核算块 63 处两边都是 1e-10 量级残差,实质为 0。 6. **结构差异**:` 货运` 程序每市州多 2 行(规上+规下货运量、规下货运量)=多 34 行,且从 V 列起手工整体右移 1 列(手工 V 列多一个无表头的「2025 年 1-8 月累计」辅助列,74 格);`城市汇总` 程序多 8 月块(41 格);`城市分市州` 程序多两个 8 月块;`中口径分析` 程序多 8 月块;`中口径排名` 布局完全不同但**数据一致**;`城市客运` 手工多一列「2025 年 1-7 月累计」;`班线包车`/`道路运输周转量` 手工各多列。 7. **文本型数字**:手工 `班线包车` 196 格(`FV8:IX57`)——**与第八节用户在《版式原型》里刚改掉的 196 格完全是同一批单元格**;手工 `公交` 153 格、`轨道、轮渡` 5 格。程序侧 `公交` `AF` 列 68 格同为文本型数字(两边一致)。 8. **纯文字差异 2 处**:`道路运输周转量!A23`(程序「2026年8月全省完成交通周转量情况」vs 手工多了「累计」二字)、`轨道、轮渡!R2/R11`(「8月与去年同比」vs「同比」)。 9. 逐格 0 差异的页签:`公路总客运`、`2025年城市客运量`、`中口径客运量`、`中口径计算过程`,以及其余页签的共有部分。 本次为比对/文档类工作,无代码改动。 ## 十、追加:母版《2026年8月道路运输量汇总表.xlsx》班线包车页 196 格文本改数值(提交) 用户 15:59 手工改的工作区改动,核对后提交。此前提到的「公路班线里的数字文本格式改为数值」即指本文件 `班线包车` 页(该页 A1 = 「公路班线客运量」)。 - 文件:`docs/生成汇总大表/2026年8月道路运输量汇总表.xlsx`(**母版**,1,486,884 → 1,355,960 字节) - 改动范围:`班线包车` 页第 **8-57 行 × `FV`/`FW`/`FX`/`FY`/`GA`/`GC`/`IT`/`IV`/`IX` 列,共 196 格 `文本 → 数值`**(`'374.0000'` → `374`、`'33,437.0000'` → `33437`)。 - 核对方式:`git show HEAD:docs/生成汇总大表/2026年8月道路运输量汇总表.xlsx > _tmp_mother_head2.xlsx`,与工作区逐格比对类型与值: - `str → 数值` = **196 格**,数值逐格等价(0 处不等); - 另有 32,092 处 `float → float`,是 Excel 另存把浮点重写为 15 位有效数字(相对差 ~1e-15),非业务改动。 - 与第八节《版式原型》的改动同源:两份文件在同一批 196 格上做过同样的文本→数值整改;本次把**母版**这份也入库。 - 本次无代码改动,属母版数据格式整理,不另出《功能测试报告》。