docs/¹¤×÷ÈÕ½á/¹¤×÷ÈÕ½á_2026-09-18.md
@@ -21,6 +21,62 @@
- å†™äº†ã€Šæ±‡æ€»è¡¨ä¸‰æ¡ä¸»çº¿ä¿®å¤æ–¹æ¡ˆ_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、全省行靠缓存值 â†’ éœ€ä¿®æ¯ç‰ˆå…¬å¼ä¸€æ¬¡ã€‚
### 4. ç¬¬ 3 æ­¥æ”¶å°¾ï¼šç¼ºæ•°æ®ä¸å†è¦†ç›–定稿值(13:30)
用户反馈「独立《生成_中口径明细》8 æœˆæ²¡é—®é¢˜äº†ï¼Œä½† 1~6 æœˆåè€Œè¢«æ¸…空」后,追出**真正根因**:
- `exportPassengerMidDetail()` å¯¹æ‰©åˆ—月份(>6 æœˆï¼‰çš„æ€»è¡Œå€¼åˆ—是「直接写库内四维合计、写 0 å°± setBlank」;
  è€Œ 1~6 æœˆèµ° `keepCached()` æŠŠå…¬å¼æ¸…成空格 â†’ è¡¨é¢ä¸Š 7/8 æœˆä¿®å¥½äº†ï¼Œå®žé™…上把母版的定稿链路掐断了。
- `fillMidCell()` åŒæ ·ã€Œåº“内取值为 0 â†’ setBlank」,于是 2026-01~06 ç½‘约车城乡(库内该 6 ä¸ªæœˆæ— è®¢å•、维度 4 æ— æºï¼‰è¢«æ•´ç‰‡æ¸…空,
  è¿žå¸¦æ€»è¡Œã€ç´¯è®¡ã€åŒæ¯”全错。
**改动(`ReportExportService.java`,4 å¤„)**:
1. `exportPassengerMidDetail()` æ€»è¡Œå€¼åˆ—:删掉「扩列月份手写库内合计」与 `keepCached` æ¸…公式两条旁路,**一律保留模板公式**,由收尾重算写回缓存值。
2. `fillMidCell()`:库内取值为 0(该月该维无源)时**直接 return,保留母版/定稿原值**——绝不写空、也绝不写 0。
3. `recalcWorkbookFormulas()`:新增 `ev.setIgnoreMissingWorkbooks(true)`。跨簿公式(`[1]出租!C13`)在外部工作簿缺失时默认抛异常,
   ä¼šè®©å¼•用它的总行/累计连锁失败(表现为「公式在、没有缓存值」),置 true åŽæ”¹ç”¨è¯¥æ ¼è‡ªèº«ç¼“存值参与计算。
4. æ–°å¢ž `blankFutureMonthColumns()`:报表期之后的月份列(8 æœˆæŠ¥è¡¨é‡Œçš„ 9~12 æœˆï¼‰**清数据格、留表头**,避免克隆公式算出「9~12 æœˆå…¨æ˜¯ 0」的假数据。
**重要纠正(写进测试报告,也在此留痕)**:早前判断「母版中口径明细城市级公式引错页(`=公交!C13-公交!C15`)」是**误判**——
那是控制台中文乱码造成的误读;母版/模板真实公式是正确的 `=[1]出租!C13-[1]出租!C15` / `=[1]网约车!C13-[1]网约车!C15`,
台账页「总量−城市内」Σ17 å¸‚å·ž = 535.83 / 333.39,与母版定稿全省行完全一致。**母版公式不需要修,之前"待修母版"的结论作废。**
### 5. ç½‘约车订单报告:Word 2003 XML(WordML)兼容导入(15:00)
**用户报障**:《湖北网络预约出租汽车2025年09月分析报告.docx》放在桌面导不进去。
**定位**:该文件根本不是 docx â€”— æ˜¯ **Word 2003 XML(WordML å¹³é“º XML)** è¢«æ”¹åæˆ `.docx`(文件头 `<?mso-application progid="Word.Document"?><w:wordDocument xmlns:w=".../word/2003/wordml">`,3.1MB çº¯ XML、不是 zip åŒ…),POI çš„ `XWPFDocument` åªèƒ½è¯» OPC(zip) åŒ… â†’ æŠ› `File is not a zip file`。监管平台/同事间流转的报告常是这种格式,会反复出现。
**改动(`DataImportService.java`)**:
- `importWycOrderReport()` å…¥å£æŒ‰æ–‡ä»¶å¤´å—…探格式分派:zip→docx;`<w:wordDocument`+`wordml`→**新增 WordML DOM è§£æžè·¯å¾„**;`D0CF11E0`→明确提示「.doc è¯·å¦å­˜ä¸º docx」;其它→「无法识别」;
- æ–°å¢ž `isWordPackage()`:zip ä½†æ—  `word/document.xml`(xlsx æ”¹åï¼‰â†’ ä¸­æ–‡æç¤ºï¼Œä¸å†æŠ› XMLBeans è‹±æ–‡å †æ ˆï¼›
- æ–°å¢ž `parseXmlSafely()`:DOM è§£æžå…³é—­å¤–部实体/DTD(防 XXE);
- è¡¨æ ¼åŒ¹é…æŠ½æˆä¸Žæ ¼å¼æ— å…³çš„ `matchWycOrderTable()`,docx ä¸Ž WordML ä¸¤æ¡è·¯å¾„**共用同一套表头识别/17 å¸‚州取值/合计行逻辑**,不会口径分叉;
- æŠ¥è¡¨æœŸè¯†åˆ«æŠ½æˆ `periodOfParagraphs()`,两种格式共用。
**验证**:8 æ¡ç”¨ä¾‹å…¨éƒ¨é€šè¿‡ï¼ˆè§ã€ŠåŠŸèƒ½æµ‹è¯•æŠ¥å‘Š_网约车订单报告WordML兼容导入_2026-09-18》)。2025-09 å…¥åº“:订单合计 17,652,159;武汉 8,076,610 / é»„石 676,644 / åå ° 1,048,593 / æ©æ–½ 804,736 / æž—区 1,424,与报告附件1 é€é¡¹ä¸€è‡´ï¼›pin ä»Ž `wyc_total_monthly` åŒæœŸå¤åˆ¶ã€‚真 docx(2026-08)重导幂等无变化;`.doc`、xlsx æ”¹åã€éžæœ¬æŠ¥å‘Š docx ä¸‰ç§è´Ÿå‘均给出中文可操作提示。
**数据缺口已补齐(重要)**:用户在 14:21~14:49 ä¹‹é—´è‡ªè¡Œå¯¼å…¥ 2026-01~06(6 ä»½ï¼‰ã€2025-01、2025-10~12;2025-09 ç”±æœ¬æ¬¡ä¿®å¤åŽè¡¥å…¥ã€‚现在 **2025-01~12 + 2026-01~08 çš„订单与 pin å…¨éƒ¨é½å…¨**。直接效果:中口径维度 4 çš„ 1~6 æœˆä»Žã€Œæ— æºã€å˜ä¸ºã€Œå¯ç®—」,**中口径排名件与中口径明细件的累计口径自动归一**(两者 1-8 æœˆç´¯è®¡å‡ä¸º 31528.0606,此前差 2063.45)。
## äºŒã€æµ‹è¯•结果摘要
见 `docs/功能测试报告/功能测试报告_汇总表公式扩页与重算_2026-09-18.md`:8 æ¡æ­£å‘ + 4 æ¡è´Ÿå‘/边界 + 4 é¡¹å…¥åº“抽查,全部通过。
@@ -30,16 +86,56 @@
- ä¸­å£å¾„排名 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 æ ¼å˜åŒ–(全部是目标格)。
### ç¬¬ 3 æ­¥æ”¶å°¾ï¼ˆ13:30)验证
- ç‹¬ç«‹ã€Šç”Ÿæˆ_中口径明细》:18 åœ°åŒº Ã— 12 ä¸ªæœˆï¼Œ**总行 = Î£4 ç»´ã€ç´¯è®¡ = Î£1-8 æœˆï¼Œä¸ä¸€è‡´æ•° 0**;9~12 æœˆæ•°æ®æ ¼å…¨ç©ºã€è¡¨å¤´ä¿ç•™ã€‚
- ä¸Žæ±‡æ€»å¤§è¡¨ã€Œä¸­å£å¾„明细」页 1~8 æœˆ **704 å¯¹æ ¼ 0 å·®å¼‚**。
- å…¨çœ 1-8 æœˆæ€»å®¢è¿é‡ï¼š3733.79 / 3777.83 / 3874.44 / 3959.25 / 4115.87 / 4034.99 / 4028.32 / 4003.57;
  ç½‘约车城乡:333.39 / 294.49 / 347.23 / 335.39 / 369.27 / 383.68 / 421.46 / 426.56;累计 AA5 = 31528.0607、AA9 = 2911.47。
- åŸŽå¸‚级网约车城乡:武汉 0、黄石 13.599765541547697(沿用定稿,未被清空)。
- å›žå½’:汇总大表 17 é¡µ **0 æ ¼å·®å¼‚**、《生成_中口径排名》**0 æ ¼å·®å¼‚**;
  æ˜Žç»†ä»¶å·®å¼‚仅落在 æ€»è¡Œ / å‡ºç§ŸåŸŽä¹¡ / ç½‘约车城乡 è¡Œçš„æœˆä»½åˆ—与 AA ç´¯è®¡åˆ—(属预期)。
### ç½‘约车订单报告 WordML å¯¼å…¥ï¼ˆ15:00)验证
- 8 æ¡ç”¨ä¾‹ï¼ˆ4 æ­£å‘ / 3 è´Ÿå‘ / 1 è¾¹ç•Œï¼‰å…¨éƒ¨é€šè¿‡ï¼šWordML 2025-09 å¯¼å…¥æˆåŠŸã€æŠ¥è¡¨æœŸç•™ç©ºæ—¶é æ ‡é¢˜è‡ªåŠ¨è¯†åˆ«ã€çœŸ docx å¹‚等无变化、`.doc`/xlsx æ”¹å/非本报告 docx å‡ç»™å‡ºä¸­æ–‡æç¤ºã€‚
- æ•°æ®è¡¥é½åŽé‡è·‘ 8 æœˆå¯¼å‡ºå›žå½’:独立《生成_中口径明细》报表期内不一致 0、报表期后仍有值 0;与汇总大表「中口径明细」页 **704 å¯¹æ ¼ 0 å·®å¼‚**;全省 1-8 æœˆæ€»å®¢è¿é‡ 3733.79…4003.57,网约车城乡 333.39…426.56,累计 AA5=31528.0607、AA9=2911.47。
- æŽ’名件与明细件累计口径一致(均 31528.0606),差值 2063.45 æ¶ˆå¤±ã€‚
## ä¸‰ã€é—留问题与待办
1. **中口径排名同比仍是写死值**(M3=0.7424 / Q3=0.2317,库内全省口径),需与 Î£17 å¸‚州口径统一 â€”— ç¬¬ 3 æ­¥ã€‚
2. **`loadMidClassMap()` ç¼ºå·¡æ¸¸å‡ºç§Ÿ + ç½‘约车两维**,导致独立《生成_公路旅客中口径明细》少 535.83+333.39(1 æœˆï¼‰â€”— ç¬¬ 3 æ­¥ã€‚
3. **库内 h2031「全省」行 â‰  Î£17 å¸‚å·ž**(1-8 æœˆ 27524.49 vs 24481.74,差 3042.75):业务口径问题,建议业务侧核对。
4. æŠ•资:模板里没有的新项目不会自动插行;明细表资金渠道分组行未入库(需加 `fund_channel`);同名不同项目未弹窗。
5. æŠ•资两张明细表(`X月客运站投资明细表` / `X月物流站场投资明细`)生成器未做。
1. ~~中口径排名同比仍是写死值~~ â†’ **已按新口径取值**(M3=0.638 / Q3=0.2247),但仍与中口径明细的 0.0581 ä¸è‡ªæ´½ï¼Œå·®å€¼ 2063.45 = ç½‘约车 1-6 æœˆæ— æºï¼›**收口办法见下方"第 3 æ­¥æ”¶å£å»ºè®®"**。
2. ~~`loadMidClassMap()` ç¼ºå·¡æ¸¸å‡ºç§Ÿ + ç½‘约车两维~~ â†’ **已补**(维度 3、4),独立中口径明细四维齐全。
3. ~~**母版缺陷待修**:中口径明细城市级公式引错页~~ â†’ **误判,已作废**:真实公式是正确的跨簿引用,母版无需修改;当时的"引错页"是控制台中文乱码误读。
4. ~~**数据缺口**:2026-01~06 ç½‘约车订单未入库~~ â†’ **已补齐**(用户 14:21~14:49 å¯¼å…¥ 2026-01~06 + 2025-01 + 2025-10~12;2025-09 ç» WordML ä¿®å¤åŽè¡¥å…¥ï¼‰ã€‚现在 2025-01~12 + 2026-01~08 è®¢å•齐全,维度 4 å…¨æœŸå¯ç®—,排名件/明细件口径归一。仍建议补一条「导入时订单列全空」的显式提示(《模板_网约车订单及全省总量.xlsx》那类文件现在会静默成功)。
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. ~~母版里引错页的城市级公式修一次~~ â†’ **无需**(误判,已作废);
6. ç”ŸæˆåŽè·‘"生成件 vs æ¯ç‰ˆé‡ç®—"逐格回归比对,差异清单落日志,作为验收基线;
7. åº“内缺失(该月该维无源)时**一律保留母版定稿值、不覆盖**——已在第 4 æ¡æ”¹åŠ¨ä¸­è½åœ°ã€‚
## å››ã€æ˜Žå¤©è®¡åˆ’
1. ç¬¬ 3 æ­¥ï¼šç»Ÿä¸€ä¸­å£å¾„口径(rank å…¨çœåŒæ¯”改为同源 + `loadMidClassMap` è¡¥ä¸¤ç»´ï¼‰ï¼Œæ”¹å®Œå¯¹ç‹¬ç«‹ä¸­å£å¾„明细与汇总表逐项比对。
2. æŠ•资"新增项目插行 + åˆ†ç»„行入库"方案落地(等用户对"模块"口径的最后确认)。
3. å»ºç”Ÿæˆä»¶ vs æ¯ç‰ˆé‡ç®—的回归比对脚本,固化为每次改动的验收基线。
1. ç¬¬ 3 æ­¥æ”¶å£ï¼šæŽ’名件与明细件口径归一(差值 2063.45 = 2026 å¹´ 1-6 æœˆç½‘约车城乡)→ æŽ’名件改取汇总表同源值 â†’ å›ºåŒ–"生成件 vs æ¯ç‰ˆé‡ç®—"逐格回归脚本。
2. ç½‘约车订单导入空列提示(页面明确提示"该期订单列为空,未写入订单数")——数据虽已补齐,但静默成功仍是隐患。
3. æŠ•资"新增项目插行 + åˆ†ç»„行入库(`fund_channel`)"方案落地(等用户对"模块"口径的最后确认)。
4. æŠ•资两张明细表生成器(`X月客运站投资明细表` / `X月物流站场投资明细`)。