# 工作日结_2026-09-18 ## 一、今天做了什么 ### 1. 汇总表三条主线(用户 09-18 上午提出,已修前两条) **先定位,再动手**:复核 8 月生成件,确认三条主线是「一个统一根因 + 一处页范围漏项 + 一处口径缺口」: - 母版本身是公式驱动的:全省行 = Σ17 市州(`公交!C5 = =C9+C13+…`)、城市客运/中口径明细市州行 = 跨表引用(`城市客运!C9 = =公交!C16+出租!C16+网约车!C16+'轨道、轮渡'!C9`)→ 这两页根本不用单独写数据。 - 主线 1 根因:`SummaryWorkbookFiller.ensureMonthFormulas()` 页范围只含 6 个台账页,漏 城市客运/中口径明细;而同比公式用的页范围是含的 → 出现"同比列有公式、当月值列空白"。 - 主线 2/3 根因:生成件**不带公式缓存值**,预览/二次处理读到的是母版上一期的旧值。 **改动**: - `SummaryWorkbookFiller.ensureMonthFormulas()`:页范围改用 `isMonthLedgerSheet`;派生页新增"结构性常量行按月沿用"(中口径明细 武汉 城际城乡出租/网约车 恒为 0 的 4 格);加 logger;删掉已无用的 `isFilledLedgerSheet()`。 - `ReportExportService.recalcWorkbookFormulas()`:新增,生成收尾逐格 `evaluateFormulaCell` 写回缓存值(失败兜底 `fullCalcOnLoad=true`)。 **踩坑记录**:POI 4.1 的 `FormulaEvaluator.evaluate(Cell)` **无副作用**(只算不写),第一版白跑(日志"成功 40713 格"但文件无 ``),必须用 `evaluateFormulaCell(Cell)`。 ### 2. 其他 - 写了《汇总表三条主线修复方案_2026-09-18》(`docs/问题汇总/`),把根因、证据、4 步修法、投资"按项目名称更新/新增插行"现状一并记录。 - 投资侧核实:导入确实按「项目名称 + 类别」upsert(库内 客运站场 49/49、物流园区 135/135 无重复行);缺口是"模板里没有的新项目不会插行"、"资金渠道分组行导入时被跳过"、"同名不同项目不弹窗"。 ### 3. 第 3 步:中口径四维口径统一(下午) **口径定死**(写进《功能测试报告_中口径四维口径统一_2026-09-18》):1 公路班线(h2031+个体)= 2 城际城乡公交(city_bus)= 3 城际城乡巡游出租(city_taxi:总量−城市内)= 4 城际城乡网约车(WycSplitCalc 拆分);总量 = 四维之和;**全省行一律 Σ17 市州**。 **改动**(`ReportExportService.java`): - `loadMidClassMap()` 补维度 3、维度 4(新增 `midPeriodKey()`); - `fillMidCell()` 去掉「出租/网约车写死 0」旁路;`fillMidYoyCell()`/`fillMidCumYoyColumn()` 同比改四维齐全; - `exportPassengerMidDetail()` 由「只遍历公式格」改为「按列遍历」(扩列出的 7~12 月空格才填得上); - 扩列月份的总行值列改由库内四维合计直接写入(模板本无此列,克隆后既无公式也无缓存值); - 该函数重算改用逐格容错的 `recalcWorkbookFormulas()`——`evaluateAll()` 会在跨簿公式(Sheet2 的 `[1]xx!A1`)处整本中断,累计列就永远拿不到新缓存值。 **验证**:独立《生成_中口径明细》8 月全省总行 4003.5701、7 月 4028.3213(原为空),18 个地区总行 = Σ4 维、累计列 = Σ1-8 月;与汇总大表「中口径明细」页逐格一致;回归 = 汇总表 17 页 0 差异、排名件 0 差异、明细件仅 36 格(18 地区 × 2 个月总行)变化。 **顺带查清两个老问题**: - 《生成_中口径排名》全省累计 29464.6108 / 同比 0.638,比中口径明细少 2063.45,差值正好是 2026 年 1-6 月维度 4(网约车)→ 排名件是 Java 现算、明细页走母版公式链,两套口径打架(第 3 步的真正收口点)。 - 母版「中口径明细」城市级「城际城乡巡游出租/网约车」行公式引错页(`=公交!C13-公交!C15`,应指向 `出租!`/`网约车!`),城市级恒 0、全省行靠缓存值 → 需修母版公式一次。 ## 二、测试结果摘要 见 `docs/功能测试报告/功能测试报告_汇总表公式扩页与重算_2026-09-18.md`:8 条正向 + 4 条负向/边界 + 4 项入库抽查,全部通过。 - 城市客运 36 格、中口径明细 180 格 8 月列补齐(公式 + 缓存值)。 - 全省行 = Σ17 市州三方一致:公交 12315.37、出租 5786.81、网约车 4997.74(与库内 `city_bus_monthly` 2026-08 各市州求和逐项对齐;武汉 3856.83 / 黄石 879.12 抽查一致)。 - 中口径排名 K3 缓存 24481.7407 = 手工 Σ17 市州。 - 回归:改动前后逐格对比,仅 216 格变化,全部落在目标两页,其余 17 页 0 差异。 ### 第 3 步(下午)测试结果 见 `docs/功能测试报告/功能测试报告_中口径四维口径统一_2026-09-18.md`:6 条正向 + 3 条回归 + 3 条负向边界,全部通过。 - 独立《生成_中口径明细》全省 8 月总客运量 4003.5701 = 班线 1646.4801 + 公交 1436.63 + 出租城乡 493.90 + 网约车城乡 426.56; - 18 个地区 ×(7、8 月)总行 = Σ 该块 4 维行;累计列缓存值 = Σ1-8 月(全省 31528.0607); - 回归:汇总大表 17 页 0 格变化、《生成_中口径排名》0 格变化、《生成_中口径明细》仅 36 格变化(全部是目标格)。 ## 三、遗留问题与待办 1. ~~中口径排名同比仍是写死值~~ → **已按新口径取值**(M3=0.638 / Q3=0.2247),但仍与中口径明细的 0.0581 不自洽,差值 2063.45 = 网约车 1-6 月无源;**收口办法见下方"第 3 步收口建议"**。 2. ~~`loadMidClassMap()` 缺巡游出租 + 网约车两维~~ → **已补**(维度 3、4),独立中口径明细四维齐全。 3. **母版缺陷待修**:中口径明细城市级「城际城乡巡游出租/网约车」行公式引错页(指向 `公交!`),城市级恒 0、全省行靠缓存值。 4. **数据缺口**:2026-01~06 网约车订单未入库(`order_*` 全 NULL),模板《网约车订单及全省总量.xlsx》只有 2026-07 一行 → 维度 4 该 6 个月无源;需业务补数或确认不适用。 5. 库内 h2031「全省」行 ≠ Σ17 市州(1-8 月 27524.49 vs 24481.74,差 3042.75):业务口径问题,建议业务侧核对。 6. 投资:模板里没有的新项目不会自动插行;明细表资金渠道分组行未入库(需加 `fund_channel`);同名不同项目未弹窗。 7. 投资两张明细表(`X月客运站投资明细表` / `X月物流站场投资明细`)生成器未做。 ### 第 3 步收口建议(待用户拍板) 不再让 Java 各算一套,改为**一条链路出数**:母版公式链(全省行 = Σ17 市州、累计 = Σ各月、派生页跨页引用)+ 台账页写数 + 生成收尾重算。 1. 台账页(货运 / 班线包车 / 公交 / 出租 / 网约车 / 轨道轮渡)只写当月值; 2. 派生页(城市客运 / 中口径明细 / 公路总客运 / 中口径客运量 / 排名)**只补公式 + 重算,不单独写数**; 3. 只有母版里本就是硬编码数值的行(中口径明细的城市级"城际城乡出租/网约车"、全省行)按四维口径回填; 4. 独立导出件(生成_中口径明细 / 排名 / 公路旅客分市州)改为直接取汇总表对应页的值,或共用同一口径函数; 5. 母版里引错页的城市级公式修一次(第 3 条); 6. 生成后跑"生成件 vs 母版重算"逐格回归比对,差异清单落日志,作为验收基线。 ## 四、明天计划 1. 第 3 步收口:按上面 6 条落地(先修母版引错页的城市级公式 → 排名件改取同源 → 建回归比对脚本)。 2. 网约车 2026-01~06 订单数据缺口:向用户确认是补数还是留空。 3. 投资"新增项目插行 + 分组行入库"方案落地(等用户对"模块"口径的最后确认)。 4. 投资两张明细表生成器。