xyc
9 天以前 71a77e721619e956cab116be691cc3ab58e18093
Merge remote-tracking branch 'origin/main'

# Conflicts:
# docs/工作日结/工作日结_2026-09-22.md
6个文件已修改
2个文件已添加
677 ■■■■■ 已修改文件
.gitignore 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HANDOFF.md 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/交接文档_2026-09-21.md 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/功能测试报告/功能测试报告_导出缓存改用数据指纹_2026-09-22.md 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/功能测试报告/数据比对报告_投资明细表软件生成与人工版_2026-09-22.md 342 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/工作日结/工作日结_2026-09-22.md 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportTaskService.java 177 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
traffic-audit-web/src/views/ReportExport.vue 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.gitignore
@@ -100,5 +100,6 @@
# æ±‡æ€»å¤§è¡¨å¯¼å‡ºç»“果落盘缓存(复用上一次生成结果用,不入库)
docs/生成汇总大表/_cache/
_tmp_codexhome/
# Codex åº”用在本仓库根目录产生的产物目录(保留在本地,不入库)
outputs/
HANDOFF.md
@@ -12,6 +12,26 @@
- **汇总大表差异复核(2026-09-22)**:软件输出与手工定稿经 Excel å…¨é‡é‡ç®—后逐格比对,930 æ¡å·®å¼‚中实质数值差异 314 æ¡ï¼›å…¶ä¸­ 304 æ¡ä¸º 2025 ç´¯è®¡åˆ—少加 7、8 æœˆï¼ˆä¸šåŠ¡å·²ç¡®è®¤å¯æ¸…ç©ºï¼‰ï¼Œ10 æ¡ ` è´§è¿` åŽ†å²åŒæ¯”ä¸šåŠ¡å·²ç¡®è®¤è½¯ä»¶æ­£ç¡®ã€‚æŠ¥å‘Šè§ `docs/问题汇总/汇总大表_软件输出与手工定稿差异清单_2026-08_20260922.md`,明细见同名目录 CSV。
- **未完成重点不变**:P0-2《亿元投资项目》按 Q7 è¿½åˆ—、P0-3 å¯¼å‡ºå‰åŸºæ•°ä½“检、P0-4 2026-09 æ¯ç‰ˆï¼›å…¶ä½™è§ `docs/交接文档_2026-09-21.md` ç¬¬ 4 ç« ã€‚
### è¡¥å……(2026-09-22 ä¸‹åˆï¼ŒæŠ•资明细表比对)
- **已完成**:软件《客运站投资明细表》《物流站场投资明细》与人工版逐格比对(156 æ ¼å·®å¼‚),报告 `docs/功能测试报告/数据比对报告_投资明细表软件生成与人工版_2026-09-22.md`。
- **捞出 3 ç±»ã€Œä¼šé™é»˜å‡ºæ•°ã€çš„问题**(都指向取数而非算术):
  1. å¯¼å‡ºç”¨åº•稿模板 + **按项目名匹配**库内当月数,匹配不上/库内无当月数就沿用上期值 â€”— æ­¦æ±‰ç‰©æµï¼ˆåº“内 0 æ¡æœˆåº¦è®°å½•)整段保留 7 æœˆå€¼ï¼›è†å·žã€Œä¸­å›½ä¾›é”€å…¬å®‰å•†è´¸ç‰©æµå›­ã€å› åº“内名多一个点未覆盖。
  2. åº“内**同名双档**:十堰「快递物流产业园二期」`id=154`(竣工2026)/`id=181`(竣工2029) å¹¶å­˜ï¼Œå¯¼å‡ºå–到旧档。
  3. **导入丢数**:天门「天门市物流中心建设项目」库内 2026-08 ç´¯è®¡/自年初/本月全为 0,源文件是 16677.7/16677.7/500(**P1-5 åŽŸè®°å½•ã€Œæºæ–‡ä»¶ H/J/K åˆ—为空」与现文件不符,需更正**)。
- **另**:导出不覆盖 L(建设阶段)列、单渠道市州的分组小计行填法、0/空白写法差异,均已在报告第五节给出处置建议。
### è¡¥å……(2026-09-22 ä¸‹åˆï¼Œå¦ä¸€ä¼šè¯æ”¶å°¾ï¼‰
- **本会话已完成**(已推送):汇总大表进度弹窗优化(完成后不再出现重复下载按钮);导出结果**落盘缓存**(`docs/生成汇总大表/_cache/`,已 gitignore);
  ç¼“存守卫升级为**数据指纹**(依赖源表 `CHECKSUM TABLE` + æ¯ç‰ˆç­‰æ–‡ä»¶èº«ä»½ï¼ŒæŽ’除投资/能耗/审核/系统/导入日志)——无关导入不再失效、**换母版必定失效**,失效时进度弹窗给出说明。
