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

生成计算参照与验收口径(2026-10-13 汇总)

一页回答两件事:① 汇总大表的"生成计算"**参照了同事专项统计的哪些做法**;② 每次出表怎么验收(四层验收,已脚本化)。
来源:docs/汇总大表M0版式重建器规格_2026-10-06.md 第十一节(2026-10-08 对齐表)、docs/汇总大表生成数据验证方法_2026-10-12.md、docs/要求与验收基线清单.md R6、docs/确认回执汇总…_2026-09-07.md 第八节。

一、参照同事「专项统计」的映射(2026-10-08 原文对齐表)

同事专项统计的做法 他为什么能成立 汇总大表的对应做法 状态
一份母版(2026年十一数据.xlsx),**天为行、年为列** 增长维度是「年」、天数固定 8 按 F10 按月按需扩列:读 N 月母版产出 N+1 月版式(不预留空列),母版只当版式来源 ✅ 已实现(扩列器)
母版**同时是数据容器**(历史年份值就在并排年列里) 历史值随模板走 反过来做:历史参照值入库、母版只留版式、参照组由 DB 回填 ⬜ 未实施(10-08 定方向)
表头/行标签**语义定位**(findYearColumn/parseDayIndex) 列序变了也能导 页规则表 SummarySheetRule:**按表头认月份组、按行标签认市州/指标,不硬编码列锚点** 🚧 部分(月度块还依赖母版公式;2026-09 漏月即源于此)
易漂移口径**外置成表**(holiday_calendar/passenger_coefficient/vehicle_adjustment) 规则不散在代码与单元格里 外置:参照年保留组数、排名口径(全省不排名)、B=G+L/2+Q/10、缺数置空规则 🚧 部分
DECIMAL(30,15) + BigDecimal + 按 Excel 显示精度取值 精度口径统一、无浮点尾差 承接待办「16 张表 228 个 double 列改 DECIMAL+BigDecimal」;已做 F1 全精度存储+两位小数显示、母版文本数字归一 🚧 部分
导入两阶段确认 + 全程只读核对(历史数据不被误覆盖) 先出差异清单、用户确认后才写 生成前先出缺数/差异清单、人工确认后再出表(B4 基数体检 + 《数据缺失清单》页) ✅ 已实现
输出走模板文件(docx/PNG) 版式来源单一 保留现有做法(快报改 word/document.xml、JFreeChart 出 PNG) —

一句话:借的是**方法与纪律**(语义定位、口径外置、两阶段确认、精度统一),**不照搬**他"母版兼数据容器"的做法——我们反过来让历史值入库。

二、生成计算的分段与各自参照(2026-10-12《生成数据验证方法》)

原则:**每一段都要有一个独立于该段的参照**;两边同源就验不出东西。

段 问题 参照 谁负责 程序能自证
L0 源文件→库 源数据对不对 源文件/下发表模板 数据、业务 不能
L1 库→口径值 算法口径对不对 手写 SQL 复算(不看母版/定稿) 程序 能
L2 口径值→单元格 写回对不对 上一期母版/生成件("不该动的格未变") 程序 能
L3 单元格→整本 与人工定稿一致吗 手工定稿(**记版本 + sha256**) 双方复核 部分
L4 跨页合成页 勾稽对不对 勾稽式本身(如 道路运输周转量 B=G+L/2+Q/10) 程序 能

典型失败模式(原文):L0 漏导/列错位/单位差 10000/重复导入叠加;L1 规下倒减为负、Σ市州≠省行;L2 当月列没写、上期列被重算冲掉、公式断链;L3 把"定稿滞后"当"程序回归";L4 源页对而合成页引用错列。

三、每次出表的四层验收(脚本化;与第二节的分段是两套切分,别混)

工具:汇总表四层验收.py(L1–L4)+ 汇总表全盘体检.py(增量版,含 A/B/C/D)。命令:
python 汇总表四层验收.py <生成表.xlsx> --源表 <当期源表.xlsx> --上期 <上期件.xlsx> --报告 验收报告.txt

层 查什么 真值/依据 通过标准
验收 L1 结构断言 全簿公式与表头 表头本身 累计=当年 1..M 月之和;累计同比分母=去年 1..M 月;**历史列零变化**;无月首日期串;#REF!=0
验收 L2 与源表 8 个可见台账页 当期业务源表 逐格 diff=0;差异须逐条结论并签核
验收 L3 内部勾稽 全簿 由 L2 推导 全省=Σ市州;累计=Σ各月;排名/占比自洽
验收 L4 跨期报警 全簿 上期件 同口径环比超阈值(默认 ±30%、基数≥100)即提示

白名单机制:已知且已解释的差异显式登记(轮渡块形态、母版模板遗留日期值、源表自带脏值被清空…);**白名单之外任何差异=不通过**,不再靠人工逐条解释。

两套切分的对应关系(重要):

