docs/¹¤×÷ÈÕ½á/¹¤×÷ÈÕ½á_2026-09-16.md
@@ -237,3 +237,138 @@
入库抽查:H2032 2025 å…¨å¹´è§„上 50117.0940 ä¸‡å¨ / 7435040.9971 ä¸‡å¨å…¬é‡Œã€2026 å¹´ 1-8 æœˆè§„上 31399.8248 ä¸‡å¨ï¼Œé€å¸‚å·ž 17/17 ä¸Žå¯¼å‡ºä»¶ã€Œè´§è¿é‡æŽ’名」累计表一致。
详见《功能测试报告/货运累计列核对与导入数据体检_2026-09-16.md》。
### 19.4 git ç»“果(本轮)
- æäº¤ `27574bc`(功能测试报告 + æœ¬èŠ‚ + .gitignore è¡¥ `_pylibs/`、修正 `~$*` å‰å¯¼ç©ºæ ¼ï¼‰â†’ **已推 origin(gitee master)**:`559e937..27574bc`。
- **公司 gitea ä»ä¸å¯ç”¨**:`Test-NetConnection 61.183.254.94:3000` è¿”回 True(TCP é€šï¼‰ï¼Œä½† `GET /r/trafficAudit.git/info/refs?service=git-upload-pack` 25 ç§’无任何响应(HTTP 000),`git fetch gitea` æŠ¥ `Operation too slow. Less than 1000 bytes/sec`。判断为服务端未正常提供 HTTP å“åº”,待恢复后补推,**禁强推**。
## äºŒåã€ç”¨æˆ·ã€Œå¯ä»¥ã€æŽˆæƒé¡¹è½å®žï¼šè´§è¿é¡µç­¾ç´¯è®¡åˆ—修复 + H2032 è„æœŸæ¸…理
### 20.1 å…³é”®å‘现:根因不是累计公式,而是「全省规下」行
上一节我判定为「2021 ç´¯è®¡åˆ—空 + 2022 å†™æ­»å¸¸é‡ + 2023 ç²¾åº¦å·®ã€ï¼Œæœ¬è½®ç”¨ Excel COM é€æœˆå®žæµ‹åŽ**修正了结论**。对 6 ä¸ªå¹´åº¦å—逐月比较「全省行」与「17 å¸‚州行之和」:
| å¹´åº¦ | åˆè®¡å·® | è§„上差 | è§„下差 |
|---|---|---|---|
| 2026(1-8) | 2.8e-5 | 1.8e-12 | 2.8e-5 |
| 2025 | 3.3e-11 | 9.1e-13 | 3.5e-11 |
| 2024 | 1.5e-11 | 9.1e-13 | 1.3e-11 |
| 2023 | **4.6e-3** | 4.5e-13 | **4.6e-3** |
| 2022 | **3.1e-3** | 2.3e-13 | **3.1e-3** |
| 2021 | 4.0e-5 | 4.0e-5 | 1.5e-4 |
- ã€Œè§„上」全省行永远是 17 å¸‚州之和(公式),**一处不差**;
- å·®å¼‚ 100% æ¥è‡ªã€Œå…¨çœè§„下」行 â€”— å®ƒæ˜¯**写死的常量**,与 17 å¸‚州规下之和不等;
- è€Œã€Œ17 å¸‚州行之和」恰好等于源文件湖北省行(2022 = 144979.2825、2023 = 173045.2964),正是用户人工核算的那个数。
所以只要把「全省 è§„上/规下」两行都改成 17 å¸‚州求和公式,全省行自然等于市州之和,累计列随之自动对上。
### 20.2 æ¯ç‰ˆæ”¹åŠ¨ï¼ˆdocs/生成汇总大表/2026å¹´8月道路运输量汇总表.xlsx çš„「 è´§è¿ã€é¡µï¼‰
| ä½ç½® | æ”¹å‰ | æ”¹åŽ |
|---|---|---|
| r7/r8/r9/r10(全省 è§„上/规下 è´§è¿é‡Â·å‘¨è½¬é‡ï¼Œ2021-2025 å„月) | å†™æ­»å¸¸é‡ | SUM(17 å¸‚州对应行) |
| r5/r6(全省 è´§è¿é‡/周转量,2021-2025 å„月) | å¸¸é‡ | m7+m9 / m8+m10 |
| DZ(2022 ç´¯è®¡ï¼Œè¡Œ 5-112) | å†™æ­»å¸¸é‡ | SUM(DM:DX) |
| EO(2021 ç´¯è®¡ï¼Œè¡Œ 5-112) | ç©º | SUM(EC:EN) |
| EA(2022 ç´¯è®¡åŒæ¯”,行 5-112) | å†™æ­»å¸¸é‡ | IFERROR(DZ/SUM(EC:EN)-1,"") |
共 360 + 324 ä¸ªå•元。2026 å¹´å—不动(当月值由导出代码回填);EP(2021 ç´¯è®¡åŒæ¯”)保持为空(页内没有 2020 å—,无同比基期)。改前备份 docs/生成汇总大表/_bak_202608母版修改前_20260916/。
**只改母版这一个文件**:生成_道路运输量汇总表.xlsx æ˜¯åˆ—宽参照件(代码只读列宽/隐藏标记),_版式原型.xlsx è¿è¡Œæ—¶æ— ä»»ä½•代码引用;同期备份母版 resolveSummaryDonor(2026,8) è¦æ±‚文件名以 _备份_ å¼€å¤´ä¸”含「2026å¹´8月」,目录下无匹配(导出日志确认「未找到同期备份母版」),不会冲掉改动。
### 20.3 æ•°æ®åº“清理
- DELETE FROM h2032_enterprise_monthly WHERE report_period='2026-09' â†’ 636 è¡Œï¼ˆROW_COUNT() å®žæµ‹ï¼‰
- DELETE FROM import_batch WHERE id=302 â†’ 1 è¡Œ
- å¤‡ä»½ï¼š_backup_h2032_2026-09_rows_20260916.sql(636 å…ƒç»„)、_backup_h2032_2026-09_batch302_20260916.sql
### 20.4 ä¿®å¤åŽå®žæµ‹ï¼ˆé‡å¯¼å‡º 2026-08,Excel é‡ç®—)
| å¹´åº¦ | åˆ— | ä¿®å¤å‰ | ä¿®å¤åŽ | æºæ–‡ä»¶æ ¸ç®— |
|---|---|---|---|---|
| 2026(1-8月) | S | 130311.8927 | 130311.8927 | 130311.8927 |
| 2025 | AT | 195433.2232 | 195433.2232 | 195433.2232 |
| 2024 | BV | 184938.5780 | 184938.5780 | 184938.5780 |
| 2023 | CW | 173045.2932 | **173045.2964** | 173045.2964 |
| 2022 | DZ | 144979.2854 | **144979.2825** | 144979.2825 |
| 2021 | EO | ç©º | **161309.5316** | 161309.5316 |
全部 4 ä½å°æ•°ä¸€è‡´ï¼ˆæœ€å¤§æ®‹å·® 4.1e-5,为浮点累加噪声)。导出件「全省行」vs「17 å¸‚州行之和」逐月 å°äºŽç­‰äºŽ 9.3e-10。预览接口 types=summaryWorkbook è¿”回 ready=true、20 é¡¹æŒ‡æ ‡ï¼ˆå½“月货运量 16888.76、累计 130311.89)。2026-07 å¯¼å‡ºå›žå½’通过。
### 20.5 è¸©å‘
1. **PowerShell åŒå¼•号里的 "$m7" ä¼šè¢«å½“成变量 m7**:公式串 "=SUM(DM$r:DX$r)" ä¸­çš„ $r:DX è¢«å½“成「驱动器 r:」而吞掉,公式被写成 =SUM(DM5) â€”— é¦–次脚本已把母版改坏,靠备份还原后改用 ${m}/${r} å®šç•Œé‡è·‘。
2. **嵌套的单引号 here-string ä¼šæå‰ç»ˆæ­¢å¤–层 here-string** â†’ æ”¹ä¸ºã€Œå…ˆ Out-File å†™è¡¥ä¸æ–‡ä»¶ï¼Œå† Get-Content -Raw ä¼ ç»™ codex.exe --codex-run-as-apply-patch」。
3. æ¯ç‰ˆè¢« Excel é‡å­˜åŽä½“积 959,706 â†’ 1,480,392 å­—节,导出件 950,186 â†’ 1,331,599(Excel è‡ªèº«æ ¼å¼å¼€é”€ï¼Œä¸å½±å“æ•°æ®ï¼‰ã€‚
4. 2026å¹´8月道路运输量汇总表_版式原型.xlsx çš„ S åˆ—漏了 8 æœˆï¼ˆ=C+E+G+I+K+M+O,缺 Q5),但它运行时不被引用,本次未改。
### 20.6 é—ç•™
- 2026-09 æœŸåœ¨ h204_vehicle_quarterly(1284 è¡Œï¼Œbatch 142/144 åŒæ–‡ä»¶ï¼‰ã€investment_monthly(31 è¡Œï¼Œbatch 107/108 åŒæºï¼‰ã€audit_result(2061 è¡Œï¼‰ã€audit_run(3 è¡Œï¼‰ä¸­ä»åœ¨ï¼Œæœ¬æ¬¡æœªåŠ¨ï¼Œå¾…ç”¨æˆ·ç¡®è®¤æ˜¯å¦æ¸…ç†ã€‚
- 2026-07 æœŸå¯¼å‡ºä»¶ã€Œ è´§è¿ã€é¡µä¸º 118x145(比 8 æœˆå°‘ 2 åˆ—),因 7 æœˆæ¯ç‰ˆæ˜¯ã€Œ1-4 æœˆéª¨æž¶ã€ã€‚
详见《功能测试报告/功能测试报告_货运页签累计列修复与脏期清理_2026-09-16.md》。
---
## äºŒåä¸€ã€2026-07 æ¯ç‰ˆè¡¥é½ + å¯¼å‡ºä»¶ã€ŒExcel æ‰“不开」根因修复
日期:2026-09-16(第 9 è½®ï¼ŒæŽ¥äºŒåèŠ‚ï¼‰
### 21.1 ä»Šå¤©åšäº†ä»€ä¹ˆ
| # | äº‹é¡¹ | ç»“æžœ |
|---|---|---|
| 1 | æ¸…理 2026-09 æ®‹ç•™æ•°æ®ï¼ˆç”¨æˆ·ç¬¬ 1 æ¡ï¼‰ | **完成**:h204_vehicle_quarterly 1284 / investment_monthly 31 / audit_result 2061 / audit_run 3 / import_batch 5 / h2032 636,全部复核为 0 æ®‹ç•™ï¼›å·²ç•™å¯è¿˜åŽŸ SQL å¤‡ä»½ `_backup_2026-09_residual_all_20260916.sql` |
| 2 | ä¿® 2026-07 å¯¼å‡ºä»¶ã€ŒExcel æ‰“不开」 | **完成**(P0,见 21.2) |
| 3 | è¡¥é½ 2026-07 æ¯ç‰ˆï¼ˆç”¨æˆ·ç¬¬ 3 æ¡ã€Œå¯ä»¥è¡¥é½ã€ï¼‰ | **完成**(见 21.3) |
| 4 | ä¿®å¤‡ä»½æ¯ç‰ˆå›žå¡«æŠŠè¡¥é½ã€Œæ‰“回原形」 | **完成**(见 21.4) |
### 21.2 æ ¹å› ï¼šopenpyxl æ¯ç‰ˆ + å¤‡ä»½å›žå¡« â†’ æ®‹ç•™ <is> éžæ³•æ ¼
- åä»¶é‡Œ 19 ä¸ªæ ¼å­å½¢å¦‚ `<c r="E15" s="111" t="n"><v>67.0</v><is><t>67.00</t></is></c>`:`t="n"` å´å¸¦ `<is>`,模式非法,Excel ç›´æŽ¥æ‹’开(COM æŠ¥ã€Œä¸èƒ½å–å¾—ç±» Workbooks çš„ Open å±žæ€§ã€ï¼Œè¿žä¿®å¤æ¨¡å¼ `CorruptLoad=1` ä¹Ÿæ‰“不开)。
- 7 æœˆæ¯ç‰ˆæ˜¯ **openpyxl å†™å‡º**(文本存 `<is>`),8 æœˆæ¯ç‰ˆæ˜¯ **Excel åŽŸç”Ÿ**(文本走 sharedStrings)→ åŒä»£ç ä¸‹åªæœ‰ 7 æœˆåã€‚
- è§¦å‘者是 `restoreSummaryMonthlyBlocks`:7 æœˆæœ‰ `_备份_2026å¹´7月…清理前…xlsx`,整格回填时往 inlineStr æ ¼é‡Œå†™å€¼ï¼Œç•™ä¸‹æ—§ `<is>`;8 æœˆæ²¡æœ‰ `_备份_*`,不走回填,所以一直是好的。
- å®šä½æ‰‹æ³•(值得记住):坏件/好件**除 worksheets/styles/sharedStrings å¤–全部部件逐字节相同** â†’ zip æ‚交 + Excel é€ä¸€å¼€æ¡£ leave-one-out â†’ é”å®š **sheet9《公交》17 æ ¼ + sheet12《轨道、轮渡》2 æ ¼**。
### 21.3 ä¿®å¤
1. `ReportExportService.exportSummaryWorkbook`:落盘前新增 `normalizeStaleInlineStrings(wb)`,清掉所有「非 inlineStr å´æ®‹ç•™ `<is>`」的格子(幂等 + warn æ—¥å¿—)。
2. `ReportExportService.restoreSummaryMonthlyBlocks`:新增 `skipFreightHistoryBlocks`,《 è´§è¿ã€‹é¡µ **T åˆ—及以后**(2025..2021 äº”个年度块 + å„年累计列)永不从备份母版回填 â€”— ä¸Žæ—¢æœ‰ã€Œä¸­å£å¾„排名左块」保护同一思路,防「生成又复活」。
### 21.4 7 æœˆæ¯ç‰ˆè¡¥é½ï¼ˆExcel COM,360 + 324 æ ¼ï¼‰
按 `_fix_mother.ps1`(8 æœˆæ¯ç‰ˆé‚£ç‰ˆï¼‰**整体左移 2 åˆ—**改写:
- å¹´åº¦å—:2025 `T,V,X,Z,AB,AD,AF,AH,AJ,AL,AN,AP`;2024 `AV..BR` éš”列;2023 `BW..CS` éš”列;2022 `DK..DV` è¿žç»­ï¼›2021 `EA..EL` è¿žç»­ï¼›æ¯åˆ—写 `r7/r9/r8/r10 = SUM(17 å¸‚å·ž)`、`r5=r7+r9`、`r6=r8+r10` â†’ **360 æ ¼**;
- ç´¯è®¡åˆ—:`DX=SUM(DK:DV)`、`EM=SUM(EA:EL)`、`DY=IFERROR(DX/SUM(EA:EL)-1,"")`,行 5..112 â†’ **324 æ ¼**;
- `CalculateFullRebuild` åŽä¿å­˜ã€‚母版 921,559 â†’ 1,440,038 å­—节(转 Excel åŽŸç”Ÿï¼‰ã€‚
### 21.5 æµ‹è¯•结果摘要
| ç”¨ä¾‹ | ç»“æžœ |
|---|---|
| 2026-07 å¯¼å‡ºï¼ˆä¿®å¤å‰ï¼‰ | FAIL(复现) |
| çŽ¯å¢ƒ/路径排除(小件、两本母版、09-08 æ—§å¯¼å‡ºã€æ”¹åå¤åˆ¶ï¼‰ | å…¨éƒ¨ OK,确认非环境问题 |
| ä¿®å¤åŽ 2026-07 å¯¼å‡º | **OK sheets=19**,`DX5=144979.2825`、`DY5=-0.101235487797891`、`EM5=161309.53162`、`CU5=173045.296428512` |
| ä¿®å¤åŽ 2026-08 å¯¼å‡º | **OK sheets=19**,`DZ5=144979.2825`、`EO5=161309.53162`、`CW5=173045.296428512` |
| è·¨æœˆä¸€è‡´æ€§ | 7 æœˆä¸Ž 8 æœˆçš„ 2022/2021/2023 ç´¯è®¡**完全相等** |
| éžæ³•格复扫 | 0 ä¸ª |
| 2026-09 æ®‹ç•™å¤æ ¸ | 5 å¼ è¡¨å…¨ 0 |
> æ³¨ï¼š8 æœˆæ¯ç‰ˆè®¡ç®—后 `DZ5` ç”±æ—§çš„写死常量 `144979.285376043` å˜ä¸º `144979.2825`,差 0.0029 â€”— æ­£æ˜¯ç¬¬åäºŒèŠ‚è®°å½•çš„ã€Œå…¨çœè§„ä¸‹å¸¸é‡ â‰  17 å¸‚州之和」那笔差额,属**修正**而非回退。
### 21.6 è¸©å‘
1. **Excel COM å­¤å„¿è¿›ç¨‹ä¼šè®© `Workbooks.Open` é—´æ­‡æ€§å‡æŠ¥åŒä¸€ä¸ªé”™**:每例测完必须强杀本次新建的 `EXCEL` è¿›ç¨‹ã€‚排查初期就因孤儿进程误判「8 æœˆä»¶ä¹Ÿæ‰“不开」,浪费了一轮。
2. `CTWorksheet` **没有** `isSetSheetData()`(sheetData æ˜¯å¿…填),要用 `getSheetData() != null`。
3. æ¯ç‰ˆè¡¥é½çš„备份文件**不能**用 `_备份_` å‰ç¼€ï¼ˆä¼šè¢« `resolveSummaryDonor` å½“ donor å›žå¡«ï¼‰ï¼Œæœ¬æ¬¡ç”¨ `_bak_2026å¹´7月道路运输量汇总表_补齐前_20260916.xlsx`。
### 21.7 é—ç•™
- 2026-06 / 2026-09 æ— æ¯ç‰ˆ â†’ é¢„览 `ready=False`「未找到模板文件」,需先建母版。
- ç¬¬ 8 æ£’遗留未动:`h2031` ç¼º 2025-01、`passenger_individual_monthly` 2026-08 ç¼ºé»„冈、`PASSENGER_AUTH` 11 æœŸå…¨ 0。
- ä»“库根 `_*.*`(含本次 `_hyb_*` / `_loo_*` / `_v2_*` / `_final_*` / `_fixed_*` / `_t7_*` / `_poijar`)未删,待用户同意。
详见《功能测试报告/功能测试报告_2026-07母版补齐与导出件打不开修复_2026-09-16.md》。