- **当前环境**:后端 8090、前端 8080 è¿è¡Œä¸­ï¼›å¯¼å‡ºç¼“存对 2026-08 æœ‰æ•ˆï¼ˆæ–‡ä»¶åå¸¦æŒ‡çº¹ï¼‰ï¼›æœ€æ–°æäº¤ `06b1cb7`。
- **剩余待办(已逐条核查,同事未触碰)**:P0-2 äº¿å…ƒè¡¨æŒ‰ Q7 è¿½åˆ—(`ReportExportService.java:6251` ä»å†™åŒä¸€æ ¼ï¼‰ã€P0-3 åŸºæ•°ä½“检(`getLastMidIssues()` æ— è°ƒç”¨æ–¹ï¼‰ã€
  P0-4 2026-06/09 æ¯ç‰ˆç¼ºå¤±ã€P1-7 æŠ•资资金渠道字段、P1-9 æŠ•资导出按月分目录 + è¿è¡Œæ—¥å¿—、P2-1 D ç»„增速排名措辞。
- **待核实**:`docs/交接文档_2026-09-21.md` çš„ P2-2「城市客运页表头仍是日期序列号」可能过时——代码已有 `fixCityMonthHeaderText()`(09-03 åŠ å…¥ï¼‰ï¼Œ
  å»ºè®®è·‘一次 2026-08 å¯¼å‡ºæ ¸å¯¹åŽå†æ”¹æ–‡æ¡£ã€‚
- **入口**:`HANDOFF.md`(本文件)→ `AGENTS.md` â†’ `docs/交接文档_2026-09-21.md` ç¬¬ 4 ç« ï¼ˆP0/P1/P2 å…¨é‡é—留)。
## æœ€æ–°ï¼ˆ2026-09-21)
- **最新总入口**:`docs/交接文档_2026-09-21.md`(系统现状、P0/P1/P2 é—留、操作手册);汇总大表专项见 `docs/问题汇总/汇总大表问题交接_2026-09-21.md`。
docs/½»½ÓÎĵµ_2026-09-21.md
@@ -11,12 +11,13 @@
## 0. å…ˆè¯»è¿™ä¸€é¡µï¼ˆæŽ¥æ‰‹çš„第 1 å°æ—¶ï¼‰
1. **先把系统跑起来**,再谈改代码。见 Â§7.1(一键脚本,必须在沙箱外执行)。
2. **当前最紧急的 4 ä»¶äº‹**(详见 Â§4 P0):① ã€Šäº¿å…ƒæŠ•资项目》月份列每月覆盖上月(用户 Q7 è¦çš„「加一列」未做);
   â‘¡ å¯¼å‡ºå‰ã€ŒåŸºæ•°ä½“检 + å¼¹çª— +《数据缺失清单》页」只做了一半;③ ç¼º 2026-06 / 2026-09 æ¯ç‰ˆï¼Œé‚£ä¸¤æœŸå‡ºä¸äº†è¡¨ï¼›
   â‘£ æ±‡æ€»å¤§è¡¨ã€Œä¸­å£å¾„排名 vs ä¸­å£å¾„明细」历史同比基数双轨制(16 ä¸ªå¸‚州有差)。
   > åŽŸã€Œ8 æœˆåå °ç‰©æµæºæ–‡ä»¶å«éžåå °æ®µã€å·²äºŽ 2026-09-21 é—­çŽ¯ï¼Œè§ Â§4 P0-1。
2. **当前最紧急的 3 ä»¶äº‹**(详见 Â§4 P0):① ã€Šäº¿å…ƒæŠ•资项目》月份列每月覆盖上月(用户 Q7 è¦çš„「加一列」未做);
   â‘¡ å¯¼å‡ºå‰ã€ŒåŸºæ•°ä½“检 + å¼¹çª— +《数据缺失清单》页」只做了一半;③ ç¼º 2026-06 / 2026-09 æ¯ç‰ˆï¼Œé‚£ä¸¤æœŸå‡ºä¸äº†è¡¨ã€‚
   > å·²é—­çŽ¯ï¼ˆä¸å¿…å†æŸ¥ï¼‰ï¼š**8 æœˆåå °ç‰©æµæºæ–‡ä»¶å«éžåå °æ®µ**(2026-09-21,见 Â§4 P0-1);
   > **中口径排名历史同比基数双轨制**(2026-09-21 åŒäº‹æŒ‰æ–¹æ¡ˆ A å®žçŽ°ï¼Œcommit `abf468c`,见 Â§4 P1-1);
   > **导出缓存**(2026-09-22 è½ç›˜ + æ•°æ®æŒ‡çº¹ + å¤±æ•ˆæç¤ºï¼Œè§ Â§4 P2-6)。
3. **别自己拍板业务口径**,第 5 ç« åˆ—的是必须业务确认的事。
4. æ”¹å®Œå¿…须:写《功能测试报告》→ æ›´æ–°ã€Šå·¥ä½œæ—¥ç»“》→ åŒä»“库推送(§7.4)。这是本项目的硬规矩。
4. æ”¹å®Œå¿…须:写《功能测试报告》→ æ›´æ–°ã€Šå·¥ä½œæ—¥ç»“》→ æŽ¨é€åˆ°å…¬å¸ gitea(`origin`,§7.4)。这是本项目的硬规矩。
---
@@ -56,7 +57,7 @@
| --- | --- |
| å·¥ä½œåŒº | `D:\文档\ChatGPT\traffic-audit`,分支 `main` |
| HEAD | `a08c70d feat(投资): å¸‚州月报统一填报模板 + åŽ¿(市、区)列解析 + è¡¨å¤´è¡Œåˆ¤å®šæ”¶ç´§` |
| ä¸ªäººè¿œç«¯ | `origin` â†’ `https://gitee.com/zhizhijie/traffic-audit.git`(分支 `master`) |
| è¿œç«¯ï¼ˆå”¯ä¸€ï¼‰ | `origin` â†’ `http://61.183.254.94:3000/r/trafficAudit.git`(分支 `main`,账号 zyj)——2026-09-21 èµ·**只用公司 gitea å•仓库**,个人 gitee å·²å¼ƒç”¨ï¼›æ—§çš„ `gitea` åˆ«åæŒ‡å‘同一地址,可用可删 |
| å…¬å¸è¿œç«¯ | `gitea` â†’ `http://61.183.254.94:3000/r/trafficAudit.git`(分支 `main`,账号 zyj) |
| å·¥ä½œåŒºçŠ¶æ€ | å¹²å‡€ï¼ˆäº¤æŽ¥æ–‡æ¡£ã€æ±‡æ€»å¤§è¡¨é—®é¢˜äº¤æŽ¥ã€æ—¥ç»“、投资系统新模板支持均已提交并推送两端) |
@@ -194,7 +195,7 @@
| # | äº‹é¡¹ | è¯´æ˜Ž | çŠ¶æ€ |
| --- | --- | --- | --- |
| P1-1 | ä¸­å£å¾„排名 vs ä¸­å£å¾„明细「历史同期基数双轨制」 | é™¤æ­¦æ±‰å¤– 16 ä¸ªå¸‚州累计同比都有差(黄冈 7.74% vs 7.64%);根因是母版 2025 å¹´ 3、4 æœˆç½‘约车拆分用了一套与出租列自相矛盾的旧输入。**方案 A å·²å®žæ–½å¹¶å›žå½’:排名页改用母版 2025 é™æ€åˆ—**;黄冈 1-8 æœˆç´¯è®¡åŒæ¯”修正为 `7.641733%`,17 å¸‚å·ž Ã— ä¸¤æŒ‡æ ‡å…± 68 ä¸ªåŒæ¯”/累计格全部一致(最大差 `2.91e-11`),当月同比无回归 | âœ…(2026-09-21,详见汇总大表交接第 4 ç« ï¼‰ |
| P1-1 | ä¸­å£å¾„排名 vs ä¸­å£å¾„明细「历史同期基数双轨制」 | é™¤æ­¦æ±‰å¤– 16 ä¸ªå¸‚州累计同比都有差(黄冈 7.74% vs 7.64%);根因是母版 2025 å¹´ 3、4 æœˆç½‘约车拆分用了一套与出租列自相矛盾的旧输入。**方案 A å·²å®žæ–½å¹¶å›žå½’:排名页改用母版 2025 é™æ€åˆ—**;黄冈 1-8 æœˆç´¯è®¡åŒæ¯”修正为 `7.641733%`,17 å¸‚å·ž Ã— ä¸¤æŒ‡æ ‡å…± 68 ä¸ªåŒæ¯”/累计格全部一致(最大差 `2.91e-11`),当月同比无回归 | âœ…(2026-09-21 ç”±åŒäº‹ xyc æŒ‰æ–¹æ¡ˆ A å®žçŽ°ï¼Œcommit `abf468c`;报告《功能测试报告_中口径排名同比基数方案A_2026-09-21.md》;详见汇总大表交接第 4 ç« ï¼‰ |
| P1-2 | ä¸­å£å¾„排名全省行差 0.0002 ä¸‡äººå…¬é‡Œ | æ¯ç‰ˆå…¬å¼ `=SUM(O4:O20)` å…ˆå››èˆäº”入再求和的结构性差异,是否改全精度写值需拍板 | â¸ |
| P1-3 | ä¸­å£å¾„明细 4 æ ¼ `#DIV/0!` | 2025 å¹´ 8 æœˆåŸºæ•°ä¸º 0(不可比),是否改空白需业务确认 | â¸ |
| P1-4 | å…¨çœ h2031 1-8 æœˆ 27524.49 vs Î£17 å¸‚å·ž 24481.74 | å·® **3042.75**(企业上报的「全省」含市州明细外的数据,或某市州漏报)。程序一律按母版口径(Σ市州)走 â†’ å»ºè®®ä¸šåŠ¡ä¾§æ ¸ä¸€æ¬¡ | â¸ |
@@ -217,7 +218,7 @@
| P2-3 | `applySummaryReferenceLayout()` æŒ‰**列序号**套列宽/隐藏 | å‚照件一加减列就整体错位,应改为按表头文字匹配 | âŒ |
| P2-4 | ç¼ºæ¯ç‰ˆæç¤ºï¼ˆT08)未实测 | æœ‰æµ‹è¯•副本时补测 | âŒ |
| P2-5 | éƒ¨ç½²åŒ…内是**带 AJ åˆ—的旧母版** | `deploy/traffic-audit-deploy-20260913/backend/docs/生成汇总大表/`、`_deploytest/`;用户 09-20 æ˜Žç¡®ã€Œéƒ¨ç½²åŒ…先不管」,发包前必须同步 | â¸ |
| P2-6 | ~~导出缓存是内存态~~ | **已解决(2026-09-22)**:结果落盘到 `docs/生成汇总大表/_cache/`(文件名带数据版本 `MAX(import_batch.id)`),内存 â†’ è½ç›˜ â†’ çœŸç®—逐级命中,重启后端后仍可秒回复用;有新导入即失效,7 å¤©ä¸Šé™å¹¶è‡ªåŠ¨æ¸…ç†ã€‚é—ç•™ï¼šæ•°æ®ç‰ˆæœ¬æ˜¯å…¨å±€çš„ï¼ˆä¸Žæ±‡æ€»æ— å…³çš„å¯¼å…¥ä¹Ÿä¼šè®©ç¼“å­˜å¤±æ•ˆï¼‰ï¼Œå¦‚éœ€æŒ‰å¯¼å…¥ç±»åž‹ç»†åˆ†å¾…æŽ’æœŸ | âœ…(可优化项见右)|
| P2-6 | ~~导出缓存是内存态~~ | **已解决(2026-09-22)**:结果落盘到 `docs/生成汇总大表/_cache/`(文件名带数据版本 `MAX(import_batch.id)`),内存 â†’ è½ç›˜ â†’ çœŸç®—逐级命中,重启后端后仍可秒回复用;有新导入即失效,7 å¤©ä¸Šé™å¹¶è‡ªåŠ¨æ¸…ç†ã€‚é—ç•™é¡¹å·²é—­çŽ¯ï¼ˆ2026-09-22 ä¸‹åˆï¼‰ï¼šç‰ˆæœ¬å·å‡çº§ä¸º**数据指纹**(依赖源表 `CHECKSUM TABLE` + æ¯ç‰ˆç­‰æ–‡ä»¶èº«ä»½ï¼ŒæŽ’除投资/能耗/审核/系统/导入日志),无关导入不再失效、换母版必定失效;失效时进度弹窗会说明原因 | âœ… |
| P2-7 | å¸‚州单表「多市州块」兜底提示 | æ˜¯å¦åœ¨è¯†åˆ«åˆ°ä¸€ä»½æ–‡ä»¶å«å¤šä¸ªå¸‚州块时弹窗提示/跳过,待确认(与 P0-1 åŒä¸€æ ¹å› ï¼‰ | â¸ |
| P2-8 | ä»“库根目录 `_*.*` ä¸´æ—¶æ–‡ä»¶å¢žå¤š | `_chk_*`(本次汇总大表排查产生,见汇总大表交接第 10 èŠ‚ï¼‰ã€`_hyb_*`、`_loo_*` ç­‰ï¼Œ**经用户同意后再清** | â¸ |
| P2-9 | `2026å¹´8月道路运输量汇总表_版式原型.xlsx` åŽ»ç•™ | è¿è¡Œæ—¶æœªè¢«å¼•用 | â¸ |
@@ -250,6 +251,8 @@
| `docs/问题汇总/汇总表三条主线修复方案_2026-09-18.md` | ã€Œå…¬å¼ä¸é‡ç®—」统一根因 + é¡µèŒƒå›´æ¼é¡¹ + å£å¾„缺口 |
| `docs/问题汇总/中口径排名同比与城市客运列错位_根因与长效方案_2026-09-18.md` | 2025 åŸºæ•°ä¸‰å¤„缺陷(公交城际城乡=0、网约车 pin ç¼ºå¤±ã€å‡ºç§Ÿ 6 æœˆé‡å¤ï¼‰ä¸Ž A/B/C/D å››ç»„方案 |
| `docs/问题汇总/汇总大表问题交接_2026-09-21.md` | æ±‡æ€»å¤§è¡¨**逐行代码地图**与 P0-1/P0-2 è¯¦ç»†è®ºè¯ï¼ˆæŽ¥æ‰‹å¿…读) |
| `docs/功能测试报告/功能测试报告_中口径排名同比基数方案A_2026-09-21.md` | åŒäº‹å®žçŽ°æ–¹æ¡ˆ A çš„回归报告(黄冈 7.744917%→7.641733%,68 ä¸ªæ•°å€¼å¯¹ä¸€è‡´ï¼‰ |
| `docs/功能测试报告/功能测试报告_汇总大表软件输出与手工定稿差异_2026-09-21.md`、`docs/问题汇总/汇总大表差异核对回执_2026-09-21.md` | è½¯ä»¶è¾“出 vs æ‰‹å·¥å®šç¨¿çš„逐格差异清单与回执 |
**最容易被改回去的 6 ä¸ªç‚¹**(取自汇总大表交接第 6 èŠ‚ï¼‰ï¼š
@@ -298,7 +301,7 @@
### 7.4 äº¤ä»˜è§„矩(硬性)
1. æ¯åšå®Œä¸€ä¸ªåŠŸèƒ½ï¼š**先测试 â†’ å†™ã€ŠåŠŸèƒ½æµ‹è¯•æŠ¥å‘Šã€‹**(`docs/功能测试报告/功能测试报告_<功能名>_<日期>.md`,含正向/负向/入库抽查)→ **更新《工作日结》**(`docs/工作日结/工作日结_<日期>.md`)。
2. ç„¶åŽ `git fetch origin`(个人 gitee,分支 `master`)与 `git fetch gitea`(公司,分支 `main`)比对合并,**禁止强推**,再 commit + push。
2. ç„¶åŽ `git fetch origin`(公司 gitea,分支 `main`)与远端比对合并,**禁止强推**,再 commit + push。
3. å…¬å¸è´¦å·å¯†ç åªèµ°æœ¬æœº git å‡­æ®ï¼Œ**禁止写进仓库任何文件**。
---
@@ -311,7 +314,7 @@
- [ ] ç”Ÿæˆä¸€æ¬¡ 2026-08 æ±‡æ€»å¤§è¡¨ï¼ˆæŠ¥è¡¨ç”Ÿæˆé¡µæˆ– Â§2.4 æŽ¥å£ï¼‰ï¼Œç¡®è®¤èƒ½äº§å‡ºã€èƒ½æ‰“开。
- [ ] è¯» `docs/问题汇总/汇总大表问题交接_2026-09-21.md`(重点第 3、4、5 ç« ï¼‰ã€‚
- [ ] è¯»æœ¬æ–‡ Â§4,按 P0 é¡ºåºå’Œç”¨æˆ·ç¡®è®¤å‰ 4 ä»¶äº‹æ€Žä¹ˆæŽ¨è¿›ã€‚
- [ ] ç¡®è®¤è‡ªå·±çŸ¥é“「改完要写测试报告 + å·¥ä½œæ—¥ç»“ + åŒä»“库推送」。
- [ ] ç¡®è®¤è‡ªå·±çŸ¥é“「改完要写测试报告 + å·¥ä½œæ—¥ç»“ + æŽ¨é€å…¬å¸ gitea(origin/main)」。
---
@@ -321,4 +324,5 @@
| --- | --- |
| 2026-09-21 | é¦–次成文:整合汇总大表交接(`docs/问题汇总/汇总大表问题交接_2026-09-21.md`)与投资/货运/客运各线遗留 |
| 2026-09-21(下午) | P0-1 é—­çŽ¯ï¼ˆåå °æºæ–‡ä»¶å·²åˆ æ®µ + é‡å¯¼éªŒè¯ï¼‰ï¼›æ–°å¢ž P1-13(投资系统新模板支持);数据快照补 `investment_system` è¡Œ |
| 2026-09-22(下午) | å¯¼å‡ºç¼“存:结果落盘 + æ•°æ®æŒ‡çº¹å®ˆå« + å¤±æ•ˆæç¤ºï¼ˆP2-6 é—­çŽ¯ï¼‰ï¼›/ åŒæ­¥åŒäº‹è¿›å±•(`abf468c` P1-1 æ–¹æ¡ˆ A、`47a8734` å·®å¼‚报告、`a5a9545` 09-22 è®°å½•);/ ä»“库约定改为公司 gitea å•仓库、§0 æ¸…单更新 |
| 2026-09-21(下午) | P1-1 é—­çŽ¯ï¼šç”¨æˆ·é‡‡ç”¨æ–¹æ¡ˆ A,中口径排名的 2025 ç´¯è®¡åŸºæ•°æ”¹è¯»æ¯ç‰ˆã€Šä¸­å£å¾„明细》静态列;黄冈累计同比由 7.74% ä¿®æ­£ä¸º 7.641733%,双页一致性回归通过 |
docs/¹¦ÄܲâÊÔ±¨¸æ/¹¦ÄܲâÊÔ±¨¸æ_µ¼³ö»º´æ¸ÄÓÃÊý¾ÝÖ¸ÎÆ_2026-09-22.md
New file
@@ -0,0 +1,61 @@
# åŠŸèƒ½æµ‹è¯•æŠ¥å‘Š_导出缓存改用数据指纹_2026-09-22
## ä¸€ã€åŠŸèƒ½è¯´æ˜Ž
用户诉求:下载过一次、期间没有新导入数据就应直接沿用上次结果(已实现落盘缓存);随后用户认可「按我说的做」,要求继续解决缓存守卫的两个问题:
1. **误失效**:原来用全局 `MAX(import_batch.id)` å½“版本号,导入投资/能耗这类与汇总大表无关的数据也会让缓存失效,白等十几秒;
2. **漏失效(正确性漏洞)**:版本号只反映数据库导入记录,**不含母版文件**——换母版/改参照件时版本号不变,会把旧结果当新表发出。
**改动**:
| # | æ”¹åЍ | è¯´æ˜Ž |
| --- | --- | --- |
| 1 | ç”¨**数据指纹**替代全局版本 | æŒ‡çº¹ = ã€Œä¾èµ–源表的内容校验和」+「母版等文件身份」,SHA-256 å–前 8 å­—节(16 ä½åå…­è¿›åˆ¶ï¼‰ï¼Œå†™è¿›ç¼“存文件名 |
| 2 | æºè¡¨èŒƒå›´ï¼**排除法** | åº“内所有基表,**排除**投资(3)/能耗(2)/审核(4)/系统(6)/`import_batch`(1) å…± 16 å¼ ï¼›å…¶ä½™ä¸€å¾‹çº³å…¥ï¼ˆå®å¯å¤šç®—不可出错) |
| 3 | ç”¨ `CHECKSUM TABLE` å–校验和 | èƒ½æ•捉**原地 UPDATE**(行数、max(id) éƒ½ä¸å˜çš„æƒ…况),比 `count+max(id)` æ›´ä¸¥æ ¼ |
| 4 | æ–‡ä»¶èº«ä»½ | æ¯ç‰ˆç›®å½•下全部文件(母版 / å‚ç…§ä»¶ / `_备份_` å›žå¡«ä»¶ï¼‰+《网约车订单及全省总量.xlsx》,取「名称+大小+修改时间」 |
| 5 | æ–°å¢ž**失效提示**(第 3 æ­¥çš„æç¤ºç‰ˆï¼‰ | æ²¡å‘½ä¸­ä¸”存在旧结果时,进度弹窗显示「上次生成的结果已因数据或母版变化失效,本次按最新数据重算。」 |
> æç¤ºæ”¾åœ¨**导出时的进度弹窗**(而不是导入结果弹窗):① æ­£å¥½å‡ºçŽ°åœ¨ç”¨æˆ·ç­‰å¾…çš„æ—¶å€™ï¼›â‘¡ å…åŽ»ã€Œæ¯æ¬¡å¯¼å…¥éƒ½è·‘ä¸€éå…¨è¡¨æ ¡éªŒå’Œã€çš„å¼€é”€ã€‚
## äºŒã€æµ‹è¯•环境
- åŽç«¯ Spring Boot 8090(重启加载新代码);前端 8080;MySQL 3308 / `traffic_audit`
- æŠ¥è¡¨æœŸ 2026-08(月报);缓存目录 `docs/生成汇总大表/_cache/`
- éªŒè¯æœŸé—´å¦ä¸€ä¸ªä¼šè¯é‡å¯è¿‡åŽç«¯ä¸¤æ¬¡ï¼Œä¸ªåˆ«æ­¥éª¤ä¸­æ–­åŽé‡è·‘(不影响结论)
## ä¸‰ã€ç”¨ä¾‹è¡¨
| # | ç”¨ä¾‹ | æ“ä½œ | é¢„期 | å®žé™… | ç»“论 |
| --- | --- | --- | --- | --- | --- |
| T01 | é¦–次生成(新指纹) | æäº¤å¯¼å‡º | çœŸç®—并落盘,旧版本文件被清理 | `DONE` 21 s;生成 `…_v227060ce99767ced.xlsx`,原 `…_v541.xlsx` å·²åˆ  | é€šè¿‡ |
| T02 | å†æ¬¡æäº¤ | åŒä¸ŠæŠ¥ | å†…存命中 | **241 ms**,`fromCache=true` | é€šè¿‡ |
| T03 | **无关导入不影响缓存(核心)** | å¾€ `investment_project`、`import_batch` å„插 1 è¡ŒåŽæäº¤ | ä»å‘½ä¸­ | `fromCache=true`(改造前必然失效) | é€šè¿‡ |
| T04 | åˆ é™¤ä¸Šè¿°ä¸¤è¡ŒåŽæäº¤ | åŒä¸Š | ä»å‘½ä¸­ | `fromCache=true` | é€šè¿‡ |
| T05 | **相关源表原地 UPDATE** | `wyc_order_monthly.pin_k +0.001`(行数/`max(id)` ä¸å˜ï¼‰åŽæäº¤ | å¿…须失效 | `fromCache=false`、`RUNNING`;缓存文件名换成新指纹 `…_v68b6bc0c…` | é€šè¿‡ |
| T06 | è¿˜åŽŸè¯¥å€¼åŽæäº¤ | åŒä¸Š | ä»ä¸å‘½ä¸­ï¼ˆç¼“存是改后指纹) | `fromCache=false` â†’ é‡ç®—;指纹回到 `227060ce99767ced` | é€šè¿‡ |
| T07 | **换母版必须失效(原漏洞)** | æ”¹æ¯ç‰ˆæ–‡ä»¶ä¿®æ”¹æ—¶é—´ï¼ˆå†…容不变)后提交 | å¿…须失效 | `fromCache=false`、`RUNNING`;指纹变 `…_v7d65cbb6…` | é€šè¿‡ |
| T08 | æ¢å¤æ¯ç‰ˆæ—¶é—´åŽæäº¤ | åŒä¸Š | å¤±æ•ˆâ†’重算→再提交命中 | é‡ç®—后 `fromCache=true` | é€šè¿‡ |
| T09 | å¤±æ•ˆæç¤ºï¼ˆæŽ¥å£ï¼‰ | å­˜åœ¨æ—§ç»“果且指纹不符时提交 | `staleCache=true` | `status=RUNNING fromCache=false staleCache=true` | é€šè¿‡ |
| T10 | å‘½ä¸­ç¼“存无提示(回归修复) | å‘½ä¸­æ—¶æäº¤ | `staleCache=false` | ä¿®å¤å‰å‘½ä¸­ä»å¸¦ `staleCache=true` â†’ å·²ä¿®ä¸ºå‘½ä¸­å³æ¸…é›¶ | é€šè¿‡ |
| T11 | **浏览器实测提示行** | admin/123456 â†’ æŠ¥è¡¨ç”Ÿæˆ â†’ æ±‡æ€»å¤§è¡¨ â†’ 2026-08 â†’ å¯¼å‡ºï¼ˆå…ˆæ”¹æ¯ç‰ˆ mtime åˆ¶é€ å¤±æ•ˆï¼‰ | å¼¹çª—出现失效提示 | å¼¹çª—显示「上次生成的结果已因数据或母版变化失效,本次按最新数据重算。」;生成 13.2 s、自动下载 1.15 MB、按钮「重新生成/关闭」、控制台 0 æŠ¥é”™ | é€šè¿‡ |
| T12 | æ•°æ®è¿˜åŽŸæ ¸å¯¹ | æŸ¥åº“ | æ— æµ‹è¯•残留 | `import_batch` 419、`investment_project` 152、`wyc_order_monthly.2025-12 pin_k=3492.63`、无「_指纹测试项目」 | é€šè¿‡ |
## å››ã€å‘现的问题与处置
| # | é—®é¢˜ | å¤„ç½® |
| --- | --- | --- |
| P1 | å‘½ä¸­ç¼“存时残留上一次的「已失效」提示标记 | å·²ä¿®ï¼šå‘½ä¸­åˆ†æ”¯æ¸…é›¶ `staleCache` |
| P2 | æ–‡ä»¶èº«ä»½ç”¨æ¯«ç§’级 mtime:把母版 mtime「恢复成同一秒」时,亚秒差异仍会产生新指纹(验证中实际遇到) | å±ž**预期行为**(保守优先:宁可多算一次)。若将来觉得太敏感,可改为「秒级 mtime」或对母版做内容哈希 |
| P3 | æµ‹è¯•用的临时数据(1 ä¸ªæŠ•资项目、1 æ¡å¯¼å…¥è®°å½•、`wyc pin Â±0.001`) | å·²å…¨éƒ¨è¿˜åŽŸ/删除,T12 å·²æ ¸å¯¹ |
| P4 | æ•°æ®æŒ‡çº¹è®¡ç®—成本 | çº¦ 11 å¼ è¡¨ CHECKSUM + 13 ä¸ªæ–‡ä»¶ stat,实测可为毫秒级(3 å¼ è¡¨ 48 ms);仅在提交导出时算一次 |
## äº”、结论
- ç¼“存守卫从「全局导入版本」升级为「**数据指纹**」后:**无关导入不再让缓存失效**(T03/T04),**换母版、改源表(含原地 UPDATE)必定失效**(T05/T07),两个方向都实测通过;
- ç”Ÿæˆä¸€æ¬¡çš„æˆæœ¬åªèŠ±åœ¨çœŸæ­£éœ€è¦é‡ç®—çš„æ—¶å€™ï¼›æ­£å¸¸ã€Œä¸‹è½½è¿‡å†çœ‹ä¸€æ¬¡ã€ä»æ˜¯æ¯«ç§’çº§å‘½ä¸­ï¼›
- å¤±æ•ˆæ—¶ä¼šåœ¨è¿›åº¦å¼¹çª—明确说明原因,用户不会误以为缓存坏了;
- æµ‹è¯•数据已全部还原,库内状态与验证前一致。
测试人:Codex(AI) 测试日期:2026-09-22
docs/¹¦ÄܲâÊÔ±¨¸æ/Êý¾Ý±È¶Ô±¨¸æ_Ͷ×ÊÃ÷ϸ±íÈí¼þÉú³ÉÓëÈ˹¤°æ_2026-09-22.md
New file
@@ -0,0 +1,342 @@
# æ•°æ®æ¯”对报告 â€” æŠ•资明细表《软件生成》vs《人工版》(2026-08)
> æ¯”对日期:2026-09-22
> èŒƒå›´ï¼šæŠ¥è¡¨ç”Ÿæˆ â†’ æŠ•资 â†’《客运站投资明细表》《物流站场投资明细》
> æ–¹æ³•:逐页签、逐行、逐格数值比对(脚本 `_tmp_diff_invest_0922.py`),并回溯到「源文件 / æ•°æ®åº“ / åº•稿模板」三方定位根因
> åŽŸåˆ™ï¼šæŒ‰ã€Œé¡µç­¾ + è¡Œ + åˆ—」严格对齐;只列真实差异,浮点表示差异(如 `783078.1665` ä¸Ž `783078.1664999999`)不计
## ä¸€ã€æ¯”对源文件
| ç±»åž‹ | æ–‡ä»¶ | å­—节 | SHA256(前16) | ä¿®æ”¹æ—¶é—´ |
| --- | --- | --- | --- | --- |
| äººå·¥ç‰ˆ-客运 | `D:\05_数据分类\投资\8月\8月客运站投资明细表.xlsx` | 34226 | `0C2150B97B87F860` | 2026-09-01 10:53:39 |
| äººå·¥ç‰ˆ-物流 | `D:\05_数据分类\投资\8月\8月物流站场投资明细.xls` | 122368 | `1B768D2341CADC41` | 2026-09-01 10:53:38 |
| è½¯ä»¶ç‰ˆ-客运 | `D:\桌面\生成数据\生成_所选报表_2026-08 (1)\生成_客运站投资明细表.xlsx` | 29462 | `4A2EA9C915E5D107` | 2026-09-22 14:16:28 |
| è½¯ä»¶ç‰ˆ-物流 | `D:\桌面\生成数据\生成_所选报表_2026-08 (1)\生成_物流站场投资明细.xls` | 134144 | `F21481D62F680366` | 2026-09-22 14:16:28 |
| åº•稿(客运) | `docs\投资\模板\模板_X月客运站投资明细表.xlsx` | 34311 | `1926A91E7C416529` | 2026-08-10 15:44:18 |
| åº•稿(物流) | `docs\投资\模板\模板_X月物流站场投资明细.xls` | 121856 | `12A61A27B9438E19` | 2026-08-10 15:44:10 |
结构完全一致:客运《明细》121×20 +《汇总》24×5;物流《月2》32×24、《 åˆ†é¡¹ç›®æŠ•资完成情况》192×20、《分市州规划内外项目完成情况》21×8、《市州汇总》24×5。
**逐行核对 B åˆ—(项目名称):两份文件 192/121 è¡Œå…¨éƒ¨ä¸€ä¸€å¯¹åº”,无增行、无删行、无错位**,因此逐格比对结果可直接使用。
## äºŒã€ç»“论摘要
| æ–‡ä»¶ | é¡µç­¾ | å·®å¼‚格数 |
| --- | --- | --- |
| å®¢è¿ç«™æŠ•资明细表 | æ˜Žç»† | 12 |
| å®¢è¿ç«™æŠ•资明细表 | æ±‡æ€» | 4 |
| ç‰©æµç«™åœºæŠ•资明细 | æœˆ2 | 0 |
| ç‰©æµç«™åœºæŠ•资明细 | åˆ†é¡¹ç›®æŠ•资完成情况 | 108 |
| ç‰©æµç«™åœºæŠ•资明细 | åˆ†å¸‚州规划内外项目完成情况 | 15 |
| ç‰©æµç«™åœºæŠ•资明细 | å¸‚州汇总 | 17 |
| **合计** | | **156** |
### æ ¹å› ï¼ˆå·²ç”¨æºæ–‡ä»¶ / æ•°æ®åº“ / åº•稿三方证据锁定)
**A. è½¯ä»¶å¯¼å‡º = åœ¨åº•稿《模板_X月…投资明细》上,把库内当月数据按「项目名称」匹配覆盖 H/J/K(累计/自年初/本月)与 M(形象进度)。凡匹配不上、或库内没有当月数的行,一律沿用底稿(上一期)旧值。**
由此产生 4 ç±»ç‰©æµå·®å¼‚:
1. **库内没有当月数据 â†’ æ•´æ®µä¿ç•™ä¸ŠæœŸå€¼**:武汉市 6 ä¸ªç‰©æµé¡¹ç›®åœ¨åº“内**一条月度记录都没有**(`investment_monthly` æ­¦æ±‰ç‰©æµå›­åŒº 0 è¡Œï¼Œå› ä¸º 8 æœˆæ­¦æ±‰æ— å•表),所以软件版武汉 8 è¡Œå…¨æ˜¯åº•稿的 7 æœˆæ•°ï¼ˆåˆè®¡ 146313.9/72166/10116),人工版是 155513.9/81366/9200。
2. **项目名称不一致 â†’ è¯¥è¡Œä¸è¦†ç›–**:库内项目名是「中国供销**.**公安商贸物流园」(中间多一个点),明细表行名是「中国供销公安商贸物流园(公安县域集采集配中心)」→ åŒ¹é…å¤±è´¥ï¼Œè½¯ä»¶ç‰ˆä¿ç•™åº•稿旧值 7758.5/7758.5/1600.1;库内 2026-08 å®žé™…是 **15986/15986/8227.5**(= æºæ–‡ä»¶ã€Šè†å·žç‰©æµæŠ•资(2026å¹´8月报省)》R21 åŽŸå€¼ï¼‰ï¼Œäººå·¥ç‰ˆæ­£ç¡®ã€‚
3. **库内同名双档 â†’ å–到旧档**:十堰「快递物流产业园二期」在库内有两档 â€”— `id=154`「十堰市快递物流产业园**二期**(…)」竣工 2026,`id=181`「十堰市快递物流产业园(**二期**…)」竣工 2029。明细表行名对应 `id=154`,其最新月度只到 **2026-07**(20081/2900/214),于是软件版写了 7 æœˆå€¼ + ç«£å·¥ 2026;人工版用的是 `id=181` çš„ 2026-08(20377/3196/296,竣工 2029)= æºæ–‡ä»¶ R71 åŽŸå€¼ã€‚
4. **库内当月数为 0 â†’ å†™å‡º 0**:天门「天门市物流中心建设项目」库内 2026-08 çš„ `start_cum/year_cum/month_done` **都是 0**,而源文件《8月份物流园中心建设项目(天门).xlsx》R13 æ˜Žæ˜Žæ˜¯ **16677.7 / 16677.7 / 500**,说明是**导入环节把这 3 ä¸ªæ•°ä¸¢äº†**(人工版正确)。
**B. è½¯ä»¶ä¼šå†™ã€Œåˆ†ç»„小计行」、人工版不写**:鄂州/恩施/仙桃/潜江/林区/天门这些「只有一个资金渠道」的市州,软件按渠道把市州合计抄进该渠道行;人工版沿用底稿的空白。金额与市州合计一致,不影响总数,只是填表习惯差异。
**C. è½¯ä»¶å¯¼å‡ºä¸è¦†ç›– L(建设阶段)等非金额列**:`D/E/F/I/L` ä¿ç•™åº•稿值。所以黄石大冶湖冷链 L=暂停、十堰枢纽 L=前期、襄阳冷链中心 L=在建、随州民生物资 M çš„「2026å¹´07月…」等都是**上一期底稿的残留**(人工版这几处反而是对的)。
**D. å®¢è¿éƒ¨åˆ†çš„差异主要是「人工版手写四舍五入」**:底稿里 203 / 203 è¿™ç±»æ‰‹å†™æ•´æ•°ï¼Œäººå·¥ç‰ˆæ²¿ç”¨äº†ï¼›è½¯ä»¶æŒ‰æºè¡¨åŽŸå€¼å†™ 202.9565。
## ä¸‰ã€å®¢è¿ç«™æŠ•资明细表差异(16 æ ¼ï¼‰
### 3.1 é‡‘额差异 12 æ ¼ï¼ˆæ˜Žç»† 8 æ ¼ + æ±‡æ€» 4 æ ¼ï¼›å®žè´¨åŒå€¼ï¼Œäººå·¥ç‰ˆå–整)
| è¡Œ | åˆ— | ä½ç½® | äººå·¥ç‰ˆ | è½¯ä»¶ç‰ˆ | è¯´æ˜Ž |
| --- | --- | --- | --- | --- | --- |
| R9 | H9 | åˆ è®¡ï¼ˆè‡ªå¼€å§‹å»ºè®¾ç´¯è®¡ï¼‰ | 622591.3 | 622591.2565 | äººå·¥ç‰ˆå››èˆäº”入到 1 ä½ |
| R9 | J9 | åˆ è®¡ï¼ˆè‡ªå¹´åˆç´¯è®¡ï¼‰ | 43225.9 | 43225.8565 | åŒä¸Š |
| R42 | H42 | è¥„阳市(市州行) | 27985.3 | 27985.2565 | åŒä¸Š |
| R42 | J42 | è¥„阳市(市州行) | 2531 | 2530.9565 | åŒä¸Š |
| R49 | H49 | ä¸‰ã€å†œæ‘综合运输服务站 | 203 | 202.9565 | åº•稿手写值 203 |
| R49 | J49 | ä¸‰ã€å†œæ‘综合运输服务站 | 203 | 202.9565 | åº•稿手写值 203 |
| R50 | H50 | è¥„州区程河镇埠口综合运输服务站 | 203 | 202.9565 | åº•稿手写值 203 |
| R50 | J50 | è¥„州区程河镇埠口综合运输服务站 | 203 | 202.9565 | åº•稿手写值 203 |
| R7 | C7 | æ±‡æ€»-合计(自年初累计) | 43225.9 | 43225.8565 | éš H/J å–æ•´ |
| R7 | E7 | æ±‡æ€»-合计(占年度计划%) | 59.2307223257 | 59.2306627194 | ç”±å–整派生 |
| R12 | C12 | æ±‡æ€»-襄阳(自年初累计) | 2531 | 2530.9565 | ç”±å–整派生 |
| R12 | E12 | æ±‡æ€»-襄阳(占年度计划%) | 125.6927752726 | 125.6906150057 | ç”±å–整派生 |
### 3.2 æ–‡æœ¬å·®å¼‚ 4 æ ¼
| è¡Œ | åˆ— | ä½ç½® | äººå·¥ç‰ˆ | è½¯ä»¶ç‰ˆ | æ ¸å¯¹ç»“论 |
| --- | --- | --- | --- | --- | --- |
| R26 | M26 | éƒ§è¥¿åŽ¿å®¢è¿æ¢ä¹˜ä¸­å¿ƒï¼ˆå½¢è±¡è¿›åº¦ï¼‰ | ï¼ˆç©ºï¼‰ | æ¢ä¹˜ä¸­å¿ƒç»“构封顶,内墙完成,配套设施已完善 | **软件对**:源文件《十堰市2026å¹´8月固定资产月报电子版投资表格.xlsx》R12 M、库内 2026-08 `progress_desc` å‡ä¸ºè¯¥æ–‡å­—;人工版沿用底稿的空 |
| R85 | M85 | é€šå±±åŽ¿ç‡•åŽ¦å®¢è¿ç«™ï¼ˆä¸‰çº§ç«™ï¼‰ | ï¼ˆç©ºï¼‰ | åœŸå»ºå·¥ç¨‹åŸºç¡€ | **软件对**:源文件《2026å¹´8月咸宁市客运站场投资统计月报表(1)省表.xls》R15 M、库内 2026-08 å‡ä¸ºã€ŒåœŸå»ºå·¥ç¨‹åŸºç¡€ã€ï¼›äººå·¥ç‰ˆç©º |
| R91 | L91 | å¤§å¹•乡综合运输服务站(建设阶段) | åœ¨å»º | æš‚停施工 | **人工版更接近**:源表 R20 L=主体施工、库内 8 æœˆ `progress_stage`=主体施工;软件版「暂停施工」来自底稿 R91 çš„æ—§å€¼ï¼ˆå¯¼å‡ºä¸è¦†ç›– L åˆ—) |
| R116 | M116 | ç¥žå†œæž¶æž¢çº½ç«™ | å»ºæˆæŠ•产 | å»ºæˆæŠ•产。 | ä»…多一个句号(软件=库内值),无实质差异 |
> æ³¨ï¼šM26/M85 ä¸¤å¤„人工版为空,是「人工版没把源表的形象进度补进去」;L91 æ˜¯ã€Œè½¯ä»¶ç‰ˆæŠŠåº•稿旧的建设阶段留下来了」。
## å››ã€ç‰©æµç«™åœºæŠ•资明细差异(140 æ ¼ï¼‰
### 4.1 é‡‘额差异按市州汇总(这是要处理的重点)
| å¸‚å·ž | é¡¹ç›® | äººå·¥ç‰ˆ | è½¯ä»¶ç‰ˆ | å·® | æ ¸å¯¹ç»“论 |
| --- | --- | --- | --- | --- | --- |
| æ­¦æ±‰ | å¸‚州行 ç´¯è®¡/自年初/本月 | 155513.9 / 81366 / 9200 | 146313.9 / 72166 / 10116 | âˆ’9200 / âˆ’9200 / +916 | **人工版对**:库内无武汉物流当月数,软件版是底稿 7 æœˆå€¼ |
| åå ° | å¸‚州行 ç´¯è®¡/自年初/本月 | 81182 / 29482 / 1671 | 80888 / 29188 / 1591 | âˆ’294 / âˆ’294 / âˆ’80 | å·® 294 å…¨éƒ¨æ¥è‡ªã€Œå¿«é€’物流产业园二期」(详见 4.2) |
| è†å·ž | å¸‚州行 ç´¯è®¡/自年初/本月 | 311700.5 / 46548 / 8606 | 303473 / 38320.5 / 1978.6 | âˆ’8227.5 / âˆ’8227.5 / âˆ’6627.4 | **人工版对**:差 8227.5 æ¥è‡ªã€Œä¸­å›½ä¾›é”€å…¬å®‰å•†è´¸ç‰©æµå›­ã€ï¼ˆè¯¦è§ 4.2) |
| å¤©é—¨ | å¸‚州行 ç´¯è®¡/自年初/本月 | 16677.7 / 16677.7 / 500 | ï¼ˆç©ºï¼‰ | | **人工版对**:源文件有值,库内被写成 0 |
| é„‚å·ž/恩施/仙桃/潜江/林区 | ä»…分组小计行 | ï¼ˆç©ºï¼‰ | = å¸‚州合计 | 0 | å¡«è¡¨ä¹ æƒ¯å·®å¼‚,金额不冲突 |
| åˆè®¡ | ç´¯è®¡/自年初/本月 | 2064669.55 / 789311.6 / 89644.1 | 2030270.35 / 754912.4 / 83352.7 | âˆ’34399.2 / âˆ’34399.2 / âˆ’6291.4 | æ±‡æ€»ä»¥ä¸Šå„项 |
### 4.2 ä¸‰ä¸ªã€ŒæŠ“错数」的行(必须修)
| é¡¹ç›® | å­—段 | äººå·¥ç‰ˆ | è½¯ä»¶ç‰ˆ | åº“内 2026-08 | æºæ–‡ä»¶ | ç»“论 |
| --- | --- | --- | --- | --- | --- | --- |
| åå °å¸‚快递物流产业园二期(十堰市物流枢纽集疏运基地) | ç«£å·¥/累计/自年初/本月/形象进度 | 2029 / 20377 / 3196 / 296 /「…B3新建基础施工、B4厂房外立面装饰装修施工。」 | 2026 / 20081 / 2900 / 214 /「…B3、B7新建基础施工。」 | `id=181` = 20377/3196/296;`id=154` æœ€æ–°åªåˆ° 2026-07 = 20081/2900/214 | åå °æ±‡æ€»è¡¨ R71 = 2029/20377/3196/296 | **软件版抓了旧档 `id=154`**;应先合并/删重复项目主档 |
| ä¸­å›½ä¾›é”€å…¬å®‰å•†è´¸ç‰©æµå›­ï¼ˆå…¬å®‰åŽ¿åŸŸé›†é‡‡é›†é…ä¸­å¿ƒï¼‰ | ç´¯è®¡/自年初/本月/形象进度 | 15986 / 15986 / 8227.5 /「支付土地款,完成土建…」 | 7758.5 / 7758.5 / 1600.1 /「完成土建、装饰…」 | 15986 / 15986 / 8227.5 /「支付土地款,完成土建…」 | è†å·ž 8 æœˆæŠ¥çœ R21 åŒä¸Š | **软件版因项目名不匹配未覆盖**(库内名多一个点),用了底稿 7 æœˆå€¼ |
| å¤©é—¨å¸‚物流中心建设项目 | ç´¯è®¡/自年初/本月 | 16677.7 / 16677.7 / 500 | 0 / 0 / 0 | 0 / 0 / 0(导入写成 0) | å¤©é—¨ 8 æœˆæºæ–‡ä»¶ R13 = 16677.7 / 16677.7 / 500 | **导入丢数**(不是导出问题),需修导入 + é‡å¯¼å¤©é—¨ |
### 4.3 æ–‡æœ¬ä¸Žå­—段差异(建设性质 / å»ºè®¾é˜¶æ®µ / å½¢è±¡è¿›åº¦ / å·¥æœŸï¼‰
| è¡Œ | åˆ— | é¡¹ç›® / ä½ç½® | äººå·¥ç‰ˆ | è½¯ä»¶ç‰ˆ | æ ¸å¯¹ç»“论 |
| --- | --- | --- | --- | --- | --- |
| R27 | L27 | é»„石大冶湖高新区智慧冷链物流园 | åœ¨å»º | æš‚停 | æºè¡¨/库内=在建;软件=底稿旧值「暂停」 |
| R35 | L35 | åå °ç”Ÿäº§æœåŠ¡åž‹å›½å®¶ç‰©æµæž¢çº½å·¥ç¨‹é¡¹ç›® | åœ¨å»º | å‰æœŸ | æºè¡¨/库内=在建;软件=底稿旧值「前期」 |
| R75 | L75 | è¥„阳高新区物流发展中心项目—冷链产业集成中心 | å®Œå·¥ | åœ¨å»º | æºè¡¨ R17 L=完工;软件=底稿旧值 |
| R47 | M47 | ç§­å½’县脐橙产业综合物流中心 | å®Œå·¥ | äºŒæœŸä¸»ä½“工程完成,正在进行配套工程施工。 | è½¯ä»¶=源表/库内原文;人工版做了简化 |
| R48 | D48 | å®œéƒ½ä¾›é”€å•†è´¸ç‰©æµå›­ï¼ˆå»ºè®¾æ€§è´¨ï¼‰ | ç»­å»º | æ–°å»º | æºè¡¨ R7 D=续建 â†’ äººå·¥ç‰ˆå¯¹ |
| R49 | D49 | é•¿é˜³åŽ¿åŸŽä¹¡å†·é“¾ç‰©æµå›­åŠå…¶é…å¥—è®¾æ–½å»ºè®¾é¡¹ç›® | ç»­å»º | æ–°å»º | æºè¡¨ R8 D=续建 â†’ äººå·¥ç‰ˆå¯¹ |
| R51 | D51 | æ¨å®¶åž±ç«™ç‰©æµè®¾å¤‡æ›´æ–°æ”¹é€ é¡¹ç›® | æ”¹å»º | æ–°å»º | æºè¡¨ R10 D=新建 â†’ è½¯ä»¶å¯¹ |
| R67 | F67 | ä¼ åŒ–鄂西北智慧物流中心项目(竣工时间) | 46539(日期 2027-06-01) | 2026å¹´10月 | æºè¡¨ R7 F=「2027å¹´6月」→ äººå·¥ç‰ˆå¯¹ï¼›è½¯ä»¶ç‰ˆå€¼æ¥æºä¸æ˜Ž |
| R75 | E75/F75 | è¥„阳高新区物流发展中心项目 | 45292 / 46600(日期格式) | 2024 / 2027 | æ•°å€¼åŒä¹‰ï¼ˆ2024å¹´1月 / 2027å¹´8月),属格式差异 |
| R51–R54 | M51–M54 | å®œæ˜Œ 4 ä¸ªé¡¹ç›®å½¢è±¡è¿›åº¦ | ä¸»ä½“施工 | ä¸»ä½“施工。 | ä»…句号(源表带句号) |
| R82 | M82 | æ­¦æ±‰ä¸‡å¨Â·åŽä¸­å†·é“¾æ¸¯ | ï¼ˆç©ºï¼‰ | å†·åº“主体施工 | è½¯ä»¶=源表/库内;人工版空(底稿空) |
| R94 | M94 | æ¹–北恒峰国际物流园 | â€¦æ­£å¼æŠ•入运营 | â€¦æ­£å¼æŠ•入运营。 | ä»…句号 |
| R119 | M119 | ä¸­å›½ä¾›é”€å…¬å®‰å•†è´¸ç‰©æµå›­ | æ”¯ä»˜åœŸåœ°æ¬¾ï¼Œå®ŒæˆåœŸå»ºâ€¦ | å®ŒæˆåœŸå»ºã€è£…饰… | è§ 4.2 |
| R136 | M136 | æ­¦æ±‰åŒ—传化城市物流中心 | å»ºè®¾é…å¥—办公及食堂,一期已完工 | å»ºè®¾é…å¥—办公及食堂 | äººå·¥ç‰ˆå¤šã€Œä¸€æœŸå·²å®Œå·¥ã€ï¼ˆåº•稿 L åˆ—同样写着「一期已完工」) |
| R145 | M145 | åº·åŽæ™ºæ…§ç‰©æµå›­ | æœ¬æœˆæ— å»ºè®¾å†…容 | æœ¬æœˆæ— å»ºè®¾è¿›å±• | æŽªè¾žä¸åŒï¼Œéœ€ä¸šåŠ¡å®šç¨¿ |
| R156 | M156 | æ°‘生物资城市配送及仓储物流建设项目 | 2026å¹´07月…7月投资额:53万元整 | 2026å¹´08月… | **软件对**(库内 8 æœˆåŽŸæ–‡ï¼‰ï¼›äººå·¥ç‰ˆæ˜¯ 7 æœˆæ–‡å­—未更新 |
| R184 | M184 | å¤©é—¨å¸‚物流中心建设项目 | 1.2.3#厂房周围道路砼浇筑完成… | 4栋厂房办公室,卫生间… | ä¸¤ä»½åˆ†åˆ«å–自源表的两个不同位置(源表同时含两段) |
| R92 | M92 | æ²™æ´‹å¤šå¼è”运现代物流园 | é•¿æ–‡æœ¬ | é•¿æ–‡æœ¬ | å†…容有增删(源表 8 æœˆä¸ºè½¯ä»¶ç‰ˆï¼‰ |
### 4.4 ã€Œ0」与「空白」的写法差异(不影响金额)
| è¡Œ | åˆ— | ä½ç½® | äººå·¥ç‰ˆ | è½¯ä»¶ç‰ˆ |
| --- | --- | --- | --- | --- |
| R41 | I41 / K41 | åå ° å››ã€ä½¿ç”¨ç¤¾ä¼šèµ„金建设项目 | 0 / 0 | ï¼ˆç©ºï¼‰ |
| R96 | K96 | è†é—¨ å››ã€ä½¿ç”¨ç¤¾ä¼šèµ„金建设项目 | 0 | ï¼ˆç©ºï¼‰ |
| R175 | K175 | æ½œæ±Ÿï¼ˆå¸‚州行) | 0 | ï¼ˆç©ºï¼‰ |
| R187 | K187 | æž—区(市州行) | 0 | ï¼ˆç©ºï¼‰ |
| R8 | G8 / H8 | åˆ†å¸‚州规划内外-襄阳(规划外项目个数/投资) | 0 / 0 | ï¼ˆç©ºï¼‰ |
| R18 | E18 | åˆ†å¸‚州规划内外-潜江 | 0 | ï¼ˆç©ºï¼‰ |
| R22 / R24 | D22 / D24 | å¸‚州汇总-潜江 / æž—区(本月完成) | 0 | ï¼ˆç©ºï¼‰ |
### 4.5 å…¨é‡å·®å¼‚清单(156 æ ¼ï¼‰
#### å®¢è¿-明细(页签「明细」)
| è¡Œ | åˆ— | ä½ç½® | äººå·¥ç‰ˆ | è½¯ä»¶ç‰ˆ |
| --- | --- | --- | --- | --- |
| R9 | H9 | åˆ è®¡ | 622591.3 | 622591.2565 |
| R9 | J9 | åˆ è®¡ | 43225.9 | 43225.8565 |
| R26 | M26 | éƒ§è¥¿åŽ¿å®¢è¿æ¢ä¹˜ä¸­å¿ƒ | (空) | æ¢ä¹˜ä¸­å¿ƒç»“构封顶,内墙完成,配套设施已完善 |
| R42 | H42 | è¥„阳市(市州行) | 27985.3 | 27985.2565 |
| R42 | J42 | è¥„阳市(市州行) | 2531 | 2530.9565 |
| R49 | H49 | ä¸‰ã€å†œæ‘综合运输服务站 | 203 | 202.9565 |
| R49 | J49 | ä¸‰ã€å†œæ‘综合运输服务站 | 203 | 202.9565 |
| R50 | H50 | è¥„州区程河镇埠口综合运输服务站 | 203 | 202.9565 |
| R50 | J50 | è¥„州区程河镇埠口综合运输服务站 | 203 | 202.9565 |
| R85 | M85 | é€šå±±åŽ¿ç‡•åŽ¦å®¢è¿ç«™ï¼ˆä¸‰çº§ç«™ï¼‰ | (空) | åœŸå»ºå·¥ç¨‹åŸºç¡€ |
| R91 | L91 | å¤§å¹•乡综合运输服务站 | åœ¨å»º | æš‚停施工 |
| R116 | M116 | ç¥žå†œæž¶æž¢çº½ç«™ | å»ºæˆæŠ•产 | å»ºæˆæŠ•产。 |
#### å®¢è¿-汇总(页签「汇总」)
| è¡Œ | åˆ— | ä½ç½® | äººå·¥ç‰ˆ | è½¯ä»¶ç‰ˆ |
| --- | --- | --- | --- | --- |
| R7 | C7 | åˆè®¡ | 43225.9 | 43225.8565 |
| R7 | E7 | åˆè®¡ | 59.2307223257 | 59.2306627194 |
| R12 | C12 | è¥„阳 | 2531 | 2530.9565 |
| R12 | E12 | è¥„阳 | 125.6927752726 | 125.6906150057 |
#### ç‰©æµ-分项目投资完成情况(页签「 åˆ†é¡¹ç›®æŠ•资完成情况」,共 108 æ ¼ï¼‰
| è¡Œ | åˆ— | ä½ç½® | äººå·¥ç‰ˆ | è½¯ä»¶ç‰ˆ |
| --- | --- | --- | --- | --- |
| R7 | H7 | åˆè®¡ | 2064669.55 | 2030270.35 |
| R7 | J7 | åˆè®¡ | 789311.6 | 754912.4 |
| R7 | K7 | åˆè®¡ | 89644.1 | 83352.7 |
| R8 | H8 | æ­¦æ±‰ï¼ˆå¸‚州行) | 155513.9 | 146313.9 |
| R8 | J8 | æ­¦æ±‰ï¼ˆå¸‚州行) | 81366 | 72166 |
| R8 | K8 | æ­¦æ±‰ï¼ˆå¸‚州行) | 9200 | 10116 |
| R11 | H11 | æ­¦æ±‰ ä¸‰ã€çº³å…¥è§„划未使用省部级资金建设项目 | 129483.9 | 122383.9 |
| R11 | J11 | æ­¦æ±‰ ä¸‰ã€çº³å…¥è§„划未使用省部级资金建设项目 | 55336 | 48236 |
| R11 | K11 | æ­¦æ±‰ ä¸‰ã€çº³å…¥è§„划未使用省部级资金建设项目 | 7100 | 6716 |
| R12 | H12 | æ­¦æ±‰ èˆªå‘智慧物流园 | 62081.8 | 59081.8 |
| R12 | J12 | æ­¦æ±‰ èˆªå‘智慧物流园 | 17475 | 14475 |
| R12 | K12 | æ­¦æ±‰ èˆªå‘智慧物流园 | 3000 | 2500 |
| R13 | K13 | æ­¦æ±‰ ä¸­é€šä¾›åº”链湖北管理中心项目 | 0 | 416 |
| R14 | H14 | æ­¦æ±‰ é˜³é€»æ¸¯é“æ°´è”运二期中欧班列集结中心 | 6400 | 6100 |
| R14 | J14 | æ­¦æ±‰ é˜³é€»æ¸¯é“æ°´è”运二期中欧班列集结中心 | 6400 | 6100 |
| R15 | H15 | æ­¦æ±‰ æžå…”速递华中物流枢纽基地项目 | 27746 | 23946 |
| R15 | J15 | æ­¦æ±‰ æžå…”速递华中物流枢纽基地项目 | 27746 | 23946 |
| R15 | K15 | æ­¦æ±‰ æžå…”速递华中物流枢纽基地项目 | 3800 | 3500 |
| R16 | H16 | æ­¦æ±‰ å››ã€ä½¿ç”¨ç¤¾ä¼šèµ„金建设项目 | 26030 | 23930 |
| R16 | J16 | æ­¦æ±‰ å››ã€ä½¿ç”¨ç¤¾ä¼šèµ„金建设项目 | 26030 | 23930 |
| R16 | K16 | æ­¦æ±‰ å››ã€ä½¿ç”¨ç¤¾ä¼šèµ„金建设项目 | 2100 | 3400 |
| R17 | H17 | æ­¦æ±‰ æ¹–北迈睿达供应链总部研发及生产基地项目 | 17730 | 16630 |
| R17 | J17 | æ­¦æ±‰ æ¹–北迈睿达供应链总部研发及生产基地项目 | 17730 | 16630 |
| R17 | K17 | æ­¦æ±‰ æ¹–北迈睿达供应链总部研发及生产基地项目 | 1100 | 2900 |
| R18 | H18 | æ­¦æ±‰ åŽä¸­åœ°åŒºåŒ–学品仓库项目 | 8300 | 7300 |
| R18 | J18 | æ­¦æ±‰ åŽä¸­åœ°åŒºåŒ–学品仓库项目 | 8300 | 7300 |
| R18 | K18 | æ­¦æ±‰ åŽä¸­åœ°åŒºåŒ–学品仓库项目 | 1000 | 500 |
| R27 | L27 | é»„石 é»„石大冶湖高新区智慧冷链物流园 | åœ¨å»º | æš‚停 |
| R31 | H31 | åå °ï¼ˆå¸‚州行) | 81182 | 80888 |
| R31 | J31 | åå °ï¼ˆå¸‚州行) | 29482 | 29188 |
| R31 | K31 | åå °ï¼ˆå¸‚州行) | 1671 | 1591 |
| R34 | H34 | åå ° ä¸‰ã€çº³å…¥è§„划未使用省部级资金建设项目 | 80152 | 79858 |
| R34 | J34 | åå ° ä¸‰ã€çº³å…¥è§„划未使用省部级资金建设项目 | 28452 | 28158 |
| R34 | K34 | åå ° ä¸‰ã€çº³å…¥è§„划未使用省部级资金建设项目 | 1671 | 1591 |
| R35 | H35 | åå ° åå °ç”Ÿäº§æœåŠ¡åž‹å›½å®¶ç‰©æµæž¢çº½å·¥ç¨‹é¡¹ç›® | 11047 | 11049 |
| R35 | J35 | åå ° åå °ç”Ÿäº§æœåŠ¡åž‹å›½å®¶ç‰©æµæž¢çº½å·¥ç¨‹é¡¹ç›® | 589 | 591 |
| R35 | K35 | åå ° åå °ç”Ÿäº§æœåŠ¡åž‹å›½å®¶ç‰©æµæž¢çº½å·¥ç¨‹é¡¹ç›® | 0 | 2 |
| R35 | L35 | åå ° åå °ç”Ÿäº§æœåŠ¡åž‹å›½å®¶ç‰©æµæž¢çº½å·¥ç¨‹é¡¹ç›® | åœ¨å»º | å‰æœŸ |
| R36 | F36 | åå ° åå °å¸‚快递物流产业园二期(十堰市物流枢纽集疏运基地) | 2029 | 2026 |
| R36 | H36 | åå ° åå °å¸‚快递物流产业园二期(十堰市物流枢纽集疏运基地) | 20377 | 20081 |
| R36 | J36 | åå ° åå °å¸‚快递物流产业园二期(十堰市物流枢纽集疏运基地) | 3196 | 2900 |
| R36 | K36 | åå ° åå °å¸‚快递物流产业园二期(十堰市物流枢纽集疏运基地) | 296 | 214 |
| R36 | M36 | åå ° åå °å¸‚快递物流产业园二期(十堰市物流枢纽集疏运基地) | â€¦B3新建基础施工、B4厂房外立面装饰装修施工。 | â€¦B3、B7新建基础施工。 |
| R41 | I41 | åå ° å››ã€ä½¿ç”¨ç¤¾ä¼šèµ„金建设项目 | 0 | (空) |
| R41 | K41 | åå ° å››ã€ä½¿ç”¨ç¤¾ä¼šèµ„金建设项目 | 0 | (空) |
| R47 | M47 | å®œæ˜Œ ç§­å½’县脐橙产业综合物流中心 | å®Œå·¥ | äºŒæœŸä¸»ä½“工程完成,正在进行配套工程施工。 |
| R48 | D48 | å®œæ˜Œ å®œéƒ½ä¾›é”€å•†è´¸ç‰©æµå›­ | ç»­å»º | æ–°å»º |
| R49 | D49 | å®œæ˜Œ é•¿é˜³åŽ¿åŸŽä¹¡å†·é“¾ç‰©æµå›­åŠå…¶é…å¥—è®¾æ–½å»ºè®¾é¡¹ç›® | ç»­å»º | æ–°å»º |
| R51 | D51 | å®œæ˜Œ æ¨å®¶åž±ç«™ç‰©æµè®¾å¤‡æ›´æ–°æ”¹é€ é¡¹ç›® | æ”¹å»º | æ–°å»º |
| R51 | M51 | å®œæ˜Œ æ¨å®¶åž±ç«™ç‰©æµè®¾å¤‡æ›´æ–°æ”¹é€ é¡¹ç›® | ä¸»ä½“施工 | ä¸»ä½“施工。 |
| R52 | M52 | å®œæ˜Œ ä¸‰å³¡ä¸´ç©ºå†œè´¸ç‰©æµå›­ | ä¸»ä½“施工 | ä¸»ä½“施工。 |
| R53 | M53 | å®œæ˜Œ æ¹–北福滋源食品有限公司水果深加工及智慧冷链物流仓储项目 | ä¸»ä½“施工 | ä¸»ä½“施工。 |
| R54 | M54 | å®œæ˜Œ æžæ±Ÿå¸‚顾家店仓储物流中心(一期) | ä¸»ä½“施工 | ä¸»ä½“施工。 |
| R67 | F67 | è¥„阳 ä¼ åŒ–鄂西北智慧物流中心项目 | 46539(2027-06-01) | 2026å¹´10月 |
| R75 | E75 | è¥„阳 è¥„阳高新区物流发展中心项目—冷链产业集成中心 | 45292(2024-01-01) | 2024 |
| R75 | F75 | è¥„阳 è¥„阳高新区物流发展中心项目—冷链产业集成中心 | 46600(2027-08-01) | 2027 |
| R75 | L75 | è¥„阳 è¥„阳高新区物流发展中心项目—冷链产业集成中心 | å®Œå·¥ | åœ¨å»º |
| R80 | G80 | é„‚å·ž ä¸‰ã€çº³å…¥è§„划未使用省部级资金建设项目 | (空) | 270490 |
| R80 | H80 | é„‚å·ž ä¸‰ã€çº³å…¥è§„划未使用省部级资金建设项目 | (空) | 169345.2 |
| R80 | I80 | é„‚å·ž ä¸‰ã€çº³å…¥è§„划未使用省部级资金建设项目 | (空) | 21000 |
| R80 | J80 | é„‚å·ž ä¸‰ã€çº³å…¥è§„划未使用省部级资金建设项目 | (空) | 12289.1 |
| R80 | K80 | é„‚å·ž ä¸‰ã€çº³å…¥è§„划未使用省部级资金建设项目 | (空) | 1250 |
| R82 | M82 | é„‚å·ž æ­¦æ±‰ä¸‡å¨Â·åŽä¸­å†·é“¾æ¸¯ | (空) | å†·åº“主体施工 |
| R92 | M92 | è†é—¨ æ²™æ´‹å¤šå¼è”运现代物流园 | ï¼ˆé•¿æ–‡æœ¬ï¼Œè§æºæ–‡ä»¶å·®å¼‚) | ï¼ˆé•¿æ–‡æœ¬ï¼‰ |
| R94 | M94 | è†é—¨ æ¹–北恒峰国际物流园 | â€¦æ­£å¼æŠ•入运营 | â€¦æ­£å¼æŠ•入运营。 |
| R96 | K96 | è†é—¨ å››ã€ä½¿ç”¨ç¤¾ä¼šèµ„金建设项目 | 0 | (空) |
| R110 | H110 | è†å·žï¼ˆå¸‚州行) | 311700.5 | 303473 |
| R110 | J110 | è†å·žï¼ˆå¸‚州行) | 46548 | 38320.5 |
| R110 | K110 | è†å·žï¼ˆå¸‚州行) | 8606 | 1978.6 |
| R113 | H113 | è†å·ž ä¸‰ã€çº³å…¥è§„划未使用省部级资金建设项目 | 84799.7 | 76572.2 |
| R113 | J113 | è†å·ž ä¸‰ã€çº³å…¥è§„划未使用省部级资金建设项目 | 22044.6 | 13817.1 |
| R113 | K113 | è†å·ž ä¸‰ã€çº³å…¥è§„划未使用省部级资金建设项目 | 8441 | 1813.6 |
| R119 | H119 | è†å·ž ä¸­å›½ä¾›é”€å…¬å®‰å•†è´¸ç‰©æµå›­ï¼ˆå…¬å®‰åŽ¿åŸŸé›†é‡‡é›†é…ä¸­å¿ƒï¼‰ | 15986 | 7758.5 |
| R119 | J119 | è†å·ž ä¸­å›½ä¾›é”€å…¬å®‰å•†è´¸ç‰©æµå›­ï¼ˆå…¬å®‰åŽ¿åŸŸé›†é‡‡é›†é…ä¸­å¿ƒï¼‰ | 15986 | 7758.5 |
| R119 | K119 | è†å·ž ä¸­å›½ä¾›é”€å…¬å®‰å•†è´¸ç‰©æµå›­ï¼ˆå…¬å®‰åŽ¿åŸŸé›†é‡‡é›†é…ä¸­å¿ƒï¼‰ | 8227.5 | 1600.1 |
| R119 | M119 | è†å·ž ä¸­å›½ä¾›é”€å…¬å®‰å•†è´¸ç‰©æµå›­ï¼ˆå…¬å®‰åŽ¿åŸŸé›†é‡‡é›†é…ä¸­å¿ƒï¼‰ | æ”¯ä»˜åœŸåœ°æ¬¾ï¼Œå®ŒæˆåœŸå»ºã€è£…饰、机电、消防、市政等工程 | å®ŒæˆåœŸå»ºã€è£…饰、机电、消防、市政等工程 |
| R136 | M136 | é»„冈 æ­¦æ±‰åŒ—传化城市物流中心 | å»ºè®¾é…å¥—办公及食堂,一期已完工 | å»ºè®¾é…å¥—办公及食堂 |
| R145 | M145 | å’¸å® åº·åŽæ™ºæ…§ç‰©æµå›­ | æœ¬æœˆæ— å»ºè®¾å†…容 | æœ¬æœˆæ— å»ºè®¾è¿›å±• |
| R156 | M156 | éšå·ž æ°‘生物资城市配送及仓储物流建设项目 | 2026å¹´07月…(7 æœˆæ–‡å­—) | 2026å¹´08月…(8 æœˆæ–‡å­—) |
| R160 | G160 | æ©æ–½ ä¸‰ã€çº³å…¥è§„划未使用省部级资金建设项目 | (空) | 308255 |
| R160 | H160 | æ©æ–½ ä¸‰ã€çº³å…¥è§„划未使用省部级资金建设项目 | (空) | 126741 |
| R160 | I160 | æ©æ–½ ä¸‰ã€çº³å…¥è§„划未使用省部级资金建设项目 | (空) | 49800 |
| R160 | J160 | æ©æ–½ ä¸‰ã€çº³å…¥è§„划未使用省部级资金建设项目 | (空) | 41574 |
| R160 | K160 | æ©æ–½ ä¸‰ã€çº³å…¥è§„划未使用省部级资金建设项目 | (空) | 2116 |
| R170 | G170 | ä»™æ¡ƒ äºŒã€ä½¿ç”¨çœç‡ƒæ²¹ç¨Žè¿”还资金建设项目 | (空) | 123710.5 |
| R170 | H170 | ä»™æ¡ƒ äºŒã€ä½¿ç”¨çœç‡ƒæ²¹ç¨Žè¿”还资金建设项目 | (空) | 29403 |
| R170 | I170 | ä»™æ¡ƒ äºŒã€ä½¿ç”¨çœç‡ƒæ²¹ç¨Žè¿”还资金建设项目 | (空) | 39200 |
| R170 | J170 | ä»™æ¡ƒ äºŒã€ä½¿ç”¨çœç‡ƒæ²¹ç¨Žè¿”还资金建设项目 | (空) | 29403 |
| R170 | K170 | ä»™æ¡ƒ äºŒã€ä½¿ç”¨çœç‡ƒæ²¹ç¨Žè¿”还资金建设项目 | (空) | 3782 |
| R175 | K175 | æ½œæ±Ÿï¼ˆå¸‚州行) | 0 | (空) |
| R179 | G179 | æ½œæ±Ÿ å››ã€ä½¿ç”¨ç¤¾ä¼šèµ„金建设项目 | (空) | 22000 |
| R179 | H179 | æ½œæ±Ÿ å››ã€ä½¿ç”¨ç¤¾ä¼šèµ„金建设项目 | (空) | 11947.9 |
| R179 | I179 | æ½œæ±Ÿ å››ã€ä½¿ç”¨ç¤¾ä¼šèµ„金建设项目 | (空) | 12000 |
| R179 | J179 | æ½œæ±Ÿ å››ã€ä½¿ç”¨ç¤¾ä¼šèµ„金建设项目 | (空) | 1135 |
| R181 | H181 | å¤©é—¨ï¼ˆå¸‚州行) | 16677.7 | (空) |
| R181 | J181 | å¤©é—¨ï¼ˆå¸‚州行) | 16677.7 | (空) |
| R181 | K181 | å¤©é—¨ï¼ˆå¸‚州行) | 500 | (空) |
| R183 | G183 | å¤©é—¨ äºŒã€ä½¿ç”¨çœç‡ƒæ²¹ç¨Žè¿”还资金建设项目 | (空) | 36835 |
| R183 | I183 | å¤©é—¨ äºŒã€ä½¿ç”¨çœç‡ƒæ²¹ç¨Žè¿”还资金建设项目 | (空) | 30635 |
| R184 | H184 | å¤©é—¨ å¤©é—¨å¸‚物流中心建设项目 | 16677.7 | 0 |
| R184 | J184 | å¤©é—¨ å¤©é—¨å¸‚物流中心建设项目 | 16677.7 | 0 |
| R184 | K184 | å¤©é—¨ å¤©é—¨å¸‚物流中心建设项目 | 500 | 0 |
| R184 | M184 | å¤©é—¨ å¤©é—¨å¸‚物流中心建设项目 | 1.2.3#厂房周围道路砼浇筑完成…接入市政雨污水口管道 | 4栋厂房办公室…四号厂房砌体墙完成二构绑扎完成。 |
| R187 | K187 | æž—区(市州行) | 0 | (空) |
| R189 | G189 | æž—区 äºŒã€ä½¿ç”¨çœç‡ƒæ²¹ç¨Žè¿”还资金建设项目 | (空) | 7440.35 |
| R189 | H189 | æž—区 äºŒã€ä½¿ç”¨çœç‡ƒæ²¹ç¨Žè¿”还资金建设项目 | (空) | 7535.45 |
| R189 | I189 | æž—区 äºŒã€ä½¿ç”¨çœç‡ƒæ²¹ç¨Žè¿”还资金建设项目 | (空) | 31 |
| R189 | J189 | æž—区 äºŒã€ä½¿ç”¨çœç‡ƒæ²¹ç¨Žè¿”还资金建设项目 | (空) | 26.1 |
#### ç‰©æµ-分市州规划内外项目完成情况(15 æ ¼ï¼‰
| è¡Œ | åˆ— | ä½ç½® | äººå·¥ç‰ˆ | è½¯ä»¶ç‰ˆ |
| --- | --- | --- | --- | --- |
| R4 | D4 | æ­¦æ±‰ | 81366 | 72166 |
| R4 | F4 | æ­¦æ±‰ | 55336 | 48236 |
| R4 | H4 | æ­¦æ±‰ | 26030 | 23930 |
| R6 | D6 | åå ° | 29482 | 29188 |
| R6 | F6 | åå ° | 28452 | 28158 |
| R8 | G8 | è¥„阳 | 0 | (空) |
| R8 | H8 | è¥„阳 | 0 | (空) |
| R12 | D12 | è†å·ž | 46548 | 38320.5 |
| R12 | F12 | è†å·ž | 22044.6 | 13817.1 |
| R18 | E18 | æ½œæ±Ÿ | 0 | (空) |
| R19 | D19 | å¤©é—¨ | 16677.7 | (空) |
| R19 | F19 | å¤©é—¨ | 16677.7 | (空) |
| R21 | D21 | åˆè®¡ | 789311.6 | 754912.4 |
| R21 | F21 | åˆè®¡ | 661947 | 629647.8 |
| R21 | H21 | åˆè®¡ | 127364.6 | 125264.6 |
#### ç‰©æµ-市州汇总(17 æ ¼ï¼‰
| è¡Œ | åˆ— | ä½ç½® | äººå·¥ç‰ˆ | è½¯ä»¶ç‰ˆ |
| --- | --- | --- | --- | --- |
| R7 | C7 | åˆè®¡ | 789311.6 | 754912.4 |
| R7 | D7 | åˆè®¡ | 89644.1 | 83352.7 |
| R7 | E7 | åˆè®¡ | 79.4316061253 | 75.9698760489 |
| R8 | C8 | æ­¦æ±‰ | 81366 | 72166 |
| R8 | D8 | æ­¦æ±‰ | 9200 | 10116 |
| R8 | E8 | æ­¦æ±‰ | 76.5437441204 | 67.8889934149 |
| R10 | C10 | åå ° | 29482 | 29188 |
| R10 | D10 | åå ° | 1671 | 1591 |
| R10 | E10 | åå ° | 139.0660377358 | 137.679245283 |
| R16 | C16 | è†å·ž | 46548 | 38320.5 |
| R16 | D16 | è†å·ž | 8606 | 1978.6 |
| R16 | E16 | è†å·ž | 78.2319327731 | 64.4042016807 |
| R22 | D22 | æ½œæ±Ÿ | 0 | (空) |
| R23 | C23 | å¤©é—¨ | 16677.7 | (空) |
| R23 | D23 | å¤©é—¨ | 500 | (空) |
| R23 | E23 | å¤©é—¨ | 54.4400195854 | 0 |
| R24 | D24 | æž—区 | 0 | (空) |
#### ç‰©æµ-月2(0 æ ¼ï¼‰
完全一致,无差异。
## äº”、处置建议(按优先级)
1. **【P0】修「按项目名匹配」的脆弱性**:明细表行名与库内项目名不一致(多点/少括号/新旧名并存)就整行不覆盖。建议改为按「市州 + åºå·/项目名归一化(去标点空格)+ å»ºåº“时间」匹配,匹配不到时**必须在运行日志/校验报错中列出行号**(符合用户「导入失败要显示行号」的要求)。
2. **【P0】修导入丢数(天门)**:核对《8月份物流园中心项目(天门).xlsx》的 H/J/K ä¸‰åˆ—映射,修复后重导,复查 `investment_monthly` 2026-08。
3. **【P0】清理重复项目主档**:十堰「快递物流产业园二期」`id=154`(2026 ç«£å·¥ï¼‰ä¸Ž `id=181`(2029 ç«£å·¥ï¼‰å¹¶å­˜ï¼Œåº”先合并再做导出比对;同类历史重名项目建议全表扫一遍。
4. **【P1】导出补写 L(建设阶段)**:目前 L æ²¿ç”¨åº•稿,导致「暂停/前期/在建」这类阶段信息可能是上一期的;建议与 M ä¸€æ ·æŒ‰å½“月数据覆盖。
5. **【P1】武汉物流无源表**(对应交接文档 P1-8):库内 0 æ¡å½“月记录,导出只能沿用旧值;要么补武汉单表,要么在导出时提示「该市州无当月数据」。
6. **【P2】分组小计行与 0/空白写法**:与业务确认统一(人工版不填单渠道分组行、0 å†™ 0;软件填、0 å†™ç©ºï¼‰ã€‚
7. **【P2】口径文案**:康华 M145「本月无建设内容/本月无建设进展」、宜昌 4 å¤„句号等,建议按源表原文统一(避免人工再改)。
## å…­ã€ç»“论
本次比对共发现 **156 æ ¼å·®å¼‚**,其中:
- **会影响报省数字的**:物流 3 ä¸ªé¡¹ç›®è¡Œï¼ˆåå °å¿«é€’产业园二期、荆州中国供销公安、天门物流中心)+ æ­¦æ±‰æ•´æ®µï¼ˆ6 è¡Œï¼‰ï¼Œåˆè®¡ä½¿è½¯ä»¶ç‰ˆç‰©æµã€Œè‡ªå¼€å§‹ç´¯è®¡ã€å°‘ **34399.2 ä¸‡å…ƒ**、「自年初累计」少 **34399.2 ä¸‡å…ƒ**、「本月完成」少 **6291.4 ä¸‡å…ƒ**;
- **不影响数字、只影响版式/口径的**:分组小计行填法、0/空白写法、句号、日期数字格式等;
- **谁对谁错(已回溯源文件/库内)**:物流的 3 ä¸ªã€ŒæŠ“错数」处全部是**人工版对**;客运的 M26/M85 æ˜¯**软件版对**(人工版缺形象进度),L91 æ˜¯**软件版取了底稿旧值**;随州 M156 æ˜¯**软件版对**(人工版还是 7 æœˆæ–‡å­—)。
软件版要修的是「取数」而不是「算术」——底稿+名称匹配的机制在数据齐全时结果正确,一旦「项目名不一致 / é‡ååŒæ¡£ / å½“月缺数」就会静默沿用上期值,属于**会静默出错**的类型,建议按第五节 1~3 é¡¹ä¼˜å…ˆä¿®ã€‚
docs/¹¤×÷ÈÕ½á/¹¤×÷ÈÕ½á_2026-09-22.md
@@ -70,7 +70,7 @@
- ä¸Žæ‰‹å·¥æ ¸ç®—一致:公交 1-8 æœˆ 110776.34 ä¸‡äººæ¬¡ã€è´§è¿ä¼ä¸š 313,998,248 å¨ã€è´§è¿é‡å‘¨è½¬é‡ 130,311.89 ä¸‡å¨ã€‚
- æ”¶å°¾ï¼šæŒ‰ç”¨æˆ·è¦æ±‚把「全省合计」行提到最前面(武汉市之上),导出 Excel ä¸­åˆè®¡è¡ŒåŠ ç²—ã€‚
### 5. æ±‡æ€»å¤§è¡¨å¯¼å‡ºç»“果落盘缓存(用户:"下载过就不该再等很久,能不能记住上次结果")
### 9. æ±‡æ€»å¤§è¡¨å¯¼å‡ºç»“果落盘缓存(用户:"下载过就不该再等很久,能不能记住上次结果")
- **背景**:原来只有「10 åˆ†é’Ÿå†… + æœŸé—´æ— æ–°å¯¼å…¥ã€çš„**内存**缓存,窗口短、重启即失效 â†’ ç¬¬äºŒæ¬¡ä¸‹è½½è¿˜è¦ç­‰ 13~17 ç§’。
- **改动**(`ReportExportTaskService.java` ä¸ºä¸»ï¼‰ï¼š
@@ -79,6 +79,32 @@
  3. å‰ç«¯æ–‡æ¡ˆï¼šå‘½ä¸­ç¼“存显示「本次直接沿用 <时间> ç”Ÿæˆçš„结果(期间没有新的数据导入)」,元信息改为「上次生成于 â€¦ã€ã€‚
- **顺带修 bug**:落盘命中时 `elapsedMs` ä¸ºè´Ÿæ•°ï¼ˆä»»åŠ¡èµ·ç‚¹ç”¨çŽ°åœ¨ã€ç»“æŸæ—¶é—´æ˜¯åŽ†å²ç”Ÿæˆæ—¶é—´ï¼‰â†’ å·²æ”¹ä¸ºä»¥ç”Ÿæˆæ—¶é—´ä½œèµ·ç‚¹ã€‚
- **实测**:首次 12.4 s å†™ç¼“存;再次提交 **164 ms** å‘½ä¸­å†…存;**重启后端后提交 1.19 s å‘½ä¸­è½ç›˜**;临时插一条导入记录后 `fromCache=false` é‡æ–°ç”Ÿæˆï¼ˆéªŒè¯ã€Œæœ‰æ–°å¯¼å…¥å³å¤±æ•ˆã€ï¼‰ï¼›æµè§ˆå™¨ç‚¹å¯¼å‡ºç§’出、文案与按钮正确、控制台 0 æŠ¥é”™ã€‚
### 10. å¯¼å‡ºç¼“存守卫升级为「数据指纹」+ å¤±æ•ˆæç¤ºï¼ˆç”¨æˆ·ï¼šæŒ‰ä½ è¯´çš„做)
- **背景**:上一版缓存守卫用全局 `MAX(import_batch.id)`,①导入投资/能耗等无关数据会白失效;②**不含母版文件**,换母版时会错误命中旧结果(正确性漏洞)。
- **改动**(`ReportExportTaskService.java`):
  1. æŒ‡çº¹ =「依赖源表 `CHECKSUM TABLE` æ ¡éªŒå’Œï¼ˆèƒ½æ•捉原地 UPDATE)」+「母版目录全部文件 + ç½‘约车订单 xlsx çš„名称/大小/修改时间」,SHA-256 å‰ 8 å­—节写进缓存文件名;
  2. æºè¡¨èŒƒå›´ç”¨**排除法**:排除投资 3 / èƒ½è€— 2 / å®¡æ ¸ 4 / ç³»ç»Ÿ 6 / `import_batch`,其余全纳入(宁可多算不可出错);
  3. å¤±æ•ˆæç¤ºï¼ˆç¬¬ 3 æ­¥æç¤ºç‰ˆï¼‰ï¼šæ²¡å‘½ä¸­ä¸”有旧结果时,进度弹窗显示「上次生成的结果已因数据或母版变化失效,本次按最新数据重算。」
- **实测**:无关导入(投资项目 + å¯¼å…¥è®°å½•各插一行)**仍命中**缓存;相关源表原地 UPDATE、改母版 mtime **必定失效**并重算;命中缓存时不再残留提示;浏览器实测提示行显示正常、控制台 0 æŠ¥é”™ï¼›æµ‹è¯•数据已全部还原(419 æ‰¹æ¬¡ / 152 é¡¹ç›®ï¼‰ã€‚
### 11. äº¤æŽ¥æ”¶å°¾ï¼šåŒæ­¥åŒäº‹è¿›å±• + å‰©ä½™é¡¹æ ¸æŸ¥ï¼ˆç”¨æˆ·å‡†å¤‡å¼€æ–°ä¼šè¯ï¼‰
- **同事进展核实**(近三天 xyc / zyj è´¦å·çš„æäº¤ï¼‰ï¼šæ”¹åЍ**全部集中在汇总大表线**——
  `abf468c` ä¸­å£å¾„排名累计同比基数改用母版 2025 é™æ€åˆ—(方案 A,`ReportExportService.java`)、`47a8734` è½¯ä»¶è¾“出与手工定稿差异报告、
  `ceaa5f2` AGENTS æ”¹å…¬å¸ gitea å•仓库、`a5a9545` 09-22 è®°å½•与 Codex å¡é¡¿å¤æ ¸ã€`zyj` çš„ 8 æœˆæ¯ç‰ˆ 196 æ ¼æ–‡æœ¬è½¬æ•°å€¼ + å·®å¼‚清单。
- **剩余待办逐条核查,同事均未触碰**(有证据):
  1. P0-2《亿元投资项目》按 Q7 è¿½åˆ— â€”— `ReportExportService.java:6251` ä»å†™åŒä¸€æ ¼ï¼ˆç¬¬ 24 åˆ—),无追列逻辑;
  2. P0-3 å¯¼å‡ºå‰åŸºæ•°ä½“检 +《数据缺失清单》页 â€”— `getLastMidIssues()` å…¨ä»“库无调用方;
  3. P0-4 ç¼º 2026-06 / 2026-09 æ¯ç‰ˆ â€”— æ¯ç‰ˆç›®å½•无这两个月文件;
  4. P1-7 æŠ•资资金渠道分组 â€”— æ—  `fund_channel` å­—段;
  5. P1-9 æŠ•资导出按月分目录 + è¿è¡Œæ—¥å¿—/校验报错 â€”— æ— å®žçŽ°ï¼›
  6. P2-1 D ç»„「增速排名」措辞 â€”— æ— ã€Œæš‚不排名」逻辑。
- **交接文档已同步**(commit `06b1cb7`):§0 æœ€ç´§æ€¥æ¸…单 4→3 ä»¶å¹¶åˆ—出三项已闭环(十堰源文件 / ä¸­å£å¾„基数双轨制 / å¯¼å‡ºç¼“存);
  P1-1 è¡¥æäº¤å· `abf468c`;§1.3 ä¸Ž Â§7.4 ä»Žã€ŒåŒä»“库」改为**公司 gitea å•仓库**;§6 ç´¢å¼•补同事两份文档。
- **待核实(留给新会话)**:P2-2「城市客运页表头仍是日期序列号」可能已过时——代码里有 `fixCityMonthHeaderText()`(09-03 åŠ å…¥ï¼‰
  ä¼šæŠŠåŸŽå¸‚客运类表头序列号改写成「YYYYå¹´M月」;建议跑一次 2026-08 å¯¼å‡ºæ ¸å¯¹å®žé™…表头后再更新交接文档。
## äºŒã€æµ‹è¯•结果摘要
@@ -89,6 +115,7 @@
- æŠ¥å‘Šï¼š`docs/功能测试报告/功能测试报告_数据查看按市州汇总与导出_2026-09-22.md`(接口 10 æ¡ + çœŸæœº 4 æ¡å…¨é€šè¿‡ï¼‰
- æŠ¥å‘Šï¼š`docs/功能测试报告/功能测试报告_汇总大表进度弹窗优化_2026-09-22.md`(6 æ¡ç”¨ä¾‹é€šè¿‡ï¼šç”Ÿæˆä¸­çŠ¶æ€ / å®Œæˆæç¤º / å†æ¬¡ä¸‹è½½èµ°ç¼“å­˜ / å…³é—­ / æ— æŽ§åˆ¶å°æŠ¥é”™ / å…¶å®ƒå¯¼å‡ºæœªå—影响)
- æŠ¥å‘Šï¼š`docs/功能测试报告/功能测试报告_汇总大表导出结果落盘缓存复用_2026-09-22.md`(10 æ¡ç”¨ä¾‹é€šè¿‡ï¼šé¦–次生成写缓存 / å†…存命中 164ms / **重启后落盘命中 1.19s** / æœ‰æ–°å¯¼å…¥å³å¤±æ•ˆ / åŒ key åªç•™æœ€æ–°ç‰ˆæœ¬ / æ—¶é•¿æ˜¾ç¤ºä¿®å¤ / æµè§ˆå™¨ç«¯åˆ°ç«¯ï¼‰
- æŠ¥å‘Šï¼š`docs/功能测试报告/功能测试报告_导出缓存改用数据指纹_2026-09-22.md`(12 æ¡ç”¨ä¾‹é€šè¿‡ï¼šæ— å…³å¯¼å…¥ä»å‘½ä¸­ / ç›¸å…³æºè¡¨åŽŸåœ° UPDATE å¿…失效 / **换母版必失效** / å¤±æ•ˆæç¤ºæ˜¾ç¤º / å‘½ä¸­æ— æç¤º / æ•°æ®è¿˜åŽŸæ ¸å¯¹ï¼‰
- çŽ¯å¢ƒï¼šåŽç«¯ `mvn spring-boot:run`(8090,`Started TrafficAuditApplication`);前端 `npm run serve`(8080,`Compiled successfully in 4769ms`);MySQL `localhost:3308/traffic_audit`;登录 admin/123456 å– JWT。
- ç»“果:3 ä¸ªæ–°ç±»åž‹æ­£å‘(含期间/关键字筛选)、负向(未知类型、无数据期、无 token)全部通过;入库抽查条数与库内一致(20 / 20 / 139);原有 15 ç±»å›žå½’正常。
@@ -114,7 +141,27 @@
- å®ˆå«ï¼šè°ƒè¯•端口 9229 è¯»å– `window.__codexPlusRetryTimerGuardInstalled=true`,本次会话 `window.__codexPlusRetryTimerGuardDropped=16`。
- ç»“论:输入卡顿修复在重启后仍生效,问题已解决。
## å…­ã€æ±‡æ€»å¤§è¡¨è½¯ä»¶è¾“出与手工定稿差异复核(2026-08)
## å…­ã€æŠ•资明细表「软件生成 vs äººå·¥ç‰ˆã€æ•°æ®æ¯”对(2026-08)
用户要求:把软件生成的《客运站投资明细表》《物流站场投资明细》与人工维护的两份定稿逐格比对,列出所有不同。
- **比对文件**:人工版 `D:\05_数据分类\投资\8月\8月客运站投资明细表.xlsx`、`8月物流站场投资明细.xls`
  vs è½¯ä»¶ç‰ˆ `D:\桌面\生成数据\生成_所选报表_2026-08 (1)\生成_客运站投资明细表.xlsx`、`生成_物流站场投资明细.xls`。
- **比对方法**:脚本逐页签逐格比对(`_tmp_diff_invest_0922.py`);先核对 B åˆ—项目名逐行对齐(192/121 è¡Œå…¨éƒ¨ä¸€è‡´ï¼Œæ— é”™ä½ï¼‰ï¼Œå†ç»Ÿè®¡å·®å¼‚,最后回溯源文件 / æ•°æ®åº“ / åº•稿模板定位根因。
- **结果**:共 **156 æ ¼å·®å¼‚** â€”— å®¢è¿ã€Šæ˜Žç»†ã€‹12 +《汇总》4;物流《分项目投资完成情况》108 +《分市州规划内外》15 +《市州汇总》17,《月2》无差异。
- **根因(三方证据锁定)**:
  1. è½¯ä»¶å¯¼å‡º = åœ¨åº•稿《模板_X月…投资明细》上,把库内当月数据**按项目名称匹配**覆盖 H/J/K ä¸Ž M;**匹配不上或库内无当月数就静默沿用上期值** â€”— æ­¦æ±‰å¸‚物流(库内 0 æ¡æœˆåº¦è®°å½•)整段保留 7 æœˆå€¼ï¼›è†å·žã€Œä¸­å›½ä¾›é”€å…¬å®‰å•†è´¸ç‰©æµå›­ã€ï¼ˆåº“内名多一个点,匹配失败)保留 7 æœˆå€¼ 7758.5/1600.1(库内/源表实际 15986/8227.5)。
  2. åº“内**同名双档**:十堰「快递物流产业园二期」有 `id=154`(竣工 2026)与 `id=181`(竣工 2029)两档,导出取到旧档,写了 7 æœˆå€¼ 20081/2900/214(应 20377/3196/296)。
  3. **导入丢数**:天门「天门市物流中心建设项目」库内 2026-08 çš„累计/自年初/本月全是 0,源文件是 16677.7/16677.7/500(P1-5 åŽŸè®°å½•ã€Œæºæ–‡ä»¶ H/J/K åˆ—为空」与现文件不符)。
  4. å¯¼å‡º**不覆盖 L(建设阶段)等非金额列** â†’ é»„石大冶湖冷链 L=暂停、十堰枢纽 L=前期、襄阳冷链中心 L=在建、随州民生物资 M çš„ 7 æœˆæ–‡å­—,都是底稿残留。
  5. å•渠道市州的**分组小计行**:软件填=市州合计,人工版不填;0 ä¸Žç©ºç™½çš„写法两边不同(不影响金额)。
  6. å®¢è¿éƒ¨åˆ†å·®å¼‚主要是**人工版手写四舍五入**(203 / 2531 / 43225.9 ç­‰ï¼‰ï¼Œä»¥åŠ 3 å¤„形象进度/建设阶段:M26、M85 äººå·¥ç‰ˆç©ºï¼ˆè½¯ä»¶ç‰ˆå–自源表与库内、是对的),L91 äººå·¥ç‰ˆã€Œåœ¨å»ºã€æ­£ç¡®ã€è½¯ä»¶ç‰ˆæ˜¯åº•稿旧值「暂停施工」。
- **影响金额**:软件版物流「自开始累计」「自年初累计」各少 **34399.2 ä¸‡å…ƒ**、「本月完成」少 **6291.4 ä¸‡å…ƒ**。
- **报告**:`docs/功能测试报告/数据比对报告_投资明细表软件生成与人工版_2026-09-22.md`(含 156 æ ¼å…¨é‡æ¸…单 + é€æ¡æ ¸å¯¹ç»“论 + å¤„置建议)。
- **临时脚本(保留)**:`_tmp_diff_invest_0922.py`、`_tmp_dump_invest_full_0922.py`、`_tmp_diff_invest_annot_0922.py`、`_tmp_diff_tables_0922.py`、`_tmp_src_spotcheck_0922.py`、`_tmp_src_spotcheck2_0922.py`、`_tmp_db_probe*_0922.py`、`_tmp_tpl_*_0922.py` åŠå¯¹åº” `_*.txt` è¾“出。
## ä¸ƒã€æ±‡æ€»å¤§è¡¨è½¯ä»¶è¾“出与手工定稿差异复核(2026-08)
- æ¯”对文件:软件输出 `生成_道路运输量汇总表_2026-08 (5).xlsx`,手工定稿 `2026å¹´8月客运量、货运量定稿.xlsx`。
- æ–¹æ³•:先用 Excel COM å¯¹ä¸¤ä»½å‰¯æœ¬å…¨é‡é‡ç®—,再按页签、数据块、行标签、列头做语义对齐后逐格比对,避免读取 XLSX æ—§ç¼“存造成 `#VALUE!` å‡å·®å¼‚。
traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportTaskService.java
@@ -1,19 +1,27 @@
package com.trafficaudit.reportexport.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.trafficaudit.dataimport.entity.ImportBatch;
import com.trafficaudit.dataimport.mapper.ImportBatchMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
import javax.sql.DataSource;
import java.io.File;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService;
@@ -29,9 +37,11 @@
 * 2) ç”Ÿæˆè¿‡ç¨‹ä¸å ç”¨ HTTP è¯·æ±‚线程,避免多人同时点把容器拖死(工作线程固定 1 ä¸ªï¼Œå¤šä½™è¯·æ±‚显示「排队中」);
 * 3) åŒä¸€æŠ¥è¡¨æœŸçš„结果可复用(**落盘保存,进程重启后依然有效**),避免每次重算整本约 4 ä¸‡æ ¼å…¬å¼ã€‚
 *
 * ç¼“存正确性守卫:只有当「期间没有任何新的数据导入(import_batch æœ€å¤§ id æœªå˜ï¼‰ã€ä¸”「结果不超过 7 å¤©ã€æ—¶æ‰å¤ç”¨ï¼›
 * å¯¼å…¥å³å¤±æ•ˆï¼Œé¿å…æŠŠè¿‡æœŸæŠ¥è¡¨ç»™ç”¨æˆ·ã€‚前端仍提供「重新生成」强制重算(跳过缓存)。
 * è½ç›˜ä½ç½®ï¼š{summary.template-dir}/_cache/<key>_v<数据版本>.xlsx
 * ç¼“存正确性守卫=**数据指纹**:指纹由「汇总大表依赖的源表内容校验和」+「母版等文件身份(大小/修改时间)」算出,
 * åªæœ‰æŒ‡çº¹ä¸€è‡´ï¼ˆä¸”结果不超过 7 å¤©ï¼‰æ‰å¤ç”¨ã€‚因此:
 *   - æŠ•资/能耗/审核等**与汇总大表无关**的导入不再让缓存失效;
 *   - æ¢æ¯ç‰ˆã€æ”¹å‚照件、动相关源表(含原地 UPDATE)都会让缓存失效,不会把旧表当新表发出。
 * å‰ç«¯ä»æä¾›ã€Œé‡æ–°ç”Ÿæˆã€å¼ºåˆ¶é‡ç®—(跳过缓存)。落盘位置:{summary.template-dir}/_cache/<key>_v<指纹>.xlsx
 */
@Slf4j
@Service
@@ -50,11 +60,24 @@
    @Resource
    private ReportExportService reportService;
    @Resource
    private ImportBatchMapper importBatchMapper;
    private DataSource dataSource;
    /** æ±‡æ€»å·¥ä½œç°¿ç›®å½•(与 ReportExportService åŒé…ç½®ï¼‰ï¼Œè½ç›˜ç¼“存放在其 _cache å­ç›®å½• */
    @org.springframework.beans.factory.annotation.Value("${summary.template-dir:docs/生成汇总大表}")
    private String summaryTemplateDir;
    /** åŸŽå¸‚客运目录:网约车订单及全省总量.xlsx(库里缺该月时的兜底输入) */
    @org.springframework.beans.factory.annotation.Value("${city-passenger.template-dir:docs/城市客运}")
    private String cityPassengerTemplateDir;
    /** è®¡ç®—指纹时**排除**的表:投资线、能耗线、审核线、系统表、导入日志。
     *  è¿™äº›è¡¨å˜åŒ–不影响汇总大表内容,没必要让缓存失效;其余表一律纳入(宁可多算不可出错)。 */
    private static final Set<String> FINGERPRINT_EXCLUDE = new HashSet<>(Arrays.asList(
        "investment_project", "investment_monthly", "investment_system",
        "h204_vehicle_quarterly", "h204_auth_vehicle",
        "audit_result", "audit_run", "audit_rule", "audit_explanation",
        "sys_user", "sys_role", "sys_user_role", "sys_dept", "sys_operation_log",
        "llm_desensitize_map", "import_batch"));
    /** è½ç›˜ç¼“存目录;定位策略与模板一致(配置目录 / user.dir ç›¸å¯¹ / ä¸Šçº§ç›®å½•) */
    private File cacheDir() {
@@ -95,8 +118,8 @@
        private final String mode;
        private final Integer toMonth;
        private volatile long createdAt = System.currentTimeMillis();
        /** ç”Ÿæˆæ—¶çš„æ•°æ®ç‰ˆæœ¬ï¼ˆimport_batch æœ€å¤§ id),用于判断缓存是否过期 */
        private final long importVersion;
        /** ç”Ÿæˆæ—¶çš„æ•°æ®æŒ‡çº¹ï¼ˆæºè¡¨æ ¡éªŒå’Œ + æ¯ç‰ˆæ–‡ä»¶èº«ä»½ï¼‰ï¼Œç”¨äºŽåˆ¤æ–­ç¼“存是否过期 */
        private final String fingerprint;
        private volatile String status = "PENDING"; // PENDING/RUNNING/DONE/FAILED
        private volatile int percent = 0;
        private volatile String step = "排队中";
@@ -106,14 +129,16 @@
        private volatile File cacheFile;
        private volatile String fileName;
        private volatile boolean fromCache;
        /** æœ¬æ¬¡ã€Œæ²¡å‘½ä¸­ç¼“存」是因为存在旧结果但数据/母版已变(用于给用户一句解释) */
        private volatile boolean staleCache;
        private volatile long finishedAt;
        Task(String type, String period, String mode, Integer toMonth, long importVersion) {
        Task(String type, String period, String mode, Integer toMonth, String fingerprint) {
            this.type = type;
            this.period = period;
            this.mode = mode;
            this.toMonth = toMonth;
            this.importVersion = importVersion;
            this.fingerprint = fingerprint;
        }
        void progress(int pct, String stepText) {
@@ -159,6 +184,7 @@
            m.put("percent", "DONE".equals(status) ? 100 : percent);
            m.put("step", step);
            m.put("fromCache", fromCache);
            m.put("staleCache", staleCache);
            m.put("fileName", fileName);
            m.put("error", error);
            long end = finishedAt > 0 ? finishedAt : System.currentTimeMillis();
@@ -170,20 +196,22 @@
    /**
     * æäº¤å¯¼å‡ºä»»åŠ¡ã€‚forceRefresh=true æ—¶å¿½ç•¥ç¼“存重新生成;
     * å¦åˆ™åœ¨ã€ŒåŒä¸€æŠ¥è¡¨æœŸã€10 åˆ†é’Ÿå†…、期间无新导入」的前提下直接复用上次结果。
     * å¦åˆ™åœ¨ã€ŒåŒä¸€æŠ¥è¡¨æœŸ + æ•°æ®æŒ‡çº¹ä¸€è‡´ + 7 å¤©å†…」的前提下直接复用上次结果。
     * åŒä¸€æŠ¥è¡¨æœŸå·²æœ‰ä»»åŠ¡åœ¨è·‘æ—¶ç›´æŽ¥è¿”å›žè¯¥ä»»åŠ¡ï¼Œé¿å…é‡å¤æŽ’é˜Ÿã€‚
     */
    public Task submit(String type, String period, String mode, Integer toMonth, boolean forceRefresh) {
        cleanupExpired();
        String key = cacheKey(type, period, mode, toMonth);
        String fingerprint = dataFingerprint();
        if (!forceRefresh) {
            Task hit = cache.get(key);
            if (cacheUsable(hit)) {
            if (cacheUsable(hit, fingerprint)) {
                hit.fromCache = true;
                hit.staleCache = false; // å‘½ä¸­ç¼“存时不能残留上一次「结果已失效」的提示
                log.info("报表导出任务命中内存缓存:{} {}(生成于 {})", type, period, new Date(hit.finishedAt));
                return hit;
            }
            Task disk = loadFromDisk(key, type, period, mode, toMonth);
            Task disk = loadFromDisk(key, type, period, mode, toMonth, fingerprint);
            if (disk != null) {
                tasks.put(disk.id, disk);
                cache.put(key, disk);
@@ -197,7 +225,9 @@
            log.info("报表导出任务已在执行,复用进行中的任务:{} {}({})", type, period, running.id);
            return running;
        }
        Task task = new Task(type, period, mode, toMonth, importVersion());
        Task task = new Task(type, period, mode, toMonth, fingerprint);
        // æœ‰æ—§ç»“果但没命中(数据或母版变了)→ å‰ç«¯æç¤ºä¸€å¥ï¼Œé¿å…ç”¨æˆ·ä»¥ä¸º"缓存坏了"
        task.staleCache = !forceRefresh && hasStaleCache(type, period, mode, toMonth, fingerprint);
        tasks.put(task.id, task);
        pool.submit(() -> run(task));
        return task;
@@ -240,23 +270,99 @@
        return null;
    }
    private boolean cacheUsable(Task t) {
        if (t == null || !"DONE".equals(t.status) || t.data == null) return false;
    private boolean cacheUsable(Task t, String fingerprint) {
        if (t == null || !"DONE".equals(t.status)) return false;
        if (t.data == null && (t.cacheFile == null || !t.cacheFile.isFile())) return false;
        if (System.currentTimeMillis() - t.finishedAt > CACHE_MAX_AGE_MS) return false;
        long now = importVersion();
        if (now < 0 || t.importVersion < 0) return false; // å–不到数据版本时不冒风险复用
        return now == t.importVersion;
        if (fingerprint == null || t.fingerprint == null) return false; // ç®—不出指纹时不冒风险复用
        return fingerprint.equals(t.fingerprint);
    }
    /** æ•°æ®ç‰ˆæœ¬ï¼import_batch æœ€å¤§ id:任何一次导入都会让它变化,取不到返回 -1(此时禁用缓存) */
    private long importVersion() {
    /**
     * æ±‡æ€»å¤§è¡¨æ•°æ®æŒ‡çº¹ï¼ã€Œä¾èµ–的源表内容校验和」+「母版等文件身份」。
     * - æºè¡¨ï¼šåº“内除 FINGERPRINT_EXCLUDE(投资/能耗/审核/系统/导入日志)以外的全部表,用 CHECKSUM TABLE å–校验和,
     *   èƒ½æ•捉行数变化、新增删除、**原地 UPDATE**;
     * - æ–‡ä»¶ï¼šæ¯ç‰ˆç›®å½•下全部文件(母版 / å‚ç…§ä»¶ / _备份_ å›žå¡«ä»¶ï¼‰+《网约车订单及全省总量.xlsx》,取「名称+大小+修改时间」。
     * ä»»ä¸€é¡¹å˜åŒ–即指纹变化 â†’ ç¼“存失效。计算失败返回 null(此时禁用缓存,只重算不复用)。
     */
    private String dataFingerprint() {
        try {
            List<Object> v = importBatchMapper.selectObjs(new QueryWrapper<ImportBatch>().select("IFNULL(MAX(id),0)"));
            if (v == null || v.isEmpty() || v.get(0) == null) return 0L;
            return ((Number) v.get(0)).longValue();
            List<String> parts = new ArrayList<>();
            try (Connection conn = dataSource.getConnection()) {
                List<String> tables = new ArrayList<>();
                try (Statement st = conn.createStatement();
                     ResultSet rs = st.executeQuery("SELECT table_name FROM information_schema.tables "
                             + "WHERE table_schema = DATABASE() AND table_type = 'BASE TABLE' ORDER BY table_name")) {
                    while (rs.next()) tables.add(rs.getString(1));
                }
                for (String t : tables) {
                    if (FINGERPRINT_EXCLUDE.contains(t)) continue;
                    try (Statement st = conn.createStatement();
                         ResultSet rs = st.executeQuery("CHECKSUM TABLE `" + t + "`")) {
                        if (rs.next()) parts.add("T:" + t + ":" + rs.getString(2));
                    }
                }
            }
            for (File f : listIdentityFiles(resolveBaseDir(summaryTemplateDir))) {
                parts.add("F:" + f.getName() + ":" + f.length() + ":" + f.lastModified());
            }
            File wyc = new File(resolveBaseDir(cityPassengerTemplateDir), "网约车订单及全省总量.xlsx");
            if (wyc.isFile()) parts.add("F:" + wyc.getName() + ":" + wyc.length() + ":" + wyc.lastModified());
            return sha256Hex(String.join("|", parts)).substring(0, 16);
        } catch (Exception e) {
            log.warn("读取导入数据版本失败,本次禁用导出缓存:{}", e.getMessage());
            return -1L;
            log.warn("计算数据指纹失败,本次禁用导出缓存:{}", e.getMessage());
            return null;
        }
    }
    /** æ¯ç‰ˆç›®å½•等基础目录定位(与模板解析同策略:配置目录 / user.dir ç›¸å¯¹ / ä¸Šçº§ç›®å½•) */
    private File resolveBaseDir(String dir) {
        if (dir == null) return null;
        String rel = dir;
        while (rel.startsWith("./")) rel = rel.substring(2);
        String[] roots = {rel, System.getProperty("user.dir") + "/" + rel, System.getProperty("user.dir") + "/../" + rel};
        for (String root : roots) {
            if (root == null || root.trim().isEmpty()) continue;
            File f = new File(root);
            if (f.isDirectory()) return f;
        }
        return null;
    }
    /** ç›®å½•下的文件(按名字排序,排除子目录,保证指纹稳定) */
    private List<File> listIdentityFiles(File dir) {
        List<File> out = new ArrayList<>();
        if (dir == null) return out;
        File[] fs = dir.listFiles(File::isFile);
        if (fs == null) return out;
        Arrays.sort(fs, Comparator.comparing(File::getName));
        out.addAll(Arrays.asList(fs));
        return out;
    }
    private String sha256Hex(String text) throws Exception {
        MessageDigest md = MessageDigest.getInstance("SHA-256");
        byte[] d = md.digest(text.getBytes(StandardCharsets.UTF_8));
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 8; i++) sb.append(String.format("%02x", d[i])); // å–前 8 å­—节=16 ä½åå…­è¿›åˆ¶ï¼Œå¤Ÿç”¨ä¸”文件名短
        return sb.toString();
    }
    /** è¯¥æŠ¥è¡¨æœŸæ˜¯å¦å­˜åœ¨ã€Œä¸Žå½“前指纹不一致」的旧结果(用于提示「上次结果已失效,正在按最新数据重算」) */
    private boolean hasStaleCache(String type, String period, String mode, Integer toMonth, String fingerprint) {
        try {
            File dir = cacheDir();
            if (dir == null) return false;
            String prefix = cacheFilePrefix(type, period, mode, toMonth);
            File[] fs = dir.listFiles((d, n) -> n.startsWith(prefix + "_v") && n.endsWith(".xlsx"));
            if (fs == null || fs.length == 0) return false;
            String current = prefix + "_v" + fingerprint + ".xlsx";
            for (File f : fs) {
                if (!f.getName().equals(current)) return true;
            }
            return false;
        } catch (Exception e) {
            return false;
        }
    }
@@ -290,10 +396,10 @@
        try {
            File dir = cacheDir();
            if (dir == null) return;
            long version = t.importVersion;
            if (version < 0) return;
            String fingerprint = t.fingerprint;
            if (fingerprint == null) return;
            String prefix = cacheFilePrefix(t.type, t.period, t.mode, t.toMonth);
            File target = new File(dir, prefix + "_v" + version + ".xlsx");
            File target = new File(dir, prefix + "_v" + fingerprint + ".xlsx");
            java.nio.file.Files.write(target.toPath(), data);
            File[] siblings = dir.listFiles((d, n) -> n.startsWith(prefix + "_v") && n.endsWith(".xlsx"));
            if (siblings != null) {
@@ -308,18 +414,17 @@
        }
    }
    /** ä»Žè½ç›˜ç¼“存里找「同一报表期 + åŒä¸€æ•°æ®ç‰ˆæœ¬ + æœªè¶…期」的结果;没有返回 null */
    private Task loadFromDisk(String key, String type, String period, String mode, Integer toMonth) {
    /** ä»Žè½ç›˜ç¼“存里找「同一报表期 + åŒä¸€æ•°æ®æŒ‡çº¹ + æœªè¶…期」的结果;没有返回 null */
    private Task loadFromDisk(String key, String type, String period, String mode, Integer toMonth, String fingerprint) {
        try {
            if (fingerprint == null) return null; // ç®—不出指纹时不冒风险复用
            File dir = cacheDir();
            if (dir == null) return null;
            long version = importVersion();
            if (version < 0) return null; // å–不到数据版本时不冒风险复用
            File f = new File(dir, cacheFilePrefix(type, period, mode, toMonth) + "_v" + version + ".xlsx");
            File f = new File(dir, cacheFilePrefix(type, period, mode, toMonth) + "_v" + fingerprint + ".xlsx");
            if (!f.isFile()) return null;
            long finished = f.lastModified();
            if (finished <= 0 || System.currentTimeMillis() - finished > CACHE_MAX_AGE_MS) return null;
            Task t = new Task(type, period, mode, toMonth, version);
            Task t = new Task(type, period, mode, toMonth, fingerprint);
            t.cacheFile = f;
            t.createdAt = finished; // å¤ç”¨åŽ†å²ç»“æžœï¼šä»¥ç”Ÿæˆæ—¶é—´ä½œä¸ºèµ·ç‚¹ï¼Œé¿å… elapsedMs å‡ºçŽ°è´Ÿæ•°
            t.fileName = "生成_道路运输量汇总表_" + period + ".xlsx";
traffic-audit-web/src/views/ReportExport.vue
@@ -170,6 +170,7 @@
            <p class="task-step">{{ taskInfo.step || '排队中' }}</p>
            <p class="task-meta" v-if="taskInfo.period && !taskInfo.fromCache">报表期 {{ taskInfo.period }} 已用 {{ ((taskInfo.elapsedMs || 0) / 1000).toFixed(1) }} ç§’</p>
            <p class="task-meta" v-else-if="taskInfo.period">报表期 {{ taskInfo.period }} 上次生成于 {{ taskCacheTime }}</p>
            <p class="task-meta" v-if="taskInfo.staleCache">上次生成的结果已因数据或母版变化失效,本次按最新数据重算。</p>
            <p class="task-meta" v-if="taskInfo.fromCache">本次直接沿用 {{ taskCacheTime }} ç”Ÿæˆçš„结果(期间没有新的数据导入)。如需按最新数据重算,请点「重新生成」。</p>
            <p class="task-done" v-if="taskDownloaded">
              å·²è‡ªåŠ¨ä¸‹è½½ï¼š<b>{{ taskFileName }}</b><span v-if="taskFileSize">({{ taskFileSizeText }})</span>,文件在浏览器默认下载目录。