验收四层 覆盖第二节的哪一段
验收 L1 结构断言 链条 L2(写回层)为主
验收 L2 与源表/定稿 链条 L3(出表层);源表可用时也覆盖 L0 的结果
验收 L3 内部勾稽 链条 L4(合成页)
验收 L4 跨期报警 链条 L1 的"环比异常"体检
未覆盖 链条 L1 的"SQL 锚点复算"尚未脚本化(待办)

四、通过标准与三条纪律

  • 通过=四层全过 + 白名单外零差异;**任一未覆盖 → 结论只能写"未覆盖",不得写"已验证"**。
  • 纪律 ①**独立参照**(同源互比等于没验);②**一次只换一个变量**(换代码/换数据/换母版分开验);③**差异先分类再结论**(结构/格式/浮点尾差只计数,实质数值差异进清单)。
  • 责任边界:程序保证"**不搬错 + 与源表一致 + 可追溯**";**数据本身的正确性**由导入审核 + 业务口径确认 + 每期签核负责。

五、待办(按优先级)

  1. 链条 L1 的 SQL 锚点复算脚本化(全省 + 2 市州,覆盖 规上/规下/合计/周转量/中口径/城市内)。
  2. 历史参照值入库、母版只留版式(10-08 已定方向)。
  3. 轮渡块 8 格口径确认(当前列白名单);跨年(2027-01)扩列规则;"缺当月母版时自动扩列"接主链。

六、「约定 8 条」vs 现状 vs 现做法(2026-10-13 核实)

# 约定可以参照的 做了吗 现在实际怎么做
1 按需增长列 → F10 按月按需扩列 ✅ 扩列器已实现;底稿取 _cache\summaryWorkbook_<期>_month_v*.xlsx;**未接主链**(resolveSummaryMother 只精确匹配)→ 每月仍需人工一步(扩列→确认落盘→生成)
2 表头/行标签语义定位 🚧 已做:表头动态定位、按「A 市州名 + B 指标文案」定位行、扩列按基准月份列判表头、累计/累计同比按表头重建(2026-10-13 新增)。未做:页规则表 SummarySheetRule(用启发式替代)
3 输出走模板文件 ✅ 复制母版 → 回填/还原 → 排名页按母版标题格对齐搬块 → 7 标题页按 period 现写
4 口径外置成表 ⬜ 写死在代码/母版:系数 2、10、排名口径、缺数置空规则
5 精度统一(DECIMAL+BigDecimal) ⬜ 仍走 double;已做 F1 全精度+两位小数显示、母版文本数字归一
6 两阶段确认+只读核对 ✅(环节不同) 同事在导入侧做;我们在**生成侧**做(缺数清单+货运体检+导出前弹窗+《数据缺失清单》页)。**导入侧仍是重复导入直接覆盖**
7 二维表三层职责 🚧 原始值 ✅(导入表齐全);配置值、人工调整值**均无表**;**Excel 仍承担历史值存储**(2025 参照值在母版里)
8 人工调整值单独建表(覆盖层) ⬜ 靠 _备份_/_bak_ 母版 + 人工改母版兜

不可照搬 3 条的执行:不把 Excel 当数据源 ✅(业务数据走 DB,但历史参照值仍在母版 ⚠️);母版只留版式 ⬜;独立「新年组」逻辑 ❌(跨年 month>=12 抛错)。

七、任务清单(借 3 条 + 自建 3 条)

借同事的:① 语义定位(比对与定位都不硬编码列锚点);② 参照值入库、母版只留版式(阶段 2 核心);③ 口径与人工调整外置成表 + 覆盖层留痕(覆盖值+原因+时间)。
自建:④ SQL 锚点复算(链条 L1,唯一能发现"源表自身错"的层);⑤ L2 比对覆盖补齐(班线包车/网约车/货运,用语义映射);⑥ L4 跨期阈值报警(已实现)。

八、2026-10-13 语义比对结果(新增脚本 汇总表语义比对.py)

按「行=市州+指标、列=年+月+类型」归位后比对 2026-09 生成件 与 桌面源表:

页签 可比行 差异 结论
班线包车 54 0 ✅ 原被"表头布局不同"跳过,现可比且完全一致
公交 / 出租 / 城市客运 / 公路总客运 / 轨道、轮渡 72/69/36/36/10 0 ✅
网约车 72 8 ⚠️ 全省 4 个指标的 2026-09 当月值 = 生成 0、源表有值(4997.74 / 29166.70 / 4571.18 / 23367.09);同比 = -100%。属**库内 9 月网约车缺数**(订单/pin 未导),非算错 → 但"缺数期同比显示 -100%"应改为留空(待处理)
中口径明细 / 中口径客运量 181 62 / 22 差异全为 生成=None / 源='#DIV/0!' → 源表脏值被清空(生成件更干净)

结论:把语义比对补上后,班线包车 可证实一致;网约车 的差异可归因到"缺数",不属于算错。