ceaa5f2895b71b9dedfe543ae3a0927f912556ab..8b739ce9e80fce73da0f36408aaeec85318b806b
9 天以前 zhizhijie
docs(交接): 统一 09-22 关机快照(合并同事版本,修正运行状态为实测:8090/8080 在运行)
8b739c 对比 | 目录
9 天以前 zhizhijie
Merge remote-tracking branch 'origin/main'
23f2d2 对比 | 目录
9 天以前 zhizhijie
docs(交接): 09-22 关机交接快照(投资比对与取数修复交付、运行状态、接手优先项)
48350f 对比 | 目录
9 天以前 xyc
docs: 记录 09-22 关机交接快照
5726d8 对比 | 目录
9 天以前 zhizhijie
merge: 合并远端 13c2d36(汇总大表差异复核)+ 日结七/八节并存
db0ee9 对比 | 目录
9 天以前 zhizhijie
fix(投资): 明细表取数三处静默缺陷 + 导入两处丢数/选错页签缺陷
595b31 对比 | 目录
9 天以前 xyc
Merge remote-tracking branch 'origin/main'
71a77e 对比 | 目录
9 天以前 xyc
docs: 汇总大表软件输出与手工定稿差异复核(930格)
13c2d3 对比 | 目录
9 天以前 zhizhijie
docs(投资): 投资明细表软件生成与人工版逐格比对(156格) + 根因定位(模板按名匹配/重名双档/导入丢数)+ 日结与 HANDOFF 更新
001da6 对比 | 目录
9 天以前 zhizhijie
docs(交接): 会话收尾——HANDOFF 补本会话进展与剩余待办核查、日结补第 11 节、gitignore 忽略 _tmp_codexhome/
73571f 对比 | 目录
9 天以前 zhizhijie
docs(交接): 同步同事进展并修正仓库约定(P1-1 闭环标注提交号、单仓库、索引补差异报告)
06b1cb 对比 | 目录
9 天以前 zhizhijie
Merge remote-tracking branch 'origin/main'
eaad84 对比 | 目录
9 天以前 zhizhijie
feat(报表生成): 导出缓存守卫改用数据指纹(无关导入不再失效 / 换母版必定失效)+ 失效提示
797d76 对比 | 目录
9 天以前 xyc
docs: 记录 09-22 远端同步与 Codex 卡顿复核
a5a954 对比 | 目录
9 天以前 zhizhijie
feat(数据查看/汇总): 全省合计行置顶(武汉市之上),导出 Excel 合计行加粗 + 文档更新
a08817 对比 | 目录
9 天以前 zhizhijie
feat(报表生成): 汇总大表导出结果落盘缓存,无新导入即秒回复用
2b39c4 对比 | 目录
9 天以前 zhizhijie
docs: 数据查看按市州汇总与导出功能测试报告 + 日结
759403 对比 | 目录
9 天以前 zhizhijie
feat(数据查看): 按市州汇总(任意起止月/自动上年同期/时点列不参与/排名可选) + 导出 Excel,新增 CityRollupService...
e9f1ee 对比 | 目录
9 天以前 zhizhijie
docs: 数据查看口径筛选与表头单位功能测试报告 + 日结补充
336695 对比 | 目录
9 天以前 zhizhijie
feat(数据查看): 拆分表空列不显示、口径上移为筛选(接口加 periodType)、12 类表表头补齐单位
30c490 对比 | 目录
9 天以前 zhizhijie
docs: 数据查看展示优化与网约车竖排功能测试报告 + 日结补充
15c803 对比 | 目录
9 天以前 zhizhijie
feat(数据查看): 隐藏报表期/所属地区+冻结收窄为市州与企业名称、网约车按市州竖排、市州月报显示项目名称、列名补单位、数值千分位与同比按百分比显示
4e8766 对比 | 目录
9 天以前 zhizhijie
fix(报表生成): 已自动下载后不再显示下载按钮(按用户反馈调整)
654556 对比 | 目录
9 天以前 zhizhijie
docs: 数据查看冻结列与数据类型下拉框功能测试报告 + 日结补充
4792a6 对比 | 目录
9 天以前 zhizhijie
feat(数据查看): 数据类型改分组单下拉框(支持搜索)+ 接入左侧冻结标识列(含此前未提交的冻结列实现)
7a26ed 对比 | 目录
9 天以前 zhizhijie
fix(报表生成): 汇总大表进度弹窗优化(自动化下载提示 + 再次下载走本地缓存)
4eee57 对比 | 目录
9 天以前 zhizhijie
feat(数据查看): 补齐网约车总数/网约车订单/个体客运三类查看(含市州派生)+ 测试报告与日结
2d74b9 对比 | 目录
10个文件已修改
14个文件已添加
4135 ■■■■■ 已修改文件
.gitignore 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HANDOFF.md 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/交接文档_2026-09-21.md 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/功能测试报告/功能测试报告_导出缓存改用数据指纹_2026-09-22.md 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/功能测试报告/功能测试报告_投资明细表取数修复_2026-09-22.md 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/功能测试报告/功能测试报告_数据查看冻结列与数据类型下拉框_2026-09-22.md 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/功能测试报告/功能测试报告_数据查看口径筛选与表头单位_2026-09-22.md 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/功能测试报告/功能测试报告_数据查看展示优化与网约车按市州竖排_2026-09-22.md 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/功能测试报告/功能测试报告_数据查看按市州汇总与导出_2026-09-22.md 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/功能测试报告/功能测试报告_数据查看补齐网约车与个体客运类型_2026-09-22.md 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/功能测试报告/功能测试报告_汇总大表导出结果落盘缓存复用_2026-09-22.md 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/功能测试报告/功能测试报告_汇总大表进度弹窗优化_2026-09-22.md 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/功能测试报告/数据比对报告_投资明细表软件生成与人工版_2026-09-22.md 342 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/工作日结/工作日结_2026-09-22.md 200 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/问题汇总/汇总大表_差异明细_2026-08_20260922.csv 931 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/问题汇总/汇总大表_软件输出与手工定稿差异清单_2026-08_20260922.md 206 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
traffic-audit-server/src/main/java/com/trafficaudit/dataimport/controller/DataViewController.java 443 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
traffic-audit-server/src/main/java/com/trafficaudit/dataimport/service/CityRollupService.java 636 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
traffic-audit-server/src/main/java/com/trafficaudit/dataimport/service/DataImportService.java 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
traffic-audit-server/src/main/java/com/trafficaudit/reportexport/controller/ReportExportController.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportTaskService.java 286 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
traffic-audit-web/src/views/DataView.vue 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
traffic-audit-web/src/views/ReportExport.vue 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.gitignore
@@ -97,5 +97,9 @@
_*.zip
_bak_*
# æ±‡æ€»å¤§è¡¨å¯¼å‡ºç»“果落盘缓存(复用上一次生成结果用,不入库)
docs/生成汇总大表/_cache/
_tmp_codexhome/
# Codex åº”用在本仓库根目录产生的产物目录(保留在本地,不入库)
outputs/
HANDOFF.md
@@ -4,6 +4,58 @@
> **每天结束时**:把当天进展、踩过的坑、新需求、未完成事项更新到本文件,然后可以放心开新对话。
> **协作约定(2026-08-31)**:说「提交」= æœ¬åœ° commit + æŽ¨é€åˆ°è¿œç«¯ git(origin main,Gitblit),不再只做本地 commit。
## æœ€æ–°ï¼ˆ2026-09-22)
- **已同步**:本地 `main` å·²åˆå¹¶å…¬å¸ `origin/main` æœ€æ–° `db0ee92`(含投资明细取数/导入修复);合并后 `mvn -q -DskipTests compile` é€šè¿‡ã€‚
- **Codex è¾“入卡顿复核(已完成)**:电脑与 Codex äºŽ 09-22 12:54 é‡å¯åŽï¼Œ`Codex++` ä¿®å¤è„šæœ¬ä»å¯ç”¨ï¼›ä¸»æ¸²æŸ“è¿›ç¨‹ç©ºé—² CPU çº¦ 13.3%(单核),调试守卫 `installed=true`、本次会话 `dropped=16`。对比修复前约 115%,卡顿问题已解决。
- **今日已完成(远端提交)**:数据查看补齐网约车/个体客运、按市州汇总与导出 Excel、汇总大表进度弹窗与结果落盘缓存。
- **汇总大表差异复核(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 ä¸‹åˆï¼ŒæŠ•资取数修复第一轮)
- **已修(代码 + é‡å¯¼ + å›žå½’)**:① å¯¼å‡ºåŽ»æ ‡ç‚¹å½’ä¸€åŒ–åŒ¹é…ï¼ˆè†å·žï¼‰ï¼›â‘¡ åŒååŒæ¡£ä¼˜å…ˆå–当月有数据的档(十堰快递产业园二期);③ æœªè¦†ç›–行逐行 WARN ç•™ç—•;④ å¯¼å…¥è¡¨å¤´åŽ»æ¢è¡Œï¼ˆå¤©é—¨ H/J/K ä¸å†ä¸¢ï¼‰ï¼›â‘¤ å¯¼å…¥æŒ‰è¡¨å†…报表期选 sheet(**潜江不再把 2018 å¹´æ•°æ®å½“ 2026-08**)。
- **结果**:2026-08 ç‰©æµ/客运明细逐格差异 **156 â†’ 129**,无新增差异;未覆盖清单已能自动列出(物流武汉 6 è¡Œï¼›å®¢è¿é»„石1/黄冈9/恩施1/仙桃1)。
- **遗留(下一轮)**:L/D/E/F è¦†ç›–口径(需《建设阶段归一表》)、武汉物流与黄冈客运 8 æœˆæºæ•°æ®ã€æ½œæ±Ÿ 2026-06/07 åŽ†å²é”™å€¼é‡å¯¼ã€æœªè¦†ç›–æ¸…å•å‡ºæ–‡ä»¶/页面提示(P1-9)。
- **报告**:`docs/功能测试报告/功能测试报告_投资明细表取数修复_2026-09-22.md`。
### è¡¥å……(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-22 æ™šï¼‰
- **今日交付(两项,均已推送)**:
  1. ã€ŠæŠ•资明细表 è½¯ä»¶ç”Ÿæˆ vs äººå·¥ç‰ˆã€‹é€æ ¼æ¯”对(156 æ ¼å·®å¼‚)+ æ ¹å› å®šä½ â€”— `docs/功能测试报告/数据比对报告_投资明细表软件生成与人工版_2026-09-22.md`;
  2. ç¬¬ä¸€è½®å–数修复(导出 3 å¤„ + å¯¼å…¥ 2 å¤„,含新发现的"潜江导入 2018 å¹´åŽ†å² sheet")—— `docs/功能测试报告/功能测试报告_投资明细表取数修复_2026-09-22.md`;回归后逐格差异 **156 â†’ 129**,无新增差异。
- **git**:`main` = `db0ee92`,已同步公司 `origin/main`(已合并同事 `13c2d36` æ±‡æ€»å¤§è¡¨å·®å¼‚复核)。工作区干净;仅本地未跟踪的临时产物(`_tmp_diff_tables_0922.md`、`_tmp/gen_new_0922/`、`_tmp_*_0922.*`)和用户自己的 `docs/确认.docx` æœªå…¥åº“。
- **运行状态(17:2x å®žæµ‹ï¼‰**:dev åŽç«¯ `8090`、前端 `8080` **均在运行**(HTTP 200;后端为本次修复后的构建,16:43 ç» `start-dev.ps1` é‡å¯ï¼‰ï¼›å…³æœºåŽè‡ªç„¶åœæ­¢ã€ä¸éœ€æ‰‹å·¥å¤„理。数据库 `3308`(本项目)与 `3305/3306` æŒ‰æƒ¯ä¾‹ä¿ç•™ï¼Œæ•°æ®å·²æŒä¹…化。
- **下次启动**:项目根目录 `powershell -NoProfile -ExecutionPolicy Bypass -File start-dev.ps1`(脚本会跳过已在跑的端口;前后端需在沙箱外运行)。
- **保留产物(未经确认不删)**:汇总大表 930 æ¡å·®å¼‚报告/CSV、投资比对与修复报告、`_tmp*_0922.*`、`_tmp/gen_new_0922/`。
- **本轮数据变更**:仅重导修正 `investment_monthly` å¤©é—¨ã€æ½œæ±Ÿ 2026-08 ä¸¤å¤„数值,未删除任何项目主档、未动其他市州/期间。
- **接手优先(明日)**:
  1. L/D/E/F åˆ—覆盖口径(需先确认《建设阶段归一表》:源表 ä¸»ä½“施工/竣工收尾/未开工/本年正式施工/暂停施工/前期 â†’ è¾“出用词);
  2. è¡¥æºæ•°æ®ï¼šæ­¦æ±‰ç‰©æµ 8 æœˆæ— å•表、黄冈客运 8 æœˆæ— æºæ–‡ä»¶ï¼ˆå¯¼å‡ºå·²èƒ½è‡ªåŠ¨å‘Šè­¦ï¼Œå…± 15 è¡Œå—影响);
  3. æ½œæ±Ÿ 2026-06 / 2026-07 æœˆåº¦ä»æ˜¯ 2018 åŽ†å² sheet é”™å€¼ï¼Œ**用 6/7 æœˆæºè¡¨**重导(不要用 8 æœˆæ–‡ä»¶é‡å¯¼ï¼‰ï¼›
  4. ã€Œæœªè¦†ç›–行清单」目前只进 `backend.log`,按 P1-9 å¯å†åšæˆã€Šæ ¡éªŒæŠ¥é”™_<年月>.xlsx》或页面提示;
  5. æ—¢æœ‰ P0/P1 ä¸å˜ï¼ˆäº¿å…ƒè¡¨æŒ‰ Q7 è¿½åˆ—、导出前基数体检、2026-09 æ¯ç‰ˆç­‰ï¼Œè§ `docs/交接文档_2026-09-21.md` ç¬¬ 4 ç« ï¼‰ã€‚
## æœ€æ–°ï¼ˆ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 | å¯¼å‡ºç¼“存是**内存态** | è¿›ç¨‹é‡å¯å³å¤±æ•ˆï¼›å¦‚需跨重启/多人共用的「导出记录」页需另做 | âŒ |
| 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,91 @@
# åŠŸèƒ½æµ‹è¯•æŠ¥å‘Š â€” æŠ•资明细表取数修复(软件生成 vs äººå·¥ç‰ˆ å·®å¼‚收敛)
> æµ‹è¯•日期:2026-09-22
> è¢«æµ‹å¯¹è±¡ï¼šæŠ¥è¡¨ç”Ÿæˆ â†’ æŠ•资《客运站投资明细表》《物流站场投资明细》导出 + æŠ•资月报(市州单表)导入
> èƒŒæ™¯ï¼šã€Šæ•°æ®æ¯”对报告_投资明细表软件生成与人工版_2026-09-22.md》定位出 156 æ ¼å·®å¼‚与 3 ç±»"会静默出数"的取数缺陷,本报告为第一轮修复与回归验证。
## ä¸€ã€åŠŸèƒ½è¯´æ˜Žï¼ˆæœ¬æ¬¡æ”¹äº†ä»€ä¹ˆï¼‰
### 1. å¯¼å‡ºï¼š`traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java`
| # | æ”¹åЍ | è¯´æ˜Ž |
| --- | --- | --- |
| 1-1 | `normInvestName()` å½’一化补标点 | å¢žåŠ åŠ/全角句点、顿号、逗号、分号、冒号等(原只去 `·•—-_-`)。库内项目名「中国供销**.**公安商贸物流园」与明细表行名「中国供销公安商贸物流园(公安县域集采集配中心)」归一化后前缀一致 â†’ å¯åŒ¹é… |
| 1-2 | æ–°å¢ž `preferMonthlyCandidate()` | åŒ¹é…åˆ°çš„æ¡£åœ¨**当月无数据**时,改选「归一化同名且当月有数据」的档(取 id æœ€å¤§è€…)。修复十堰「快递物流产业园二期」取到旧档 id=154(月度只到 7 æœˆï¼‰çš„问题 |
| 1-3 | æ–°å¢ž `logSkippedRows()` + å®¢è¿/物流导出留痕 | æœªæŒ‰å½“月数据覆盖的行**逐行 WARN**:`[未覆盖] ç¬¬N行 å¸‚å·ž é¡¹ç›®å â†’ åŽŸå› `,并给出按市州统计。彻底消除"静默结转上期值" |
### 2. å¯¼å…¥ï¼š`traffic-audit-server/src/main/java/com/trafficaudit/dataimport/service/DataImportService.java`
| # | æ”¹åЍ | è¯´æ˜Ž |
| --- | --- | --- |
| 2-1 | `investHeaderKey()` å…ˆåŽ»ç©ºç™½å†åˆ¤å®š | è¡¨å¤´å•元格常含换行/全角空格(天门「自开始建\n设累计完\n成投资\n(万元)」),原逻辑 `v.contains("自开始建设")` åŒ¹é…ä¸ä¸Š â†’ H/J/K ä¸‰åˆ—映射落到 -1 è¢«å†™æˆ 0。改为 `replaceAll("[\\s\\u3000]+","")` åŽå†åˆ¤å®š |
| 2-2 | æ–°å¢ž `investSheetPeriodCellHit()` + è¯„分加权 | å¤š sheet åŽ†å²æ–‡ä»¶æŒ‰ sheet ååŒ¹é…æœˆä»½ä¼šæŠŠ 2018 å¹´çš„「潜江(8月)」当成 2026-08。新增"表内报表期"命中(sheet å‰ 8 è¡Œçš„ `2026.08.24` / `2026å¹´8月` / æ—¥æœŸå•元格),权重 2000000 é«˜äºŽ sheet ååŒ¹é…ï¼ˆ1000000) |
## äºŒã€æµ‹è¯•环境
- åŽç«¯ï¼š`mvn spring-boot:run`(8090),重启后日志出现 `Started TrafficAuditApplication`;前端 8080 åœ¨è¿è¡Œ
- æ•°æ®åº“:`localhost:3308/traffic_audit`(本机开发库);登录 `admin/123456` å– JWT
- äººå·¥ç‰ˆåŸºå‡†ï¼š`D:\05_数据分类\投资\8月\8月客运站投资明细表.xlsx`、`8月物流站场投资明细.xls`
- ä¿®å¤å‰è½¯ä»¶ç‰ˆï¼š`D:\桌面\生成数据\生成_所选报表_2026-08 (1)\…`
- ä¿®å¤åŽè½¯ä»¶ç‰ˆï¼š`_tmp/gen_new_0922/…`(本次重跑导出)
- æ¯”对脚本:`_tmp_diff_invest_0922.py`(修复前)、`_tmp_diff_after_fix_0922.py`(修复后)
## ä¸‰ã€æµ‹è¯•用例与结果
| # | ç”¨ä¾‹ | è¾“å…¥ | é¢„期 | å®žé™… | ç»“论 |
| --- | --- | --- | --- | --- | --- |
| 1 | å¯¼å‡º-项目名带标点 | 2026-08 ç‰©æµæ˜Žç»†å¯¼å‡º | ç¬¬119/120行「中国供销公安商贸物流园」按库内当月写入 | ä¿®å¤å‰ï¼šæœªè¦†ç›–,保留底稿 7758.5/7758.5/1600.1;修复后:写入 **15986/15986/8227.5** ä¸Žæºè¡¨ä¸€è‡´ï¼›æ—¥å¿—不再列该行 | âœ… |
| 2 | å¯¼å‡º-同名双档 | åŒä¸Š | å–「当月有数据」的档(id=181) | ä¿®å¤å‰ï¼š20081/2900/214、竣工 2026;修复后:**20377/3196/296、竣工 2029**(= åå °æºè¡¨ R71) | âœ… |
| 3 | å¯¼å‡º-未覆盖留痕(物流) | åŒä¸Š | æœªè¦†ç›–行列出行号+市州+项目名+原因 | æ—¥å¿—:`物流站场投资明细 2026-08:写入 93 è¡Œï¼Œç»“转母版原值 6 è¡Œ` + 6 æ¡ `[未覆盖] ç¬¬12行 æ­¦æ±‰å¸‚ èˆªå‘智慧物流园 â†’ åº“内无 2026-08 æœˆåº¦æ•°æ®`(按市州统计 `{武汉市=6}`) | âœ… |
| 4 | å¯¼å‡º-未覆盖留痕(客运) | åŒä¸Š | åŒä¸Š | `写入 37 è¡Œï¼Œç»“转母版原值 12 è¡Œï¼ˆå…¶ä¸­åº“内有项目但当月无数据 9 è¡Œï¼‰` + 12 æ¡æ˜Žç»†ï¼ˆé»„石 1 / é»„冈 9 / æ©æ–½ 1 / ä»™æ¡ƒ 1) | âœ… |
| 5 | å¯¼å…¥-表头含换行(天门) | `8月份物流园中心建设项目(天门).xlsx`,period=2026-08,type=investmentLogistics | å…¥åº“ 16677.7 / 16677.7 / 500 | ä¿®å¤å‰åº“内 0/0/0;修复后 `investment_monthly` = **16677.7 / 16677.7 / 500**,接口返回 success=1 | âœ… |
| 6 | å¯¼å…¥-历史页签(潜江) | `潜江2026.08.xlsx`(含 20 ä¸ªåŽ†å² sheet) | é€‰å½“期 sheet(表内报表期 2026.08.24) | ä¿®å¤å‰ï¼šå…¥åº“ **2018 å¹´**「潜江市公路项目」5173/5173/1440(错);修复后:入库「**中国虾谷冷链仓储物流园**」11947.9/1135/0(= æºè¡¨å½“期 sheet),旧错行被同市州同期间清理 | âœ… |
| 7 | å›žå½’-逐格比对 | ä¿®å¤åŽå¯¼å‡º vs äººå·¥ç‰ˆ | å·®å¼‚数下降且无新增差异 | 156 æ ¼ â†’ **129 æ ¼**(降 27),剩余差异与修复前逐条对应,无新增 | âœ… |
| 8 | è´Ÿå‘-未匹配行不写错值 | æ­¦æ±‰ 6 è¡Œï¼ˆåº“内无 2026-08 æ•°æ®ï¼‰ | ä¿æŒåº•稿原值且必须有日志告警 | 6 è¡Œä¿æŒåŽŸå€¼ï¼Œæ—¥å¿—é€è¡Œå‘Šè­¦ï¼ˆä¸é™é»˜ï¼‰ | âœ… |
### ä¿®å¤å‰åŽé€é¡µç­¾å¯¹ç…§
| æ–‡ä»¶ / é¡µç­¾ | ä¿®å¤å‰ | ä¿®å¤åŽ | è¯´æ˜Ž |
| --- | --- | --- | --- |
| å®¢è¿-明细 | 12 | 12 | æœ¬æ¬¡æœªåŠ¨å®¢è¿åŒ¹é…é€»è¾‘ï¼ˆå·®å¼‚å±žå–æ•´/文本口径) |
| å®¢è¿-汇总 | 4 | 4 | åŒä¸Š |
| ç‰©æµ-月2 | 0 | 0 | â€” |
| ç‰©æµ-分项目投资完成情况 | 108 | **91** | è†å·ž âˆ’10、十堰 âˆ’5、天门 âˆ’2 |
| ç‰©æµ-分市州规划内外项目完成情况 | 15 | **11** | è†å·žã€å¤©é—¨éšæ˜Žç»†é¡µå½’位 |
| ç‰©æµ-市州汇总 | 17 | **11** | åŒä¸Š |
| **合计** | **156** | **129** | æ”¶æ•› 27 æ ¼ |
## å››ã€å‰©ä½™å·®å¼‚(129 æ ¼ï¼‰åˆ†ç±»ä¸Žè´£ä»»
| ç±»åˆ« | æ ¼æ•° | åŽŸå›  | è´£ä»»æ–¹ / ä¸‹ä¸€æ­¥ |
| --- | --- | --- | --- |
| æ­¦æ±‰æ•´æ®µï¼ˆæ˜Žç»† 24 + åˆè®¡ 3) | 27 | åº“内**无武汉物流当月数据**(8 æœˆæ­¦æ±‰æ— å•表),导出只能结转底稿 7 æœˆå€¼ | ä¸šåŠ¡è¡¥æ­¦æ±‰å•è¡¨ï¼›æˆ–æ˜Žç¡®"武汉由人工填"(现已有告警) |
| åå °æž¢çº½ 2 ä¸‡å…ƒå·®å¼‚ | 3 | äººå·¥ç‰ˆç”¨æ—§å€¼ 11047/589/0,源表与库内是 11049/591/2 | **软件对**,人工版需更新(已列入差异清单) |
| L åˆ—(建设阶段)未覆盖 | 3 | å¯¼å‡ºæŒ‰ 2026-09-18 å£å¾„不写 L,沿用底稿 | éœ€ã€Šå»ºè®¾é˜¶æ®µå½’一表》后放开(见第五节) |
| D åˆ—(建设性质)未覆盖 | 3 | åŒä¸Šï¼ˆI/L/G/D/E/F ä¸å†™ï¼‰ | åŒä¸Š |
| å·¥æœŸ E/F å†™æ³•(日期 vs å¹´ä»½ï¼‰ | 4 | äººå·¥ç‰ˆæ˜¯æ—¥æœŸåºåˆ—号,软件写年份/文本 | æ ¼å¼å£å¾„,建议以源表原样为准 |
| åˆ†ç»„小计行(6 ä¸ªå¸‚州) | 25 | è½¯ä»¶æŒ‰æ¸ é“求和不填=市州合计,人工版留空 | å£å¾„差异,建议人工版补齐(软件规则与武汉 R11/R16 å®Œå…¨ä¸€è‡´ï¼‰ |
| 0 ä¸Žç©ºç™½ | 11 | å†™æ³•不同 | ç»Ÿä¸€è§„则:源表空→空、源表 0→0 |
| å®¢è¿å–æ•´ + æ–‡æœ¬ | 16 | äººå·¥ç‰ˆæ‰‹å†™å–整(203/2531/43225.9);M26/M85 äººå·¥ç‰ˆç©ºã€L91 åº•稿旧值 | äººå·¥ç‰ˆå¯¹é½ï¼›L91 éœ€å½’一表 |
| æœªè¦†ç›–行(数据缺口清单) | 18 è¡Œ | ç‰©æµï¼šæ­¦æ±‰ 6;客运:黄石 1、黄冈 9、恩施 1、仙桃 1 | è¡¥æºæ–‡ä»¶/项目主档后重导(日志已逐行列出) |
## äº”、遗留问题与处置
1. **【新发现,已修+重导】潜江导入选错历史页签**:2026-08 æ›¾å¯¼å…¥ 2018 å¹´ã€Œæ½œæ±Ÿå¸‚公路项目」的数据;已修复选页签逻辑并重导 2026-08。
   - **仍遗留**:潜江 **2026-06 / 2026-07** ä¸¤ä¸ªæœˆçš„æœˆåº¦æ•°æ®ä»æ˜¯åŽ†å² sheet é”™å€¼ï¼Œéœ€ç”¨ 6/7 æœˆæºè¡¨é‡å¯¼ï¼ˆä¸è¦ç”¨ 8 æœˆæ–‡ä»¶é‡å¯¼ï¼Œä¼šæŠŠ 8 æœˆæ•°å†™æˆ 7 æœˆï¼‰ã€‚
2. **【需口径拍板】"全量覆盖"未实施**:现行口径(2026-09-18 ç¡®è®¤ï¼‰æ˜¯åªå†™ H/J/K/M,I/L/G ä¸åŠ¨ã€‚è‹¥è¦ä¸Žäººå·¥ç‰ˆå®Œå…¨ä¸€è‡´ï¼Œéœ€ç¡®è®¤ L/D/E/F/I æ˜¯å¦ä¹ŸæŒ‰å½“月写,且 L éœ€è¦ã€Šæºè¡¨ç”¨è¯â†’输出用词》归一表(源表有 ä¸»ä½“施工/竣工收尾/未开工/本年正式施工/暂停施工/前期 ç­‰ï¼Œäººå·¥ç‰ˆå†™ åœ¨å»º/完工/前期/暂停施工)。
3. **【数据缺口】黄冈客运 8 æœˆæ— æºæ–‡ä»¶**(9 è¡Œï¼‰ã€é»„石/恩施/仙桃 3 è¡Œåº“内无对应项目主档、武汉物流无单表 â€”— å¯¼å‡ºå·²èƒ½è‡ªåŠ¨å‘Šè­¦ï¼Œä½†æ•°æ®æœ¬èº«éœ€è¦ä¸šåŠ¡æä¾›ã€‚
4. **【对比工具化】** ç›®å‰"未覆盖行"只进后端日志;建议按 P1-9 çº¦å®šï¼Œåœ¨å¯¼å‡ºç»“果旁生成《校验报错_<年月>.xlsx》或前端弹窗提示(用户要求"失败要显示行号",本次已做到日志留痕,页面提示待做)。
## å…­ã€ç»“论
- æœ¬æ¬¡ä¿®å¤åŽï¼Œ**逐格差异由 156 æ ¼é™è‡³ 129 æ ¼**;三处"会影响数字"的取数缺陷(荆州项目名匹配失败、十堰同名双档取旧值、天门导入丢 H/J/K)全部闭环并逐条回溯源文件验证。
- åŒæ—¶ç«¯åˆ°ç«¯æš´éœ²å¹¶ä¿®å¤äº†ä¸€ä¸ªæ›´ä¸¥é‡çš„问题:**潜江导入选到 2018 å¹´åŽ†å²é¡µç­¾**(属"把旧年份数据当当期数据入库");未覆盖行现已在日志中逐行列出(行号+市州+项目名+原因),不再静默。
- å‰©ä½™ 129 æ ¼å·®å¼‚中,**只有武汉 27 æ ¼å±ž"缺数据"、L/D åˆ— 6 æ ¼å±ž"待放开口径"**,其余为填表习惯(分组行/0 ä¸Žç©ºç™½/取整)与人工版自身旧值,均已在《数据比对报告》中逐条标注"以谁为准"。
- å»ºè®®ä¸‹ä¸€æ­¥ï¼šâ‘  ä¸šåŠ¡ç¡®è®¤ L/D/E/F è¦†ç›–口径并出《建设阶段归一表》;② è¡¥æ­¦æ±‰ç‰©æµã€é»„冈客运源数据;③ æŒ‰ P1-9 æŠŠæœªè¦†ç›–清单输出成校验文件/页面提示。
## ä¸ƒã€æœ¬æ¬¡æ•°æ®å˜æ›´è¯´æ˜Žï¼ˆæœªåˆ é™¤ä»»ä½•项目主档)
| è¡¨ | å˜æ›´ | ä¿®å¤å‰ | ä¿®å¤åŽ |
| --- | --- | --- | --- |
| `investment_monthly`(天门市物流中心建设项目 2026-08) | é‡å¯¼ä¿®æ­£ | start_cum/year_cum/month_done = 0/0/0 | **16677.7 / 16677.7 / 500** |
| `investment_monthly`(潜江市 2026-08) | é‡å¯¼ä¿®æ­£ï¼ˆæ—§é”™è¡Œåˆ é™¤ã€æ–°è¡Œå†™å…¥ï¼‰ | æ½œæ±Ÿå¸‚公路项目 5173/5173/1440 | **中国虾谷冷链仓储物流园 11947.9/1135/0** |
- æœªåˆ é™¤ä»»ä½• `investment_project` é¡¹ç›®ä¸»æ¡£ï¼›æœªæ”¹åŠ¨å…¶ä»–å¸‚å·žã€å…¶ä»–æœŸé—´æ•°æ®ã€‚
- å¤çŽ°å‘½ä»¤ï¼š`POST /api/import/batch?type=investmentLogistics&period=2026-08`(multipart,字段名 `files`)+ `GET /api/report/export/investLogisticsDetail?period=2026-08`;均需 `Authorization: Bearer <JWT>`。
docs/¹¦ÄܲâÊÔ±¨¸æ/¹¦ÄܲâÊÔ±¨¸æ_Êý¾Ý²é¿´¶³½áÁÐÓëÊý¾ÝÀàÐÍÏÂÀ­¿ò_2026-09-22.md
New file
@@ -0,0 +1,64 @@
# åŠŸèƒ½æµ‹è¯•æŠ¥å‘Šï¼šæ•°æ®æŸ¥çœ‹å†»ç»“åˆ—ä¸Žæ•°æ®ç±»åž‹ä¸‹æ‹‰æ¡†ï¼ˆ2026-09-22)
> æ—¥æœŸï¼š2026-09-22 模块:数据查看(前端 DataView.vue) 测试人:Codex
> è¯‰æ±‚来源:①横向滚动时企业名称看不到;②数据类型改成一个下拉框更简洁;③跨期汇总的时点列处理口径。
## ä¸€ã€åŠŸèƒ½è¯´æ˜Ž
1. **左侧冻结标识列**:`renderColumns` è®¡ç®—属性按表自适应冻结"这是谁的数据"所需的连续前导列,横向滚动时不会跑出视野。
   - å†»ç»“集合:`reportPeriod` / `regionCode` / `city` / `regionName` / `periodType` / `enterpriseName` / `projectName` / `plateNo`;
   - æ¨¡æ¿ç”± `visibleColumns` æ”¹ä¸º `renderColumns`,并传 `:fixed="c.fixed ? 'left' : false"`。
2. **数据类型分组下拉框**:去掉"模块单选按钮 + å•类型下拉"的两级结构,合并为一个 `el-select`(`el-option-group` æŒ‰æ¨¡å—分组,`filterable` æ”¯æŒè¾“入搜索),选中类型时同步 `activeModule`。
3. **跨期汇总口径确认**(按用户决定):汇总视图**不放时点列**(运营车辆数、营运车辆数、企业数),只放流量列与按累计口径重算的比率列。
## äºŒã€æµ‹è¯•环境
- åŽç«¯ï¼š`start-dev.ps1` å¯åŠ¨ï¼Œ8090,日志 `Started TrafficAuditApplication` / `Tomcat started on port(s): 8090`
- å‰ç«¯ï¼šåŒä¸€è„šæœ¬å¯åŠ¨ï¼Œ8080,`Compiled successfully`
- æ•°æ®åº“:本机 MySQL `localhost:3308/traffic_audit`;登录 `admin/123456`
- æµè§ˆå™¨ï¼šCodex å†…置浏览器真机操作(DOM + æ— éšœç¢æ ‘校验,非仅代码审查)
## ä¸‰ã€ç”¨ä¾‹è¡¨
### 3.1 æ­£å‘用例
| ç¼–号 | è¾“å…¥ | é¢„期 | å®žé™… | ç»“论 |
| --- | --- | --- | --- | --- |
| TC-1 | å±•å¼€"数据类型"下拉 | å•下拉、按模块分组 | 5 ç»„ 18 é¡¹ï¼šé“路货运 5 / å…¬è·¯æ—…客 3 / åŸŽå¸‚客运 5 / æŠ•资 3 / èƒ½è€— 2;无单选按钮残留 | é€šè¿‡ |
| TC-2 | åˆ‡åˆ°"个体客运量/周转量" | ç«‹å³æŸ¥è¯¢å¹¶å‡ºæ•° | å…± 139 æ¡ï¼Œå†»ç»“列=报表期/所属地区/市州/企业名称 | é€šè¿‡ |
| TC-3 | åˆ‡åˆ°"货运量周转量"(宽表) | å‡ºæ•°ã€å†»ç»“标识列 | å…± 234 æ¡ï¼Œæ­£æ–‡ 48 åˆ—,冻结列=报表期/市州 | é€šè¿‡ |
| TC-4 | åˆ‡åˆ°"网约车总数" | å‡ºæ•° | å…± 20 æ¡ï¼Œå†»ç»“列=报表期(该表无名称类字段) | é€šè¿‡ |
| TC-5 | åˆ‡åˆ°"城市公共交通月度运营情况" | å‡ºæ•°ã€å†»ç»“企业名称 | å…± 2860 æ¡ï¼Œå†»ç»“列=报表期/所属地区/市州/企业名称 | é€šè¿‡ |
| TC-6 | åˆ‡åˆ°"巡游出租汽车运营服务情况月报" | å‡ºæ•° | å…± 340 æ¡ï¼Œå†»ç»“列=报表期/所属地区/市州 | é€šè¿‡ |
| TC-7 | åˆ‡åˆ°"网约车订单及全省总量" | å‡ºæ•°ã€å®½è¡¨ | å…± 20 æ¡ï¼Œæ­£æ–‡ 22 åˆ—(订单合计 + 17 å¸‚州),冻结列=报表期 | é€šè¿‡ |
| TC-8 | è´§è¿è¡Œï¼ˆh2032)横向滚动 | å†»ç»“组常驻 | `el-table__fixed` è¡¨å¤´=报表期/所属地区/企业名称,且冻结表内有数据行(如 2025-04 / 429021 / ç¥žå†œæž¶å¤§è¿ç‰©æµæœ‰é™å…¬å¸ï¼‰ | é€šè¿‡ |
| TC-9 | é¡µé¢åˆæ¬¡è¿›å…¥ | é»˜è®¤ç±»åž‹å¯æŸ¥ | é»˜è®¤"道路货物运输月度生产情况",共 13056 æ¡ | é€šè¿‡ |
### 3.2 è´Ÿå‘/边界
| ç¼–号 | è¾“å…¥ | é¢„期 | å®žé™… | ç»“论 |
| --- | --- | --- | --- | --- |
| TC-10 | æ— åç§°ç±»å­—段的表(网约车总数/订单) | åªå†»ç»“报表期,不误冻结数值列 | å†»ç»“列仅"报表期" | é€šè¿‡ |
| TC-11 | æœªç™»å½•直接访问 `/api/data/list` | 401 | 401 `未登录或登录已过期` | é€šè¿‡ï¼ˆæ—¢æœ‰å®‰å…¨ç­–略) |
| TC-12 | ä¸‹æ‹‰è¾“入关键字筛选 | æ”¯æŒè¾“入搜索 | `filterable` ç”Ÿæ•ˆï¼ˆæŒ‰é€‰é¡¹åè¿‡æ»¤ï¼‰ | é€šè¿‡ |
### 3.3 æ±‡æ€»å£å¾„核对(时点列为何不汇总)
武汉市公交运营车辆数(`city_bus_monthly`,2026 å¹´ï¼‰ï¼š1 æœˆ 8476 â†’ 2 æœˆ 8283 â†’ 3 æœˆ 8248 â†’ 4~6 æœˆ 8050 â†’ 7~8 æœˆ 7861。
| ç®—法 | ç»“æžœ | æ˜¯å¦æœ‰ä¸šåС含义 |
| --- | --- | --- |
| é€æœˆç›¸åŠ  | 64879 è¾† | å¦ï¼ˆåŒä¸€æ‰¹è½¦é‡å¤è®¡ 8 æ¬¡ï¼‰ |
| å–期末(8 æœˆï¼‰ | 7861 è¾† | æ˜¯ |
| å–期间平均 | çº¦ 8100 è¾† | å¯é€‰ |
结论:时点列不参与累加,汇总视图不显示(用户决定)。
## å››ã€å‘现的问题与处置
1. å†»ç»“列依赖"标识列连续出现在最前面"这一列序假设;若后续调整列序或新增类型,需同步维护 `stickyProps` ä¸Ž `nameProps`。已在 `renderColumns` æ³¨é‡Šä¸­è¯´æ˜Žï¼Œæš‚不改动。
2. æœ¬æ¬¡æ”¹åŠ¨åŒ…å«ä¸€å¤„**此前未提交的冻结列实现**(09:56 è½åœ¨å·¥ä½œåŒºï¼‰ï¼Œæµ‹è¯•通过后一并提交,避免遗漏。
## äº”、结论
数据类型下拉框、按表自适应的左侧冻结列均通过真机用例;切换 7 ä¸ªç±»åž‹è¡Œæ•°ä¸ŽæŽ¥å£ä¸€è‡´ï¼Œæ— å›žå½’。跨期汇总的时点列处理口径已确定:不参与汇总、不显示。
docs/¹¦ÄܲâÊÔ±¨¸æ/¹¦ÄܲâÊÔ±¨¸æ_Êý¾Ý²é¿´¿Ú¾¶É¸Ñ¡Óë±íÍ·µ¥Î»_2026-09-22.md
New file
@@ -0,0 +1,61 @@
# åŠŸèƒ½æµ‹è¯•æŠ¥å‘Šï¼šæ•°æ®æŸ¥çœ‹å£å¾„ç­›é€‰ã€ç©ºåˆ—éšè—ä¸Žè¡¨å¤´å•ä½ï¼ˆ2026-09-22)
> æ—¥æœŸï¼š2026-09-22 模块:数据查看(前端 DataView.vue + åŽç«¯ DataViewController) 测试人:Codex
> è¯‰æ±‚来源:用户复核第 2、3 ç‚¹â€”—空列能否不显示、口径能否提到上面、所有表头是否都带单位。
## ä¸€ã€åŠŸèƒ½è¯´æ˜Ž
1. **源文件未提供的空列不再显示**:规上规下拆分表的 `规上货运量 / è§„下货运量 / åˆè®¡è´§è¿é‡` ä¸‰åˆ—(源文件《模板_规上规下拆分运输量.xlsx》没有货运量列,库内全空)不展示;
   åˆ—定义与接口字段保留(若填报方后续补上货运量列,取消前端隐藏即可恢复)。
2. **口径上移为筛选**:拆分表的 `口径`(当月/累计)不再是表格列,改成工具栏下拉(全部 / å½“月 / ç´¯è®¡ï¼‰ï¼ŒåŽç«¯ `/api/data/list` æ–°å¢ž `periodType` å‚数(`MONTH` / `CUMULATIVE`);
   "全部"时仍会同时返回两种口径的行。切换数据类型时口径自动复位为"全部"。
3. **所有表头补单位**:按库内字段注释 + æºæ–‡ä»¶è¡¨å¤´ + äº¤å‰æ ¸å¯¹ï¼Œä¸ºå„表数值列补齐单位,共 12 ç±»è¡¨ã€60 ä½™åˆ—:
| æ¨¡å— | å•位口径 |
| --- | --- |
| åŸŽå¸‚公交/巡游出租 | å®¢è¿é‡(万人次)、旅客周转量(万人公里)、平均运距(公里)、运营车数(辆)、载客车次(车次)、站点(个)、单车次载客人数(人/车次) |
| å…¬è·¯æ—…客企业 h2031 | å®¢è¿è½¦è¾†(辆)、载客位(座)、客运量(人)、周转量(人公里)、平均运距(公里) |
| è´§è¿ä¼ä¸š h2032 | è½¦è¾†(辆)、吨位/标记吨位/各类货运量(吨)、周转量(吨公里)、平均运距(公里) |
| è´§è¿é‡å‘¨è½¬é‡ï¼ˆå®½è¡¨ï¼‰ | è´§è¿é‡N月(万吨)、周转量N月(万吨公里)(含去年同月列) |
| è§„上规下拆分 | è§„上/规下/合计周转量(万吨公里)、货运量(万吨)、排名(名)、同比(%) |
| è¿æ”¿è½¦è¾† / è½¨è¿¹é‡Œç¨‹ | ç‰µå¼•车、挂车、其他车(辆)、吨位(吨)、月度里程(公里)、有里程车辆(辆) |
| æ—…客运政车辆 | è½¦è¾†æ•°(辆)、载客位数(座) |
| ä¸ªä½“客运 | ä¸ªä½“客运量(人)、个体旅客周转量(人公里) |
| æŠ•资 | æŠ•资额(万元)、建筑面积(平方米) |
| èƒ½è€—车辆/运政车辆 | æ ‡è®°å¨ä½(吨)、货运量(吨)、周转量(吨公里)、里程(公里)、车次(次);燃料类按填报燃料单位标注 |
| ç½‘约车 | è®¢å•æ•°(单)、订单占比(%)、客运量(万人次)、旅客周转量(万人公里) |
## äºŒã€æµ‹è¯•环境
- åŽç«¯ `start-dev.ps1`(8090);前端 dev server(8080);MySQL `localhost:3308/traffic_audit`;账号 admin/123456;浏览器:Codex å†…置浏览器真机。
## ä¸‰ã€ç”¨ä¾‹è¡¨
### 3.1 æŽ¥å£ç”¨ä¾‹
| ç¼–号 | è¾“å…¥ | é¢„期 | å®žé™… | ç»“论 |
| --- | --- | --- | --- | --- |
| TC-1 | `type=scaleSplit&period=2026-08` | ä¸¤ç§å£å¾„å…± 36 è¡Œ | total=36 | é€šè¿‡ |
| TC-2 | åŒä¸Š `&periodType=CUMULATIVE` | ä»…累计 18 è¡Œ | total=18 | é€šè¿‡ |
| TC-3 | åŒä¸Š `&periodType=MONTH` | ä»…当月 18 è¡Œ | total=18 | é€šè¿‡ |
| TC-4 | æ‹†åˆ†è¡¨åˆ—名 | å¸¦å•位 | è§„上货运量(万吨)、规上周转量(万吨公里)、规上排名(名)、规上同比(%) | é€šè¿‡ |
| TC-5 | `type=transportAuth` åˆ—名 | å¸¦å•位 | ç‰µå¼•车数(辆)、挂车吨位(吨)、其他吨位(吨) | é€šè¿‡ |
| TC-6 | `type=freightTurnover` åˆ—名 | å¸¦å•位 | è´§è¿é‡1月(万吨) â€¦ å‘¨è½¬é‡N月(万吨公里) | é€šè¿‡ |
| TC-7 | `type=h2031` åˆ—名 | å¸¦å•位 | å®¢è¿è½¦è¾†åˆè®¡(辆)、核定载客位合计(座)、客运量合计(人)、周转量合计(人公里) | é€šè¿‡ |
### 3.2 çœŸæœºç”¨ä¾‹
| ç¼–号 | è¾“å…¥ | é¢„期 | å®žé™… | ç»“论 |
| --- | --- | --- | --- | --- |
| TC-8 | è´§è¿ä¼ä¸šæœˆæŠ¥ | è¡¨å¤´å¸¦å•位、冻结市州+企业名称 | è½¦è¾†æ•°åˆè®¡(辆)、标记吨位数合计(吨)…;冻结=市州、企业名称;工具栏无"口径" | é€šè¿‡ |
| TC-9 | è§„上规下拆分 | å·¥å…·æ å‡ºçŽ°å£å¾„ç­›é€‰ã€å£å¾„åˆ—æ¶ˆå¤±ã€ç©ºåˆ—æ¶ˆå¤± | å·¥å…·æ ï¼šæŠ¥è¡¨æœŸ / æ•°æ®ç±»åž‹ / å£å¾„[全部];表头从"规上周转量(万吨公里)"开始(三列货运量不再出现) | é€šè¿‡ |
## å››ã€å‘现的问题与处置
1. æ‹†åˆ†è¡¨ä¸‰ä¸ªè´§è¿é‡åˆ—**不能在页面上区分"空"与"零"**:源文件未提供该列,故显示为全空。本次按用户意见不展示;若业务需要,需先让填报方在模板中增加货运量列(导入已支持"扩展布局"自动识别)。
2. "表头单位"以库内字段注释为准(如 `h2032.freight_total` æ³¨é‡Š"货运量_总计(吨)");能耗表的燃料类字段(燃料消耗量、百公里油耗、周转量油耗)库内无单位注释,标注为"(按燃料单位)",未擅自写成升。
3. å£å¾„筛选默认"全部"(两种口径同屏),因为原有页面行为即如此;需要只看向上或累计时再切换。
## äº”、结论
三项诉求全部落地并通过接口 + çœŸæœºç”¨ä¾‹ï¼šç©ºåˆ—不再显示、口径上移为筛选(接口 `periodType` å‚数)、12 ç±»è¡¨è¡¨å¤´å…¨éƒ¨å¸¦å•位。原有筛选、冻结、格式化逻辑无回归。
docs/¹¦ÄܲâÊÔ±¨¸æ/¹¦ÄܲâÊÔ±¨¸æ_Êý¾Ý²é¿´Õ¹Ê¾ÓÅ»¯ÓëÍøÔ¼³µ°´ÊÐÖÝÊúÅÅ_2026-09-22.md
New file
@@ -0,0 +1,74 @@
# åŠŸèƒ½æµ‹è¯•æŠ¥å‘Šï¼šæ•°æ®æŸ¥çœ‹å±•ç¤ºä¼˜åŒ–ä¸Žç½‘çº¦è½¦æŒ‰å¸‚å·žç«–æŽ’ï¼ˆ2026-09-22)
> æ—¥æœŸï¼š2026-09-22 模块:数据查看(前端 DataView.vue + åŽç«¯ DataViewController) 测试人:Codex
> è¯‰æ±‚来源:用户当日复核后的 4 ç‚¹åé¦ˆã€‚
## ä¸€ã€åŠŸèƒ½è¯´æ˜Žï¼ˆæŒ‰ç”¨æˆ· 4 ç‚¹åé¦ˆé€æ¡ï¼‰
1. **数据类型下拉分组标题样式**:Element UI é»˜è®¤æŠŠ `el-select-group__title` åšæˆ 12px ç°å­—,视觉上"比选项更小更淡"。
   æ”¹ä¸ºæ˜Žç¡®çš„组标题样式(13px / 700 / `#303133` / æµ…底 `#F5F7FA`),并与选项左缩进拉开层级;通过 `popper-class="data-type-select"` ç²¾ç¡®å‘½ä¸­è¯¥ä¸‹æ‹‰ï¼Œä¸å½±å“å…¶å®ƒé¡µé¢ã€‚
2. **冻结列调整**:报表期与所属地区不再出现在表格中(报表期由筛选条件体现;所属地区是 6 ä½åŒºåˆ’代码,已由派生的"市州"列替代)。
   å†»ç»“区只保留"能辨识数据归属"的列,最多 3 åˆ—:市州/地区、企业名称/项目名称/车牌号、口径。
   - åŽç«¯ä¸ºä¼ä¸šç±»è¡¨è¡¥æ´¾ç”Ÿ"市州"列(`RegionUtil.cityByCode`):h2032、h2031、h204 è½¦è¾†èƒ½è€—季报、个体客运(原有)。
3. **规上规下拆分空值核查**:源文件《模板_规上规下拆分运输量.xlsx》的表头只有"周转量/排名/同比/增速排名",**没有货运量列**,
   å¯¼å…¥æŒ‰"周转量"布局解析(有货运量的扩展布局会自动识别),所以规上/规下/合计货运量三列为空——属源数据形态,不是导入故障。
   ä¸‰å®¶å‘¨è½¬é‡åˆ—名已标注单位 `(万吨公里)`;货运量列名标注 `(来源文件未提供该列)`。
4. **网约车订单及全省总量改为按市州竖排**:由"1 è¡Œ/期 Ã— 23 åˆ—宽表"改为"地区(全省 + 17 å¸‚州)נ指标"的长表,
   åˆ—:`地区 | æœŸé—´ | è®¢å•æ•°(单) | è®¢å•占比 | å®¢è¿é‡(万人次) | æ—…客周转量(万人公里) | å…¶ä¸­åŸŽå¸‚内客运量(万人次) | å…¶ä¸­åŸŽå¸‚内旅客周转量(万人公里) | è¯´æ˜Ž`。
   - è®¢å•数取台账原值;订单占比 = è¯¥å¸‚州订单数 Ã· è®¢å•合计;
   - å®¢è¿é‡/周转量/城市内两列**复用 `WycSplitCalc`(拆分口径)**,与汇总大表「网约车」页同源算法;全省行直接取台账 pin å€¼ã€‚
5. **市州月报进度显示项目名称**:原表只有 `project_id`,页面显示数字无法辨识。现按 `investment_project` è¿žè¡¨è¡¥ `项目名称` + `市州`;`项目ID` åˆ—保留在接口中(供连表)但页面不展示。
6. **数值显示规范**:全部数据**底层保持全精度**(导出/汇总仍用原值),仅显示层格式化:
   - æ¯”率类列(rate/yoy/mom/growth/ratio/percent/share)库内是小数(0.045 = 4.5%),显示为百分比两位小数;
   - æŽ’名类列(rank)显示整数;
   - å…¶ä½™æ•°å€¼åƒåˆ†ä½ã€ä¿ç•™ä¸¤ä½å°æ•°ï¼›æ•´æ•°åŽŸæ ·æ˜¾ç¤ºï¼ˆå¦‚è½¦è¾†æ•° 51、排名 1)。
## äºŒã€æµ‹è¯•环境
- åŽç«¯ï¼š`start-dev.ps1`(8090);前端:dev server(8080);数据库:本机 MySQL `localhost:3308/traffic_audit`;账号 admin/123456。
- æµè§ˆå™¨ï¼šCodex å†…置浏览器真机操作(DOM æ ¡éªŒï¼‰ã€‚
## ä¸‰ã€ç”¨ä¾‹è¡¨
### 3.1 æŽ¥å£ç”¨ä¾‹
| ç¼–号 | è¾“å…¥ | é¢„期 | å®žé™… | ç»“论 |
| --- | --- | --- | --- | --- |
| TC-1 | `type=wycOrder&period=2026-08` | 18 è¡Œï¼ˆå…¨çœ + 17 å¸‚州) | total=18;全省:订单 30,508,652、客运量 4997.74、周转量 29166.70、城市内 4571.18/23367.09 | é€šè¿‡ |
| TC-2 | åŒä¸Šï¼Œæ­¦æ±‰å¸‚ | æŒ‰è®¢å•占比拆分 | è®¢å• 11,550,551、占比 0.378599、客运量 1892.14、周转量 13484.80 | é€šè¿‡ |
| TC-3 | `type=investmentMonthly&period=2026-08` | æ˜¾ç¤ºé¡¹ç›®åç§°ä¸Žå¸‚å·ž | `通山城西综合客运站(二级站)` / å’¸å®å¸‚(原为 projectId=1) | é€šè¿‡ |
| TC-4 | `type=h2032&period=2026-08` | æ´¾ç”Ÿå¸‚州列 | regionCode=429021 â†’ å¸‚å·ž=神农架林区 | é€šè¿‡ |
| TC-5 | `type=cityBus` åˆ—名 | å¸¦å•位 | å®¢è¿é‡(万人次) / æ—…客周转量(万人公里) / å¹³å‡è¿è·(公里) | é€šè¿‡ |
| TC-6 | `type=scaleSplit` åˆ—名 | æ ‡æ³¨å•位与缺口 | è§„上周转量(万吨公里) / è§„上货运量(来源文件未提供该列) | é€šè¿‡ |
### 3.2 çœŸæœºï¼ˆæµè§ˆå™¨ï¼‰ç”¨ä¾‹
| ç¼–号 | è¾“å…¥ | é¢„期 | å®žé™… | ç»“论 |
| --- | --- | --- | --- | --- |
| TC-7 | å±•开数据类型下拉 | ç»„标题比选项更醒目 | ç»„标题 13px / 700 / rgb(48,49,51)(原为 12px ç°å­—) | é€šè¿‡ |
| TC-8 | è´§è¿ä¼ä¸šæœˆæŠ¥ | å†»ç»“市州+企业名称,隐藏报表期/所属地区 | å†»ç»“表头=市州、企业名称;正文首列=车辆数合计;无报表期/所属地区 | é€šè¿‡ |
| TC-9 | åŸŽå¸‚公交 | åŒä¸Š | å†»ç»“=市州、企业名称;神农架林区行数据正常 | é€šè¿‡ |
| TC-10 | ç½‘约车订单 | å†»ç»“地区 | å†»ç»“=地区;列序=地区、期间、订单数…;360 è¡Œï¼ˆ20 æœŸ Ã— 18) | é€šè¿‡ |
| TC-11 | è§„上规下拆分 | å†»ç»“口径+市州 | å†»ç»“=口径、市州;规上同比列显示百分比 | é€šè¿‡ |
| TC-12 | æ•°å€¼æ ¼å¼ | åƒåˆ†ä½ + ä¸¤ä½å°æ•° + æ¯”率百分比 | 30,508,652 / 570,004.44 / 100.00% / ç©ºå€¼ `-` | é€šè¿‡ |
### 3.3 å•位核对(规上规下拆分周转量)
| é¡¹ | å€¼ |
| --- | --- |
| h2032 æ­¦æ±‰ 1-6 æœˆè§„上周转量(吨公里) | 12,357,607,239 |
| æ‹†åˆ†è¡¨ æ­¦æ±‰ 2026-06 ç´¯è®¡è§„上周转量(万吨公里) | 1,235,760.72 |
| 1,235,760.72 Ã— 10000 | 12,357,607,239(完全一致) |
结论:拆分表周转量单位为**万吨公里**(与 h2032 çš„吨公里相差 1 ä¸‡å€ï¼‰ï¼Œè·¨è¡¨æ±‡æ€»éœ€æ¢ç®—。
## å››ã€å‘现的问题与处置
1. è§„上规下拆分(`scale_split_transport`)**货运量三列全空、周转量等有值**:核查源文件表头确认源数据本身没有货运量列,非导入故障;已把列名标注为"来源文件未提供该列",并建议与业务确认是否需要供应商补该列。
2. `investment_monthly` åªå­˜ `project_id`,页面无法辨识项目;已连表补项目名称与市州。
3. ç½‘约车台账是多期混排(默认 360 è¡Œï¼‰ï¼›"报表期"列在全站被隐藏,故该表把期间列改名为"期间"并紧跟"地区",避免多期行无法区分。
4. å‹¾ç¨½æ ¡éªŒï¼šç½‘约车全省客运量 4997.74 ä¸Ž `wyc_total_monthly` 2026-08 çš„ pinK ä¸€è‡´ã€‚
## äº”、结论
用户反馈的 4 ç‚¹å…¨éƒ¨å¤„理并通过真机用例:下拉分组标题样式、隐藏报表期/所属地区并收窄冻结列、拆分表空值与单位说明、网约车按市州竖排、市州月报项目名称、数值与百分比显示规范。底层数据精度未做任何改动。
docs/¹¦ÄܲâÊÔ±¨¸æ/¹¦ÄܲâÊÔ±¨¸æ_Êý¾Ý²é¿´°´ÊÐÖÝ»ã×ÜÓëµ¼³ö_2026-09-22.md
New file
@@ -0,0 +1,60 @@
# åŠŸèƒ½æµ‹è¯•æŠ¥å‘Šï¼šæ•°æ®æŸ¥çœ‹ã€ŒæŒ‰å¸‚å·žæ±‡æ€» + å¯¼å‡º Excel」(2026-09-22)
> æ—¥æœŸï¼š2026-09-22 模块:数据查看(后端 CityRollupService/DataViewController + å‰ç«¯ DataView.vue) 测试人:Codex
> å£å¾„依据:2026-09-22 ç”¨æˆ·ç¡®è®¤â€”—起止月任意选、累计同比带上年同期、排名字段可选(留空/按累计值重排)、不放时点列。
## ä¸€ã€åŠŸèƒ½è¯´æ˜Ž
1. **入口**:数据查看工具栏加「视图:明细 / æŒ‰å¸‚州汇总」切换(仅对有市州维度的类型出现)。
2. **汇总条件**:起止月(任意区间,年初至 N æœˆå³ 01~N)、排名口径(留空 / æŒ‰ç´¯è®¡å€¼é‡æŽ’)、汇总、导出 Excel。
3. **结果**:「全省合计」行放在**最前面**(2026-09-22 ç”¨æˆ·è¦æ±‚,位于武汉市之上),其后为 17 ä¸ªå¸‚州(RegionUtil è§„范名与顺序);导出 Excel ä¸­åˆè®¡è¡ŒåŠ ç²—ã€‚
4. **口径规则**:
   - æµé‡ç±»ï¼ˆå®¢è¿é‡/周转量/货运量/订单数)→ è·¨æœŸæ±‚和;
   - **时点类(车辆数、企业数、站点数)不参与汇总,不出现在结果中**;
   - æ¯”率类按累计口径重算:累计同比 = æœ¬æœŸç´¯è®¡ Ã· ä¸Šå¹´åŒæœŸç´¯è®¡ âˆ’ 1;平均运距 = ç´¯è®¡å‘¨è½¬é‡ Ã· ç´¯è®¡å®¢è¿é‡ï¼›
   - æŽ’名默认留空;选「按累计值重排」时按累计值降序给名次,全省合计行不排名;
   - åˆè®¡è¡Œç”± 17 å¸‚州相加("湖北省"等合计行不计入,避免重复)。
5. **接口**:`GET /api/data/rollupTypes`(支持汇总的类型)、`GET /api/data/summary`、`GET /api/data/export`(xlsx,数值全精度、显示 2 ä½å°æ•° / ç™¾åˆ†æ¯”)。
6. **支持类型(7 ç±»ï¼‰**:`cityBus`、`cityTaxi`、`h2032`、`h2031`、`passengerIndividual`、`wycOrder`(拆分口径)、`freightTurnover`。
## äºŒã€æµ‹è¯•环境
后端 `mvn spring-boot:run`(8090,`Started TrafficAuditApplication`);前端 8080;MySQL `localhost:3308/traffic_audit`;账号 admin/123456;浏览器:Codex å†…置浏览器真机。
## ä¸‰ã€ç”¨ä¾‹è¡¨
### 3.1 æŽ¥å£ç”¨ä¾‹
| ç¼–号 | è¾“å…¥ | é¢„期 | å®žé™… | ç»“论 |
| --- | --- | --- | --- | --- |
| TC-1 | `rollupTypes` | è¿”回 7 ä¸ªç±»åž‹ | cityBus/cityTaxi/h2032/h2031/passengerIndividual/wycOrder/freightTurnover | é€šè¿‡ |
| TC-2 | å…¬äº¤ 2026-01~08 | ä¸Žæ‰‹å·¥æ ¸ç®—一致 | å…¨çœåˆè®¡å®¢è¿é‡ 110776.34 ä¸‡äººæ¬¡ã€å‘¨è½¬é‡ 738254.64 ä¸‡äººå…¬é‡Œã€å¹³å‡è¿è· 6.66 å…¬é‡Œã€ç´¯è®¡åŒæ¯” âˆ’3.07%;武汉客运量 36935.38(与 SQL é€æœˆç›¸åŠ ä¸€è‡´ï¼‰ | é€šè¿‡ |
| TC-3 | å…¬äº¤ 2026-03~06 | åŒºé—´ç´¯è®¡ | å…¨çœåˆè®¡ 59060.71 ä¸‡äººæ¬¡ï¼ˆ= 3~6 æœˆé€æœˆç›¸åŠ ï¼‰ | é€šè¿‡ |
| TC-4 | è´§è¿ä¼ä¸š h2032 2026-01~08 | ä¸Ž SQL ä¸€è‡´ | å…¨çœåˆè®¡è´§è¿é‡ 313,998,248 å¨ã€å‘¨è½¬é‡ 49,271,617,743 å¨å…¬é‡Œã€å¹³å‡è¿è· 156.92 å…¬é‡Œã€åŒæ¯” âˆ’17.37% | é€šè¿‡ |
| TC-5 | è´§è¿é‡å‘¨è½¬é‡ 2026-01~08 | 17 å¸‚州之和(排除"湖北省"行) | 130,311.89 ä¸‡å¨ï¼Œä¸Ž SQL ç›´æŸ¥ 17 å¸‚州之和完全一致(修复前误把"湖北省"行与区间重复叠加,曾得到 1,149,579) | é€šè¿‡ |
| TC-6 | åŒä¸Š `to=2026-09`(该月无数据) | è‡ªåŠ¨å›žé€€åˆ°æœ€æ–°æœ‰æ•°æœˆä»½ | ç»“果与 01~08 ä¸€è‡´ï¼›æœŸé—´æ ‡ç­¾ä»æ˜¾ç¤ºè¯·æ±‚区间 | é€šè¿‡ |
| TC-7 | æŽ’名 `rankMode=blank` | æŽ’名列为空 | ç©ºï¼ˆæ˜¾ç¤º `-`) | é€šè¿‡ |
| TC-8 | æŽ’名 `rankMode=recompute` | æŒ‰ç´¯è®¡å€¼é™åº | è´§è¿é‡ï¼šæ­¦æ±‰ 1、宜昌 3、黄石 9、十堰 12;全省合计行留空 | é€šè¿‡ |
| TC-9 | ç½‘约车 2026-01~08 | æ‹†åˆ†å£å¾„合计 | å…¨çœåˆè®¡è®¢å• 208,229,132 å•、客运量 33864.94 ä¸‡äººæ¬¡ | é€šè¿‡ |
| TC-10 | `export`(公交 2026-01~08) | ç”Ÿæˆ xlsx | 5,790 å­—节,可正常打开、含表头与合计行;合计行加粗、数值格式 `0.00`、同比格式 `0.00%` | é€šè¿‡ |
| TC-10b | åˆè®¡è¡Œä½ç½® | åœ¨æ­¦æ±‰å¸‚之上 | ç¬¬ 1 è¡Œ=全省合计(客运量 110776.34),第 2 è¡Œ=武汉市(排名 1);合计行排名留空 | é€šè¿‡ |
### 3.2 çœŸæœºç”¨ä¾‹
| ç¼–号 | è¾“å…¥ | é¢„期 | å®žé™… | ç»“论 |
| --- | --- | --- | --- | --- |
| TC-11 | æ•°æ®æŸ¥çœ‹é€‰"道路货物运输月度生产情况" | å‡ºçŽ°ã€Œè§†å›¾ã€åˆ‡æ¢ | å·¥å…·æ ï¼šæŠ¥è¡¨æœŸ / æ•°æ®ç±»åž‹ / è§†å›¾ | é€šè¿‡ |
| TC-12 | åˆ‡åˆ°"按市州汇总" | å‡ºçŽ°èµ·æ­¢æœˆã€æŽ’åã€æ±‡æ€»ã€å¯¼å‡º | å·¥å…·æ ï¼šæ•°æ®ç±»åž‹ / è§†å›¾ / èµ·æ­¢æœˆ / æŽ’名;按钮:汇总、导出 Excel | é€šè¿‡ |
| TC-13 | æ‰§è¡Œæ±‡æ€» | 18 è¡Œã€å¸‚州冻结、口径提示 | 18 è¡Œï¼›å†»ç»“列=市州;提示"共 18 æ¡è®°å½• | é“路货物运输企业(按市州汇总) 2026-01 ~ 2026-09 ç´¯è®¡ï¼›åŒæ¯”基数 2025-01 ~ 2025-09;排名口径:留空";全省合计 313,998,248 å¨ / 49,271,617,743 å¨å…¬é‡Œ | é€šè¿‡ |
| TC-14 | æ•°å€¼æ˜¾ç¤º | åƒåˆ†ä½ + 2 ä½å°æ•° + åŒæ¯”百分比 | 100,729,811 / 16,328,908,098 / 162.11 / âˆ’24.39% | é€šè¿‡ |
## å››ã€å‘现的问题与处置
1. **货运量周转量表口径坑**:该表每行是"年初至当期"的行内累计(行内含各月列),跨期再叠加会重复计算;且表内"湖北省"行等于 17 å¸‚州之和。已改为只取区间内最新一期那一行、对区间月份求和,并显式排除非市州行 â†’ ç”± 1,149,579 ä¿®æ­£ä¸º 130,311.89 ä¸‡å¨ï¼ˆä¸Žç›´æŸ¥ä¸€è‡´ï¼‰ã€‚
2. ç»“束月无数据(如 2026-09)时自动回退到最新有数月份,避免出现全 0 è¡Œã€‚
3. æ±‡æ€»æ¨¡å¼ä¸‹"报表期/关键字"输入框隐藏(由起止月承担期间条件),避免两套期间条件并存。
4. æŽ’名口径默认"留空";开启重排后按累计值降序,全省合计行不参与排名。
## äº”、结论
「按市州汇总 + å¯¼å‡º Excel」按用户确认的口径完成并通过 10 æ¡æŽ¥å£ç”¨ä¾‹ + 4 æ¡çœŸæœºç”¨ä¾‹ï¼›ä¸Žæ‰‹å·¥/SQL æ ¸ç®—逐项一致。时点列不参与汇总、比率按累计重算、排名可选,导出保留全精度。
docs/¹¦ÄܲâÊÔ±¨¸æ/¹¦ÄܲâÊÔ±¨¸æ_Êý¾Ý²é¿´²¹ÆëÍøÔ¼³µÓë¸öÌå¿ÍÔËÀàÐÍ_2026-09-22.md
New file
@@ -0,0 +1,76 @@
# åŠŸèƒ½æµ‹è¯•æŠ¥å‘Šï¼šæ•°æ®æŸ¥çœ‹è¡¥é½ç½‘çº¦è½¦ä¸Žä¸ªä½“å®¢è¿ç±»åž‹ï¼ˆ2026-09-22)
> æ—¥æœŸï¼š2026-09-22 模块:数据查看(前端 DataView + åŽç«¯ DataViewController) 测试人:Codex
> è¯‰æ±‚来源:数据查看的数据类型应做到"能导入什么数据就能看到什么数据",用于核对导入是否完整。
## ä¸€ã€åŠŸèƒ½è¯´æ˜Ž
数据查看页原先只有 15 ä¸ªæ•°æ®ç±»åž‹ï¼Œç½‘约车与个体客运虽然已有导入接口和模板,但**没有查看入口**,导入后只能查数据库。本次补齐 3 ä¸ªç±»åž‹ï¼š
| æ–°å¢žç±»åž‹ | é¡µé¢åç§° | æ•°æ®è¡¨ | åˆ—æ•° |
| --- | --- | --- | --- |
| `wycTotal` | ç½‘约车总数 | `wyc_total_monthly` | 5 |
| `wycOrder` | ç½‘约车订单及全省总量 | `wyc_order_monthly` | 23(含 17 å¸‚州订单列) |
| `passengerIndividual` | ä¸ªä½“客运量/周转量 | `passenger_individual_monthly` | 7(含由区划代码派生的"市州"列) |
改动点:
- åŽç«¯ `traffic-audit-server/src/main/java/com/trafficaudit/dataimport/controller/DataViewController.java`:新增 3 ä¸ª `switch` åˆ†æ”¯ã€3 ç»„列定义、3 ä¸ª Mapper æ³¨å…¥ï¼›`passengerIndividual` ç”¨ `RegionUtil.cityByCode` æŠŠ 6 ä½åŒºåˆ’代码派生为市州名。
- å‰ç«¯ `traffic-audit-web/src/views/DataView.vue`:公路旅客模块加"个体客运量/周转量",城市客运模块加"网约车总数""网约车订单及全省总量"。
## äºŒã€æµ‹è¯•环境
- åŽç«¯ï¼š`mvn spring-boot:run -f traffic-audit-server/pom.xml`,8090,日志出现 `Started TrafficAuditApplication`、`Tomcat started on port(s): 8090`
- å‰ç«¯ï¼š`npm run serve`(traffic-audit-web),8080,`Compiled successfully in 4769ms`
- æ•°æ®åº“:本机 MySQL `localhost:3308/traffic_audit`(mysql CLI ç›´æŸ¥æ ¸å¯¹ï¼‰
- ç™»å½•:`POST /api/auth/login`(admin/123456)取 JWT,后续接口带 `Authorization: Bearer <token>`
## ä¸‰ã€ç”¨ä¾‹è¡¨
### 3.1 æ­£å‘用例
| ç¼–号 | è¾“å…¥ | é¢„期 | å®žé™… | ç»“论 |
| --- | --- | --- | --- | --- |
| TC-1 | `GET /api/data/list?type=wycTotal` | 20 è¡Œã€5 åˆ—,列名与模板一致 | total=20,列:报表期/全省网约车客运量/其中城市内客运量/全省网约车周转量/其中城市内周转量;首行 2025-01:2467.79 / 2325.25 / 14910.54 / 12202.49 | é€šè¿‡ |
| TC-2 | `type=wycOrder` | 20 è¡Œã€23 åˆ—(含 17 å¸‚州) | total=20,23 åˆ—;首行 2025-09:orderSum=17652159,武汉 8076610、黄石 676644…神农架 1424 | é€šè¿‡ |
| TC-3 | `type=passengerIndividual` | 139 è¡Œã€7 åˆ—,含派生市州 | total=139;首行 2025-01:regionCode=420900 â†’ å¸‚å·ž=孝感市,个体客运量 6442、周转量 117502.08 | é€šè¿‡ |
| TC-4 | `type=wycOrder&period=2026-08` | ä»… 2026-08 ä¸€è¡Œ | total=1,rows=1,cols=23 | é€šè¿‡ |
| TC-5 | `type=passengerIndividual&period=2026-08` | ä»… 2026-08 | total=6 | é€šè¿‡ |
| TC-6 | `type=passengerIndividual&keyword=孝感` | ä»…孝感相关行 | total=40 | é€šè¿‡ |
| TC-7 | å‰ç«¯ä¸‹æ‹‰ | å…¬è·¯æ—…客 3 é¡¹ã€åŸŽå¸‚客运 5 é¡¹ | ä¸‹æ‹‰æ–°å¢ž 3 é¡¹ï¼Œ`npm run serve` ç¼–译成功 | é€šè¿‡ |
### 3.2 è´Ÿå‘用例
| ç¼–号 | è¾“å…¥ | é¢„期 | å®žé™… | ç»“论 |
| --- | --- | --- | --- | --- |
| TC-8 | `type=notExist` | ç©ºç»“果、不报错 | total=0、records=0、columns=0 | é€šè¿‡ |
| TC-9 | `type=wycOrder&period=1999-01`(无数据的期) | ç©ºç»“æžœ | total=0、records=0、列定义正常返回 | é€šè¿‡ |
| TC-10 | ä¸å¸¦ token è®¿é—® `/api/data/list` | 401(既有安全策略) | 401 | é€šè¿‡ï¼ˆéžç¼ºé™·ï¼‰ |
| TC-11 | `type=wycTotal&keyword=xx` | è¯¥è¡¨æ— åç§°åˆ—,关键字不生效 | ä»è¿”回 20 è¡Œ | é€šè¿‡ï¼ˆè§é—ç•™ 1) |
### 3.3 å…¥åº“抽查(接口条数 vs åº“内行数)
| è¡¨ | åº“内行数 | æŽ¥å£ total | ç»“论 |
| --- | --- | --- | --- |
| `wyc_total_monthly` | 20 | 20 | ä¸€è‡´ |
| `wyc_order_monthly` | 20 | 20 | ä¸€è‡´ |
| `passenger_individual_monthly` | 139 | 139 | ä¸€è‡´ |
### 3.4 å›žå½’(原有 15 ç±»ä¸å—影响)
`h2032` 13056 / `transportAuth` 1270 / `trackMileage` 628 / `scaleSplit` 288 / `freightTurnover` 234 / `h2031` 15811 / `passengerAuth` 0 / `cityBus` 2860 / `cityTaxi` 340 / `cityTaxiAuth` 85272 / `investmentProject` 152 / `investmentMonthly` 284 / `investmentSystem` 277 / `energyVehicle` 2568 / `energyAuth` 1203 â€”— å‡æ­£å¸¸è¿”回,列数不变。
## å››ã€å‘现的问题与处置
1. `wycTotal` / `wycOrder` æ²¡æœ‰åç§°ç±»å­—段,页面上"企业/市州名称"关键字框对它无效(返回全量)。属既有交互的一致性问题,未在本次改动,列入待优化。
2. ç½‘约车订单表为宽表(17 å¸‚州各一列),明细页横向 23 åˆ—,需要横向滚动查看;未做转置,保持与导入文件列序一致,便于核对。
## äº”、结论
3 ä¸ªæ–°å¢žç±»åž‹å…¨éƒ¨é€šè¿‡æ­£å‘、负向与入库抽查用例,原有 15 ç±»æ— å›žå½’。数据查看现已覆盖**全部可导入的数据类型**,可用于核对导入完整性。
## å…­ã€é™„:跨期汇总口径(下一步待做功能的口径依据)
月报各表的月值均为**当月值**。按市州做"任意起止月"汇总时,列按性质分三类处理:
- æµé‡ç±»ï¼ˆå®¢è¿é‡ã€å‘¨è½¬é‡ã€è´§è¿é‡ã€è®¢å•数)→ é€æœˆæ±‚和;
- æ—¶ç‚¹ç±»ï¼ˆè¿è¥è½¦è¾†æ•°ã€è¥è¿è½¦è¾†æ•°ã€ä¼ä¸šæ•°ï¼‰â†’ ä¸æ±‚和,取期末值(如武汉公交运营车辆 2026 å„月 8476→7861,逐月相加会得到 64879 è¾†ï¼Œå®žé™… 8 æœˆæœ«åªæœ‰ 7861 è¾†ï¼‰ï¼›
- æ¯”率类(环比、同比、平均运距、占比)→ ä¸æ±‚和,按累计口径重算。
docs/¹¦ÄܲâÊÔ±¨¸æ/¹¦ÄܲâÊÔ±¨¸æ_»ã×Ü´ó±íµ¼³ö½á¹ûÂäÅÌ»º´æ¸´ÓÃ_2026-09-22.md
New file
@@ -0,0 +1,56 @@
# åŠŸèƒ½æµ‹è¯•æŠ¥å‘Š_汇总大表导出结果落盘缓存复用_2026-09-22
## ä¸€ã€åŠŸèƒ½è¯´æ˜Ž
用户诉求:「我已经下载过了为什么还要重新生成呢?可以弄一个记忆功能吗——我下载过某个数据,第二次下载期间没有新导入数据,就直接沿用上次算好的结果。不然每次下载都要等很久。」
**改造前**:已有「10 åˆ†é’Ÿå†… + æœŸé—´æ— æ–°å¯¼å…¥ã€çš„内存缓存,但①窗口只有 10 åˆ†é’Ÿï¼›â‘¡å­˜åœ¨å†…存里,进程一重启就没了 â†’ æ­£å¸¸åœºæ™¯ä¸‹ç¬¬äºŒæ¬¡ä¸‹è½½ä»è¦é‡ç®— 13~17 ç§’。
**改造后**:
1. ç»“æžœ**落盘**保存到 `docs/生成汇总大表/_cache/`(已加入 `.gitignore`),文件名 `<key>_v<数据版本>.xlsx`;
2. æäº¤å¯¼å‡ºæ—¶ï¼ˆæœªç‚¹ã€Œé‡æ–°ç”Ÿæˆã€ï¼‰ï¼š**内存缓存 â†’ è½ç›˜ç¼“å­˜ â†’ çœŸç®—**;落盘命中要求「同一报表期 + åŒä¸€æ•°æ®ç‰ˆæœ¬ã€ï¼›
3. **数据版本 = `MAX(import_batch.id)`**:只要期间有任何一次数据导入,版本就变,旧缓存自动失效;
4. å¤ç”¨ä¸Šé™ **7 å¤©**(防陈年结果被当新表发出),超期文件在下次提交时自动清理;同一 key åªä¿ç•™æœ€æ–°ç‰ˆæœ¬æ–‡ä»¶ï¼›
5. å‰ç«¯å‘½ä¸­ç¼“存时显示「本次直接沿用 &lt;生成时间&gt; ç”Ÿæˆçš„结果(期间没有新的数据导入)。如需按最新数据重算,请点「重新生成」。」,并把一行元信息改成「报表期 2026-08 上次生成于 â€¦ã€ï¼ˆä¸å†æ˜¾ç¤ºã€Œä¸Šæ¬¡ç”Ÿæˆç”¨æ—¶ 0.0 ç§’」);
6. ä¿®æŽ‰è½ç›˜å‘½ä¸­æ—¶ `elapsedMs` ä¸ºè´Ÿæ•°çš„问题(以生成时间作为任务起点)。
改动文件:`ReportExportTaskService.java`(核心)、`ReportExportController.java`(注释)、`ReportExport.vue`(文案)、`.gitignore`。
## äºŒã€æµ‹è¯•环境
- åŽç«¯ Spring Boot 8090(重启加载新代码);前端 `npm run serve` 8080(`Compiled successfully`)
- æ•°æ®åº“ MySQL 3308 / `traffic_audit`;报表期 2026-08(月报)
- ç¼“存目录:`docs/生成汇总大表/_cache/`;命中判据 `MAX(import_batch.id)`(测试时为 **541**)
## ä¸‰ã€ç”¨ä¾‹è¡¨
| # | ç”¨ä¾‹ | æ“ä½œ | é¢„期 | å®žé™… | ç»“论 |
| --- | --- | --- | --- | --- | --- |
| T01 | é¦–次提交(无缓存,正向) | `GET /api/report/exportTask/summaryWorkbook?period=2026-08` | çœŸç®—,完成后写落盘缓存 | `RUNNING` â†’ `DONE`(12.4 s);生成 `summaryWorkbook_2026-08_month__v541.xlsx`(1,204,461 B) | é€šè¿‡ |
| T02 | å†æ¬¡æäº¤ï¼ˆå†…存命中) | åŒä¸ŠæŠ¥ | ç«‹å³ DONE、fromCache=true | æäº¤è€—æ—¶ **164 ms**,`fromCache=true`;下载 1,204,461 B ä¸Žç¼“存文件一致 | é€šè¿‡ |
| T03 | **重启后端后再提交(落盘命中,核心)** | åœ/起前后端后提交 | ä»ç«‹å³ DONE(不再重算) | æäº¤ **1,194 ms**,`fromCache=true`,日志「命中落盘缓存…」,下载字节一致 | é€šè¿‡ |
| T04 | æœ‰æ–°å¯¼å…¥ï¼ˆè´Ÿå‘) | ä¸´æ—¶æ’入一条 `import_batch`(id å˜ 542)后提交 | ç¼“存失效、重新生成 | `fromCache=false`、`status=RUNNING` | é€šè¿‡ |
| T05 | åŒ key åªç•™æœ€æ–°ç‰ˆæœ¬ | é‡ç®—完成后看缓存目录 | æ—§ç‰ˆæœ¬æ–‡ä»¶è¢«åˆ é™¤ | ç›®å½•只剩 `…_v542.xlsx`(v541 å·²åˆ ï¼‰ | é€šè¿‡ |
| T06 | ç‰ˆæœ¬å›žè½åŽ | åˆ æŽ‰ä¸´æ—¶å¯¼å…¥è¡Œï¼ˆç‰ˆæœ¬å›žåˆ° 541)后再提交 | ä¸å‘½ä¸­ v542,重算并写回 v541 | `fromCache=false` â†’ é‡ç®—完成;目录只剩 `…_v541.xlsx` | é€šè¿‡ |
| T07 | æ—¶é•¿æ˜¾ç¤ºï¼ˆå›žå½’修复) | è½ç›˜å‘½ä¸­æ—¶çœ‹ `elapsedMs` / å‰ç«¯å…ƒä¿¡æ¯ | ä¸ä¸ºè´Ÿæ•° | ä¿®å¤å‰ `elapsedMs=-72937`;修复后 `elapsedMs=0`,前端显示「报表期 2026-08 上次生成于 2026-09-22 11:27:32」 | é€šè¿‡ |
| T08 | æµè§ˆå™¨ç«¯åˆ°ç«¯ï¼ˆæ­£å‘) | admin/123456 â†’ æŠ¥è¡¨ç”Ÿæˆ â†’ æ±‡æ€»å¤§è¡¨ â†’ 2026-08 â†’ å¯¼å‡º | ç§’出并自动下载,文案正确 | ç‚¹å‡»åŽ**立即**「汇总大表已生成」100%;显示「本次直接沿用 2026-09-22 11:27:32 ç”Ÿæˆçš„结果(期间没有新的数据导入)」、「已自动下载:生成_道路运输量汇总表_2026-08.xlsx ï¼ˆ1.15 MB)…」;按钮仅「重新生成 / å…³é—­ã€ï¼›æŽ§åˆ¶å° 0 æŠ¥é”™ | é€šè¿‡ |
| T09 | ç¼“存不串期(静态) | â€”— | ä¸åŒæŠ¥è¡¨æœŸ/模式互不命中 | key(type\|period\|mode\|toMonth)同时进入内存键与落盘文件名前缀 | é€šè¿‡ï¼ˆé™æ€ï¼‰ |
| T10 | è‡ªåŠ¨æ¸…ç† | â€”— | è¶…期文件被删除 | æ¯æ¬¡æäº¤è°ƒç”¨ `cleanupExpired()`:内存条目与磁盘文件超过 7 å¤©å³æ¸… | é€šè¿‡ï¼ˆé™æ€ï¼‰ |
## å››ã€å‘现的问题与处置
| # | é—®é¢˜ | å¤„ç½® |
| --- | --- | --- |
| P1 | è½ç›˜å‘½ä¸­æ—¶å‰ç«¯ã€Œç”¨æ—¶ã€ä¸ºè´Ÿæ•°ï¼ˆ`elapsedMs=-72937`,因为任务起点是现在、结束时间是历史生成时间) | å·²ä¿®ï¼šè½ç›˜å‘½ä¸­æ—¶æŠŠä»»åŠ¡èµ·ç‚¹è®¾ä¸ºç”Ÿæˆæ—¶é—´ï¼›å‰ç«¯ç¼“å­˜å‘½ä¸­ä¸å†æ˜¾ç¤ºç”¨æ—¶ï¼Œæ”¹æ˜¾ç¤ºã€Œä¸Šæ¬¡ç”ŸæˆäºŽ â€¦ã€ |
| P2 | æµ‹è¯•用的临时 `import_batch` è¡Œ | å·²åˆ é™¤ï¼ˆ`MAX(id)` å›žåˆ° 541、批次 419 æ¡ï¼‰ï¼Œä»…用于验证「导入即失效」 |
| P3 | æ•°æ®ç‰ˆæœ¬æ˜¯**全局**的:任何一次导入(含与汇总大表无关的投资/能耗导入)都会让汇总缓存失效 | å±žä¿å®ˆè®¾è®¡ï¼ˆå®å¯é‡ç®—不可出错)。若希望「只有相关数据导入才失效」,需要按 `import_type` ç»†åˆ†ä¾èµ–,待用户确认后排期 |
| P4 | è½ç›˜ç›®å½• | æ–°å¢ž `docs/生成汇总大表/_cache/` å¹¶åŠ å…¥ `.gitignore`(结果文件不入库) |
## äº”、结论
- ã€Œä¸‹è½½è¿‡ä¸€æ¬¡ã€æœŸé—´æ²¡æœ‰æ–°å¯¼å…¥ â†’ ç¬¬äºŒæ¬¡ç›´æŽ¥æ²¿ç”¨ã€å·²å®žçŽ°ï¼Œä¸”**跨后端重启有效**(这是本次的关键增量);
- å¤ç”¨æ­£ç¡®æ€§ç”±ã€Œæ•°æ®ç‰ˆæœ¬ï¼ˆ`MAX(import_batch.id)`)+ 7 å¤©ä¸Šé™ã€åŒé‡æŠŠå…³ï¼šæœ‰æ–°å¯¼å…¥å¿…定重算,测试已覆盖;
- ç”¨æˆ·ä½“验:命中缓存时点导出**秒回**(毫秒级),不再每次等 13~17 ç§’;「重新生成」保留为强制重算入口;
- æµè§ˆå™¨ç«¯åˆ°ç«¯å®žæµ‹é€šè¿‡ï¼Œæ— æŽ§åˆ¶å°æŠ¥é”™ã€‚
测试人:Codex(AI) 测试日期:2026-09-22
docs/¹¦ÄܲâÊÔ±¨¸æ/¹¦ÄܲâÊÔ±¨¸æ_»ã×Ü´ó±í½ø¶Èµ¯´°ÓÅ»¯_2026-09-22.md
New file
@@ -0,0 +1,63 @@
# åŠŸèƒ½æµ‹è¯•æŠ¥å‘Š_汇总大表进度弹窗优化_2026-09-22
## ä¸€ã€åŠŸèƒ½è¯´æ˜Ž
用户问题:「汇总表的进度条弹窗的『保存』会使下载的汇总表再次下载;这个弹窗可以怎么优化一下呢?」
**原因**:任务完成时 `downloadTaskFile(true)` ä¼šè‡ªåŠ¨ä¸‹è½½ä¸€æ¬¡ï¼›è€Œå¼¹çª—åº•éƒ¨ä¸€ç›´æŒ‚ç€ã€Œä¿å­˜æ–‡ä»¶ã€ï¼ˆç¼“å­˜å‘½ä¸­æ—¶æ˜¯ã€Œä¸‹è½½ã€ï¼‰ï¼Œç‚¹ä¸€ä¸‹ä¼š**再次请求后端拿同一个文件并第二次下载**,看起来像「保存又下了一遍」。同时弹窗标题始终是「正在生成汇总大表」,完成/失败后不变化。
**改动**(`traffic-audit-web/src/views/ReportExport.vue`):
| # | æ”¹åЍ | è¯´æ˜Ž |
| --- | --- | --- |
| 1 | å®ŒæˆåŽæ˜¾ç¤ºã€Œå·²è‡ªåŠ¨ä¸‹è½½ã€ | `已自动下载:<文件名>(<大小>),文件在浏览器默认下载目录。` |
| 2 | **已自动下载后不再显示下载按钮** | å®ŒæˆåŽåº•部只剩「重新生成 / å…³é—­ã€ï¼›åªæœ‰**自动下载失败**时才出现「保存文件」兜底按钮(见 Â§å…­ å˜æ›´è®°å½•) |
| 3 | è‡ªåŠ¨ä¸‹è½½å¤±è´¥å…œåº• | `taskDownloaded=false` æ—¶æç¤ºã€Œè‡ªåŠ¨ä¸‹è½½æ²¡æˆåŠŸï¼Œå¯ç‚¹ã€Žä¿å­˜æ–‡ä»¶ã€å†å­˜ä¸€æ¬¡ã€ï¼Œå¹¶æ˜¾ç¤ºã€Œä¿å­˜æ–‡ä»¶ã€æŒ‰é’® |
| 4 | å¼¹çª—标题随状态变化 | æ­£åœ¨ç”Ÿæˆæ±‡æ€»å¤§è¡¨ / **汇总大表已生成** / æ±‡æ€»å¤§è¡¨ç”Ÿæˆå¤±è´¥ |
| 5 | å®Œæˆæ€ä¸»æŒ‰é’®æ”¹ä¸ºã€Œå…³é—­ã€ | ç”Ÿæˆä¸­ä»æ˜¯ã€ŒåŽå°è¿è¡Œã€ï¼Œå®ŒæˆåŽä¸»æŒ‰é’®æ˜¯ã€Œå…³é—­ã€ï¼ˆä¸‹è½½æŒ‰é’®é™ä¸ºæ¬¡è¦ï¼‰ |
| 6 | æ¯æ¬¡æ–°ä»»åŠ¡é‡ç½®çŠ¶æ€ | `taskDownloaded/taskFileName/taskFileSize/taskBlob` åœ¨ `startSummaryTask` é‡Œæ¸…é›¶ |
## äºŒã€æµ‹è¯•环境
- å‰ç«¯ï¼š`npm run serve`(8080),改后热编译 `Compiled successfully in 592ms`(10:00:24)
- åŽç«¯ï¼šSpring Boot 8090(今日运行中);数据库 MySQL 3308 / `traffic_audit`
- æµè§ˆå™¨ï¼šCodex å†…置浏览器(视口 1280×720),登录 `admin/123456`
- æŠ¥è¡¨æœŸï¼š2026-08(月报,汇总大表《道路运输量汇总表(整本)》数据状态=数据就绪)
- ç”Ÿæˆè€—时:**13.5 ç§’**(未命中缓存),产物 `生成_道路运输量汇总表_2026-08.xlsx`,**1.15 MB**
## ä¸‰ã€ç”¨ä¾‹è¡¨
| # | ç”¨ä¾‹ | è¾“å…¥/操作 | é¢„期 | å®žé™… | ç»“论 |
| --- | --- | --- | --- | --- | --- |
| T01 | ç”Ÿæˆä¸­å¼¹çª—状态(正向) | é€‰ 2026-08 â†’ ç‚¹ã€Œå¯¼å‡ºã€ | æ ‡é¢˜ã€Œæ­£åœ¨ç”Ÿæˆæ±‡æ€»å¤§è¡¨ã€ï¼›è¿›åº¦é€’增;按钮「保存文件(禁用)/重新生成(禁用)/后台运行」 | æ ‡é¢˜æ­£ç¡®ï¼›è¿›åº¦ 6%→45%;步骤文字「读取母版工作簿」→「刷新排名页与跨页合成页」;按钮状态与预期一致 | é€šè¿‡ |
| T02 | å®ŒæˆåŽè‡ªåŠ¨ä¸‹è½½ + æç¤ºï¼ˆæ­£å‘) | ç­‰å¾…任务结束 | æ ‡é¢˜å˜ã€Œæ±‡æ€»å¤§è¡¨å·²ç”Ÿæˆã€ï¼›æ˜¾ç¤ºã€Œå·²è‡ªåŠ¨ä¸‹è½½ï¼šæ–‡ä»¶åï¼ˆå¤§å°ï¼‰ã€ï¼›æŒ‰é’®å˜ã€Œå†æ¬¡ä¸‹è½½/重新生成/关闭」 | è¿›åº¦ 100%、「完成」、已用 13.5 ç§’;提示「已自动下载:生成_道路运输量汇总表_2026-08.xlsx ï¼ˆ1.15 MB)」;按钮已变更 | é€šè¿‡ |
| T03 | å®ŒæˆåŽ**不再提供下载按钮**(正向,核心) | ä»»åŠ¡å®Œæˆ | åº•部只有「重新生成 / å…³é—­ã€ | åº•部按钮为「重新生成 / å…³é—­ã€ï¼Œæ— ä¸‹è½½æŒ‰é’® | é€šè¿‡ |
| T04 | å…³é—­æŒ‰é’®ï¼ˆæ­£å‘) | ç‚¹ã€Œå…³é—­ã€ | å¼¹çª—消失、列表页可继续操作 | `.el-dialog__wrapper` display=none,列表正常 | é€šè¿‡ |
| T05 | æŽ§åˆ¶å°æ— æŠ¥é”™ï¼ˆå›žå½’) | è¯»å– dev logs(error/warn) | æ— æ–°å¢žé”™è¯¯ | 0 æ¡ | é€šè¿‡ |
| T06 | å…¶å®ƒæŠ¥è¡¨å¯¼å‡ºè·¯å¾„未受影响(回归,静态) | â€”— | å•å¼ /批量导出仍走原 `downloadBlob` | æœ¬æ¬¡åªæ”¹æ±‡æ€»å¤§è¡¨å¼‚步任务分支,`exportChecked` ä¸­å…¶å®ƒåˆ†æ”¯æœªåЍ | é€šè¿‡ï¼ˆé™æ€ï¼‰ |
## å››ã€å‘现的问题与处置
| # | é—®é¢˜ | å¤„ç½® |
| --- | --- | --- |
| P1 | å¼¹çª—标题与按钮文案和真实状态不符(已完成仍写「正在生成」;已自动下载仍写「保存文件」) | å·²ä¿®ï¼ˆæ ‡é¢˜éšçŠ¶æ€ã€æŒ‰é’®æ–‡æ¡ˆéšä¸‹è½½çŠ¶æ€ï¼‰ |
| P2 | åŒä¸€ä»½æ–‡ä»¶è¢«é‡å¤ä¸‹è½½/重复请求后端(1.15 MB) | å·²ä¿®ï¼šè‡ªåŠ¨ä¸‹è½½åŽä¸å†æ˜¾ç¤ºä¸‹è½½æŒ‰é’®ï¼Œä»Žæ ¹ä¸Šæ¶ˆé™¤é‡å¤ä¸‹è½½ï¼›è‡ªåŠ¨ä¸‹è½½å¤±è´¥æ—¶æ‰å‡ºçŽ°ã€Œä¿å­˜æ–‡ä»¶ã€å…œåº• |
| P3 | éªŒè¯æ–¹æ³•记录:Element UI æœˆä»½é€‰æ‹©æ¡†æ˜¯ **readonly** è¾“入框,自动化不能用 fill/type,必须先点开弹层再选月份;`setValue` å¯¹è¯¥æŽ§ä»¶æ— æ•ˆ | ä»…记录为测试方法备注,非系统缺陷 |
## äº”、结论
- å¼¹çª—现在能明确告诉用户「已自动下载了什么文件、多大」,按钮语义与行为一致(「再次下载」= å†å­˜ä¸€ä»½ï¼Œèµ°æœ¬åœ°ç¼“存);
- é‡å¤ä¸‹è½½ä¸å†é‡å¤è¯·æ±‚后端,体验与带宽都改善;
- ç”Ÿæˆä¸­/已完成/失败三种状态在标题、进度、按钮上都有区分;
- æµè§ˆå™¨ç«¯å®žæµ‹ 6 æ¡ç”¨ä¾‹é€šè¿‡ï¼Œæ— æŽ§åˆ¶å°æŠ¥é”™ã€‚
测试人:Codex(AI) 测试日期:2026-09-22
## å…­ã€å˜æ›´è®°å½•(用户反馈后调整)
| ç‰ˆæœ¬ | è¡Œä¸º | è¯´æ˜Ž |
| --- | --- | --- |
| v1(09-22 ä¸Šåˆï¼‰ | å®ŒæˆåŽè‡ªåŠ¨ä¸‹è½½ä¸€æ¬¡ï¼ŒæŒ‰é’®å˜ã€Œå†æ¬¡ä¸‹è½½ã€ï¼ˆèµ°å†…å­˜ç¼“å­˜ï¼Œ0 è¯·æ±‚) | è§£å†³äº†ã€Œé‡å¤è¯·æ±‚后端」,但用户反馈:**「已经下载过了就不需要了,为什么还要有一个再次下载」** |
| **v2(09-22 ä¸‹åˆï¼Œæœ€ç»ˆï¼‰** | å®ŒæˆåŽè‡ªåŠ¨ä¸‹è½½ä¸€æ¬¡ï¼Œ**底部只保留「重新生成 / å…³é—­ã€**;仅当自动下载失败(`taskDownloaded=false`)时才显示「保存文件」兜底按钮 | å·²åˆ é™¤ã€Œå†æ¬¡ä¸‹è½½ã€æŒ‰é’®ä¸Žå†…å­˜ Blob ç¼“存;提示语改为「已自动下载:<文件名>(<大小>),文件在浏览器默认下载目录。」 |
**v2 æµè§ˆå™¨å¤éªŒ**(admin/123456,2026-08,未命中缓存 13.6 ç§’):生成中底部为「重新生成(禁用)/后台运行」;完成后标题「汇总大表已生成」、提示「已自动下载:生成_道路运输量汇总表_2026-08.xlsx ï¼ˆ1.15 MB),文件在浏览器默认下载目录。」、底部为「重新生成/**关闭**」;控制台 0 æŠ¥é”™ï¼›ç‚¹ã€Œå…³é—­ã€åŽå¼¹çª— `display:none`。
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
New file
@@ -0,0 +1,200 @@
# å·¥ä½œæ—¥ç»“_2026-09-22
## ä¸€ã€ä»Šå¤©åšäº†ä»€ä¹ˆ
### 1. æ•°æ®æŸ¥çœ‹é¡µè¡¥é½ç½‘约车与个体客运类型("能导入就能看")
用户诉求:数据查看的数据类型应做到"能导入什么数据就能看到什么数据",用于核对导入是否完整。
原先网约车总数、网约车订单、个体客运三张表**有导入接口和模板但没有查看入口**,导入后只能查数据库。
- åŽç«¯ `DataViewController`:新增 `wycTotal` / `wycOrder` / `passengerIndividual` ä¸‰ä¸ªåˆ†æ”¯ + ä¸‰ç»„列定义 + ä¸‰ä¸ª Mapper æ³¨å…¥ï¼›
  `passengerIndividual` ç”¨ `RegionUtil.cityByCode` æŠŠ 6 ä½åŒºåˆ’代码派生为"市州"列(如 420900 â†’ å­æ„Ÿå¸‚)。
- å‰ç«¯ `DataView.vue`:公路旅客模块加"个体客运量/周转量",城市客运模块加"网约车总数""网约车订单及全省总量"(订单表 23 åˆ—,17 å¸‚州各一列,保持与导入文件列序一致)。
### 2. è·¨æœŸ"按市州汇总"的口径调研 + æ ·ä¾‹
- ç”Ÿæˆæ ·ä¾‹ `D:\桌面\按市州汇总_2026å¹´1-8月累计_样例.xlsx`:公交、巡游出租、货运规上企业三张表,17 å¸‚å·ž + å…¨çœåˆè®¡è¡Œ + "口径说明"页。
- æ ¸å®žå„表月值口径为**当月值**(公交 2025 å„月全省 1.2~1.5 äº¿äººæ¬¡é‡çº§ï¼‰ï¼Œæ•…跨期汇总按列性质分三类:
  - æµé‡ç±»ï¼ˆå®¢è¿é‡/周转量/货运量/订单数)→ æ±‚和;
  - æ—¶ç‚¹ç±»ï¼ˆè¿è¥è½¦è¾†æ•°/营运车辆数/企业数)→ å–期末(武汉公交 2026 å„月 8476→7861,逐月相加得 64879 è¾†ï¼Œå®žé™… 8 æœˆæœ«ä»… 7861 è¾†ï¼‰ï¼›
  - æ¯”率类(环比/同比/平均运距/占比)→ æŒ‰ç´¯è®¡å£å¾„重算。
- è´§è¿ä¼ä¸šè¡¨çš„市州由 6 ä½åŒºåˆ’代码前 4 ä½å½’并(4290xx ç›´ç®¡å¸‚按 6 ä½ä¼˜å…ˆï¼‰ï¼Œ17 å¸‚州全部识别,无"未识别"。
### 3. æ ¸æŸ¥"数据查看已加汇总功能"的现状
用户在别处看到"汇总"按钮,实际核查:前端 `DataView.vue` å…¨æ–‡æ— "汇总/导出"(`ReportExport.vue` æ‰æœ‰ï¼‰ï¼ŒåŽç«¯åªæœ‰ `/api/data/list`,全仓 + `traffic-audit-web/dist` + éƒ¨ç½² jar + gitea è¿œç«¯ `main` å‡æ— ç›¸å…³ä»£ç ã€‚已向用户说明,按"尚未实现、由本仓实现"推进。
### 4. æ±‡æ€»å¤§è¡¨è¿›åº¦å¼¹çª—优化(用户:"保存"会导致再下载一次)
- **根因**:任务完成时会自动下载一次,但弹窗底部仍挂着「保存文件」按钮,点它会再次请求后端拿同一份文件并第二次下载;同时标题/按钮文案不随状态变化。
- **改动**(`traffic-audit-web/src/views/ReportExport.vue`):
  1. å®ŒæˆåŽæ˜¾ç¤ºã€Œå·²è‡ªåŠ¨ä¸‹è½½ï¼š<文件名>(<大小>)」+ æç¤ºå¯ç‚¹ã€Œå†æ¬¡ä¸‹è½½ã€ï¼ˆæœ¬åœ°ç¼“存,不再请求服务器);
  2. æŒ‰é’®æ–‡æ¡ˆéšçŠ¶æ€ï¼šå†æ¬¡ä¸‹è½½ / ä¸‹è½½ / ä¿å­˜æ–‡ä»¶ï¼ˆç”Ÿæˆä¸­ç¦ç”¨ï¼‰ï¼›
  3. é¦–次下载后把 Blob å­˜å†…存,重复保存 **0 è¯·æ±‚**;
  4. å¼¹çª—标题随状态:正在生成 / **已生成** / ç”Ÿæˆå¤±è´¥ï¼›å®Œæˆæ€ä¸»æŒ‰é’®æ”¹ä¸ºã€Œå…³é—­ã€ï¼›
  5. æ¯æ¬¡æ–°ä»»åŠ¡é‡ç½® `taskDownloaded/taskFileName/taskFileSize/taskBlob`。
- **浏览器实测**(admin/123456,2026-08):生成 13.5 ç§’、产物 1.15 MB;完成后标题「汇总大表已生成」、提示「已自动下载:生成_道路运输量汇总表_2026-08.xlsx ï¼ˆ1.15 MB)」;控制台 0 æŠ¥é”™ã€‚
- **用户反馈后改 v2**:「已经下载过了就不需要再次下载」→ åˆ æŽ‰ã€Œå†æ¬¡ä¸‹è½½ã€æŒ‰é’®ä¸Žå†…存缓存,**完成后底部只留「重新生成 / å…³é—­ã€**;仅当自动下载失败时才出现「保存文件」兜底。复验:生成中「重新生成(禁用)/后台运行」→ å®ŒæˆåŽã€Œé‡æ–°ç”Ÿæˆ/关闭」,提示语为「已自动下载:…,文件在浏览器默认下载目录。」,13.6 ç§’、控制台 0 æŠ¥é”™ã€‚
### 5. æ•°æ®æŸ¥çœ‹ä½“验优化(第二轮,用户当日反馈)
用户三点反馈:①跨期汇总时点列怎么处理——决定**不放时点列**;②横向滚动时看不到企业名称;③数据类型做成下拉框更简洁。
- **数据类型改为分组单下拉框**:去掉"模块单选按钮 + ç±»åž‹ä¸‹æ‹‰"两级结构,合并为一个 `el-select`(按 5 ä¸ªæ¨¡å—分组、支持输入搜索),切换类型时同步 `activeModule`。
- **左侧冻结标识列**:`renderColumns` æŒ‰è¡¨è‡ªé€‚应冻结 `报表期/所属地区/市州/企业名称` ç­‰å‰å¯¼åˆ—(此实现 09:56 å·²è½åœ¨å·¥ä½œåŒºä½†æœªæäº¤ï¼Œæœ¬æ¬¡çœŸæœºéªŒè¯åŽä¸€å¹¶æäº¤ï¼‰ã€‚
- **跨期汇总口径定稿**:流量列求和、时点列不参与汇总且不显示、比率列按累计口径重算。
### 6. æ•°æ®æŸ¥çœ‹å±•示优化(第三轮,用户复核反馈 4 ç‚¹ï¼‰
- **下拉分组标题**:改成 13px/700/深色+浅底(原为 Element UI é»˜è®¤ 12px ç°å­—),`popper-class` ç²¾ç¡®å‘½ä¸­ï¼›
- **隐藏报表期与所属地区**,冻结区收窄为"市州/地区 + ä¼ä¸šåç§°/项目名称 + å£å¾„"(最多 3 åˆ—);后端为企业类表(h2032/h2031/h204 è½¦è¾†èƒ½è€—)补派生市州列;
- **规上规下拆分空值定性**:源文件《模板_规上规下拆分运输量.xlsx》只有"周转量"列,无货运量列 â†’ ä¸‰åˆ—空属源数据形态;周转量单位核对为**万吨公里**(1,235,760.72×10000=12,357,607,239 å¨å…¬é‡Œï¼Œä¸Ž h2032 æ­¦æ±‰ 1-6 æœˆå®Œå…¨ä¸€è‡´ï¼‰ï¼›åˆ—名已标注单位;
- **网约车订单改按市州竖排**:地区(全省+17 å¸‚州)נ指标(期间/订单数/订单占比/客运量/旅客周转量/城市内两项/说明);客运量与周转量复用 `WycSplitCalc` æ‹†åˆ†å£å¾„,全省行取台账 pin;
- **市州月报进度**:连 `investment_project` è¡¥é¡¹ç›®åç§°ä¸Žå¸‚州(原表只有 project_id,页面显示数字无法辨识);
- **数值显示规范**:底层全精度不变,显示层千分位+两位小数、比率类转百分比、排名字段整数。
### 7. æ•°æ®æŸ¥çœ‹ï¼šå£å¾„上移筛选、空列隐藏、表头补单位(第四轮)
- **空列不显示**:拆分表"规上/规下/合计货运量"(源文件未提供、库内全空)不再展示,字段保留;
- **口径上移**:拆分表"口径"从表格列改为工具栏下拉(全部/当月/累计),后端 `/api/data/list` æ–°å¢ž `periodType` å‚数;切换类型自动复位;
- **表头补单位**:12 ç±»è¡¨ 60 ä½™åˆ—按库内注释/源文件核对补齐(万人次、万人公里、吨、吨公里、万吨、万吨公里、人、人公里、辆、座、公里、车次、万元、平方米、名、%);
  èƒ½è€—燃料三项库内无单位注释,标注"(按燃料单位)"未臆造。
### 8. æ•°æ®æŸ¥çœ‹ã€ŒæŒ‰å¸‚州汇总 + å¯¼å‡º Excel」落地(第五轮,主线功能)
- æ–°å¢ž `CityRollupService` + ä¸‰ä¸ªæŽ¥å£ï¼š`/api/data/rollupTypes`、`/api/data/summary`、`/api/data/export`;
- æ”¯æŒ 7 ç±»ï¼šå…¬äº¤ã€å·¡æ¸¸å‡ºç§Ÿã€è´§è¿ä¼ä¸šã€å…¬è·¯æ—…客企业、个体客运、网约车(拆分口径)、货运量周转量;
- å£å¾„:任意起止月;流量求和、**时点列不参与**、比率按累计重算(累计同比自动取上年同期);排名可选「留空 / æŒ‰ç´¯è®¡å€¼é‡æŽ’」;结果 = 17 å¸‚å·ž + å…¨çœåˆè®¡ï¼›
- å‰ç«¯ï¼šå·¥å…·æ åŠ ã€Œè§†å›¾ï¼šæ˜Žç»† / æŒ‰å¸‚州汇总」,汇总模式提供起止月、排名、汇总、导出 Excel;
- ä¿®å¤ä¸¤ä¸ªå£å¾„坑:货运量周转量表的"行内累计 + æ¹–北省合计行"重复计算(1,149,579 â†’ 130,311.89 ä¸‡å¨ï¼‰ã€ç»“束月无数据自动回退;
- ä¸Žæ‰‹å·¥æ ¸ç®—一致:公交 1-8 æœˆ 110776.34 ä¸‡äººæ¬¡ã€è´§è¿ä¼ä¸š 313,998,248 å¨ã€è´§è¿é‡å‘¨è½¬é‡ 130,311.89 ä¸‡å¨ã€‚
- æ”¶å°¾ï¼šæŒ‰ç”¨æˆ·è¦æ±‚把「全省合计」行提到最前面(武汉市之上),导出 Excel ä¸­åˆè®¡è¡ŒåŠ ç²—ã€‚
### 9. æ±‡æ€»å¤§è¡¨å¯¼å‡ºç»“果落盘缓存(用户:"下载过就不该再等很久,能不能记住上次结果")
- **背景**:原来只有「10 åˆ†é’Ÿå†… + æœŸé—´æ— æ–°å¯¼å…¥ã€çš„**内存**缓存,窗口短、重启即失效 â†’ ç¬¬äºŒæ¬¡ä¸‹è½½è¿˜è¦ç­‰ 13~17 ç§’。
- **改动**(`ReportExportTaskService.java` ä¸ºä¸»ï¼‰ï¼š
  1. ç»“æžœ**落盘**到 `docs/生成汇总大表/_cache/`,文件名 `<key>_v<数据版本>.xlsx`(数据版本=`MAX(import_batch.id)`),已加 `.gitignore`;
  2. æäº¤é¡ºåºï¼šå†…存缓存 â†’ è½ç›˜ç¼“存(同报表期 + åŒæ•°æ®ç‰ˆæœ¬ + 7 å¤©å†…)→ çœŸç®—;生成成功后写盘并删除同 key æ—§ç‰ˆæœ¬ï¼›
  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 å¯¼å‡ºæ ¸å¯¹å®žé™…表头后再更新交接文档。
## äºŒã€æµ‹è¯•结果摘要
- æŠ¥å‘Šï¼š`docs/功能测试报告/功能测试报告_数据查看补齐网约车与个体客运类型_2026-09-22.md`
- æŠ¥å‘Šï¼š`docs/功能测试报告/功能测试报告_数据查看冻结列与数据类型下拉框_2026-09-22.md`(冻结列/下拉框真机用例 12 æ¡å…¨é€šè¿‡ï¼‰
- æŠ¥å‘Šï¼š`docs/功能测试报告/功能测试报告_数据查看展示优化与网约车按市州竖排_2026-09-22.md`(接口 6 æ¡ + çœŸæœº 6 æ¡å…¨é€šè¿‡ï¼‰
- æŠ¥å‘Šï¼š`docs/功能测试报告/功能测试报告_数据查看口径筛选与表头单位_2026-09-22.md`(接口 7 æ¡ + çœŸæœº 2 æ¡å…¨é€šè¿‡ï¼‰
- æŠ¥å‘Šï¼š`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 ç±»å›žå½’正常。
## ä¸‰ã€é—留问题与待办
1. ã€å·²å®Œæˆã€‘数据查看"按市州汇总 + å¯¼å‡º Excel"(见第 8 èŠ‚ä¸Žã€ŠåŠŸèƒ½æµ‹è¯•æŠ¥å‘Š_数据查看按市州汇总与导出_2026-09-22.md》)。
2. æ±‡æ€»å£å¾„细则待业务确认:排名字段跨期需重新排名(先留空);累计同比需要自动取上年同期期间。
3. å…³é”®å­—框对无名称列的表(网约车总数、网约车订单)无效,待优化。
4. å†»ç»“列依赖"标识列连续排在前面"的列序假设,若以后调整列序/新增类型需同步维护 `stickyProps`/`nameProps`。
5. `scale_split_transport`(规上/规下拆分)288 è¡Œæ•°å€¼å…¨ä¸º NULL,若哪张报表依赖它按市州出数会取不到值,建议与同事确认导入来源。
6. Codex æ¡Œé¢ç«¯æ¨¡åž‹æ˜¾ç¤ºï¼ˆ09-21 æ™šé—留):已写 `model_catalog_json` æ¸…单,待用户重启客户端确认界面显示 `deepseek-flash`。
## å››ã€æ˜Žå¤©è®¡åˆ’
1. å¼€å·¥"按市州汇总 + å¯¼å‡º Excel":后端加 `/api/data/summary` ä¸Ž `/api/data/export`,前端加"明细/汇总"切换与导出按钮。
2. æ±‡æ€»ç»“果与报表/手工作业抽样核对(1-8 æœˆå…¬äº¤ã€å·¡æ¸¸å‡ºç§Ÿã€è´§è¿è§„上企业)。
## äº”、Codex æ¡Œé¢ç«¯è¾“入卡顿复核(2026-09-22)
- æŒ‰ 09-21 çš„修复方案,用户重启电脑和 Codex åŽå¤æ ¸ã€‚
- è¿›ç¨‹ï¼šChatGPT äºŽ 2026-09-22 12:54 æ–°å¯åŠ¨ï¼›ä¿®å¤è„šæœ¬ `fix-codex-typing-retry-storm.js` å­˜åœ¨ä¸” `user_scripts.json` ä»ä¸º `enabled=true`。
- æ€§èƒ½ï¼šä¸»æ¸²æŸ“进程(PID 7044)连续 10 ç§’采样约 `13.28%` å•核;修复前约 `115%` å•核。
- å®ˆå«ï¼šè°ƒè¯•端口 9229 è¯»å– `window.__codexPlusRetryTimerGuardInstalled=true`,本次会话 `window.__codexPlusRetryTimerGuardDropped=16`。
- ç»“论:输入卡顿修复在重启后仍生效,问题已解决。
## å…­ã€æŠ•资明细表「软件生成 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` è¾“出。
## ä¸ƒã€æŠ•资明细表取数修复(第一轮,已编译/重启/端到端验证)
按第六节比对结论动手修了三处"会静默出数"的取数缺陷,并顺带端到端暴露+修复了潜江导入选错历史页签。
- **导出**(`ReportExportService.java`):
  1. `normInvestName()` å½’一化补标点(半/全角句点、顿号、分号等)→ è†å·žã€Œä¸­å›½ä¾›é”€.公安商贸物流园」可匹配,写入库内 15986/15986/8227.5;
  2. æ–°å¢ž `preferMonthlyCandidate()`:同名多档优先取「当月有数据」的档 â†’ åå °ã€Œå¿«é€’物流产业园二期」改取 id=181,写入 20377/3196/296、竣工 2029;
  3. æ–°å¢ž `logSkippedRows()`:未覆盖行逐行 WARN(`[未覆盖] ç¬¬N行 å¸‚å·ž é¡¹ç›®å â†’ åŽŸå› ` + æŒ‰å¸‚州统计),不再静默结转上期值。
- **导入**(`DataImportService.java`):
  1. `investHeaderKey()` å…ˆåŽ»å…¨éƒ¨ç©ºç™½ï¼ˆå«æ¢è¡Œ/全角空格)再判定关键词 â†’ å¤©é—¨ H/J/K ä¸‰åˆ—恢复识别,2026-08 å…¥åº“ 16677.7/16677.7/500(原为 0/0/0);
  2. æ–°å¢ž `investSheetPeriodCellHit()` + è¯„分加权 2000000:按表内报表期(`2026.08.24`)选 sheet,优先于「sheet åå«åŒæœˆã€â†’ æ½œæ±Ÿä¸å†æŠŠ **2018 å¹´**「潜江(8月)」当 2026-08,重导后 2026-08 å…¥åº“「中国虾谷冷链仓储物流园」11947.9/1135/0。
- **验证**:`mvn -o compile` é€šè¿‡ï¼›åœæ—§èµ·æ–°åŽç«¯ï¼ˆ8090 å°±ç»ªï¼‰ï¼›æŽ¥å£é‡å¯¼ + é‡è·‘ 2026-08 å¯¼å‡ºï¼›é€æ ¼æ¯”对**156 æ ¼ â†’ 129 æ ¼**(降 27 æ ¼ï¼šç‰©æµåˆ†é¡¹ç›® 108→91、分市州 15→11、市州汇总 17→11),无新增差异。
- **未覆盖清单(新增能力,来自日志)**:物流 6 è¡Œï¼ˆå…¨éƒ¨æ­¦æ±‰ï¼Œåº“内无当月数据);客运 12 è¡Œï¼ˆé»„石 1「阳新综合客运枢纽站」、黄冈 9、恩施 1「咸丰县坪坝营旅游客运站」、仙桃 1「仙桃市毛嘴客运站」)。
- **报告**:`docs/功能测试报告/功能测试报告_投资明细表取数修复_2026-09-22.md`。
- **遗留(需拍板/补数)**:① L/D/E/F æ˜¯å¦æŒ‰å½“月覆盖(需《建设阶段归一表》);② æ­¦æ±‰ç‰©æµã€é»„冈客运 8 æœˆæºæ•°æ®ç¼ºå¤±ï¼›â‘¢ æ½œæ±Ÿ 2026-06/07 æœˆåº¦ä»æ˜¯åŽ†å² sheet é”™å€¼ï¼Œéœ€ç”¨ 6/7 æœˆæºè¡¨é‡å¯¼ï¼ˆ**不要**用 8 æœˆæ–‡ä»¶é‡å¯¼ï¼‰ï¼›â‘£ æœªè¦†ç›–清单目前只进日志,建议按 P1-9 å‡ºã€Šæ ¡éªŒæŠ¥é”™_<年月>.xlsx》或页面提示。
- **数据变更**:仅重导修正了天门、潜江两处 2026-08 æœˆåº¦å€¼ï¼Œæœªåˆ é™¤ä»»ä½•项目主档、未动其他市州/期间;临时脚本与产物保留(`_tmp_*_0922.*`、`_tmp/gen_new_0922/`)。
## å…«ã€æ±‡æ€»å¤§è¡¨è½¯ä»¶è¾“出与手工定稿差异复核(2026-08)
- æ¯”对文件:软件输出 `生成_道路运输量汇总表_2026-08 (5).xlsx`,手工定稿 `2026å¹´8月客运量、货运量定稿.xlsx`。
- æ–¹æ³•:先用 Excel COM å¯¹ä¸¤ä»½å‰¯æœ¬å…¨é‡é‡ç®—,再按页签、数据块、行标签、列头做语义对齐后逐格比对,避免读取 XLSX æ—§ç¼“存造成 `#VALUE!` å‡å·®å¼‚。
- ç»“果:930 æ¡é€æ ¼å·®å¼‚中,实质数值差异 314 æ¡ã€‚其中 304 æ¡æ˜¯å…¬äº¤/出租/网约车/中口径明细的 2025 ç´¯è®¡åˆ—少加 7、8 æœˆï¼Œä¸šåŠ¡å·²ç¡®è®¤è¯¥åˆ—å¯æ¸…ç©ºï¼›å¦ 10 æ¡æ˜¯ ` è´§è¿` 2022 å¹´ç´¯è®¡åŒæ¯”,业务已确认软件正确。
- å…¶ä½™å·®å¼‚:文本型数字 286 æ¡ã€å–整尾差 194 æ¡ã€ä»…软件有值 129 æ¡ã€ä»…手工有值 2 æ¡ã€é”™è¯¯å€¼ 2 æ¡ã€æ–‡æœ¬ä¸åŒ 2 æ¡ã€ç±»åž‹ä¸åŒ 1 æ¡ã€‚
- ç»“构差异:城市汇总/城市分市州/中口径分析/中口径排名存在软件多出的 8 æœˆå—或不同布局;两个货运排名页签块顺序相反;城市客运手工多一列 AJ;道路运输周转量手工多 AA/AB ç©ºåˆ—。可比业务数据均已逐块对齐核对。
- ä¸Šç‰ˆæŠ¥å‘Šä¸­çš„ `班线包车` 2019、2020 å¹´åŽ†å²å— `#VALUE!` ç»é‡ç®—确认是缓存假差异,本次已剔除。
- äº¤ä»˜ï¼š`docs/问题汇总/汇总大表_软件输出与手工定稿差异清单_2026-08_20260922.md`,逐格明细 `docs/问题汇总/汇总大表_差异明细_2026-08_20260922.csv`。
## ä¹ã€å…³æœºäº¤æŽ¥å¿«ç…§ï¼ˆ2026-09-22 17:20)
- **git**:拉取并合并公司仓库最新 `db0ee92`(投资明细取数/导入修复 + æ—¥ç»“第七/八节);合并后本地编译 `mvn -q -DskipTests compile` é€šè¿‡ã€‚关机前将 HANDOFF、本日结快照提交并推送 `origin/main`。
- **运行状态**:dev åŽç«¯ `8090`、前端 `8080` å‡æœªè¿è¡Œï¼Œæœªå‘现对应 Java/Node è¿›ç¨‹ï¼›`backend.log` æœ€åŽå†™å…¥ 09-21 17:29,`frontend.log` æœ€åŽå†™å…¥ 09-21 17:36。MySQL80(`3305`)、MySQL57(`3306`) Running,关机后自动停止,无需手工处理。
- **下次启动**:项目根目录执行 `powershell -NoProfile -ExecutionPolicy Bypass -File start-dev.ps1`;数据库和生成缓存已持久化。
- **保留产物**:汇总大表差异报告/CSV、投资 156→129 æ ¼æŠ¥å‘Šã€`_tmp*_0922.*` ä¸Ž `_tmp/gen_new_0922/` ç­‰å‡ä¿ç•™ï¼Œæœªç»ç¡®è®¤ä¸åˆ é™¤ã€‚
- **下次优先**:P0-2《亿元投资项目》按 Q7 è¿½åˆ—、P0-3 å¯¼å‡ºå‰åŸºæ•°ä½“检、P0-4 2026-09 æ¯ç‰ˆï¼›æŠ•资遗留需补武汉物流/黄冈客运 8 æœˆæºæ•°æ®ã€é‡å¯¼æ½œæ±Ÿ 2026-06/07 åŽ†å²é”™å€¼ã€å°†æœªè¦†ç›–æ¸…å•è½æ–‡ä»¶æˆ–é¡µé¢ã€‚
docs/ÎÊÌâ»ã×Ü/»ã×Ü´ó±í_²îÒìÃ÷ϸ_2026-08_20260922.csv
New file
@@ -0,0 +1,931 @@
sheet,kind,rlab,chdr,pc,mc,pv,mv,typ
公交,数据,全省|客运量(万人次),,U5,U5,88908.90999999999,114285.68,数值差异
公交,数据,全省|旅客周转量(万人公里),,U6,U6,601850.32,774997.32,数值差异
公交,数据,全省|其中城市内客运量(万人次),,U7,U7,81324.48,104006.93,数值差异
公交,数据,全省|其中城市内旅客周转量(万人公里),,U8,U8,407371.23000000004,522761.21,数值差异
公交,数据,武汉|客运量(万人次),46174,M9,M9,4970.63,'4970.63',格式差异(文本型数字)
公交,数据,武汉|客运量(万人次),,U9,U9,30315.319999999996,38419.829999999994,数值差异
公交,数据,武汉|旅客周转量(万人公里),46174,M10,M10,26403.98,'26403.98',格式差异(文本型数字)
公交,数据,武汉|旅客周转量(万人公里),,U10,U10,160320.99,203544.41999999998,数值差异
公交,数据,武汉|其中城市内客运量(万人次),46174,M11,M11,4946.860000000001,'4946.86',格式差异(文本型数字)
公交,数据,武汉|其中城市内客运量(万人次),,U11,U11,30187.77,38245.189999999995,数值差异
公交,数据,武汉|其中城市内旅客周转量(万人公里),46082,G12,G12,27097.570000000003,'27097.57',格式差异(文本型数字)
公交,数据,武汉|其中城市内旅客周转量(万人公里),46174,M12,M12,25809.77,'25809.77',格式差异(文本型数字)
公交,数据,武汉|其中城市内旅客周转量(万人公里),,U12,U12,156976.42,199239.31,数值差异
公交,数据,黄石|客运量(万人次),46174,M13,M13,1010.85,'1010.85',格式差异(文本型数字)
公交,数据,黄石|客运量(万人次),,U13,U13,6733.38,8645.890000000001,数值差异
公交,数据,黄石|旅客周转量(万人公里),46174,M14,M14,7802.040000000001,'7802.04',格式差异(文本型数字)
公交,数据,黄石|旅客周转量(万人公里),,U14,U14,51860.46,66620.81999999999,数值差异
公交,数据,黄石|其中城市内客运量(万人次),46174,M15,M15,874.9499999999999,'874.95',格式差异(文本型数字)
公交,数据,黄石|其中城市内客运量(万人次),,U15,U15,6176.280000000001,7884.790000000001,数值差异
公交,数据,黄石|其中城市内旅客周转量(万人公里),46082,G16,G16,5513.96,'5513.96',格式差异(文本型数字)
公交,数据,黄石|其中城市内旅客周转量(万人公里),46174,M16,M16,4892.91,'4892.91',格式差异(文本型数字)
公交,数据,黄石|其中城市内旅客周转量(万人公里),,U16,U16,29098.950000000004,37163.600000000006,数值差异
公交,数据,十堰|客运量(万人次),46174,M17,M17,1404.69,'1404.69',格式差异(文本型数字)
公交,数据,十堰|客运量(万人次),,U17,U17,8209.25,10619.96,数值差异
公交,数据,十堰|旅客周转量(万人公里),46174,M18,M18,8271.86,'8271.86',格式差异(文本型数字)
公交,数据,十堰|旅客周转量(万人公里),,U18,U18,50924.43,66167.43000000001,数值差异
公交,数据,十堰|其中城市内客运量(万人次),46174,M19,M19,1279.8300000000002,'1279.83',格式差异(文本型数字)
公交,数据,十堰|其中城市内客运量(万人次),,U19,U19,7510.09,9702.45,数值差异
公交,数据,十堰|其中城市内旅客周转量(万人公里),46082,G20,G20,5431.489999999999,'5431.49',格式差异(文本型数字)
公交,数据,十堰|其中城市内旅客周转量(万人公里),46174,M20,M20,5732.650000000001,'5732.65',格式差异(文本型数字)
公交,数据,十堰|其中城市内旅客周转量(万人公里),,U20,U20,35238.09,45727.51,数值差异
公交,数据,宜昌|客运量(万人次),46174,M21,M21,1134.97,'1134.97',格式差异(文本型数字)
公交,数据,宜昌|客运量(万人次),,U21,U21,6479.9800000000005,8384.43,数值差异
公交,数据,宜昌|旅客周转量(万人公里),46174,M22,M22,4519.92,'4519.92',格式差异(文本型数字)
公交,数据,宜昌|旅客周转量(万人公里),,U22,U22,24379.8,31682.64,数值差异
公交,数据,宜昌|其中城市内客运量(万人次),46174,M23,M23,1092,'1092.00',格式差异(文本型数字)
公交,数据,宜昌|其中城市内客运量(万人次),,U23,U23,6208.870000000001,8032.93,数值差异
公交,数据,宜昌|其中城市内旅客周转量(万人公里),46082,G24,G24,2887.33,'2887.33',格式差异(文本型数字)
公交,数据,宜昌|其中城市内旅客周转量(万人公里),46174,M24,M24,3412.92,'3412.92',格式差异(文本型数字)
公交,数据,宜昌|其中城市内旅客周转量(万人公里),,U24,U24,19322.38,24984.640000000003,数值差异
公交,数据,襄阳|客运量(万人次),46174,M25,M25,1556.7799999999997,'1556.78',格式差异(文本型数字)
公交,数据,襄阳|客运量(万人次),,U25,U25,9550.51,12351.300000000001,数值差异
公交,数据,襄阳|旅客周转量(万人公里),46174,M26,M26,10216.330000000002,'10216.33',格式差异(文本型数字)
公交,数据,襄阳|旅客周转量(万人公里),,U26,U26,62315.19,80614.21,数值差异
公交,数据,襄阳|其中城市内客运量(万人次),46174,M27,M27,1362.5800000000002,'1362.58',格式差异(文本型数字)
公交,数据,襄阳|其中城市内客运量(万人次),,U27,U27,8757.59,11183.39,数值差异
公交,数据,襄阳|其中城市内旅客周转量(万人公里),46082,G28,G28,6177.57,'6177.57',格式差异(文本型数字)
公交,数据,襄阳|其中城市内旅客周转量(万人公里),46174,M28,M28,6784.790000000001,'6784.79',格式差异(文本型数字)
公交,数据,襄阳|其中城市内旅客周转量(万人公里),,U28,U28,47617.99,59703,数值差异
公交,数据,鄂州|客运量(万人次),46174,M29,M29,197.85999999999996,'197.86',格式差异(文本型数字)
公交,数据,鄂州|客运量(万人次),,U29,U29,1367.9,1740.31,数值差异
公交,数据,鄂州|旅客周转量(万人公里),46174,M30,M30,1231.8200000000002,'1231.82',格式差异(文本型数字)
公交,数据,鄂州|旅客周转量(万人公里),,U30,U30,8657.67,10961.47,数值差异
公交,数据,鄂州|其中城市内客运量(万人次),46174,M31,M31,186.48,'186.48',格式差异(文本型数字)
公交,数据,鄂州|其中城市内客运量(万人次),,U31,U31,1270.81,1610.99,数值差异
公交,数据,鄂州|其中城市内旅客周转量(万人公里),46082,G32,G32,1282.2099999999998,'1282.21',格式差异(文本型数字)
公交,数据,鄂州|其中城市内旅客周转量(万人公里),46174,M32,M32,1095.5,'1095.50',格式差异(文本型数字)
公交,数据,鄂州|其中城市内旅客周转量(万人公里),,U32,U32,7298.0199999999995,9192.599999999999,数值差异
公交,数据,荆门|客运量(万人次),46174,M33,M33,575.43,'575.43',格式差异(文本型数字)
公交,数据,荆门|客运量(万人次),,U33,U33,3537.35,4586.0199999999995,数值差异
公交,数据,荆门|旅客周转量(万人公里),46174,M34,M34,2960.0599999999995,'2960.06',格式差异(文本型数字)
公交,数据,荆门|旅客周转量(万人公里),,U34,U34,18125.48,23504.95,数值差异
公交,数据,荆门|其中城市内客运量(万人次),46174,M35,M35,563.61,'563.61',格式差异(文本型数字)
公交,数据,荆门|其中城市内客运量(万人次),,U35,U35,3494.46,4522.36,数值差异
公交,数据,荆门|其中城市内旅客周转量(万人公里),46082,G36,G36,2764.2200000000003,'2764.22',格式差异(文本型数字)
公交,数据,荆门|其中城市内旅客周转量(万人公里),46174,M36,M36,2881.5,'2881.50',格式差异(文本型数字)
公交,数据,荆门|其中城市内旅客周转量(万人公里),,U36,U36,17856.079999999998,23107.149999999998,数值差异
公交,数据,孝感|客运量(万人次),46174,M37,M37,458.55,'458.55',格式差异(文本型数字)
公交,数据,孝感|客运量(万人次),,U37,U37,2369.51,3200.3900000000003,数值差异
公交,数据,孝感|旅客周转量(万人公里),46174,M38,M38,4957.09,'4957.09',格式差异(文本型数字)
公交,数据,孝感|旅客周转量(万人公里),,U38,U38,26322.71,35409.69,数值差异
公交,数据,孝感|其中城市内客运量(万人次),46174,M39,M39,286.03999999999996,'286.04',格式差异(文本型数字)
公交,数据,孝感|其中城市内客运量(万人次),,U39,U39,1550.33,2086.77,数值差异
公交,数据,孝感|其中城市内旅客周转量(万人公里),46082,G40,G40,1667.98,'1667.98',格式差异(文本型数字)
公交,数据,孝感|其中城市内旅客周转量(万人公里),46174,M40,M40,1772.35,'1772.35',格式差异(文本型数字)
公交,数据,孝感|其中城市内旅客周转量(万人公里),,U40,U40,9608.54,12932.240000000002,数值差异
公交,数据,荆州|客运量(万人次),46174,M41,M41,772.29,'772.29',格式差异(文本型数字)
公交,数据,荆州|客运量(万人次),,U41,U41,4661.59,5979.490000000001,数值差异
公交,数据,荆州|旅客周转量(万人公里),46174,M42,M42,4305.03,'4305.03',格式差异(文本型数字)
公交,数据,荆州|旅客周转量(万人公里),,U42,U42,26044.6,33407.07,数值差异
公交,数据,荆州|其中城市内客运量(万人次),46174,M43,M43,763.9899999999999,'763.99',格式差异(文本型数字)
公交,数据,荆州|其中城市内客运量(万人次),,U43,U43,4604.8,5907.1,数值差异
公交,数据,荆州|其中城市内旅客周转量(万人公里),46082,G44,G44,4404.919999999999,'4404.92',格式差异(文本型数字)
公交,数据,荆州|其中城市内旅客周转量(万人公里),46174,M44,M44,4201.97,'4201.97',格式差异(文本型数字)
公交,数据,荆州|其中城市内旅客周转量(万人公里),,U44,U44,25326.47,32489.149999999998,数值差异
公交,数据,黄冈|客运量(万人次),46174,M45,M45,668.3100000000001,'668.31',格式差异(文本型数字)
公交,数据,黄冈|客运量(万人次),,U45,U45,3851.6499999999996,5042.73,数值差异
公交,数据,黄冈|旅客周转量(万人公里),46174,M46,M46,9071.52,'9071.52',格式差异(文本型数字)
公交,数据,黄冈|旅客周转量(万人公里),,U46,U46,48939.63,65135.149999999994,数值差异
公交,数据,黄冈|其中城市内客运量(万人次),46174,M47,M47,411.33,'411.33',格式差异(文本型数字)
公交,数据,黄冈|其中城市内客运量(万人次),,U47,U47,2513.66,3248.4999999999995,数值差异
公交,数据,黄冈|其中城市内旅客周转量(万人公里),46082,G48,G48,3561.770000000001,'3561.77',格式差异(文本型数字)
公交,数据,黄冈|其中城市内旅客周转量(万人公里),46174,M48,M48,3579.67,'3579.67',格式差异(文本型数字)
公交,数据,黄冈|其中城市内旅客周转量(万人公里),,U48,U48,14336.200000000003,20227.800000000003,数值差异
公交,数据,咸宁|客运量(万人次),46174,M49,M49,687.86,'687.86',格式差异(文本型数字)
公交,数据,咸宁|客运量(万人次),,U49,U49,4108.889999999999,5286.959999999999,数值差异
公交,数据,咸宁|旅客周转量(万人公里),46174,M50,M50,7012.860000000001,'7012.86',格式差异(文本型数字)
公交,数据,咸宁|旅客周转量(万人公里),,U50,U50,48474.18,60495.15,数值差异
公交,数据,咸宁|其中城市内客运量(万人次),46174,M51,M51,503.53000000000003,'503.53',格式差异(文本型数字)
公交,数据,咸宁|其中城市内客运量(万人次),,U51,U51,3283.4700000000003,4199.64,数值差异
公交,数据,咸宁|其中城市内旅客周转量(万人公里),46082,G52,G52,2686.3300000000004,'2686.33',格式差异(文本型数字)
公交,数据,咸宁|其中城市内旅客周转量(万人公里),46174,M52,M52,2536.8500000000004,'2536.85',格式差异(文本型数字)
公交,数据,咸宁|其中城市内旅客周转量(万人公里),,U52,U52,15405.09,20003.82,数值差异
公交,数据,随州|客运量(万人次),46174,M53,M53,165.69,'165.69',格式差异(文本型数字)
公交,数据,随州|客运量(万人次),,U53,U53,1118.96,1416.8200000000002,数值差异
公交,数据,随州|旅客周转量(万人公里),46174,M54,M54,1176.08,'1176.08',格式差异(文本型数字)
公交,数据,随州|旅客周转量(万人公里),,U54,U54,8018.57,10144.04,数值差异
公交,数据,随州|其中城市内客运量(万人次),46174,M55,M55,135.47,'135.47',格式差异(文本型数字)
公交,数据,随州|其中城市内客运量(万人次),,U55,U55,913.4,1155.86,数值差异
公交,数据,随州|其中城市内旅客周转量(万人公里),46082,G56,G56,738.11,'738.11',格式差异(文本型数字)
公交,数据,随州|其中城市内旅客周转量(万人公里),46174,M56,M56,667.35,'667.35',格式差异(文本型数字)
公交,数据,随州|其中城市内旅客周转量(万人公里),,U56,U56,4510.08,5704.48,数值差异
公交,数据,恩施|客运量(万人次),46174,M57,M57,514.0499999999998,'514.05',格式差异(文本型数字)
公交,数据,恩施|客运量(万人次),,U57,U57,3069.9799999999996,4114.53,数值差异
公交,数据,恩施|旅客周转量(万人公里),46174,M58,M58,3936.6000000000004,'3936.60',格式差异(文本型数字)
公交,数据,恩施|旅客周转量(万人公里),,U58,U58,33033.39,43203.78,数值差异
公交,数据,恩施|其中城市内客运量(万人次),46174,M59,M59,415.93000000000006,'415.93',格式差异(文本型数字)
公交,数据,恩施|其中城市内客运量(万人次),,U59,U59,2629.47,3505.5699999999997,数值差异
公交,数据,恩施|其中城市内旅客周转量(万人公里),46082,G60,G60,2394.1600000000003,'2394.16',格式差异(文本型数字)
公交,数据,恩施|其中城市内旅客周转量(万人公里),46174,M60,M60,2380.29,'2380.29',格式差异(文本型数字)
公交,数据,恩施|其中城市内旅客周转量(万人公里),,U60,U60,13475.52,18393.61,数值差异
公交,数据,仙桃|客运量(万人次),46174,M61,M61,150.92000000000002,'150.92',格式差异(文本型数字)
公交,数据,仙桃|客运量(万人次),,U61,U61,1503.5900000000001,1761.3300000000002,数值差异
公交,数据,仙桃|旅客周转量(万人公里),46174,M62,M62,1165.1999999999998,'1165.20',格式差异(文本型数字)
公交,数据,仙桃|旅客周转量(万人公里),,U62,U62,11758.08,13756.59,数值差异
公交,数据,仙桃|其中城市内客运量(万人次),46174,M63,M63,127.91000000000001,'127.91',格式差异(文本型数字)
公交,数据,仙桃|其中城市内客运量(万人次),,U63,U63,1342.29,1549.73,数值差异
公交,数据,仙桃|其中城市内旅客周转量(万人公里),46082,G64,G64,864.22,'864.22',格式差异(文本型数字)
公交,数据,仙桃|其中城市内旅客周转量(万人公里),46174,M64,M64,902.48,'902.48',格式差异(文本型数字)
公交,数据,仙桃|其中城市内旅客周转量(万人公里),,U64,U64,7790.78,9214.509999999998,数值差异
公交,数据,潜江|客运量(万人次),46174,M65,M65,205.06,'205.06',格式差异(文本型数字)
公交,数据,潜江|客运量(万人次),,U65,U65,1187.71,1652.62,数值差异
公交,数据,潜江|旅客周转量(万人公里),46174,M66,M66,2112.12,'2112.12',格式差异(文本型数字)
公交,数据,潜江|旅客周转量(万人公里),,U66,U66,12233.42,17021.989999999998,数值差异
公交,数据,潜江|其中城市内客运量(万人次),46174,M67,M67,70.14,'70.14',格式差异(文本型数字)
公交,数据,潜江|其中城市内客运量(万人次),,U67,U67,427.96,590.92,数值差异
公交,数据,潜江|其中城市内旅客周转量(万人公里),46082,G68,G68,250.58,'250.58',格式差异(文本型数字)
公交,数据,潜江|其中城市内旅客周转量(万人公里),46174,M68,M68,273.55,'273.55',格式差异(文本型数字)
公交,数据,潜江|其中城市内旅客周转量(万人公里),,U68,U68,1669.06,2304.61,数值差异
公交,数据,天门|客运量(万人次),46174,M69,M69,125.94,'125.94',格式差异(文本型数字)
公交,数据,天门|客运量(万人次),,U69,U69,787.95,1007.7500000000001,数值差异
公交,数据,天门|旅客周转量(万人公里),46174,M70,M70,1454.01,'1454.01',格式差异(文本型数字)
公交,数据,天门|旅客周转量(万人公里),,U70,U70,9915.5,12612.36,数值差异
公交,数据,天门|其中城市内客运量(万人次),46174,M71,M71,62.78,'62.78',格式差异(文本型数字)
公交,数据,天门|其中城市内客运量(万人次),,U71,U71,400.77,509.84999999999997,数值差异
公交,数据,天门|其中城市内旅客周转量(万人公里),46082,G72,G72,243.76,'243.76',格式差异(文本型数字)
公交,数据,天门|其中城市内旅客周转量(万人公里),46174,M72,M72,227.97,'227.97',格式差异(文本型数字)
公交,数据,天门|其中城市内旅客周转量(万人公里),,U72,U72,1448.1,1841.49,数值差异
公交,数据,林区|客运量(万人次),46174,M73,M73,10.45,'10.45',格式差异(文本型数字)
公交,数据,林区|客运量(万人次),,U73,U73,55.38999999999999,75.32,数值差异
公交,数据,林区|旅客周转量(万人公里),46174,M74,M74,99.28,'99.28',格式差异(文本型数字)
公交,数据,林区|旅客周转量(万人公里),,U74,U74,526.22,715.5600000000001,数值差异
公交,数据,林区|其中城市内客运量(万人次),46174,M75,M75,9.38,'9.38',格式差异(文本型数字)
公交,数据,林区|其中城市内客运量(万人次),,U75,U75,52.46000000000001,70.89,数值差异
公交,数据,林区|其中城市内旅客周转量(万人公里),46082,G76,G76,69,'69.00',格式差异(文本型数字)
公交,数据,林区|其中城市内旅客周转量(万人公里),46174,M76,M76,70.35,'70.35',格式差异(文本型数字)
公交,数据,林区|其中城市内旅客周转量(万人公里),,U76,U76,393.46000000000004,531.69,数值差异
出租,数据,全省|客运量(万人次),,U5,U5,39797.94,52461.16,数值差异
出租,数据,全省|旅客周转量(万人公里),,U6,U6,238459.04000000004,313005.31000000006,数值差异
出租,数据,全省|其中城市内客运量(万人次),,U7,U7,37159.020000000004,48651.740000000005,数值差异
出租,数据,全省|其中城市内旅客周转量(万人公里),,U8,U8,193688.30999999997,252897.54999999996,数值差异
出租,数据,武汉|客运量(万人次),,U9,U9,9103.72,11745.119999999999,数值差异
出租,数据,武汉|旅客周转量(万人公里),,U10,U10,71009.01999999999,91611.93999999999,数值差异
出租,数据,武汉|其中城市内客运量(万人次),,U11,U11,9103.72,11745.119999999999,数值差异
出租,数据,武汉|其中城市内旅客周转量(万人公里),,U12,U12,71009.01999999999,91611.93999999999,数值差异
出租,数据,黄石|客运量(万人次),,U13,U13,2066.84,2716.25,数值差异
出租,数据,黄石|旅客周转量(万人公里),,U14,U14,10334.2,13581.25,数值差异
出租,数据,黄石|其中城市内客运量(万人次),,U15,U15,1936.8500000000001,2529.4,数值差异
出租,数据,黄石|其中城市内旅客周转量(万人公里),,U16,U16,8715.84,11382.32,数值差异
出租,数据,十堰|客运量(万人次),,U17,U17,2040.73,2707.4399999999996,数值差异
出租,数据,十堰|旅客周转量(万人公里),,U18,U18,12520.359999999999,16308.66,数值差异
出租,数据,十堰|其中城市内客运量(万人次),,U19,U19,2008.95,2666.4300000000003,数值差异
出租,数据,十堰|其中城市内旅客周转量(万人公里),,U20,U20,8569.05,11813.66,数值差异
出租,数据,宜昌|客运量(万人次),,U21,U21,4520.78,6022.05,数值差异
出租,数据,宜昌|旅客周转量(万人公里),,U22,U22,22603.899999999998,30110.249999999996,数值差异
出租,数据,宜昌|其中城市内客运量(万人次),,U23,U23,4025.5200000000004,5347,数值差异
出租,数据,宜昌|其中城市内旅客周转量(万人公里),,U24,U24,19322.49,25665.6,数值差异
出租,数据,襄阳|客运量(万人次),,U25,U25,2414.58,3178.58,数值差异
出租,数据,襄阳|旅客周转量(万人公里),,U26,U26,13980.42,18403.98,数值差异
出租,数据,襄阳|其中城市内客运量(万人次),,U27,U27,2077.24,2730.44,数值差异
出租,数据,襄阳|其中城市内旅客周转量(万人公里),,U28,U28,10656.23,14007.14,数值差异
出租,数据,鄂州|客运量(万人次),,U29,U29,585.9499999999999,804.8199999999999,数值差异
出租,数据,鄂州|旅客周转量(万人公里),,U30,U30,3855.5600000000004,4982.740000000001,数值差异
出租,数据,鄂州|其中城市内客运量(万人次),,U31,U31,580.01,790.08,数值差异
出租,数据,鄂州|其中城市内旅客周转量(万人公里),,U32,U32,2673.84,3629.6600000000003,数值差异
出租,数据,荆门|客运量(万人次),,U33,U33,2036.83,2693.72,数值差异
出租,数据,荆门|旅客周转量(万人公里),,U34,U34,9165.75,12121.76,数值差异
出租,数据,荆门|其中城市内客运量(万人次),,U35,U35,1868.71,2470.8199999999997,数值差异
出租,数据,荆门|其中城市内旅客周转量(万人公里),,U36,U36,7474.84,9883.279999999999,数值差异
出租,数据,孝感|客运量(万人次),,U37,U37,2755.83,3682.46,数值差异
出租,数据,孝感|旅客周转量(万人公里),,U38,U38,14330.32,19148.8,数值差异
出租,数据,孝感|其中城市内客运量(万人次),,U39,U39,2245.55,2991.03,数值差异
出租,数据,孝感|其中城市内旅客周转量(万人公里),,U40,U40,7634.859999999999,10169.499999999998,数值差异
出租,数据,荆州|客运量(万人次),,U41,U41,4566.16,6107.53,数值差异
出租,数据,荆州|旅客周转量(万人公里),,U42,U42,22830.800000000003,31015.460000000003,数值差异
出租,数据,荆州|其中城市内客运量(万人次),,U43,U43,4552.33,5866,数值差异
出租,数据,荆州|其中城市内旅客周转量(万人公里),,U44,U44,18209.32,23464,数值差异
出租,数据,黄冈|客运量(万人次),,U45,U45,2496.1800000000003,3231.6200000000003,数值差异
出租,数据,黄冈|旅客周转量(万人公里),,U46,U46,14542.13,18329.5,数值差异
出租,数据,黄冈|其中城市内客运量(万人次),,U47,U47,2412.3500000000004,3089.4400000000005,数值差异
出租,数据,黄冈|其中城市内旅客周转量(万人公里),,U48,U48,12238.19,15217.39,数值差异
出租,数据,咸宁|客运量(万人次),,U49,U49,1434.69,1888.34,数值差异
出租,数据,咸宁|旅客周转量(万人公里),,U50,U50,8774.43,11587.060000000001,数值差异
出租,数据,咸宁|其中城市内客运量(万人次),,U51,U51,1168.5300000000002,1535.2800000000002,数值差异
出租,数据,咸宁|其中城市内旅客周转量(万人公里),,U52,U52,5225.240000000001,6881.080000000001,数值差异
出租,数据,随州|客运量(万人次),,U53,U53,979.1500000000001,1306.6000000000001,数值差异
出租,数据,随州|旅客周转量(万人公里),,U54,U54,5914.07,7891.87,数值差异
出租,数据,随州|其中城市内客运量(万人次),,U55,U55,917.17,1223.98,数值差异
出租,数据,随州|其中城市内旅客周转量(万人公里),,U56,U56,4329.030000000001,5777.18,数值差异
出租,数据,恩施|客运量(万人次),,U57,U57,3215.91,4299.0599999999995,数值差异
出租,数据,恩施|旅客周转量(万人公里),,U58,U58,20840.79,27794.620000000003,数值差异
出租,数据,恩施|其中城市内客运量(万人次),,U59,U59,2948.5,3934.16,数值差异
出租,数据,恩施|其中城市内旅客周转量(万人公里),,U60,U60,13708.350000000002,18252.24,数值差异
出租,数据,仙桃|客运量(万人次),,U61,U61,376,502,数值差异
出租,数据,仙桃|旅客周转量(万人公里),,U62,U62,1428.8000000000002,1907.6000000000001,数值差异
出租,数据,仙桃|其中城市内客运量(万人次),,U63,U63,336,449.40000000000003,数值差异
出租,数据,仙桃|其中城市内旅客周转量(万人公里),,U64,U64,1142.3999999999999,1527.9599999999998,数值差异
出租,数据,潜江|客运量(万人次),,U65,U65,622.96,808.7600000000001,数值差异
出租,数据,潜江|旅客周转量(万人公里),,U66,U66,3613.17,4631.339999999999,数值差异
出租,数据,潜江|其中城市内客运量(万人次),,U67,U67,532.9599999999999,696.92,数值差异
出租,数据,潜江|其中城市内旅客周转量(万人公里),,U68,U68,1332.4099999999999,1706.07,数值差异
出租,数据,天门|客运量(万人次),,U69,U69,486,639.0500000000001,数值差异
出租,数据,天门|旅客周转量(万人公里),,U70,U70,2332.8,3067.44,数值差异
出租,数据,天门|其中城市内客运量(万人次),,U71,U71,363.40000000000003,477.76,数值差异
出租,数据,天门|其中城市内旅客周转量(万人公里),,U72,U72,1162.88,1528.8300000000002,数值差异
出租,数据,林区|客运量(万人次),,U73,U73,95.63000000000001,127.76000000000002,数值差异
出租,数据,林区|旅客周转量(万人公里),,U74,U74,382.52000000000004,511.0400000000001,数值差异
出租,数据,林区|其中城市内客运量(万人次),,U75,U75,81.22999999999999,108.47999999999999,数值差异
出租,数据,林区|其中城市内旅客周转量(万人公里),,U76,U76,284.32,379.7,数值差异
网约车,数据,全省|客运量(万人次),,U5,U5,16384.07,22474.110000000008,数值差异
网约车,数据,全省|旅客周转量(万人公里),,U6,U6,98105.7900000001,133955.96000000014,数值差异
网约车,数据,全省|其中城市内客运量(万人次),,U7,U7,15289.679999999997,20816.68,数值差异
网约车,数据,全省|其中城市内旅客周转量(万人公里),,U8,U8,79642.53000000009,108116.99000000012,数值差异
网约车,数据,武汉|客运量(万人次),,U9,U9,8276.951226020261,11088.570527303931,数值差异
网约车,数据,武汉|旅客周转量(万人公里),,U10,U10,57896.93641720795,77661.9346501225,数值差异
网约车,数据,武汉|其中城市内客运量(万人次),,U11,U11,8276.951226020261,11088.570527303931,数值差异
网约车,数据,武汉|其中城市内旅客周转量(万人公里),,U12,U12,57896.93641720795,77661.9346501225,数值差异
网约车,数据,黄石|客运量(万人次),,U13,U13,513.6524317833163,745.0823955706873,数值差异
网约车,数据,黄石|旅客周转量(万人公里),,U14,U14,2303.855932675847,3346.8973482776787,数值差异
网约车,数据,黄石|其中城市内客运量(万人次),,U15,U15,461.62274366185346,659.1668490809662,数值差异
网约车,数据,黄石|其中城市内旅客周转量(万人公里),,U16,U16,1418.7467177733552,2044.449565917182,数值差异
网约车,数据,十堰|客运量(万人次),,U17,U17,767.734769213929,1080.117772243713,数值差异
网约车,数据,十堰|旅客周转量(万人公里),,U18,U18,4214.250033279417,5802.297730905932,数值差异
网约车,数据,十堰|其中城市内客运量(万人次),,U19,U19,719.0059357794262,1007.1564313243792,数值差异
网约车,数据,十堰|其中城市内旅客周转量(万人公里),,U20,U20,2088.918746278956,3091.817529891371,数值差异
网约车,数据,宜昌|客运量(万人次),,U21,U21,1686.0051583002069,2284.906006627505,数值差异
网约车,数据,宜昌|旅客周转量(万人公里),,U22,U22,7561.9910193004125,10260.960720176892,数值差异
网约车,数据,宜昌|其中城市内客运量(万人次),,U23,U23,1460.0017198266169,1953.2609262940268,数值差异
网约车,数据,宜昌|其中城市内旅客周转量(万人公里),,U24,U24,4782.798598515801,6448.920128683533,数值差异
网约车,数据,襄阳|客运量(万人次),,U25,U25,1583.018066334676,2181.733831681401,数值差异
网约车,数据,襄阳|旅客周转量(万人公里),,U26,U26,8219.7335257433,11344.304564035821,数值差异
网约车,数据,襄阳|其中城市内客运量(万人次),,U27,U27,1303.494727353259,1782.4507179837528,数值差异
网约车,数据,襄阳|其中城市内旅客周转量(万人公里),,U28,U28,4559.395311476809,6288.810387758712,数值差异
网约车,数据,鄂州|客运量(万人次),,U29,U29,208.5915765643878,298.9315364949481,数值差异
网约车,数据,鄂州|旅客周转量(万人公里),,U30,U30,1230.502915184737,1649.8514018453882,数值差异
网约车,数据,鄂州|其中城市内客运量(万人次),,U31,U31,195.97223426227208,277.0997698144388,数值差异
网约车,数据,鄂州|其中城市内旅客周转量(万人公里),,U32,U32,615.7810794573255,875.5656742316046,数值差异
网约车,数据,荆门|客运量(万人次),,U33,U33,307.2768094364829,448.36725610070494,数值差异
网约车,数据,荆门|旅客周转量(万人公里),,U34,U34,1240.086200850952,1812.4172471198792,数值差异
网约车,数据,荆门|其中城市内客运量(万人次),,U35,U35,268.3414937088589,389.3181364182719,数值差异
网约车,数据,荆门|其中城市内旅客周转量(万人公里),,U36,U36,732.381719842786,1073.187301522511,数值差异
网约车,数据,孝感|客运量(万人次),,U37,U37,388.731283906958,561.0152985486853,数值差异
网约车,数据,孝感|旅客周转量(万人公里),,U38,U38,1812.8758514513738,2620.402703498781,数值差异
网约车,数据,孝感|其中城市内客运量(万人次),,U39,U39,301.6387207930702,431.3241363004601,数值差异
网约车,数据,孝感|其中城市内旅客周转量(万人公里),,U40,U40,699.6995378557159,1010.1198384889449,数值差异
网约车,数据,荆州|客运量(万人次),,U41,U41,689.9909286676384,978.4625855192073,数值差异
网约车,数据,荆州|旅客周转量(万人公里),,U42,U42,3094.1277799457457,4474.670193958618,数值差异
网约车,数据,荆州|其中城市内客运量(万人次),,U43,U43,654.0841380199126,884.2405326518456,数值差异
网约车,数据,荆州|其中城市内旅客周转量(万人公里),,U44,U44,1784.5444134268691,2431.706515087877,数值差异
网约车,数据,黄冈|客运量(万人次),,U45,U45,389.69971151859323,565.8775967810398,数值差异
网约车,数据,黄冈|旅客周转量(万人公里),,U46,U46,2020.356730240677,2838.472133701603,数值差异
网约车,数据,黄冈|其中城市内客运量(万人次),,U47,U47,357.80984667647317,509.56043732738783,数值差异
网约车,数据,黄冈|其中城市内旅客周转量(万人公里),,U48,U48,1228.272116791191,1698.3457370255849,数值差异
网约车,数据,咸宁|客运量(万人次),,U49,U49,710.1943821265304,919.7307169268723,数值差异
网约车,数据,咸宁|旅客周转量(万人公里),,U50,U50,3899.402550688465,5070.30400911845,数值差异
网约车,数据,咸宁|其中城市内客运量(万人次),,U51,U51,553.9640752425487,712.4650914210579,数值差异
网约车,数据,咸宁|其中城市内旅客周转量(万人公里),,U52,U52,1692.002492563809,2195.49122769483,数值差异
网约车,数据,随州|客运量(万人次),,U53,U53,108.7857744325686,163.00693483258158,数值差异
网约车,数据,随州|旅客周转量(万人公里),,U54,U54,589.2426806031549,884.472801255585,数值差异
网约车,数据,随州|其中城市内客运量(万人次),,U55,U55,97.0874402134117,144.6159531087274,数值差异
网约车,数据,随州|其中城市内旅客周转量(万人公里),,U56,U56,312.6290049932284,470.675011023445,数值差异
网约车,数据,恩施|客运量(万人次),,U57,U57,528.6742066831321,822.6747493053571,数值差异
网约车,数据,恩施|旅客周转量(万人公里),,U58,U58,3061.6441938065886,4763.045679122509,数值差异
网约车,数据,恩施|其中城市内客运量(万人次),,U59,U59,460.3228507849884,710.6290556219394,数值差异
网约车,数据,恩施|其中城市内旅客周转量(万人公里),,U60,U60,1458.674860345012,2271.220966199628,数值差异
网约车,数据,仙桃|客运量(万人次),,U61,U61,79.98356000455382,118.51164761892892,数值差异
网约车,数据,仙桃|旅客周转量(万人公里),,U62,U62,272.44231072549934,404.3903037596158,数值差异
网约车,数据,仙桃|其中城市内客运量(万人次),,U63,U63,68.3882807969825,100.83443064512001,数值差异
网约车,数据,仙桃|其中城市内旅客周转量(万人公里),,U64,U64,158.2985090345263,235.8798609207951,数值差异
网约车,数据,潜江|客运量(万人次),,U65,U65,73.67075888020761,107.92276395801241,数值差异
网约车,数据,潜江|旅客周转量(万人公里),,U66,U66,383.0747148625071,551.9003339024423,数值差异
网约车,数据,潜江|其中城市内客运量(万人次),,U67,U67,60.17956657558272,88.48967759528222,数值差异
网约车,数据,潜江|其中城市内旅客周转量(万人公里),,U68,U68,102.4871945248859,147.7021025121702,数值差异
网约车,数据,天门|客运量(万人次),,U69,U69,70.07658110602671,107.57829931570191,数值差异
网约车,数据,天门|旅客周转量(万人公里),,U70,U70,301.5644366676026,463.8175727603175,数值差异
网约车,数据,天门|其中城市内客运量(万人次),,U71,U71,49.979870768034175,76.19612121207408,数值差异
网约车,数据,天门|其中城市内旅客周转量(万人公里),,U72,U72,108.9788358320163,168.029295632831,数值差异
网约车,数据,林区|客运量(万人次),,U73,U73,1.0327750205277542,1.6200811707253961,数值差异
网约车,数据,林区|旅客周转量(万人公里),,U74,U74,3.702706765867998,5.820606438110038,数值差异
网约车,数据,林区|其中城市内客运量(万人次),,U75,U75,0.835129516446933,1.30120589634181,数值差异
网约车,数据,林区|其中城市内旅客周转量(万人公里),,U76,U76,1.9844440798582696,3.1342072866171797,数值差异
轨道、轮渡,数据,地区名称|指标,8月与去年同比,R2,R2,'8月与去年同比','同比',文本不同
轨道、轮渡,数据,武汉|轨道旅客周转量(万人公里),2026年6月,M7,M7,99225.68,'99225.68',格式差异(文本型数字)
轨道、轮渡,数据,黄石|轨道旅客周转量(万人公里),2026年6月,M9,M9,468.48,'468.48',格式差异(文本型数字)
轨道、轮渡,数据,地区名称|指标,8月与去年同比,R11,R11,'8月与去年同比','同比',文本不同
轨道、轮渡,数据,全省|轮渡旅客周转量(万人公里),2026年2月,E14,E14,227.8,'227.80',格式差异(文本型数字)
轨道、轮渡,数据,武汉|轮渡客运量(万人次),2026年2月,E15,E15,67,'67.00',格式差异(文本型数字)
轨道、轮渡,数据,武汉|轮渡旅客周转量(万人公里),2026年2月,E16,E16,227.8,'227.80',格式差异(文本型数字)
中口径明细,数据,中口径客运量,=S99-网约车!S6+网约车!S8-出租!S6+出租!S8-公交!S6+公交!S8-班线包车!S5|累计,S1,S1,2.9103830456733704e-11,3.2741809263825417e-11,取整差异
中口径明细,数据,全省|总旅客周转量(万人公里),,U99,U99,1102278.385724,1256684.215724,数值差异
中口径明细,数据,全省|公路班线旅客周转量(万人公里),,U100,U100,802842.265724,918501.375724,数值差异
中口径明细,数据,全省|城际城乡公交旅客周转量(万人公里),,U101,U101,224768.97,252236.11,数值差异
中口径明细,数据,全省|城际城乡巡游出租旅客周转量(万人公里),,U102,U102,52505.70999999999,60107.759999999995,数值差异
中口径明细,数据,全省|城际城乡网约车旅客周转量(万人公里),,U103,U103,22161.44,25838.969999999983,数值差异
中口径明细,数据,武汉|总旅客周转量(万人公里),,U104,U104,127804.0047,146257.0186,数值差异
中口径明细,数据,武汉|公路班线旅客周转量(万人公里),,U105,U105,123967.9247,141951.9086,数值差异
中口径明细,数据,武汉|城际城乡公交旅客周转量(万人公里),,U106,U106,3836.0799999999945,4305.109999999997,数值差异
中口径明细,数据,黄石|总旅客周转量(万人公里),,U109,U109,47738.11548924788,54160.1262823605,数值差异
中口径明细,数据,黄石|公路班线旅客周转量(万人公里),,U110,U110,18630.4089,21201.5285,数值差异
中口径明细,数据,黄石|城际城乡公交旅客周转量(万人公里),,U111,U111,26134.84,29457.22,数值差异
中口径明细,数据,黄石|城际城乡巡游出租旅客周转量(万人公里),,U112,U112,1885.9399999999996,2198.9299999999994,数值差异
中口径明细,数据,黄石|城际城乡网约车旅客周转量(万人公里),,U113,U113,1086.92658924788,1302.447782360497,数值差异
中口径明细,数据,十堰|总旅客周转量(万人公里),,U114,U114,66117.07779545893,74765.31760101457,数值差异
中口径明细,数据,十堰|公路班线旅客周转量(万人公里),,U115,U115,41058.0762,47119.917400000006,数值差异
中口径明细,数据,十堰|城际城乡公交旅客周转量(万人公里),,U116,U116,18257.02,20439.920000000002,数值差异
中口径明细,数据,十堰|城际城乡巡游出租旅客周转量(万人公里),,U117,U117,4355.01,4495,数值差异
中口径明细,数据,十堰|城际城乡网约车旅客周转量(万人公里),,U118,U118,2446.97159545892,2710.4802010145613,数值差异
中口径明细,数据,宜昌|总旅客周转量(万人公里),,U119,U119,131717.27464958615,152331.53849149335,数值差异
中口径明细,数据,宜昌|公路班线旅客周转量(万人公里),,U120,U120,118666.18149999998,137376.84789999996,数值差异
中口径明细,数据,宜昌|城际城乡公交旅客周转量(万人公里),,U121,U121,5850.73,6698,数值差异
中口径明细,数据,宜昌|城际城乡巡游出租旅客周转量(万人公里),,U122,U122,3888.1400000000003,4444.650000000001,数值差异
中口径明细,数据,宜昌|城际城乡网约车旅客周转量(万人公里),,U123,U123,3312.223149586145,3812.040591493359,数值差异
中口径明细,数据,襄阳|总旅客周转量(万人公里),,U124,U124,128032.45987136237,146124.57794027711,数值差异
中口径明细,数据,襄阳|公路班线旅客周转量(万人公里),,U125,U125,101998.79516400001,115761.033764,数值差异
中口径明细,数据,襄阳|城际城乡公交旅客周转量(万人公里),,U126,U126,17806.730000000003,20911.210000000003,数值差异
中口径明细,数据,襄阳|城际城乡巡游出租旅客周转量(万人公里),,U127,U127,3865.5799999999995,4396.839999999999,数值差异
中口径明细,数据,襄阳|城际城乡网约车旅客周转量(万人公里),,U128,U128,4361.354707362358,5055.494176277109,数值差异
中口径明细,数据,鄂州|总旅客周转量(万人公里),,U129,U129,19115.041938669896,21664.60542761378,数值差异
中口径明细,数据,鄂州|公路班线旅客周转量(万人公里),,U130,U130,15582.5108,17768.3697,数值差异
中口径明细,数据,鄂州|城际城乡公交旅客周转量(万人公里),,U131,U131,1569.46,1768.8700000000001,数值差异
中口径明细,数据,鄂州|城际城乡巡游出租旅客周转量(万人公里),,U132,U132,1267.89,1353.0800000000002,数值差异
中口径明细,数据,鄂州|城际城乡网约车旅客周转量(万人公里),,U133,U133,695.1811386698976,774.2857276137836,数值差异
中口径明细,数据,荆门|总旅客周转量(万人公里),,U134,U134,31205.974567234833,35503.62584559737,数值差异
中口径明细,数据,荆门|公路班线旅客周转量(万人公里),,U135,U135,28294.2373,32128.1159,数值差异
中口径明细,数据,荆门|城际城乡公交旅客周转量(万人公里),,U136,U136,332.5100000000002,397.8000000000002,数值差异
中口径明细,数据,荆门|城际城乡巡游出租旅客周转量(万人公里),,U137,U137,1960.3,2238.48,数值差异
中口径明细,数据,荆门|城际城乡网约车旅客周转量(万人公里),,U138,U138,618.92726723483,739.229945597368,数值差异
中口径明细,数据,孝感|总旅客周转量(万人公里),,U139,U139,55219.75551277897,62803.011925009836,数值差异
中口径明细,数据,孝感|公路班线旅客周转量(万人公里),,U140,U140,26327.91106,29735.979059999998,数值差异
中口径明细,数据,孝感|城际城乡公交旅客周转量(万人公里),,U141,U141,19670.329999999998,22477.449999999997,数值差异
中口径明细,数据,孝感|城际城乡巡游出租旅客周转量(万人公里),,U142,U142,7865.450000000001,8979.300000000001,数值差异
中口径明细,数据,孝感|城际城乡网约车旅客周转量(万人公里),,U143,U143,1356.064452778971,1610.2828650098359,数值差异
中口径明细,数据,荆州|总旅客周转量(万人公里),,U144,U144,86333.40921650287,98333.35807887075,数值差异
中口径明细,数据,荆州|公路班线旅客周转量(万人公里),,U145,U145,77866.88769999999,87821.01439999999,数值差异
中口径明细,数据,荆州|城际城乡公交旅客周转量(万人公里),,U146,U146,814.2999999999993,917.9199999999992,数值差异
中口径明细,数据,荆州|城际城乡巡游出租旅客周转量(万人公里),,U147,U147,5981.58,7551.460000000001,数值差异
中口径明细,数据,荆州|城际城乡网约车旅客周转量(万人公里),,U148,U148,1670.6415165028661,2042.9636788707421,数值差异
中口径明细,数据,黄冈|总旅客周转量(万人公里),,U149,U149,105024.65272782632,119517.39269667602,数值差异
中口径明细,数据,黄冈|公路班线旅客周转量(万人公里),,U150,U150,61493.677500000005,70357.80630000001,数值差异
中口径明细,数据,黄冈|城际城乡公交旅客周转量(万人公里),,U151,U151,39881.60999999999,44907.34999999999,数值差异
中口径明细,数据,黄冈|城际城乡巡游出租旅客周转量(万人公里),,U152,U152,2690.0999999999995,3112.1099999999997,数值差异
中口径明细,数据,黄冈|城际城乡网约车旅客周转量(万人公里),,U153,U153,959.265227826317,1140.126396676018,数值差异
中口径明细,数据,咸宁|总旅客周转量(万人公里),,U154,U154,84103.02473199645,93642.88608142361,数值差异
中口径明细,数据,咸宁|公路班线旅客周转量(万人公里),,U155,U155,40458.0831,45570.763300000006,数值差异
中口径明细,数据,咸宁|城际城乡公交旅客周转量(万人公里),,U156,U156,36968.96,40491.33,数值差异
中口径明细,数据,咸宁|城际城乡巡游出租旅客周转量(万人公里),,U157,U157,4130.889999999999,4705.98,数值差异
中口径明细,数据,咸宁|城际城乡网约车旅客周转量(万人公里),,U158,U158,2545.0916319964626,2874.8127814236213,数值差异
中口径明细,数据,随州|总旅客周转量(万人公里),,U159,U159,53902.35853382558,61063.98519023214,数值差异
中口径明细,数据,随州|公路班线旅客周转量(万人公里),,U160,U160,47736.6942,54095.937399999995,数值差异
中口径明细,数据,随州|城际城乡公交旅客周转量(万人公里),,U161,U161,3974.7699999999995,4439.5599999999995,数值差异
中口径明细,数据,随州|城际城乡巡游出租旅客周转量(万人公里),,U162,U162,1849.44,2114.69,数值差异
中口径明细,数据,随州|城际城乡网约车旅客周转量(万人公里),,U163,U163,341.45433382558315,413.79779023213996,数值差异
中口径明细,数据,恩施|总旅客周转量(万人公里),,U164,U164,122073.18520520045,140064.22921292286,数值差异
中口径明细,数据,恩施|公路班线旅客周转量(万人公里),,U165,U165,88859.5657,103219.8545,数值差异
中口径明细,数据,恩施|城际城乡公交旅客周转量(万人公里),,U166,U166,22848.91,24810.17,数值差异
中口径明细,数据,恩施|城际城乡巡游出租旅客周转量(万人公里),,U167,U167,8331.419999999998,9542.379999999997,数值差异
中口径明细,数据,恩施|城际城乡网约车旅客周转量(万人公里),,U168,U168,2033.289505200463,2491.824712922881,数值差异
中口径明细,数据,仙桃|总旅客周转量(万人公里),,U169,U169,7285.424912889523,8124.17164283882,数值差异
中口径明细,数据,仙桃|公路班线旅客周转量(万人公里),,U170,U170,2552.6529,3033.9412,数值差异
中口径明细,数据,仙桃|城际城乡公交旅客周转量(万人公里),,U171,U171,4257.9800000000005,4542.080000000001,数值差异
中口径明细,数据,仙桃|城际城乡巡游出租旅客周转量(万人公里),,U172,U172,332.28,379.64,数值差异
中口径明细,数据,仙桃|城际城乡网约车旅客周转量(万人公里),,U173,U173,142.51201288952382,168.51044283882072,数值差异
中口径明细,数据,潜江|总旅客周转量(万人公里),,U174,U174,16984.905293997494,19573.242831390275,数值差异
中口径明细,数据,潜江|公路班线旅客周转量(万人公里),,U175,U175,1305.1146,1526.3946,数值差异
中口径明细,数据,潜江|城际城乡公交旅客周转量(万人公里),,U176,U176,12701.830000000002,14717.380000000001,数值差异
中口径明细,数据,潜江|城际城乡巡游出租旅客周转量(万人公里),,U177,U177,2631.82,2925.2700000000004,数值差异
中口径明细,数据,潜江|城际城乡网约车旅客周转量(万人公里),,U178,U178,346.14069399749206,404.19823139027204,数值差异
中口径明细,数据,天门|总旅客周转量(万人公里),,U179,U179,16879.573318792896,19176.282477127486,数值差异
中口径明细,数据,天门|公路班线旅客周转量(万人公里),,U180,U180,5578.4541,6571.0142,数值差异
中口径明细,数据,天门|城际城乡公交旅客周转量(万人公里),,U181,U181,9702.95,10770.87,数值差异
中口径明细,数据,天门|城际城乡巡游出租旅客周转量(万人公里),,U182,U182,1354.94,1538.6100000000001,数值差异
中口径明细,数据,天门|城际城乡网约车旅客周转量(万人公里),,U183,U183,243.22921879289592,295.78827712748654,数值差异
中口径明细,数据,林区|总旅客周转量(万人公里),,U184,U184,2742.1472586293976,3578.845399151493,数值差异
中口径明细,数据,林区|公路班线旅客周转量(万人公里),,U185,U185,2465.0903,3260.9489999999996,数值差异
中口径明细,数据,林区|城际城乡公交旅客周转量(万人公里),,U186,U186,159.95999999999998,183.86999999999998,数值差异
中口径明细,数据,林区|城际城乡巡游出租旅客周转量(万人公里),,U187,U187,114.92999999999999,131.34,数值差异
中口径明细,数据,林区|城际城乡网约车旅客周转量(万人公里),,U188,U188,2.166958629397518,2.686399151492858,数值差异
城市汇总,数据,分类|客运量(万人次),同比|0.00117184,C13,C13,'同比',None,仅软件有值
城市汇总,数据,分类|客运量(万人次),累计周转量(万人公里)|1.68147e+06,D13,D13,'周转量(万人公里)',None,仅软件有值
城市汇总,数据,分类|客运量(万人次),同比|0.00835472,E13,E13,'同比',None,仅软件有值
城市汇总,数据,总客运量|32215.7,同比|0.00117184,C14,C14,0.0443952615401972,None,仅软件有值
城市汇总,数据,总客运量|32215.7,累计周转量(万人公里)|1.68147e+06,D14,D14,201812.55,None,仅软件有值
城市汇总,数据,总客运量|32215.7,同比|0.00835472,E14,E14,0.04680493557025811,None,仅软件有值
城市汇总,数据,城市公交|10878.7,同比|0.00117184,C15,C15,-0.020975861740020817,None,仅软件有值
城市汇总,数据,城市公交|10878.7,累计周转量(万人公里)|1.68147e+06,D15,D15,56014.969999999994,None,仅软件有值
城市汇总,数据,城市公交|10878.7,同比|0.00835472,E15,E15,-0.010734896413653985,None,仅软件有值
城市汇总,数据,城市出租车|9864.09,同比|0.00117184,C16,C16,0.16498211915211244,None,仅软件有值
城市汇总,数据,城市出租车|9864.09,累计周转量(万人公里)|1.68147e+06,D16,D16,50423.53,None,仅软件有值
城市汇总,数据,城市出租车|9864.09,同比|0.00835472,E16,E16,0.15632369843574703,None,仅软件有值
城市汇总,数据,其中:城市巡游出租车|5292.91,同比|0.00117184,C17,C17,-0.07249000276873366,None,仅软件有值
城市汇总,数据,其中:城市巡游出租车|5292.91,累计周转量(万人公里)|1.68147e+06,D17,D17,27056.44,None,仅软件有值
城市汇总,数据,其中:城市巡游出租车|5292.91,同比|0.00835472,E17,E17,-0.0793831940487528,None,仅软件有值
城市汇总,数据,城市网约车|4571.18,同比|0.00117184,C18,C18,0.6558766635996788,None,仅软件有值
城市汇总,数据,城市网约车|4571.18,累计周转量(万人公里)|1.68147e+06,D18,D18,23367.090000000004,None,仅软件有值
城市汇总,数据,城市网约车|4571.18,同比|0.00835472,E18,E18,0.6435685000446637,None,仅软件有值
城市汇总,数据,轨道|11405.3,同比|0.00117184,C19,C19,0.017262201006441515,None,仅软件有值
城市汇总,数据,轨道|11405.3,累计周转量(万人公里)|1.68147e+06,D19,D19,95144.24,None,仅软件有值
城市汇总,数据,轨道|11405.3,同比|0.00835472,E19,E19,0.03002696852884965,None,仅软件有值
城市汇总,数据,轮渡|67.59,同比|0.00117184,C20,C20,0.21674167416741685,None,仅软件有值
城市汇总,数据,轮渡|67.59,累计周转量(万人公里)|1.68147e+06,D20,D20,229.81,None,仅软件有值
城市汇总,数据,轮渡|67.59,同比|0.00835472,E20,E20,0.2167628527558638,None,仅软件有值
货运周转量排名,数据,全省,规下增速,J5,J26,0.01415852628504477,0.0141585262862789,取整差异
 è´§è¿,数据,全省|货运量(万吨),2月与去年同比,BA5,BB5,-0.3259271573835075,-0.32592699999868746,取整差异
 è´§è¿,数据,全省|货运量(万吨),3月与去年同比,BC5,BD5,0.04647015984992553,0.04647016055967912,取整差异
 è´§è¿,数据,全省|货运量(万吨),4月与去年同比,BE5,BF5,0.12175617404972017,0.1217558476136098,取整差异
 è´§è¿,数据,全省|货运量(万吨),5月与去年同比,BG5,BH5,0.09469759976345893,0.0946979425523109,取整差异
 è´§è¿,数据,全省|货运量(万吨),12月与去年同比,BU5,BV5,0.10905865660861669,0.10905865668884962,取整差异
 è´§è¿,数据,全省|货运量(万吨),累计同比,BW5,BX5,0.06872929687359908,0.06872931708163765,取整差异
 è´§è¿,数据,全省|货运量(万吨),1月与去年同比,BZ5,CA5,-0.13469121324297262,-0.13469146371690677,取整差异
 è´§è¿,数据,全省|货运量(万吨),2023å¹´2月,CA5,CB5,11992.289999999997,11992.2872,取整差异
 è´§è¿,数据,全省|货运量(万吨),2月与去年同比,CB5,CC5,0.4935507740558167,0.49355042533658455,取整差异
 è´§è¿,数据,全省|货运量(万吨),2023å¹´3月,CC5,CD5,14744.155460183607,14744.1554501836,取整差异
 è´§è¿,数据,全省|货运量(万吨),3月与去年同比,CD5,CE5,0.17377825653347467,0.17377825298399863,取整差异
 è´§è¿,数据,全省|货运量(万吨),2023å¹´4月,CE5,CF5,14303.60000000001,14303.6041624134,取整差异
 è´§è¿,数据,全省|货运量(万吨),4月与去年同比,CF5,CG5,0.23803531215379192,0.2380356724277628,取整差异
 è´§è¿,数据,全省|货运量(万吨),2023å¹´5月,CG5,CH5,14764.37999999999,14764.375376747601,取整差异
 è´§è¿,数据,全省|货运量(万吨),5月与去年同比,CH5,CI5,0.16948351086928226,0.16948307550359232,取整差异
 è´§è¿,数据,全省|货运量(万吨),11月与去年同比,CT5,CU5,0.17257538487654434,0.1725754703274529,取整差异
 è´§è¿,数据,全省|货运量(万吨),45261,CU5,CV5,16355.307701183196,16355.3077,取整差异
 è´§è¿,数据,全省|货运量(万吨),12月与去年同比,CV5,CW5,0.19188566831439102,0.19188575508630312,取整差异
 è´§è¿,数据,全省|货运量(万吨),累计,CW5,CX5,173045.29642851182,173045.2931564896,取整差异
 è´§è¿,数据,全省|货运量(万吨),累计同比,CX5,CY5,0.19358637623628638,0.1935863299894891,取整差异
 è´§è¿,数据,全省|货运量(万吨),12月环比%,CZ5,DA5,0.016468266080717386,0.016468266007182875,取整差异
 è´§è¿,数据,全省|货运量(万吨),6月环比%,DF5,DG5,-0.003274621102300812,-0.0032743089920441726,取整差异
 è´§è¿,数据,全省|货运量(万吨),5月环比%,DG5,DH5,0.03221426773679226,0.032213644134881925,取整差异
 è´§è¿,数据,全省|货运量(万吨),4月环比%,DH5,DI5,-0.02988000644549027,-0.029879723478140274,取整差异
 è´§è¿,数据,全省|货运量(万吨),3月环比%,DI5,DJ5,0.2294695558716151,0.22946984209847798,取整差异
 è´§è¿,数据,全省|货运量(万吨),2月份环比,DJ5,DK5,0.29407922247315843,0.29407892032721095,取整差异
 è´§è¿,数据,全省|货运量(万吨),1月份环比,DK5,DL5,-0.3246682992848995,-0.3246682500704024,取整差异
 è´§è¿,数据,全省|货运量(万吨),2022å¹´1月,DM5,DN5,10709.5234,10709.5265,取整差异
 è´§è¿,数据,全省|货运量(万吨),2022å¹´3月,DO5,DP5,12561.27840000001,12561.2784294655,取整差异
 è´§è¿,数据,全省|货运量(万吨),2022å¹´5月,DQ5,DR5,12624.701299999999,12624.7020465772,取整差异
 è´§è¿,数据,全省|货运量(万吨),2022å¹´12月,DX5,DY5,13722.211900000006,13722.2109,取整差异
 è´§è¿,数据,全省|货运量(万吨),累计,DZ5,EA5,144979.28249999997,144979.285376043,取整差异
 è´§è¿,数据,全省|货运量(万吨),累计同比,EA5,EB5,-0.10123548779789115,-0.101235470414284,取整差异
 è´§è¿,数据,全省|货运量(万吨),2021å¹´1月,EC5,ED5,14945.336060000003,14945.3361,取整差异
 è´§è¿,数据,全省|货运量(万吨),2021å¹´2月,ED5,EE5,6495.005440000003,6495.0054,取整差异
 è´§è¿,数据,全省|货运量(万吨),2021å¹´3月,EE5,EF5,11923.963759999997,11923.9638,取整差异
 è´§è¿,数据,全省|货运量(万吨),2021å¹´4月,EF5,EG5,14358.291360000003,14358.2914,取整差异
 è´§è¿,数据,全省|货运量(万吨),累计,EO5,EP5,161309.53162000002,None,仅软件有值
 è´§è¿,数据,全省|货物周转量(万吨公里),2月与去年同比,BA6,BB6,-0.30623222152889906,-0.3062322234049324,取整差异
 è´§è¿,数据,全省|货物周转量(万吨公里),4月与去年同比,BE6,BF6,0.06467071585099982,0.06467071760258558,取整差异
 è´§è¿,数据,全省|货物周转量(万吨公里),12月与去年同比,BU6,BV6,0.08879104867917631,0.08879104853039399,取整差异
 è´§è¿,数据,全省|货物周转量(万吨公里),累计同比,BW6,BX6,0.03416386282757555,0.034163862753850305,取整差异
 è´§è¿,数据,全省|货物周转量(万吨公里),2023å¹´2月,CA6,CB6,1738086.6899999995,1738086.6946999999,取整差异
 è´§è¿,数据,全省|货物周转量(万吨公里),2月与去年同比,CB6,CC6,0.5142112309110594,0.5142112350056727,取整差异
 è´§è¿,数据,全省|货物周转量(万吨公里),3月与去年同比,CD6,CE6,0.2018125227060572,0.20181252272301387,取整差异
 è´§è¿,数据,全省|货物周转量(万吨公里),2023å¹´4月,CE6,CF6,1997282.69,1997282.68671409,取整差异
 è´§è¿,数据,全省|货物周转量(万吨公里),4月与去年同比,CF6,CG6,0.1940999140443589,0.194099912079837,取整差异
 è´§è¿,数据,全省|货物周转量(万吨公里),5月与去年同比,CH6,CI6,0.17198567116825836,0.17198567113378216,取整差异
 è´§è¿,数据,全省|货物周转量(万吨公里),11月与去年同比,CT6,CU6,0.11906446147253447,0.11906446006220461,取整差异
 è´§è¿,数据,全省|货物周转量(万吨公里),45261,CU6,CV6,2299312.1948858015,2299312.1952,取整差异
 è´§è¿,数据,全省|货物周转量(万吨公里),12月与去年同比,CV6,CW6,0.1591073851100362,0.15910738380763223,取整差异
 è´§è¿,数据,全省|货物周转量(万吨公里),累计,CW6,CX6,24243256.54425965,24243256.545987938,取整差异
 è´§è¿,数据,全省|货物周转量(万吨公里),累计同比,CX6,CY6,0.17756624707975566,0.17756624701915347,取整差异
 è´§è¿,数据,全省|货物周转量(万吨公里),,CY6,CZ6,25019040.75367596,25019040.75545955,取整差异
 è´§è¿,数据,全省|货物周转量(万吨公里),12月环比%,CZ6,DA6,0.035782499593286055,0.03578249973482461,取整差异
 è´§è¿,数据,全省|货物周转量(万吨公里),5月环比%,DG6,DH6,0.02429572450758055,0.024295726192741895,取整差异
 è´§è¿,数据,全省|货物周转量(万吨公里),4月环比%,DH6,DI6,-0.029113551944278226,-0.02911355354157108,取整差异
 è´§è¿,数据,全省|货物周转量(万吨公里),3月环比%,DI6,DJ6,0.18358557942019593,0.18358557621963478,取整差异
 è´§è¿,数据,全省|货物周转量(万吨公里),2月份环比,DJ6,DK6,0.193528873607178,0.193528876834627,取整差异
 è´§è¿,数据,全省|货物周转量(万吨公里),1月份环比,DK6,DL6,-0.2658847697994972,-0.2658847707246848,取整差异
 è´§è¿,数据,全省|货物周转量(万吨公里),2022å¹´3月,DO6,DP6,1711726.499100001,1711726.49907585,取整差异
 è´§è¿,数据,全省|货物周转量(万吨公里),2022å¹´5月,DQ6,DR6,1745591.4098,1745591.40985135,取整差异
 è´§è¿,数据,全省|货物周转量(万吨公里),2022å¹´12月,DX6,DY6,1983692.127600001,1983692.1301,取整差异
 è´§è¿,数据,全省|货物周转量(万吨公里),累计,DZ6,EA6,20587594.6295,20587594.6320272,取整差异
 è´§è¿,数据,全省|货物周转量(万吨公里),累计同比,EA6,EB6,-0.06257169309527677,-0.0625716929823387,取整差异
 è´§è¿,数据,全省|货物周转量(万吨公里),2021å¹´1月,EC6,ED6,2157113.301829999,2157113.3018,取整差异
 è´§è¿,数据,全省|货物周转量(万吨公里),2021å¹´3月,EE6,EF6,1676879.9555499996,1676879.9556,取整差异
 è´§è¿,数据,全省|货物周转量(万吨公里),2021å¹´4月,EF6,EG6,1941623.1793699996,1941623.1794,取整差异
 è´§è¿,数据,全省|货物周转量(万吨公里),累计,EO6,EP6,21961780.413349997,None,仅软件有值
 è´§è¿,数据,全省|其中规上货运量(万吨),,CY7,CZ7,0.1774344725554818,0.17743447591049671,取整差异
 è´§è¿,数据,全省|其中规上货运量(万吨),累计同比,EA7,EB7,0.014026560257553777,0.0140265553784427,取整差异
 è´§è¿,数据,全省|其中规上货运量(万吨),,EB7,EC7,0.05814495253830493,0.05814495138484783,取整差异
 è´§è¿,数据,全省|其中规上货运量(万吨),2021å¹´4月,EF7,EG7,698.0137599999999,698.0138,取整差异
 è´§è¿,数据,全省|其中规上货运量(万吨),累计,EO7,EP7,8313.20779,None,仅软件有值
 è´§è¿,数据,全省|其中规上货物周转量(万吨公里),,CY8,CZ8,0.20930179737348306,0.20930179735856203,取整差异
 è´§è¿,数据,全省|其中规上货物周转量(万吨公里),累计同比,EA8,EB8,0.1953712101706122,0.195371210139514,取整差异
 è´§è¿,数据,全省|其中规上货物周转量(万吨公里),,EB8,EC8,0.0669548170831396,0.06695481707492067,取整差异
 è´§è¿,数据,全省|其中规上货物周转量(万吨公里),2021å¹´4月,EF8,EG8,95953.91117,95953.9112,取整差异
 è´§è¿,数据,全省|其中规上货物周转量(万吨公里),累计,EO8,EP8,1153146.92279,None,仅软件有值
 è´§è¿,数据,全省|其中规下货运量(万吨),2月与去年同比,BA9,BB9,-0.4595914039715734,-0.45959125056008465,取整差异
 è´§è¿,数据,全省|其中规下货运量(万吨),3月与去年同比,BC9,BD9,-0.04247633985129007,-0.04247633907377968,取整差异
 è´§è¿,数据,全省|其中规下货运量(万吨),4月与去年同比,BE9,BF9,0.03483363954859575,0.03483327027290195,取整差异
 è´§è¿,数据,全省|其中规下货运量(万吨),5月与去年同比,BG9,BH9,0.010834525673049544,0.010834909959420269,取整差异
 è´§è¿,数据,全省|其中规下货运量(万吨),12月与去年同比,BU9,BV9,0.007937879960076,0.0079378800495018,取整差异
 è´§è¿,数据,全省|其中规下货运量(万吨),累计同比,BW9,BX9,-0.029999493353130458,-0.029999471055541238,取整差异
 è´§è¿,数据,全省|其中规下货运量(万吨),1月与去年同比,BZ9,CA9,-0.2538311979204889,-0.2538314274525072,取整差异
 è´§è¿,数据,全省|其中规下货运量(万吨),2023å¹´2月,CA9,CB9,9863.306299999997,9863.3035,取整差异
 è´§è¿,数据,全省|其中规下货运量(万吨),2月与去年同比,CB9,CC9,0.3192724850826718,0.3192721105669829,取整差异
 è´§è¿,数据,全省|其中规下货运量(万吨),2023å¹´3月,CC9,CD9,12315.271060183608,12315.2710501836,取整差异
 è´§è¿,数据,全省|其中规下货运量(万吨),3月与去年同比,CD9,CE9,0.03389647200677981,0.033896468609706965,取整差异
 è´§è¿,数据,全省|其中规下货运量(万吨),2023å¹´4月,CE9,CF9,11664.46620000001,11664.4703624134,取整差异
 è´§è¿,数据,全省|其中规下货运量(万吨),4月与去年同比,CF9,CG9,0.06536399947745952,0.06536437964791109,取整差异
 è´§è¿,数据,全省|其中规下货运量(万吨),2023å¹´5月,CG9,CH9,12161.099799999989,12161.0951767476,取整差异
 è´§è¿,数据,全省|其中规下货运量(万吨),5月与去年同比,CH9,CI9,0.014611766261230175,0.014611317341293395,取整差异
 è´§è¿,数据,全省|其中规下货运量(万吨),11月与去年同比,CT9,CU9,0.03997168642578708,0.0399717683320957,取整差异
 è´§è¿,数据,全省|其中规下货运量(万吨),45261,CU9,CV9,13336.078001183196,13336.078,取整差异
 è´§è¿,数据,全省|其中规下货运量(万吨),12月与去年同比,CV9,CW9,0.050325547127978876,0.05032562975655286,取整差异
 è´§è¿,数据,全省|其中规下货运量(万吨),累计,CW9,CX9,142341.09552851183,142341.09225648962,取整差异
 è´§è¿,数据,全省|其中规下货运量(万吨),累计同比,CX9,CY9,0.04241412706271186,0.04241408114492362,取整差异
 è´§è¿,数据,全省|其中规下货运量(万吨),12月环比%,CZ9,DA9,0.009955906336043041,0.009955906246438495,取整差异
 è´§è¿,数据,全省|其中规下货运量(万吨),6月环比%,DF9,DG9,-0.010991945836213435,-0.010991569847556226,取整差异
 è´§è¿,数据,全省|其中规下货运量(万吨),5月环比%,DG9,DH9,0.042576624723725365,0.04257585633158989,取整差异
 è´§è¿,数据,全省|其中规下货运量(万吨),4月环比%,DH9,DI9,-0.05284535411386193,-0.052845015356807634,取整差异
 è´§è¿,数据,全省|其中规下货运量(万吨),3月环比%,DI9,DJ9,0.24859460769089292,0.24859496112875368,取整差异
 è´§è¿,数据,全省|其中规下货运量(万吨),2月份环比,DJ9,DK9,0.31168654072269275,0.31168616836050467,取整差异
 è´§è¿,数据,全省|其中规下货运量(万吨),1月份环比,DK9,DL9,-0.40777292277206884,-0.40777287612932384,取整差异
 è´§è¿,数据,全省|其中规下货运量(万吨),2022å¹´1月,DM9,DN9,10077.5595,10077.5626,取整差异
 è´§è¿,数据,全省|其中规下货运量(万吨),2022å¹´3月,DO9,DP9,11911.51280000001,11911.5128294655,取整差异
 è´§è¿,数据,全省|其中规下货运量(万吨),2022å¹´5月,DQ9,DR9,11985.963699999998,11985.9644465772,取整差异
 è´§è¿,数据,全省|其中规下货运量(万吨),2022å¹´12月,DX9,DY9,12697.090000000006,12697.089,取整差异
 è´§è¿,数据,全省|其中规下货运量(万吨),累计,DZ9,EA9,136549.46899999998,136549.471876043,取整差异
 è´§è¿,数据,全省|其中规下货运量(万吨),累计同比,EA9,EB9,-0.10749836609325825,-0.107498346536789,取整差异
 è´§è¿,数据,全省|其中规下货运量(万吨),2021å¹´1月,EC9,ED9,14160.085080000003,14160.0851,取整差异
 è´§è¿,数据,全省|其中规下货运量(万吨),2021å¹´2月,ED9,EE9,5975.687650000003,5975.6875,取整差异
 è´§è¿,数据,全省|其中规下货运量(万吨),累计,EO9,EP9,152996.32383,None,仅软件有值
 è´§è¿,数据,全省|其中规下货物周转量(万吨公里),2月与去年同比,BA10,BB10,-0.4154297706288229,-0.41542977263195713,取整差异
 è´§è¿,数据,全省|其中规下货物周转量(万吨公里),4月与去年同比,BE10,BF10,-0.0058127227356115085,-0.00581272067270322,取整差异
 è´§è¿,数据,全省|其中规下货物周转量(万吨公里),12月与去年同比,BU10,BV10,-0.031018696165214465,-0.031018696335082807,取整差异
 è´§è¿,数据,全省|其中规下货物周转量(万吨公里),累计同比,BW10,BX10,-0.05189933685184023,-0.05189933693732107,取整差异
 è´§è¿,数据,全省|其中规下货物周转量(万吨公里),2023å¹´2月,CA10,CB10,1371590.5321999996,1371590.5369,取整差异
 è´§è¿,数据,全省|其中规下货物周转量(万吨公里),2月与去年同比,CB10,CC10,0.3056523560132123,0.3056523604872634,取整差异
 è´§è¿,数据,全省|其中规下货物周转量(万吨公里),3月与去年同比,CD10,CE10,0.02483825012726726,0.024838250142626528,取整差异
 è´§è¿,数据,全省|其中规下货物周转量(万吨公里),2023å¹´4月,CE10,CF10,1583594.0229,1583594.01961409,取整差异
 è´§è¿,数据,全省|其中规下货物周转量(万吨公里),4月与去年同比,CF10,CG10,0.0007859135844336951,0.0007859115078328038,取整差异
 è´§è¿,数据,全省|其中规下货物周转量(万吨公里),5月与去年同比,CH10,CI10,-0.01535442492497463,-0.015354424955666413,取整差异
 è´§è¿,数据,全省|其中规下货物周转量(万吨公里),11月与去年同比,CT10,CU10,-0.027309853371422443,-0.027309854719284488,取整差异
 è´§è¿,数据,全省|其中规下货物周转量(万吨公里),45261,CU10,CV10,1792284.6330858017,1792284.6334,取整差异
 è´§è¿,数据,全省|其中规下货物周转量(万吨公里),12月与去年同比,CV10,CW10,-0.006568266278148216,-0.006568267480597467,取整差异
 è´§è¿,数据,全省|其中规下货物周转量(万吨公里),累计,CW10,CX10,19169099.37535965,19169099.37708794,取整差异
 è´§è¿,数据,全省|其中规下货物周转量(万吨公里),累计同比,CX10,CY10,-0.002085287950538417,-0.0020852879918542566,取整差异
 è´§è¿,数据,全省|其中规下货物周转量(万吨公里),12月环比%,CZ10,DA10,0.021323940789537366,0.02132394096858148,取整差异
 è´§è¿,数据,全省|其中规下货物周转量(万吨公里),5月环比%,DG10,DH10,0.02431473593812039,0.024314738063542674,取整差异
 è´§è¿,数据,全省|其中规下货物周转量(万吨公里),4月环比%,DH10,DI10,-0.04110006309926317,-0.0411000650889517,取整差异
 è´§è¿,数据,全省|其中规下货物周转量(万吨公里),3月环比%,DI10,DJ10,0.20405433385229133,0.2040543297263837,取整差异
 è´§è¿,数据,全省|其中规下货物周转量(万吨公里),2月份环比,DJ10,DK10,0.20954795733560008,0.2095479614803326,取整差异
 è´§è¿,数据,全省|其中规下货物周转量(万吨公里),1月份环比,DK10,DL10,-0.3714607053696277,-0.37146070624059807,取整差异
 è´§è¿,数据,全省|其中规下货物周转量(万吨公里),2022å¹´3月,DO10,DP10,1611444.073600001,1611444.07357585,取整差异
 è´§è¿,数据,全省|其中规下货物周转量(万吨公里),2022å¹´5月,DQ10,DR10,1647393.4728,1647393.47285135,取整差异
 è´§è¿,数据,全省|其中规下货物周转量(万吨公里),2022å¹´12月,DX10,DY10,1804134.6700000009,1804134.6725,取整差异
 è´§è¿,数据,全省|其中规下货物周转量(万吨公里),累计,DZ10,EA10,19209155.9969,19209155.9994272,取整差异
 è´§è¿,数据,全省|其中规下货物周转量(万吨公里),累计同比,EA10,EB10,-0.0768660515062467,-0.0768660513821359,取整差异
 è´§è¿,数据,全省|其中规下货物周转量(万吨公里),2021å¹´2月,ED10,EE10,1020210.4993599998,1020210.4993,取整差异
 è´§è¿,数据,全省|其中规下货物周转量(万吨公里),累计,EO10,EP10,20808633.490559995,None,仅软件有值
 è´§è¿,数据,武汉|规上货运量(万吨),累计,EO12,EP11,2653.07492,None,仅软件有值
 è´§è¿,数据,武汉|规上+规下周转量(万吨公里),8月环比%,DD14,DE12,0.1774344725554818,0.17743447591049671,取整差异
 è´§è¿,数据,武汉|规上+规下周转量(万吨公里),累计,EO14,EP12,6678874.299222901,None,仅软件有值
 è´§è¿,数据,武汉|规上货物周转量(万吨公里),8月环比%,DD15,DE13,0.20930179737348306,0.20930179735856203,取整差异
 è´§è¿,数据,武汉|规上货物周转量(万吨公里),累计,EO15,EP13,412262.2015499999,None,仅软件有值
 è´§è¿,数据,武汉|规下货物周转量(万吨公里),累计,EO16,EP14,6266612.097672901,None,仅软件有值
 è´§è¿,数据,黄石|规上货运量(万吨),累计,EO18,EP15,1435.6778599999998,None,仅软件有值
 è´§è¿,数据,黄石|规上+规下周转量(万吨公里),累计,EO20,EP16,465459.1541002903,None,仅软件有值
 è´§è¿,数据,黄石|规上货物周转量(万吨公里),累计,EO21,EP17,36761.33706,None,仅软件有值
 è´§è¿,数据,黄石|规下货物周转量(万吨公里),累计,EO22,EP18,428697.81704029033,None,仅软件有值
 è´§è¿,数据,十堰|规上货运量(万吨),累计,EO24,EP19,185.70419,None,仅软件有值
 è´§è¿,数据,十堰|规上+规下周转量(万吨公里),累计,EO26,EP20,454971.7209087118,None,仅软件有值
 è´§è¿,数据,十堰|规上货物周转量(万吨公里),累计,EO27,EP21,21335.284040000002,None,仅软件有值
 è´§è¿,数据,十堰|规下货物周转量(万吨公里),累计,EO28,EP22,433636.4368687118,None,仅软件有值
 è´§è¿,数据,宜昌|规上货运量(万吨),累计,EO30,EP23,575.3451,None,仅软件有值
 è´§è¿,数据,宜昌|规上+规下周转量(万吨公里),累计,EO32,EP24,1070313.9672362313,None,仅软件有值
 è´§è¿,数据,宜昌|规上货物周转量(万吨公里),累计,EO33,EP25,108694.70645999997,None,仅软件有值
 è´§è¿,数据,宜昌|规下货物周转量(万吨公里),累计,EO34,EP26,961619.2607762313,None,仅软件有值
 è´§è¿,数据,襄阳|规上货运量(万吨),累计,EO36,EP27,656.1511499999999,None,仅软件有值
 è´§è¿,数据,襄阳|规上+规下周转量(万吨公里),累计,EO38,EP28,5491979.075171484,None,仅软件有值
 è´§è¿,数据,襄阳|规上货物周转量(万吨公里),累计,EO39,EP29,120579.77257,None,仅软件有值
 è´§è¿,数据,襄阳|规下货物周转量(万吨公里),累计,EO40,EP30,5371399.302601485,None,仅软件有值
 è´§è¿,数据,鄂州|规上货运量(万吨),累计,EO42,EP31,267.5108,None,仅软件有值
 è´§è¿,数据,鄂州|规上+规下周转量(万吨公里),累计,EO44,EP32,150308.76446841884,None,仅软件有值
 è´§è¿,数据,鄂州|规上货物周转量(万吨公里),累计,EO45,EP33,9519.9237,None,仅软件有值
 è´§è¿,数据,鄂州|规下货物周转量(万吨公里),累计,EO46,EP34,140788.84076841883,None,仅软件有值
 è´§è¿,数据,荆门|规上货运量(万吨),累计,EO48,EP35,170.5474,None,仅软件有值
 è´§è¿,数据,荆门|规上+规下周转量(万吨公里),累计,EO50,EP36,1164929.0764394852,None,仅软件有值
 è´§è¿,数据,荆门|规上货物周转量(万吨公里),累计,EO51,EP37,47169.18646,None,仅软件有值
 è´§è¿,数据,荆门|规下货物周转量(万吨公里),累计,EO52,EP38,1117759.8899794852,None,仅软件有值
 è´§è¿,数据,孝感|规上货运量(万吨),累计,EO54,EP39,279.06606999999997,None,仅软件有值
 è´§è¿,数据,孝感|规上+规下周转量(万吨公里),累计,EO56,EP40,473167.29755546176,None,仅软件有值
 è´§è¿,数据,孝感|规上货物周转量(万吨公里),累计,EO57,EP41,46930.417949999995,None,仅软件有值
 è´§è¿,数据,孝感|规下货物周转量(万吨公里),累计,EO58,EP42,426236.8796054617,None,仅软件有值
 è´§è¿,数据,荆州|规上货运量(万吨),累计,EO60,EP43,449.15995,None,仅软件有值
 è´§è¿,数据,荆州|规上+规下周转量(万吨公里),累计,EO62,EP44,1557587.443872681,None,仅软件有值
 è´§è¿,数据,荆州|规上货物周转量(万吨公里),累计,EO63,EP45,107486.43884,None,仅软件有值
 è´§è¿,数据,荆州|规下货物周转量(万吨公里),累计,EO64,EP46,1450101.0050326807,None,仅软件有值
 è´§è¿,数据,黄冈|规上货运量(万吨),累计,EO66,EP47,540.1548,None,仅软件有值
 è´§è¿,数据,黄冈|规上+规下周转量(万吨公里),累计,EO68,EP48,1132738.0107476648,None,仅软件有值
 è´§è¿,数据,黄冈|规上货物周转量(万吨公里),累计,EO69,EP49,85269.47769,None,仅软件有值
 è´§è¿,数据,黄冈|规下货物周转量(万吨公里),累计,EO70,EP50,1047468.5330576648,None,仅软件有值
 è´§è¿,数据,咸宁|规上货运量(万吨),累计,EO72,EP51,89.36540000000001,None,仅软件有值
 è´§è¿,数据,咸宁|规上+规下周转量(万吨公里),累计,EO74,EP52,546278.0372249647,None,仅软件有值
 è´§è¿,数据,咸宁|规上货物周转量(万吨公里),累计,EO75,EP53,7111.533399999998,None,仅软件有值
 è´§è¿,数据,咸宁|规下货物周转量(万吨公里),累计,EO76,EP54,539166.5038249647,None,仅软件有值
 è´§è¿,数据,随州|规上货运量(万吨),累计,EO78,EP55,23.731219999999997,None,仅软件有值
 è´§è¿,数据,随州|规上+规下周转量(万吨公里),累计,EO80,EP56,1362641.0472375695,None,仅软件有值
 è´§è¿,数据,随州|规上货物周转量(万吨公里),累计,EO81,EP57,25334.99079,None,仅软件有值
 è´§è¿,数据,随州|规下货物周转量(万吨公里),累计,EO82,EP58,1337306.0564475693,None,仅软件有值
 è´§è¿,数据,恩施|规上货运量(万吨),累计,EO84,EP59,34.348400000000005,None,仅软件有值
 è´§è¿,数据,恩施|规上+规下周转量(万吨公里),累计,EO86,EP60,587538.9542579086,None,仅软件有值
 è´§è¿,数据,恩施|规上货物周转量(万吨公里),累计,EO87,EP61,4915.344300000001,None,仅软件有值
 è´§è¿,数据,恩施|规下货物周转量(万吨公里),累计,EO88,EP62,582623.6099579087,None,仅软件有值
 è´§è¿,数据,仙桃|规上货运量(万吨),累计,EO90,EP63,0,None,仅软件有值
 è´§è¿,数据,仙桃|规上+规下周转量(万吨公里),累计同比,EA92,EB64,-0.014716890297826635,0.0861759439924117,数值差异
 è´§è¿,数据,仙桃|规上+规下周转量(万吨公里),累计,EO92,EP64,174715.639567205,None,仅软件有值
 è´§è¿,数据,仙桃|规上货物周转量(万吨公里),累计同比,EA93,EB65,None,'#DIV/0!',仅手工有值
 è´§è¿,数据,仙桃|规上货物周转量(万吨公里),累计,EO93,EP65,0,None,仅软件有值
 è´§è¿,数据,仙桃|规下货物周转量(万吨公里),累计同比,EA94,EB66,-0.014716890297826635,0.0861759439924117,数值差异
 è´§è¿,数据,仙桃|规下货物周转量(万吨公里),累计,EO94,EP66,174715.639567205,None,仅软件有值
 è´§è¿,数据,潜江|规上货运量(万吨),累计同比,EA96,EB67,0.17927552472853048,0.282164375758668,数值差异
 è´§è¿,数据,潜江|规上货运量(万吨),累计,EO96,EP67,225.65049,None,仅软件有值
 è´§è¿,数据,潜江|规上+规下周转量(万吨公里),累计同比,EA98,EB68,-0.058086589654320786,0.0248055028126148,数值差异
 è´§è¿,数据,潜江|规上+规下周转量(万吨公里),累计,EO98,EP68,316605.69105947675,None,仅软件有值
 è´§è¿,数据,潜江|规上货物周转量(万吨公里),累计,EO99,EP69,61558.660130000004,None,仅软件有值
 è´§è¿,数据,潜江|规下货物周转量(万吨公里),累计同比,EA100,EB70,-0.11356122917111411,-0.0369708863263284,数值差异
 è´§è¿,数据,潜江|规下货物周转量(万吨公里),累计,EO100,EP70,255047.03092947675,None,仅软件有值
 è´§è¿,数据,天门|规上货运量(万吨),累计同比,EA102,EB71,0.07614997107953769,0.197304029150807,数值差异
 è´§è¿,数据,天门|规上货运量(万吨),累计,EO102,EP71,727.72004,None,仅软件有值
 è´§è¿,数据,天门|规上+规下周转量(万吨公里),累计同比,EA104,EB72,-0.042328172408227505,0.0592616926181349,数值差异
 è´§è¿,数据,天门|规上+规下周转量(万吨公里),累计,EO104,EP72,313422.8564262737,None,仅软件有值
 è´§è¿,数据,天门|规上货物周转量(万吨公里),累计,EO105,EP73,58217.64785,None,仅软件有值
 è´§è¿,数据,天门|规下货物周转量(万吨公里),累计同比,EA106,EB74,-0.06256225467560805,0.0355008526230451,数值差异
 è´§è¿,数据,天门|规下货物周转量(万吨公里),累计,EO106,EP74,255205.2085762737,None,仅软件有值
 è´§è¿,数据,林区|规上货运量(万吨),累计,EO108,EP75,0,None,仅软件有值
 è´§è¿,数据,林区|规上+规下周转量(万吨公里),累计同比,EA110,EB76,-0.04778443610214134,0.0951581405110749,数值差异
 è´§è¿,数据,林区|规上+规下周转量(万吨公里),累计,EO110,EP76,20249.377853271875,None,仅软件有值
 è´§è¿,数据,林区|规上货物周转量(万吨公里),累计同比,EA111,EB77,None,'#DIV/0!',仅手工有值
 è´§è¿,数据,林区|规上货物周转量(万吨公里),累计,EO111,EP77,0,None,仅软件有值
 è´§è¿,数据,林区|规下货物周转量(万吨公里),累计同比,EA112,EB78,-0.22284816525405782,-0.106185415882961,数值差异
 è´§è¿,数据,林区|规下货物周转量(万吨公里),累计,EO112,EP78,20249.377853271875,None,仅软件有值
 è´§è¿,数据,尾部历史块|林区,2025å¹´2月,X115,Y81,-5.1954884838778526e-11,6.446043698815629e-11,取整差异
 è´§è¿,数据,尾部历史块|林区,2025å¹´3月,Z115,AA81,1.2801137927453965e-10,1.1596057447604835e-11,取整差异
 è´§è¿,数据,尾部历史块|林区,2025å¹´4月,AB115,AC81,-3.865352482534945e-11,7.776179700158536e-11,取整差异
 è´§è¿,数据,尾部历史块|林区,2025å¹´5月,AD115,AE81,1.509761204943061e-10,3.456079866737127e-11,取整差异
 è´§è¿,数据,尾部历史块|林区,2025å¹´7月,AH115,AI81,-1.4711076801177114e-10,-3.069544618483633e-11,取整差异
 è´§è¿,数据,尾部历史块|林区,2025å¹´8月,AJ115,AK81,5.1386450650170445e-11,-6.502887117676437e-11,取整差异
 è´§è¿,数据,尾部历史块|林区,2025å¹´11月,AP115,AQ81,1.3676526577910408e-10,2.034994395216927e-11,取整差异
 è´§è¿,数据,尾部历史块|林区,2025å¹´12月,AR115,AS81,1.701891960692592e-10,5.377387424232438e-11,取整差异
 è´§è¿,数据,尾部历史块|林区,2024å¹´3月,BB115,BC81,-1.6416379367001355e-10,6.866684998385608e-11,取整差异
 è´§è¿,数据,尾部历史块|林区,2024å¹´4月,BD115,BE81,-1.502939994679764e-10,8.253664418589324e-11,取整差异
 è´§è¿,数据,尾部历史块|林区,2024å¹´6月,BH115,BI81,6.127720553195104e-11,-5.5138116294983774e-11,取整差异
 è´§è¿,数据,尾部历史块|林区,2024å¹´7月,BJ115,BK81,-1.4642864698544145e-10,-3.001332515850663e-11,取整差异
 è´§è¿,数据,尾部历史块|林区,2024å¹´9月,BN115,BO81,-1.1687006917782128e-10,0,取整差异
 è´§è¿,数据,尾部历史块|林区,2024å¹´10月,BP115,BQ81,-4.411049303598702e-11,7.23048287909478e-11,取整差异
 è´§è¿,数据,尾部历史块|林区,2024å¹´12月,BT115,BU81,1.1164047464262694e-10,-4.774847184307873e-12,取整差异
 è´§è¿,数据,尾部历史块|林区,2025å¹´2月,X117,Y83,2.6216184778604656e-10,2.9331204132176936e-11,取整差异
 è´§è¿,数据,尾部历史块|林区,2025å¹´3月,Z117,AA83,3.497007128316909e-10,1.1687006917782128e-10,取整差异
 è´§è¿,数据,尾部历史块|林区,2025å¹´4月,AB117,AC83,5.35919753019698e-10,-3.9540282159578055e-10,取整差异
 è´§è¿,数据,尾部历史块|林区,2025å¹´5月,AD117,AE83,3.54702933691442e-11,5.011315806768835e-10,取整差异
 è´§è¿,数据,尾部历史块|林区,2025å¹´6月,AF117,AG83,3.731770448212046e-11,9.68640279097599e-10,取整差异
 è´§è¿,数据,尾部历史块|林区,2025å¹´7月,AH117,AI83,4.672529030358419e-10,7.000835466897115e-10,取整差异
 è´§è¿,数据,尾部历史块|林区,2025å¹´8月,AJ117,AK83,-6.921254680491984e-10,-2.2646418074145913e-10,取整差异
 è´§è¿,数据,尾部历史块|林区,2025å¹´9月,AL117,AM83,7.266862667165697e-10,-2.0463630789890885e-10,取整差异
 è´§è¿,数据,尾部历史块|林区,2025å¹´10月,AN117,AO83,1.2141754268668592e-10,-1.1141310096718371e-10,取整差异
 è´§è¿,数据,尾部历史块|林区,2025å¹´11月,AP117,AQ83,-2.6989255275111645e-10,-3.7061909097246826e-11,取整差异
 è´§è¿,数据,尾部历史块|林区,2025å¹´12月,AR117,AS83,-3.0661340133519843e-10,-1.0051053322968073e-09,取整差异
 è´§è¿,数据,尾部历史块|林区,2024å¹´2月,AZ117,BA83,-2.2794210963184014e-10,1.213038558489643e-10,取整差异
 è´§è¿,数据,尾部历史块|林区,2024å¹´3月,BB117,BC83,-1.8394530343357474e-10,-4.1677594708744437e-10,取整差异
 è´§è¿,数据,尾部历史块|林区,2024å¹´4月,BD117,BE83,7.571543392259628e-11,-6.227764970390126e-10,取整差异
 è´§è¿,数据,尾部历史块|林区,2024å¹´5月,BF117,BG83,-2.759179551503621e-10,1.586727194080595e-09,取整差异
 è´§è¿,数据,尾部历史块|林区,2024å¹´6月,BH117,BI83,3.666400516522117e-11,1.2008172234345693e-09,取整差异
 è´§è¿,数据,尾部历史块|林区,2024å¹´7月,BJ117,BK83,2.376054908381775e-10,-9.265477274311706e-10,取整差异
 è´§è¿,数据,尾部历史块|林区,2024å¹´9月,BN117,BO83,1.7189449863508344e-10,-2.937667886726558e-10,取整差异
 è´§è¿,数据,尾部历史块|林区,2024å¹´10月,BP117,BQ83,1.2147438610554673e-10,-3.4418690120219253e-10,取整差异
 è´§è¿,数据,尾部历史块|林区,2024å¹´11月,BR117,BS83,-1.610089839232387e-10,7.182165973063093e-11,取整差异
 è´§è¿,数据,尾部历史块|林区,2024å¹´12月,BT117,BU83,1.61662683240138e-10,-7.116796041373163e-11,取整差异
 è´§è¿,数据,尾部历史块|林区,2025å¹´3月,Z118,AA84,3.0377123039215803e-10,-1.6189005691558123e-10,取整差异
 è´§è¿,数据,尾部历史块|林区,2025å¹´4月,AB118,AC84,3.3924152376130223e-10,-5.920810508541763e-10,取整差异
 è´§è¿,数据,尾部历史块|林区,2025å¹´5月,AD118,AE84,5.820766091346741e-11,9.89530235528946e-10,取整差异
 è´§è¿,数据,尾部历史块|林区,2025å¹´6月,AF118,AG84,-1.6279955161735415e-10,7.685230229981244e-10,取整差异
 è´§è¿,数据,尾部历史块|林区,2025å¹´7月,AH118,AI84,-1.7917045624926686e-10,2.864908310584724e-10,取整差异
 è´§è¿,数据,尾部历史块|林区,2025å¹´8月,AJ118,AK84,-1.1236807040404528e-09,-6.580194167327136e-10,取整差异
 è´§è¿,数据,尾部历史块|林区,2025å¹´9月,AL118,AM84,9.049472282640636e-10,-2.637534635141492e-11,取整差异
 è´§è¿,数据,尾部历史块|林区,2025å¹´10月,AN118,AO84,2.3010215954855084e-10,-2.355591277591884e-10,取整差异
 è´§è¿,数据,尾部历史块|林区,2025å¹´12月,AR118,AS84,-3.490185918053612e-10,-1.2803411664208397e-09,取整差异
 è´§è¿,数据,尾部历史块|林区,2024å¹´2月,AZ118,BA84,5.95719029661268e-11,2.9240254661999643e-10,取整差异
 è´§è¿,数据,尾部历史块|林区,2024å¹´4月,BD118,BE84,-2.2782842279411852e-10,-6.934897101018578e-10,取整差异
 è´§è¿,数据,尾部历史块|林区,2024å¹´5月,BF118,BG84,-1.3915268937125802e-10,1.2578311725519598e-09,取整差异
 è´§è¿,数据,尾部历史块|林区,2024å¹´6月,BH118,BI84,-3.410605131648481e-12,9.2791196948383e-10,取整差异
 è´§è¿,数据,尾部历史块|林区,2024å¹´7月,BJ118,BK84,-1.673470251262188e-10,-1.0986695997416973e-09,取整差异
 è´§è¿,数据,尾部历史块|林区,2024å¹´9月,BN118,BO84,-7.73070496506989e-12,-4.733919922728091e-10,取整差异
 è´§è¿,数据,尾部历史块|林区,2024å¹´10月,BP118,BQ84,2.4874680093489587e-10,-2.1691448637284338e-10,取整差异
 è´§è¿,数据,尾部历史块|林区,2024å¹´12月,BT118,BU84,0,-4.665707820095122e-10,取整差异
班线包车,数据,全省|客运量(万人),同比,IL4,IL4,-0.016421275397327406,'#REF!',错误值差异
班线包车,数据,全省|旅客周转量(万人公里),同比,IL5,IL5,-0.010369977064559,'#REF!',错误值差异
班线包车,数据,武汉|客运量(万人),43650,FV8,FV8,374,'374.0000',格式差异(文本型数字)
班线包车,数据,武汉|客运量(万人),43681,FW8,FW8,316,'316.0000',格式差异(文本型数字)
班线包车,数据,武汉|客运量(万人),43712,FX8,FX8,349,'349.0000',格式差异(文本型数字)
班线包车,数据,武汉|客运量(万人),43742,FY8,FY8,352,'352.0000',格式差异(文本型数字)
班线包车,数据,武汉|客运量(万人),43773,GA8,GA8,291,'291.0000',格式差异(文本型数字)
班线包车,数据,武汉|客运量(万人),43803,GC8,GC8,177,'177.0000',格式差异(文本型数字)
班线包车,数据,武汉|客运量(万人),同比,IL8,IL8,-0.08956804335937629,None,仅软件有值
班线包车,数据,武汉|旅客周转量(万人公里),43650,FV9,FV9,33437,"'33,437.0000'",格式差异(文本型数字)
班线包车,数据,武汉|旅客周转量(万人公里),43681,FW9,FW9,35219,"'35,219.0000'",格式差异(文本型数字)
班线包车,数据,武汉|旅客周转量(万人公里),43712,FX9,FX9,34369,"'34,369.0000'",格式差异(文本型数字)
班线包车,数据,武汉|旅客周转量(万人公里),43742,FY9,FY9,42294,"'42,294.0000'",格式差异(文本型数字)
班线包车,数据,武汉|旅客周转量(万人公里),43773,GA9,GA9,30906,"'30,906.0000'",格式差异(文本型数字)
班线包车,数据,武汉|旅客周转量(万人公里),43803,GC9,GC9,22497,"'22,497.0000'",格式差异(文本型数字)
班线包车,数据,武汉|旅客周转量(万人公里),同比,IL9,IL9,-0.050445149799922095,None,仅软件有值
班线包车,数据,黄石|客运量(万人),43650,FV10,FV10,189.74,'189.7400',格式差异(文本型数字)
班线包车,数据,黄石|客运量(万人),43681,FW10,FW10,173.51,'173.5100',格式差异(文本型数字)
班线包车,数据,黄石|客运量(万人),43712,FX10,FX10,212.76,'212.7600',格式差异(文本型数字)
班线包车,数据,黄石|客运量(万人),43742,FY10,FY10,235.44,'235.4400',格式差异(文本型数字)
班线包车,数据,黄石|客运量(万人),43773,GA10,GA10,235.07,'235.0700',格式差异(文本型数字)
班线包车,数据,黄石|客运量(万人),43803,GC10,GC10,210.79,'210.7900',格式差异(文本型数字)
班线包车,数据,黄石|客运量(万人),同比,IL10,IL10,0.007814803892657096,None,仅软件有值
班线包车,数据,黄石|客运量(万人),42461|4月,IT10,IT10,255,'255',格式差异(文本型数字)
班线包车,数据,黄石|客运量(万人),42491|5月,IV10,IV10,254,'254.0000',格式差异(文本型数字)
班线包车,数据,黄石|客运量(万人),42522|6月,IX10,IX10,271,'271.0000',格式差异(文本型数字)
班线包车,数据,黄石|旅客周转量(万人公里),43650,FV11,FV11,12939.55,"'12,939.5500'",格式差异(文本型数字)
班线包车,数据,黄石|旅客周转量(万人公里),43681,FW11,FW11,12615.74,"'12,615.7400'",格式差异(文本型数字)
班线包车,数据,黄石|旅客周转量(万人公里),43712,FX11,FX11,14098.66,"'14,098.6600'",格式差异(文本型数字)
班线包车,数据,黄石|旅客周转量(万人公里),43742,FY11,FY11,12424.8,"'12,424.8000'",格式差异(文本型数字)
班线包车,数据,黄石|旅客周转量(万人公里),43773,GA11,GA11,10888.26,"'10,888.2600'",格式差异(文本型数字)
班线包车,数据,黄石|旅客周转量(万人公里),43803,GC11,GC11,11504.24,"'11,504.2400'",格式差异(文本型数字)
班线包车,数据,黄石|旅客周转量(万人公里),同比,IL11,IL11,0.009946712402894686,None,仅软件有值
班线包车,数据,黄石|旅客周转量(万人公里),42461|4月,IT11,IT11,15548,'15548',格式差异(文本型数字)
班线包车,数据,黄石|旅客周转量(万人公里),42491|5月,IV11,IV11,18649,"'18,649.0000'",格式差异(文本型数字)
班线包车,数据,黄石|旅客周转量(万人公里),42522|6月,IX11,IX11,17563,"'17,563.0000'",格式差异(文本型数字)
班线包车,数据,十堰|客运量(万人),43681,FW14,FW14,255,'255.0000',格式差异(文本型数字)
班线包车,数据,十堰|客运量(万人),43712,FX14,FX14,247,'247.0000',格式差异(文本型数字)
班线包车,数据,十堰|客运量(万人),43742,FY14,FY14,257,'257.0000',格式差异(文本型数字)
班线包车,数据,十堰|客运量(万人),43773,GA14,GA14,228,'228.0000',格式差异(文本型数字)
班线包车,数据,十堰|客运量(万人),43803,GC14,GC14,274,'274.0000',格式差异(文本型数字)
班线包车,数据,十堰|客运量(万人),同比,IL14,IL14,0.02001244577520045,None,仅软件有值
班线包车,数据,十堰|旅客周转量(万人公里),43681,FW15,FW15,23454,"'23,454.0000'",格式差异(文本型数字)
班线包车,数据,十堰|旅客周转量(万人公里),43712,FX15,FX15,25859,"'25,859.0000'",格式差异(文本型数字)
班线包车,数据,十堰|旅客周转量(万人公里),43742,FY15,FY15,22793,"'22,793.0000'",格式差异(文本型数字)
班线包车,数据,十堰|旅客周转量(万人公里),43773,GA15,GA15,19645,"'19,645.0000'",格式差异(文本型数字)
班线包车,数据,十堰|旅客周转量(万人公里),43803,GC15,GC15,35100,"'35,100.0000'",格式差异(文本型数字)
班线包车,数据,十堰|旅客周转量(万人公里),同比,IL15,IL15,0.026697668361913562,None,仅软件有值
班线包车,数据,宜昌|客运量(万人),43650,FV18,FV18,751,'751.0000',格式差异(文本型数字)
班线包车,数据,宜昌|客运量(万人),43681,FW18,FW18,762,'762.0000',格式差异(文本型数字)
班线包车,数据,宜昌|客运量(万人),43712,FX18,FX18,728,'728.0000',格式差异(文本型数字)
班线包车,数据,宜昌|客运量(万人),43742,FY18,FY18,903,'903.0000',格式差异(文本型数字)
班线包车,数据,宜昌|客运量(万人),43773,GA18,GA18,706,'706.0000',格式差异(文本型数字)
班线包车,数据,宜昌|客运量(万人),43803,GC18,GC18,702,'702.0000',格式差异(文本型数字)
班线包车,数据,宜昌|客运量(万人),同比,IL18,IL18,0.012753463620515548,None,仅软件有值
班线包车,数据,宜昌|旅客周转量(万人公里),43650,FV19,FV19,37470,"'37,470.0000'",格式差异(文本型数字)
班线包车,数据,宜昌|旅客周转量(万人公里),43681,FW19,FW19,39710,"'39,710.0000'",格式差异(文本型数字)
班线包车,数据,宜昌|旅客周转量(万人公里),43712,FX19,FX19,40130,"'40,130.0000'",格式差异(文本型数字)
班线包车,数据,宜昌|旅客周转量(万人公里),43742,FY19,FY19,50180,"'50,180.0000'",格式差异(文本型数字)
班线包车,数据,宜昌|旅客周转量(万人公里),43773,GA19,GA19,40360,"'40,360.0000'",格式差异(文本型数字)
班线包车,数据,宜昌|旅客周转量(万人公里),43803,GC19,GC19,38120,"'38,120.0000'",格式差异(文本型数字)
班线包车,数据,宜昌|旅客周转量(万人公里),同比,IL19,IL19,0.014923117191445678,None,仅软件有值
班线包车,数据,襄阳|客运量(万人),43681,FW22,FW22,791,'791.0000',格式差异(文本型数字)
班线包车,数据,襄阳|客运量(万人),43712,FX22,FX22,826,'826.0000',格式差异(文本型数字)
班线包车,数据,襄阳|客运量(万人),43742,FY22,FY22,840,'840.0000',格式差异(文本型数字)
班线包车,数据,襄阳|客运量(万人),43773,GA22,GA22,743,'743.0000',格式差异(文本型数字)
班线包车,数据,襄阳|客运量(万人),43803,GC22,GC22,685,'685.0000',格式差异(文本型数字)
班线包车,数据,襄阳|客运量(万人),同比,IL22,IL22,0.012848551120831164,None,仅软件有值
班线包车,数据,襄阳|旅客周转量(万人公里),43681,FW23,FW23,40165,"'40,165.0000'",格式差异(文本型数字)
班线包车,数据,襄阳|旅客周转量(万人公里),43712,FX23,FX23,42520,"'42,520.0000'",格式差异(文本型数字)
班线包车,数据,襄阳|旅客周转量(万人公里),43742,FY23,FY23,40421,"'40,421.0000'",格式差异(文本型数字)
班线包车,数据,襄阳|旅客周转量(万人公里),43773,GA23,GA23,36809,"'36,809.0000'",格式差异(文本型数字)
班线包车,数据,襄阳|旅客周转量(万人公里),43803,GC23,GC23,37389,"'37,389.0000'",格式差异(文本型数字)
班线包车,数据,襄阳|旅客周转量(万人公里),同比,IL23,IL23,0.01494971746923257,None,仅软件有值
班线包车,数据,鄂州|客运量(万人),43650,FV26,FV26,113.7518,'113.7518',格式差异(文本型数字)
班线包车,数据,鄂州|客运量(万人),43681,FW26,FW26,106.5756,'106.5756',格式差异(文本型数字)
班线包车,数据,鄂州|客运量(万人),43712,FX26,FX26,106.2796,'106.2796',格式差异(文本型数字)
班线包车,数据,鄂州|客运量(万人),43742,FY26,FY26,112.6674,'112.6674',格式差异(文本型数字)
班线包车,数据,鄂州|客运量(万人),43773,GA26,GA26,96,'96.0000',格式差异(文本型数字)
班线包车,数据,鄂州|客运量(万人),43803,GC26,GC26,111.28,'111.2800',格式差异(文本型数字)
班线包车,数据,鄂州|客运量(万人),同比,IL26,IL26,-0.03399798681472077,None,仅软件有值
班线包车,数据,鄂州|旅客周转量(万人公里),43650,FV27,FV27,6809.0802,"'6,809.0802'",格式差异(文本型数字)
班线包车,数据,鄂州|旅客周转量(万人公里),43681,FW27,FW27,6583.0306,"'6,583.0306'",格式差异(文本型数字)
班线包车,数据,鄂州|旅客周转量(万人公里),43712,FX27,FX27,7084.1998,"'7,084.1998'",格式差异(文本型数字)
班线包车,数据,鄂州|旅客周转量(万人公里),43742,FY27,FY27,6521.3373,"'6,521.3373'",格式差异(文本型数字)
班线包车,数据,鄂州|旅客周转量(万人公里),43773,GA27,GA27,5400,"'5,400.0000'",格式差异(文本型数字)
班线包车,数据,鄂州|旅客周转量(万人公里),43803,GC27,GC27,9583.25,"'9,583.2500'",格式差异(文本型数字)
班线包车,数据,鄂州|旅客周转量(万人公里),同比,IL27,IL27,-0.026094841612348763,None,仅软件有值
班线包车,数据,荆门|客运量(万人),43650,FV28,FV28,149.3507,'149.3507',格式差异(文本型数字)
班线包车,数据,荆门|客运量(万人),43681,FW28,FW28,149.4144,'149.4144',格式差异(文本型数字)
班线包车,数据,荆门|客运量(万人),43712,FX28,FX28,149.22,'149.2200',格式差异(文本型数字)
班线包车,数据,荆门|客运量(万人),43742,FY28,FY28,152.38,'152.3800',格式差异(文本型数字)
班线包车,数据,荆门|客运量(万人),43773,GA28,GA28,151.0347,'151.0347',格式差异(文本型数字)
班线包车,数据,荆门|客运量(万人),43803,GC28,GC28,143.994,'143.9940',格式差异(文本型数字)
班线包车,数据,荆门|旅客周转量(万人公里),43650,FV29,FV29,9648.601,"'9,648.6010'",格式差异(文本型数字)
班线包车,数据,荆门|旅客周转量(万人公里),43681,FW29,FW29,9960.1209,"'9,960.1209'",格式差异(文本型数字)
班线包车,数据,荆门|旅客周转量(万人公里),43712,FX29,FX29,9853.9052,"'9,853.9052'",格式差异(文本型数字)
班线包车,数据,荆门|旅客周转量(万人公里),43742,FY29,FY29,11732.5774,"'11,732.5774'",格式差异(文本型数字)
班线包车,数据,荆门|旅客周转量(万人公里),43773,GA29,GA29,11452.5648,"'11,452.5648'",格式差异(文本型数字)
班线包车,数据,荆门|旅客周转量(万人公里),43803,GC29,GC29,10001.6771,"'10,001.6771'",格式差异(文本型数字)
班线包车,数据,孝感|客运量(万人),43681,FW32,FW32,425.18,'425.1800',格式差异(文本型数字)
班线包车,数据,孝感|客运量(万人),43712,FX32,FX32,445.87,'445.8700',格式差异(文本型数字)
班线包车,数据,孝感|客运量(万人),43742,FY32,FY32,455.09,'455.0900',格式差异(文本型数字)
班线包车,数据,孝感|客运量(万人),43773,GA32,GA32,408.23,'408.2300',格式差异(文本型数字)
班线包车,数据,孝感|客运量(万人),43803,GC32,GC32,478.98,'478.9800',格式差异(文本型数字)
班线包车,数据,孝感|客运量(万人),同比,IL32,IL32,-0.015902925740727047,None,仅软件有值
班线包车,数据,孝感|旅客周转量(万人公里),43681,FW33,FW33,19487.68,"'19,487.6800'",格式差异(文本型数字)
班线包车,数据,孝感|旅客周转量(万人公里),43712,FX33,FX33,22469.67,"'22,469.6700'",格式差异(文本型数字)
班线包车,数据,孝感|旅客周转量(万人公里),43742,FY33,FY33,19737.46,"'19,737.4600'",格式差异(文本型数字)
班线包车,数据,孝感|旅客周转量(万人公里),43773,GA33,GA33,17237.76,"'17,237.7600'",格式差异(文本型数字)
班线包车,数据,孝感|旅客周转量(万人公里),43803,GC33,GC33,28820.83,"'28,820.8300'",格式差异(文本型数字)
班线包车,数据,孝感|旅客周转量(万人公里),同比,IL33,IL33,-0.018393170722521224,None,仅软件有值
班线包车,数据,荆州|客运量(万人),43650,FV36,FV36,475,'475.0000',格式差异(文本型数字)
班线包车,数据,荆州|客运量(万人),43681,FW36,FW36,469,'469.0000',格式差异(文本型数字)
班线包车,数据,荆州|客运量(万人),43712,FX36,FX36,455,'455.0000',格式差异(文本型数字)
班线包车,数据,荆州|客运量(万人),43742,FY36,FY36,456,'456.0000',格式差异(文本型数字)
班线包车,数据,荆州|客运量(万人),43773,GA36,GA36,401,'401.0000',格式差异(文本型数字)
班线包车,数据,荆州|客运量(万人),43803,GC36,GC36,465.45,'465.4500',格式差异(文本型数字)
班线包车,数据,荆州|客运量(万人),同比,IL36,IL36,-0.012405115079928919,None,仅软件有值
班线包车,数据,荆州|旅客周转量(万人公里),43650,FV37,FV37,26742,"'26,742.0000'",格式差异(文本型数字)
班线包车,数据,荆州|旅客周转量(万人公里),43681,FW37,FW37,25128,"'25,128.0000'",格式差异(文本型数字)
班线包车,数据,荆州|旅客周转量(万人公里),43712,FX37,FX37,25308,"'25,308.0000'",格式差异(文本型数字)
班线包车,数据,荆州|旅客周转量(万人公里),43742,FY37,FY37,25412,"'25,412.0000'",格式差异(文本型数字)
班线包车,数据,荆州|旅客周转量(万人公里),43773,GA37,GA37,21352,"'21,352.0000'",格式差异(文本型数字)
班线包车,数据,荆州|旅客周转量(万人公里),43803,GC37,GC37,23866.57,"'23,866.5700'",格式差异(文本型数字)
班线包车,数据,荆州|旅客周转量(万人公里),同比,IL37,IL37,-0.024147051886107662,None,仅软件有值
班线包车,数据,黄冈|客运量(万人),43650,FV38,FV38,605,'605.0000',格式差异(文本型数字)
班线包车,数据,黄冈|客运量(万人),43681,FW38,FW38,575,'575.0000',格式差异(文本型数字)
班线包车,数据,黄冈|客运量(万人),同比,IL38,IL38,-0.033448106246925735,None,仅软件有值
班线包车,数据,黄冈|旅客周转量(万人公里),43650,FV39,FV39,30086,"'30,086.0000'",格式差异(文本型数字)
班线包车,数据,黄冈|旅客周转量(万人公里),43681,FW39,FW39,31110,"'31,110.0000'",格式差异(文本型数字)
班线包车,数据,黄冈|旅客周转量(万人公里),同比,IL39,IL39,-0.015729759185897696,None,仅软件有值
班线包车,数据,咸宁|客运量(万人),43650,FV42,FV42,381,'381.0000',格式差异(文本型数字)
班线包车,数据,咸宁|客运量(万人),43681,FW42,FW42,367,'367.0000',格式差异(文本型数字)
班线包车,数据,咸宁|客运量(万人),43712,FX42,FX42,372,'372.0000',格式差异(文本型数字)
班线包车,数据,咸宁|客运量(万人),43742,FY42,FY42,382,'382.0000',格式差异(文本型数字)
班线包车,数据,咸宁|客运量(万人),43773,GA42,GA42,357,'357.0000',格式差异(文本型数字)
班线包车,数据,咸宁|客运量(万人),43803,GC42,GC42,390,'390.0000',格式差异(文本型数字)
班线包车,数据,咸宁|客运量(万人),同比,IL42,IL42,-0.0045705204824514345,None,仅软件有值
班线包车,数据,咸宁|旅客周转量(万人公里),43650,FV43,FV43,23132,"'23,132.0000'",格式差异(文本型数字)
班线包车,数据,咸宁|旅客周转量(万人公里),43681,FW43,FW43,21503,"'21,503.0000'",格式差异(文本型数字)
班线包车,数据,咸宁|旅客周转量(万人公里),43712,FX43,FX43,24106,"'24,106.0000'",格式差异(文本型数字)
班线包车,数据,咸宁|旅客周转量(万人公里),43742,FY43,FY43,21433,"'21,433.0000'",格式差异(文本型数字)
班线包车,数据,咸宁|旅客周转量(万人公里),43773,GA43,GA43,19142,"'19,142.0000'",格式差异(文本型数字)
班线包车,数据,咸宁|旅客周转量(万人公里),43803,GC43,GC43,30675,"'30,675.0000'",格式差异(文本型数字)
班线包车,数据,咸宁|旅客周转量(万人公里),同比,IL43,IL43,-0.006856532800454396,None,仅软件有值
班线包车,数据,随州|客运量(万人),43650,FV44,FV44,155.7059,'155.7059',格式差异(文本型数字)
班线包车,数据,随州|客运量(万人),43681,FW44,FW44,152.3916,'152.3916',格式差异(文本型数字)
班线包车,数据,随州|客运量(万人),43712,FX44,FX44,198.5506,'198.5506',格式差异(文本型数字)
班线包车,数据,随州|客运量(万人),43742,FY44,FY44,221.8934,'221.8934',格式差异(文本型数字)
班线包车,数据,随州|客运量(万人),43773,GA44,GA44,198.4638,'198.4638',格式差异(文本型数字)
班线包车,数据,随州|客运量(万人),43803,GC44,GC44,284.6173,'284.6173',格式差异(文本型数字)
班线包车,数据,随州|客运量(万人),同比,IL44,IL44,-0.02226538678045087,None,仅软件有值
班线包车,数据,随州|旅客周转量(万人公里),43650,FV45,FV45,9760.26,"'9,760.2600'",格式差异(文本型数字)
班线包车,数据,随州|旅客周转量(万人公里),43681,FW45,FW45,9665.1387,"'9,665.1387'",格式差异(文本型数字)
班线包车,数据,随州|旅客周转量(万人公里),43712,FX45,FX45,10860.085,"'10,860.0850'",格式差异(文本型数字)
班线包车,数据,随州|旅客周转量(万人公里),43742,FY45,FY45,11214.6759,"'11,214.6759'",格式差异(文本型数字)
班线包车,数据,随州|旅客周转量(万人公里),43773,GA45,GA45,9884.992,"'9,884.9920'",格式差异(文本型数字)
班线包车,数据,随州|旅客周转量(万人公里),43803,GC45,GC45,19983.1777,"'19,983.1777'",格式差异(文本型数字)
班线包车,数据,随州|旅客周转量(万人公里),同比,IL45,IL45,-0.01961284579418665,None,仅软件有值
班线包车,数据,恩施|客运量(万人),43650,FV48,FV48,339.3471,'339.3471',格式差异(文本型数字)
班线包车,数据,恩施|客运量(万人),43681,FW48,FW48,337.4522,'337.4522',格式差异(文本型数字)
班线包车,数据,恩施|客运量(万人),43712,FX48,FX48,323.5839,'323.5839',格式差异(文本型数字)
班线包车,数据,恩施|客运量(万人),43742,FY48,FY48,324.1455,'324.1455',格式差异(文本型数字)
班线包车,数据,恩施|客运量(万人),43773,GA48,GA48,312.8523,'312.8523',格式差异(文本型数字)
班线包车,数据,恩施|客运量(万人),43803,GC48,GC48,322.4966,'322.4966',格式差异(文本型数字)
班线包车,数据,恩施|客运量(万人),同比,IL48,IL48,0.013343150437318485,None,仅软件有值
班线包车,数据,恩施|旅客周转量(万人公里),43650,FV49,FV49,22562.9173,"'22,562.9173'",格式差异(文本型数字)
班线包车,数据,恩施|旅客周转量(万人公里),43681,FW49,FW49,20286.2209,"'20,286.2209'",格式差异(文本型数字)
班线包车,数据,恩施|旅客周转量(万人公里),43712,FX49,FX49,20254.1227,"'20,254.1227'",格式差异(文本型数字)
班线包车,数据,恩施|旅客周转量(万人公里),43742,FY49,FY49,19329.5673,"'19,329.5673'",格式差异(文本型数字)
班线包车,数据,恩施|旅客周转量(万人公里),43773,GA49,GA49,17842.428,"'17,842.4280'",格式差异(文本型数字)
班线包车,数据,恩施|旅客周转量(万人公里),43803,GC49,GC49,18078.4298,"'18,078.4298'",格式差异(文本型数字)
班线包车,数据,恩施|旅客周转量(万人公里),同比,IL49,IL49,0.00249036116687118,None,仅软件有值
班线包车,数据,仙桃|客运量(万人),43650,FV50,FV50,148,'148.0000',格式差异(文本型数字)
班线包车,数据,仙桃|客运量(万人),43681,FW50,FW50,142,'142.0000',格式差异(文本型数字)
班线包车,数据,仙桃|客运量(万人),43712,FX50,FX50,143,'143.0000',格式差异(文本型数字)
班线包车,数据,仙桃|客运量(万人),43742,FY50,FY50,153,'153.0000',格式差异(文本型数字)
班线包车,数据,仙桃|客运量(万人),43773,GA50,GA50,134,'134.0000',格式差异(文本型数字)
班线包车,数据,仙桃|客运量(万人),43803,GC50,GC50,154,'154.0000',格式差异(文本型数字)
班线包车,数据,仙桃|客运量(万人),同比,IL50,IL50,0.00778588807785896,'`',类型不同
班线包车,数据,仙桃|旅客周转量(万人公里),43650,FV51,FV51,6054,"'6,054.0000'",格式差异(文本型数字)
班线包车,数据,仙桃|旅客周转量(万人公里),43681,FW51,FW51,5836,"'5,836.0000'",格式差异(文本型数字)
班线包车,数据,仙桃|旅客周转量(万人公里),43712,FX51,FX51,6379,"'6,379.0000'",格式差异(文本型数字)
班线包车,数据,仙桃|旅客周转量(万人公里),43742,FY51,FY51,5736,"'5,736.0000'",格式差异(文本型数字)
班线包车,数据,仙桃|旅客周转量(万人公里),43773,GA51,GA51,5155,"'5,155.0000'",格式差异(文本型数字)
班线包车,数据,仙桃|旅客周转量(万人公里),43803,GC51,GC51,8348,"'8,348.0000'",格式差异(文本型数字)
班线包车,数据,仙桃|旅客周转量(万人公里),同比,IL51,IL51,0.010203196092287481,None,仅软件有值
班线包车,数据,潜江|客运量(万人),43650,FV52,FV52,104.6,'104.6000',格式差异(文本型数字)
班线包车,数据,潜江|客运量(万人),43681,FW52,FW52,101.8,'101.8000',格式差异(文本型数字)
班线包车,数据,潜江|客运量(万人),43712,FX52,FX52,102,'102.0000',格式差异(文本型数字)
班线包车,数据,潜江|客运量(万人),43742,FY52,FY52,104.7,'104.7000',格式差异(文本型数字)
班线包车,数据,潜江|客运量(万人),43773,GA52,GA52,93,'93.0000',格式差异(文本型数字)
班线包车,数据,潜江|客运量(万人),43803,GC52,GC52,109,'109.0000',格式差异(文本型数字)
班线包车,数据,潜江|客运量(万人),同比,IL52,IL52,-0.09755023396641893,None,仅软件有值
班线包车,数据,潜江|旅客周转量(万人公里),43650,FV53,FV53,4571,"'4,571.0000'",格式差异(文本型数字)
班线包车,数据,潜江|旅客周转量(万人公里),43681,FW53,FW53,4471,"'4,471.0000'",格式差异(文本型数字)
班线包车,数据,潜江|旅客周转量(万人公里),43712,FX53,FX53,4897,"'4,897.0000'",格式差异(文本型数字)
班线包车,数据,潜江|旅客周转量(万人公里),43742,FY53,FY53,4280,"'4,280.0000'",格式差异(文本型数字)
班线包车,数据,潜江|旅客周转量(万人公里),43773,GA53,GA53,3743,"'3,743.0000'",格式差异(文本型数字)
班线包车,数据,潜江|旅客周转量(万人公里),43803,GC53,GC53,6379,"'6,379.0000'",格式差异(文本型数字)
班线包车,数据,潜江|旅客周转量(万人公里),同比,IL53,IL53,-0.09764237492613437,None,仅软件有值
班线包车,数据,天门|客运量(万人),43650,FV54,FV54,161,'161.0000',格式差异(文本型数字)
班线包车,数据,天门|客运量(万人),43681,FW54,FW54,158,'158.0000',格式差异(文本型数字)
班线包车,数据,天门|客运量(万人),43712,FX54,FX54,163,'163.0000',格式差异(文本型数字)
班线包车,数据,天门|客运量(万人),43742,FY54,FY54,164,'164.0000',格式差异(文本型数字)
班线包车,数据,天门|客运量(万人),43773,GA54,GA54,145,'145.0000',格式差异(文本型数字)
班线包车,数据,天门|客运量(万人),43803,GC54,GC54,170,'170.0000',格式差异(文本型数字)
班线包车,数据,天门|客运量(万人),同比,IL54,IL54,0.009821428571428648,None,仅软件有值
班线包车,数据,天门|旅客周转量(万人公里),43650,FV55,FV55,7240,"'7,240.0000'",格式差异(文本型数字)
班线包车,数据,天门|旅客周转量(万人公里),43681,FW55,FW55,7110,"'7,110.0000'",格式差异(文本型数字)
班线包车,数据,天门|旅客周转量(万人公里),43712,FX55,FX55,8100,"'8,100.0000'",格式差异(文本型数字)
班线包车,数据,天门|旅客周转量(万人公里),43742,FY55,FY55,7180,"'7,180.0000'",格式差异(文本型数字)
班线包车,数据,天门|旅客周转量(万人公里),43773,GA55,GA55,6205,"'6,205.0000'",格式差异(文本型数字)
班线包车,数据,天门|旅客周转量(万人公里),43803,GC55,GC55,7950,"'7,950.0000'",格式差异(文本型数字)
班线包车,数据,天门|旅客周转量(万人公里),同比,IL55,IL55,0.009862546403130334,None,仅软件有值
班线包车,数据,林区|客运量(万人),43650,FV56,FV56,46,'46.0000',格式差异(文本型数字)
班线包车,数据,林区|客运量(万人),43681,FW56,FW56,45,'45.0000',格式差异(文本型数字)
班线包车,数据,林区|客运量(万人),43712,FX56,FX56,44.5,'44.5000',格式差异(文本型数字)
班线包车,数据,林区|客运量(万人),43742,FY56,FY56,47,'47.0000',格式差异(文本型数字)
班线包车,数据,林区|客运量(万人),43773,GA56,GA56,42,'42.0000',格式差异(文本型数字)
班线包车,数据,林区|客运量(万人),43803,GC56,GC56,48,'48.0000',格式差异(文本型数字)
班线包车,数据,林区|客运量(万人),同比,IL56,IL56,0.00952380952380949,None,仅软件有值
班线包车,数据,林区|旅客周转量(万人公里),43650,FV57,FV57,1782,"'1,782.0000'",格式差异(文本型数字)
班线包车,数据,林区|旅客周转量(万人公里),43681,FW57,FW57,1750,"'1,750.0000'",格式差异(文本型数字)
班线包车,数据,林区|旅客周转量(万人公里),43712,FX57,FX57,1880,"'1,880.0000'",格式差异(文本型数字)
班线包车,数据,林区|旅客周转量(万人公里),43742,FY57,FY57,1733,"'1,733.0000'",格式差异(文本型数字)
班线包车,数据,林区|旅客周转量(万人公里),43773,GA57,GA57,1515,"'1,515.0000'",格式差异(文本型数字)
班线包车,数据,林区|旅客周转量(万人公里),43803,GC57,GC57,2336,"'2,336.0000'",格式差异(文本型数字)
班线包车,数据,林区|旅客周转量(万人公里),同比,IL57,IL57,0.010006050169870218,None,仅软件有值
docs/ÎÊÌâ»ã×Ü/»ã×Ü´ó±í_Èí¼þÊä³öÓëÊÖ¹¤¶¨¸å²îÒìÇåµ¥_2026-08_20260922.md
New file
@@ -0,0 +1,206 @@
# æ±‡æ€»å¤§è¡¨ï¼šè½¯ä»¶è¾“出与手工定稿差异清单(2026-08)
> å¤æ ¸æ—¥æœŸï¼š2026-09-22
> æ¯”对文件:
>
> - è½¯ä»¶è¾“出:`D:\03_公司\02_项目\27_湖北省道路运输事业发展中心\05_开发测试\01_测试\01_报表生成\汇总大表\软件输出\生成_道路运输量汇总表_2026-08 (5).xlsx`
>   SHA256:`AC7B2959DBA2B929F0091698E93A1CA9E50A2241D67D0676AE13AD7310FAB685`
> - æ‰‹å·¥å®šç¨¿ï¼š`D:\03_公司\02_项目\27_湖北省道路运输事业发展中心\05_开发测试\01_测试\01_报表生成\汇总大表\手工计算\2026å¹´8月客运量、货运量定稿.xlsx`
>   SHA256:`3C96F2EC286CFAC0C966FE0C403924F1E2E8C3691E17E553F24B22E52737F1FD`
>
> æ¯”对方法:先把两份工作簿复制到临时目录,用 Excel COM åšå…¨é‡é‡ç®—,再读取重算结果;随后按页签、数据块、行标签和列头做语义对齐,最后逐格比对。这样可以避免 `openpyxl(data_only=True)` è¯»åˆ°æ—§ç¼“存公式结果,把已经消失的 `#VALUE!` è¯¯æŠ¥æˆå·®å¼‚。
>
> 930 æ¡é€æ ¼æ˜Žç»†è§åŒç›®å½•:`汇总大表_差异明细_2026-08_20260922.csv`。
## ä¸€ã€ç»“论速览
| ç±»åˆ« | æ¡æ•° | è¯´æ˜Ž |
| --- | ---: | --- |
| æ•°å€¼å·®å¼‚(相对差 > 1e-6) | 314 | å…¶ä¸­ 304 æ¡æ˜¯åŒä¸€ä¸ªâ€œ2025 å¹´ç´¯è®¡å…¬å¼å°‘加 7、8 æœˆâ€é—®é¢˜ï¼›å¦ 10 æ¡æ˜¯ ` è´§è¿` åŽ†å²åŒæ¯”å·®å¼‚ï¼Œä¸šåŠ¡å·²ç¡®è®¤è½¯ä»¶å£å¾„æ­£ç¡® |
| æ ¼å¼å·®å¼‚(文本型数字) | 286 | ä¸¤è¾¹æ˜¾ç¤ºå€¼ç›¸åŒï¼Œä»…存储类型不同 |
| å–整尾差(相对差 <= 1e-6) | 194 | æµ®ç‚¹æ®‹å·®æˆ–手工保留精度造成,不影响业务结论 |
| ä»…软件有值 | 129 | ä¸»è¦æ¥è‡ªè½¯ä»¶å¤šå‡ºçš„列、块,以及手工公式断链后留空 |
| ä»…手工有值 | 2 | æ‰‹å·¥ä¸º `#DIV/0!`,软件留空 |
| é”™è¯¯å€¼å·®å¼‚ | 2 | `班线包车!IL4`、`IL5`:软件有数,手工为 `#REF!` |
| æ–‡æœ¬ä¸åŒ | 2 | `轨道、轮渡!R2`、`R11` æ ‡é¢˜æŽªè¾žä¸åŒ |
| ç±»åž‹ä¸åŒ | 1 | `班线包车!IL50`:软件有数,手工单元格为反引号字符 |
| **逐格差异合计** | **930** | |
另有若干整块/整列结构差异,不重复计入上述 930 æ¡ï¼Œå•列在本文第四节。
## äºŒã€å®žè´¨æ•°å€¼å·®å¼‚
### 2.1 â€œ2025 å¹´ç´¯è®¡â€å…¬å¼å°‘加 7、8 æœˆï¼š304 æ¡
| é¡µç­¾ | è½¯ä»¶ä½ç½® | æ¡æ•° | è½¯ä»¶å…¬å¼è¦†ç›– | æ‰‹å·¥å…¬å¼è¦†ç›– |
| --- | --- | ---: | --- | --- |
| `公交` | `U5:U76` | 72 | 2025 å¹´ç´¯è®¡åªåŠ åˆ° 6 æœˆ | åŠ åˆ° 8 æœˆ |
| `出租` | `U5:U76` | 72 | 2025 å¹´ç´¯è®¡åªåŠ åˆ° 6 æœˆ | åŠ åˆ° 8 æœˆ |
| `网约车` | `U5:U76` | 72 | 2025 å¹´ç´¯è®¡åªåŠ åˆ° 6 æœˆ | åŠ åˆ° 8 æœˆ |
| `中口径明细` | `U99:U188` åŒºé—´å†… 88 æ ¼ | 88 | 2025 å¹´ç´¯è®¡åªåŠ åˆ° 7 æœˆ | åŠ åˆ° 8 æœˆ |
| **合计** |  | **304** |  |  |
示例:
| é¡µç­¾ | å•元格 | è½¯ä»¶ | æ‰‹å·¥ |
| --- | --- | ---: | ---: |
| `公交` | `U5` | 88908.91 | 114285.68 |
| `出租` | `U5` | 39797.94 | 52461.16 |
| `网约车` | `U5` | 16384.07 | 22474.11 |
| `中口径明细` | `U99` | 1102278.385724 | 1256684.215724 |
结论:该列在母版中本身与“累计同比”的分母口径不一致。业务已确认该列可以清空或留空,不从这一列取业务结论。若保留,应统一改成两边一致的累计口径。
### 2.2 ` è´§è¿` 2022 å¹´ç´¯è®¡åŒæ¯”:10 æ¡
| è½¯ä»¶ | æ‰‹å·¥ | åœ°åŒº | æŒ‡æ ‡ | è½¯ä»¶å€¼ | æ‰‹å·¥å€¼ |
| --- | --- | --- | --- | ---: | ---: |
| `EA92` | `EB64` | ä»™æ¡ƒ | è§„上+规下周转量 | -0.0147168903 | 0.0861759440 |
| `EA94` | `EB66` | ä»™æ¡ƒ | è§„下货物周转量 | -0.0147168903 | 0.0861759440 |
| `EA96` | `EB67` | æ½œæ±Ÿ | è§„上货运量 | 0.1792755247 | 0.2821643758 |
| `EA98` | `EB68` | æ½œæ±Ÿ | è§„上+规下周转量 | -0.0580865897 | 0.0248055028 |
| `EA100` | `EB70` | æ½œæ±Ÿ | è§„下货物周转量 | -0.1135612292 | -0.0369708863 |
| `EA102` | `EB71` | å¤©é—¨ | è§„上货运量 | 0.0761499711 | 0.1973040292 |
| `EA104` | `EB72` | å¤©é—¨ | è§„上+规下周转量 | -0.0423281724 | 0.0592616926 |
| `EA106` | `EB74` | å¤©é—¨ | è§„下货物周转量 | -0.0625622547 | 0.0355008526 |
| `EA110` | `EB76` | æž—区 | è§„上+规下周转量 | -0.0477844361 | 0.0951581405 |
| `EA112` | `EB78` | æž—区 | è§„下货物周转量 | -0.2228481653 | -0.1061854159 |
结论:业务此前已确认“软件对,手工错”,以软件结果为准。
## ä¸‰ã€é”™è¯¯å€¼ã€æ–‡æœ¬å’Œç²¾åº¦å·®å¼‚
### 3.1 `班线包车` IL åˆ—:34 æ¡
| æƒ…况 | æ¡æ•° | è¯´æ˜Ž |
| --- | ---: | --- |
| è½¯ä»¶æœ‰å€¼ï¼Œæ‰‹å·¥ä¸º `#REF!` | 2 | `IL4`、`IL5`,手工公式引用已断 |
| è½¯ä»¶æœ‰å€¼ï¼Œæ‰‹å·¥ç©ºç™½ | 31 | é›†ä¸­åœ¨ IL åˆ—的历史累计同比位置 |
| è½¯ä»¶æœ‰æ•°ï¼Œæ‰‹å·¥ä¸ºåå¼•号字符 | 1 | `IL50`,软件值 `0.00778588807785896`,手工为 `` ` `` |
结论:这是手工定稿公式断链或误录,软件这几格计算正常。
### 3.2 æ–‡æœ¬åž‹æ•°å­—:286 æ¡
| é¡µç­¾ | ä½ç½® | æ¡æ•° |
| --- | --- | ---: |
| `班线包车` | `FV8:IX57` åŒºé—´çš„历史数据列 | 196 |
| `公交` | `M9:M76`、`G12/G16/.../G76` | 85 |
| `轨道、轮渡` | `M7`、`M9`、`E14`、`E15`、`E16` | 5 |
| **合计** |  | **286** |
数值内容一致,仅手工把数值存成了文本。建议后续统一为数值格式,否则 Excel å‚与计算时可能再次触发类型问题。
### 3.3 å–整尾差:194 æ¡
| é¡µç­¾ | æ¡æ•° | è¯´æ˜Ž |
| --- | ---: | --- |
| ` è´§è¿` | 192 | ä¸»è¦æ˜¯åŽ†å²æœˆä»½/累计值的浮点残差或手工保留约 12 ä½æœ‰æ•ˆæ•°å­— |
| `货运周转量排名` | 1 | `J5` å¯¹ `J26`:0.01415852628504477 å¯¹ 0.0141585262862789,相对差约 8.7e-11 |
| `中口径明细` | 1 | `S1` æ ¡éªŒè¡Œæµ®ç‚¹æ®‹å·® |
| **合计** | **194** | ä¸å½±å“ä¸šåŠ¡ç»“è®º |
### 3.4 ä»…一边有值:131 æ¡
软件有值、手工无值:129 æ¡ã€‚
| é¡µç­¾ | ä½ç½®/内容 | æ¡æ•° |
| --- | --- | ---: |
| ` è´§è¿` | è½¯ä»¶ `EO5:EO112`(2021 å¹´ç´¯è®¡ï¼‰ï¼Œæ‰‹å·¥å¯¹åº” `EP` ç©º | 74 |
| `班线包车` | è½¯ä»¶ IL åˆ—有历史累计同比,手工空 | 31 |
| `城市汇总` | è½¯ä»¶å¤šå‡º 2026 å¹´ 8 æœˆåŸŽå¸‚客运块的 `C13:E20` éžç©ºå€¼ | 24 |
手工有值、软件无值:2 æ¡ï¼Œå‡åœ¨ ` è´§è¿`:
- æ‰‹å·¥ `EB65` ä¸º `#DIV/0!`,软件对应 `EA93` ç©ºç™½ï¼›
- æ‰‹å·¥ `EB77` ä¸º `#DIV/0!`,软件对应 `EA111` ç©ºç™½ã€‚
## å››ã€ç»“构、版式和整块差异
### 4.1 ` è´§è¿`
- è½¯ä»¶æ˜¯ 118 è¡Œï¼Œæ‰‹å·¥æ˜¯ 84 è¡Œï¼›è½¯ä»¶æ¯ä¸ªå¸‚州多 2 è¡Œï¼Œå…±å¤š 34 è¡Œï¼Œä¸»è¦æ˜¯â€œè§„上+规下货运量”“规下货运量”相关行。
- ä»Ž V åˆ—开始,手工整体右移 1 åˆ—;手工 `V` åˆ—多一个无表头辅助列,内容是 2025 å¹´ 1-8 æœˆç´¯è®¡ï¼Œè½¯ä»¶æ²¡æœ‰è¿™ä¸ªè¾…助列。
- å› æ­¤å°¾éƒ¨åŽ†å²æ ¸ç®—å—ä½ç½®ä¸åŒï¼šè½¯ä»¶çº¦åœ¨ç¬¬ 114-118 è¡Œï¼Œæ‰‹å·¥çº¦åœ¨ç¬¬ 80-84 è¡Œã€‚
### 4.2 `城市汇总`
- è½¯ä»¶å¤šä¸€ä¸ªâ€œ2026 å¹´ 8 æœˆå…¨çœå®ŒæˆåŸŽå¸‚客运量情况”块,位置约 `A12:E20`,含标题、表头和数据。
- ä¸¤è¾¹å…±æœ‰çš„ 1-8 æœˆç´¯è®¡å—å’Œ 2025 å¹´ 1-12 æœˆå—的数值一致。
### 4.3 `城市分市州`
- è½¯ä»¶å¤šç¬¬ 45-89 è¡Œçš„两个 8 æœˆå—,含 8 æœˆå®¢è¿é‡å’Œæ—…客周转量数据。
- æ‰‹å·¥åªåˆ°ç¬¬ 44 è¡Œï¼Œåªæœ‰ä¸¤ä¸ª 1-8 æœˆç´¯è®¡å—。
### 4.4 `中口径分析`
- è½¯ä»¶å¤šç¬¬ 9-16 è¡Œçš„“8 æœˆä¸­å£å¾„客运量及周转量”块。
- æ‰‹å·¥åªåˆ°ç¬¬ 7 è¡Œï¼Œåªæœ‰ 1-8 æœˆç´¯è®¡å—。
- ä¸¤è¾¹å…±æœ‰çš„ 1-8 æœˆç´¯è®¡æ•°æ®ä¸€è‡´ã€‚
### 4.5 `中口径排名`
- è½¯ä»¶æŠŠâ€œ1-8 æœˆç´¯è®¡â€å’Œâ€œ8 æœˆâ€ä¸¤ä¸ªå—纵向排在 `J:R`,分别约在第 1-20 è¡Œå’Œç¬¬ 22-41 è¡Œã€‚
- æ‰‹å·¥æŠŠ 8 æœˆè¾…助数据放在隐藏的 `A:H` åˆ—,`J:R` ä»æ˜¯ 1-8 æœˆç´¯è®¡å—;手工 A-I åˆ—全部隐藏。
- ä¸¤è¾¹å¯è§çš„ 1-8 æœˆç´¯è®¡å— `J1:R20` æ•°å€¼å®Œå…¨ä¸€è‡´ã€‚此前业务已确认以软件布局和结果为准。
### 4.6 `货运量排名`、`货运周转量排名`
- è½¯ä»¶ä¸¤ä¸ªå—的顺序是“1-8 æœˆç´¯è®¡åœ¨å‰ã€8 æœˆåœ¨åŽâ€ï¼›æ‰‹å·¥é¡ºåºç›¸åã€‚
- æŒ‰è¯­ä¹‰å¯¹é½åŽï¼Œç´¯è®¡æ•°å€¼æ— å·®å¼‚。
- 8 æœˆå—的地区名有 15 å¤„后缀差异,例如软件“武汉”,手工“武汉市”;手工 `货运周转量排名` è¿˜æŠŠæ©æ–½å†™æˆäº†â€œæ©æ–½å¸‚”(应为“恩施州”)。
- æ ‡é¢˜å’Œè¡¨å¤´æŽªè¾žä¸åŒï¼Œä¾‹å¦‚软件用“完成公路货运量情况”,手工用“各市州货运量排名”。
### 4.7 `城市客运`
- æ‰‹å·¥å¤šä¸€åˆ— `AJ`“2025 å¹´ 1-7 æœˆç´¯è®¡â€ï¼Œå…± 37 æ ¼ï¼›è½¯ä»¶æ²¡æœ‰è¿™ä¸€åˆ—。
- ä»Ž `AJ` å¼€å§‹æ‰‹å·¥æ•´ä½“右移 1 åˆ—。
- ä¸¤è¾¹å…±æœ‰çš„ 2026 å¹´æ•°æ®ä¸€è‡´ã€‚
### 4.8 `道路运输周转量`
- æ‰‹å·¥å¤šä¸¤ä¸ªç©ºåˆ— `AA`、`AB`。
- ä¸šåŠ¡æ•°å€¼ä¸€è‡´ã€‚
- `A23` æ–‡å­—略不同:软件为“2026å¹´8月全省完成交通周转量情况”,手工多“累计”二字。
### 4.9 `班线包车`
- è½¯ä»¶ 287 åˆ—,手工 288 åˆ—,手工多 1 åˆ—。
- 2015/2016 åŽ†å²åŒºå¸ƒå±€ä¸åŒï¼šè½¯ä»¶ `JL/JM` æ˜¯â€œç´¯è®¡/同比”;手工 `JL` æ˜¯â€œ2015 å…¨å¹´â€ï¼Œ`JY/JZ` è¿˜åŒ…含“2015 å¹´å…¨å¹´â€â€œé¢„ä¼° 2016 å¹´å…¨å¹´â€ç­‰å†…容。
- æ‰‹å·¥ `JY`、`KA`、`KB` å­˜åœ¨ `#REF!`。
### 4.10 `轨道、轮渡`
- `R2`、`R11` æ ‡é¢˜ä¸åŒï¼šè½¯ä»¶ä¸ºâ€œ8月与去年同比”,手工为“同比”。
- æ•°å€¼æœ¬èº«ä¸€è‡´ã€‚
## äº”、完全一致或对齐后一致的内容
以下页签或共有区域未发现业务数值差异:
- `公路总客运`
- `2025年城市客运量`
- `中口径客运量`
- `中口径计算过程`
- `城市汇总` çš„共有块
- `城市分市州` çš„共有 1-8 æœˆç´¯è®¡å—
- `中口径分析` çš„共有 1-8 æœˆç´¯è®¡å—
- `中口径排名` çš„ 1-8 æœˆç´¯è®¡å— `J1:R20`
- `货运量排名` çš„累计块
- `货运周转量排名` çš„累计块
- `城市客运` çš„ 2026 å¹´å…±æœ‰æ•°æ®
- `道路运输周转量` çš„业务数值
- `轨道、轮渡` çš„æ•°å€¼
- `班线包车` çš„共有历史数据
- `公交`、`出租`、`网约车` é™¤ 2025 ç´¯è®¡ U åˆ—以外的共有数据
- `中口径明细` é™¤ 2025 ç´¯è®¡ U åˆ—以外的共有数据
- ` è´§è¿` é™¤ä¸Šè¿°å·®å¼‚以外的共有数据
## å…­ã€å¤æ ¸ç»“论
1. ä¸šåŠ¡ä¸Šæœ€éœ€è¦å¤„ç†çš„æ˜¯ 304 æ ¼â€œ2025 å¹´ç´¯è®¡å°‘加 7、8 æœˆâ€é—®é¢˜ã€‚该列业务已确认可清空,建议软件侧直接清空该列,避免继续与手工定稿逐格比较时反复制造假差异。
2. ` è´§è¿` 2022 å¹´ç´¯è®¡åŒæ¯” 10 æ ¼æ˜¯æ‰‹å·¥å£å¾„问题,业务已确认软件正确,无需改软件。
3. 286 æ ¼æ–‡æœ¬åž‹æ•°å­—、194 æ ¼å–整尾差,以及 `班线包车` IL åˆ—断链,属于格式或手工公式维护问题,不影响当前业务结论。
4. åŸŽå¸‚汇总、城市分市州、中口径分析、中口径排名和两个货运排名页签存在整块布局差异,但共有业务数据均已核对;其中中口径排名可见的 1-8 æœˆç´¯è®¡å—完全一致。
5. ä¸Šä¸€ç‰ˆæŠ¥å‘Šä¸­çš„ `班线包车` 2019、2020 å¹´åŽ†å²å— `#VALUE!` å‡å·®å¼‚,在 Excel å…¨é‡é‡ç®—后已消失,本次不再计入。
traffic-audit-server/src/main/java/com/trafficaudit/dataimport/controller/DataViewController.java
@@ -19,6 +19,13 @@
import com.trafficaudit.dataimport.entity.InvestmentSystem;
import com.trafficaudit.dataimport.entity.EnergyVehicleQuarterly;
import com.trafficaudit.dataimport.entity.EnergyAuthVehicle;
import com.trafficaudit.dataimport.entity.PassengerIndividualMonthly;
import com.trafficaudit.dataimport.entity.WycOrderMonthly;
import com.trafficaudit.dataimport.entity.WycTotalMonthly;
import com.trafficaudit.common.util.RegionUtil;
import com.trafficaudit.reportexport.calc.WycSplitCalc;
import com.trafficaudit.dataimport.service.CityRollupService;
import javax.servlet.http.HttpServletResponse;
import com.trafficaudit.dataimport.mapper.FreightTurnoverImportMapper;
import com.trafficaudit.dataimport.mapper.H2032EnterpriseMonthlyMapper;
import com.trafficaudit.dataimport.mapper.PassengerAuthVehicleMapper;
@@ -34,6 +41,9 @@
import com.trafficaudit.dataimport.mapper.InvestmentSystemMapper;
import com.trafficaudit.dataimport.mapper.EnergyVehicleQuarterlyMapper;
import com.trafficaudit.dataimport.mapper.EnergyAuthVehicleMapper;
import com.trafficaudit.dataimport.mapper.PassengerIndividualMonthlyMapper;
import com.trafficaudit.dataimport.mapper.WycOrderMonthlyMapper;
import com.trafficaudit.dataimport.mapper.WycTotalMonthlyMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -84,11 +94,22 @@
    private EnergyVehicleQuarterlyMapper energyVehicleMapper;
    @Resource
    private EnergyAuthVehicleMapper energyAuthMapper;
    @Resource
    private PassengerIndividualMonthlyMapper passengerIndividualMapper;
    @Resource
    private WycOrderMonthlyMapper wycOrderMapper;
    @Resource
    private WycTotalMonthlyMapper wycTotalMapper;
    @Resource
    private WycSplitCalc wycSplitCalc;
    @Resource
    private CityRollupService cityRollupService;
    @GetMapping("/list")
    public Result<Map<String, Object>> list(@RequestParam("type") String type,
                                            @RequestParam(value = "period", required = false) String period,
                                            @RequestParam(value = "keyword", required = false) String keyword,
                                            @RequestParam(value = "periodType", required = false) String periodType,
                                            @RequestParam(value = "page", defaultValue = "1") long page,
                                            @RequestParam(value = "size", defaultValue = "20") long size) {
        String kw = keyword == null ? "" : keyword.trim();
@@ -107,7 +128,9 @@
                        .orderByDesc(H2032EnterpriseMonthly::getId);
                Page<H2032EnterpriseMonthly> p = new Page<>(safePage, safeSize);
                Page<H2032EnterpriseMonthly> r = h2032Mapper.selectPage(p, w);
                result.put("records", toMaps(r.getRecords(), propsOf(H2032_COLUMNS)));
                List<Map<String, Object>> rows = toMaps(r.getRecords(), propsOf(H2032_COLUMNS));
                fillCity(rows);
                result.put("records", rows);
                fillPage(result, r);
                break;
            }
@@ -136,6 +159,7 @@
            case "scaleSplit": {
                LambdaQueryWrapper<ScaleSplitTransport> w = new LambdaQueryWrapper<ScaleSplitTransport>()
                        .eq(notEmpty(period), ScaleSplitTransport::getReportPeriod, period)
                        .eq(notEmpty(periodType), ScaleSplitTransport::getPeriodType, periodType)
                        .like(!kw.isEmpty(), ScaleSplitTransport::getRegionName, kw)
                        .orderByDesc(ScaleSplitTransport::getId);
                Page<ScaleSplitTransport> p = new Page<>(safePage, safeSize);
@@ -160,7 +184,9 @@
                        .orderByDesc(PassengerEnterpriseMonthly::getId);
                Page<PassengerEnterpriseMonthly> p = new Page<>(safePage, safeSize);
                Page<PassengerEnterpriseMonthly> r = passengerMapper.selectPage(p, w);
                result.put("records", toMaps(r.getRecords(), propsOf(H2031_COLUMNS)));
                List<Map<String, Object>> rows = toMaps(r.getRecords(), propsOf(H2031_COLUMNS));
                fillCity(rows);
                result.put("records", rows);
                fillPage(result, r);
                break;
            }
@@ -241,7 +267,9 @@
                        .orderByAsc(InvestmentMonthly::getId);
                Page<InvestmentMonthly> p = new Page<>(safePage, safeSize);
                Page<InvestmentMonthly> r = investmentMonthlyMapper.selectPage(p, w);
                result.put("records", toMaps(r.getRecords(), propsOf(INVEST_MONTHLY_COLUMNS)));
                List<Map<String, Object>> rows = toMaps(r.getRecords(), propsOf(INVEST_MONTHLY_COLUMNS));
                fillProjectInfo(rows);
                result.put("records", rows);
                fillPage(result, r);
                break;
            }
@@ -274,7 +302,9 @@
                        .orderByDesc(EnergyVehicleQuarterly::getId);
                Page<EnergyVehicleQuarterly> p = new Page<>(safePage, safeSize);
                Page<EnergyVehicleQuarterly> r = energyVehicleMapper.selectPage(p, w);
                result.put("records", toMaps(r.getRecords(), propsOf(ENERGY_VEHICLE_COLUMNS)));
                List<Map<String, Object>> rows = toMaps(r.getRecords(), propsOf(ENERGY_VEHICLE_COLUMNS));
                fillCity(rows);
                result.put("records", rows);
                fillPage(result, r);
                break;
            }
@@ -289,6 +319,44 @@
                fillPage(result, r);
                break;
            }
            case "passengerIndividual": {
                LambdaQueryWrapper<PassengerIndividualMonthly> w = new LambdaQueryWrapper<PassengerIndividualMonthly>()
                        .eq(notEmpty(period), PassengerIndividualMonthly::getReportPeriod, period)
                        .like(!kw.isEmpty(), PassengerIndividualMonthly::getEnterpriseName, kw)
                        .orderByDesc(PassengerIndividualMonthly::getId);
                Page<PassengerIndividualMonthly> p = new Page<>(safePage, safeSize);
                Page<PassengerIndividualMonthly> r = passengerIndividualMapper.selectPage(p, w);
                List<Map<String, Object>> rows = toMaps(r.getRecords(), propsOf(PAX_INDIVIDUAL_COLUMNS));
                fillCity(rows);
                result.put("records", rows);
                fillPage(result, r);
                break;
            }
            case "wycTotal": {
                LambdaQueryWrapper<WycTotalMonthly> w = new LambdaQueryWrapper<WycTotalMonthly>()
                        .eq(notEmpty(period), WycTotalMonthly::getReportPeriod, period)
                        .orderByDesc(WycTotalMonthly::getId);
                Page<WycTotalMonthly> p = new Page<>(safePage, safeSize);
                Page<WycTotalMonthly> r = wycTotalMapper.selectPage(p, w);
                result.put("records", toMaps(r.getRecords(), propsOf(WYC_TOTAL_COLUMNS)));
                fillPage(result, r);
                break;
            }
            case "wycOrder": {
                LambdaQueryWrapper<WycOrderMonthly> w = new LambdaQueryWrapper<WycOrderMonthly>()
                        .eq(notEmpty(period), WycOrderMonthly::getReportPeriod, period)
                        .orderByDesc(WycOrderMonthly::getReportPeriod);
                List<WycOrderMonthly> list = wycOrderMapper.selectList(w);
                List<Map<String, Object>> rows = new ArrayList<>();
                for (WycOrderMonthly o : list) {
                    rows.addAll(wycOrderCityRows(o));
                }
                result.put("records", rows);
                result.put("total", (long) rows.size());
                result.put("current", 1L);
                result.put("size", (long) rows.size());
                break;
            }
            default:
                result.put("records", new ArrayList<>());
                result.put("total", 0L);
@@ -296,6 +364,128 @@
                result.put("size", safeSize);
        }
        return Result.ok(result);
    }
    /** åŒºåˆ’代码 -> å¸‚州名(无法识别返回空串) */
    private String cityOf(String regionCode) {
        if (regionCode == null || regionCode.trim().isEmpty()) return "";
        String city = RegionUtil.cityByCode(regionCode.trim());
        return city == null ? "" : city;
    }
    /** æŒ‰ regionCode æ´¾ç”Ÿ"市州"列(企业类表通用) */
    private void fillCity(List<Map<String, Object>> rows) {
        for (Map<String, Object> row : rows) {
            Object rc = row.get("regionCode");
            row.put("city", cityOf(rc == null ? null : String.valueOf(rc)));
        }
    }
    /** æŠ•资月报:补项目名称与市州(原表只有 projectId,页面无法辨识项目) */
    private void fillProjectInfo(List<Map<String, Object>> rows) {
        java.util.Set<Long> ids = new java.util.LinkedHashSet<>();
        for (Map<String, Object> row : rows) {
            Object pid = row.get("projectId");
            if (pid instanceof Number) ids.add(((Number) pid).longValue());
        }
        if (ids.isEmpty()) return;
        Map<Long, InvestmentProject> byId = new LinkedHashMap<>();
        for (InvestmentProject ip : investmentProjectMapper.selectBatchIds(ids)) {
            byId.put(ip.getId(), ip);
        }
        for (Map<String, Object> row : rows) {
            Object pid = row.get("projectId");
            InvestmentProject ip = pid instanceof Number ? byId.get(((Number) pid).longValue()) : null;
            row.put("projectName", ip == null ? null : ip.getProjectName());
            row.put("city", ip == null ? null : ip.getCity());
        }
    }
    private static double nz(Double v) {
        return v == null ? 0.0 : v;
    }
    /** ç½‘约车订单台账 -> æŒ‰å¸‚州竖排:全省 + 17 å¸‚å·ž Ã— æŒ‡æ ‡ï¼ˆå®¢è¿é‡/周转量由 WycSplitCalc æ‹†åˆ†å£å¾„计算) */
    private List<Map<String, Object>> wycOrderCityRows(WycOrderMonthly o) {
        List<Map<String, Object>> rows = new ArrayList<>();
        List<String> cities = RegionUtil.cityList();
        double orderSum = nz(o.getOrderSum());
        double[] orders = { nz(o.getOrderWuhan()), nz(o.getOrderHuangshi()), nz(o.getOrderShiyan()),
                nz(o.getOrderYichang()), nz(o.getOrderXiangyang()), nz(o.getOrderEzhou()), nz(o.getOrderJingmen()),
                nz(o.getOrderXiaogan()), nz(o.getOrderJingzhou()), nz(o.getOrderHuanggang()), nz(o.getOrderXianning()),
                nz(o.getOrderSuizhou()), nz(o.getOrderEnshi()), nz(o.getOrderXiantao()), nz(o.getOrderQianjiang()),
                nz(o.getOrderTianmen()), nz(o.getOrderShennong()) };
        Map<String, Object> province = new LinkedHashMap<>();
        province.put("reportPeriod", o.getReportPeriod());
        province.put("period", o.getReportPeriod());
        province.put("region", "全省");
        province.put("orderCount", orderSum);
        province.put("orderShare", orderSum > 0 ? 1.0 : null);
        province.put("pax", o.getPinK());
        province.put("turnover", o.getPinZ());
        province.put("cityPax", o.getPinCK());
        province.put("cityTurnover", o.getPinCZ());
        province.put("note", "全省口径直接取台账 pin å€¼");
        rows.add(province);
        Map<String, WycSplitCalc.WycMetrics> byCity = null;
        String calcError = null;
        try {
            byCity = wycSplitCalc.calc(o.getReportPeriod()).getByCity();
        } catch (Exception e) {
            calcError = e.getMessage() == null ? "拆分计算失败" : e.getMessage();
        }
        for (int i = 0; i < cities.size() && i < orders.length; i++) {
            String city = cities.get(i);
            Map<String, Object> row = new LinkedHashMap<>();
            row.put("reportPeriod", o.getReportPeriod());
            row.put("period", o.getReportPeriod());
            row.put("region", city);
            row.put("orderCount", orders[i]);
            row.put("orderShare", orderSum > 0 ? orders[i] / orderSum : null);
            WycSplitCalc.WycMetrics m = byCity == null ? null : byCity.get(city);
            row.put("pax", m == null ? null : m.getTotalPax());
            row.put("turnover", m == null ? null : m.getTotalTurnover());
            row.put("cityPax", m == null ? null : m.getCityPax());
            row.put("cityTurnover", m == null ? null : m.getCityTurnover());
            row.put("note", m == null ? (calcError == null ? "拆分未计算" : calcError) : "");
            rows.add(row);
        }
        return rows;
    }
    /** æ”¯æŒæŒ‰å¸‚州汇总的数据类型 */
    @GetMapping("/rollupTypes")
    public Result<List<Map<String, Object>>> rollupTypes() {
        return Result.ok(cityRollupService.supportedTypes());
    }
    /** æŒ‰å¸‚州汇总(任意起止月) */
    @GetMapping("/summary")
    public Result<Map<String, Object>> summary(@RequestParam("type") String type,
                                               @RequestParam("from") String from,
                                               @RequestParam("to") String to,
                                               @RequestParam(value = "rankMode", defaultValue = "blank") String rankMode) {
        return Result.ok(cityRollupService.summary(type, from, to, "recompute".equalsIgnoreCase(rankMode)));
    }
    /** æŒ‰å¸‚州汇总导出 Excel(数值全精度,显示 2 ä½å°æ•° / ç™¾åˆ†æ¯”) */
    @GetMapping("/export")
    public void export(@RequestParam("type") String type,
                       @RequestParam("from") String from,
                       @RequestParam("to") String to,
                       @RequestParam(value = "rankMode", defaultValue = "blank") String rankMode,
                       HttpServletResponse response) throws Exception {
        byte[] bytes = cityRollupService.exportExcel(type, from, to, "recompute".equalsIgnoreCase(rankMode));
        String fileName = "按市州汇总_" + type + "_" + from + "_" + to + ".xlsx";
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("UTF-8");
        response.setHeader("Content-Disposition",
                "attachment; filename=\"" + java.net.URLEncoder.encode(fileName, "UTF-8") + "\"");
        response.setContentLength(bytes.length);
        response.getOutputStream().write(bytes);
        response.getOutputStream().flush();
    }
    private boolean notEmpty(String s) {
@@ -346,6 +536,9 @@
            case "investmentSystem": return INVEST_SYSTEM_COLUMNS;
            case "energyVehicle": return ENERGY_VEHICLE_COLUMNS;
            case "energyAuth": return ENERGY_AUTH_COLUMNS;
            case "passengerIndividual": return PAX_INDIVIDUAL_COLUMNS;
            case "wycTotal": return WYC_TOTAL_COLUMNS;
            case "wycOrder": return WYC_ORDER_COLUMNS;
            default: return new ArrayList<>();
        }
    }
@@ -374,35 +567,39 @@
    private static final List<Map<String, Object>> INVEST_SYSTEM_COLUMNS = new ArrayList<>();
    private static final List<Map<String, Object>> ENERGY_VEHICLE_COLUMNS = new ArrayList<>();
    private static final List<Map<String, Object>> ENERGY_AUTH_COLUMNS = new ArrayList<>();
    private static final List<Map<String, Object>> PAX_INDIVIDUAL_COLUMNS = new ArrayList<>();
    private static final List<Map<String, Object>> WYC_TOTAL_COLUMNS = new ArrayList<>();
    private static final List<Map<String, Object>> WYC_ORDER_COLUMNS = new ArrayList<>();
    static {
        H2032_COLUMNS.add(col("reportPeriod", "报表期", 100));
        H2032_COLUMNS.add(col("regionCode", "所属地区", 100));
        H2032_COLUMNS.add(col("city", "市州", 110));
        H2032_COLUMNS.add(col("enterpriseCode", "企业代码", 130));
        H2032_COLUMNS.add(col("enterpriseName", "企业名称", 220));
        H2032_COLUMNS.add(col("unifiedCreditCode", "统一社会信用代码", 180));
        H2032_COLUMNS.add(col("reportUnit", "填报单位", 160));
        H2032_COLUMNS.add(col("vehicleTotal", "车辆数合计", 110));
        H2032_COLUMNS.add(col("tonsTotal", "标记吨位数合计", 130));
        H2032_COLUMNS.add(col("vehicleTractor", "牵引车", 90));
        H2032_COLUMNS.add(col("vehicleTrailer", "挂车", 90));
        H2032_COLUMNS.add(col("tonsTrailer", "吨位-挂车", 110));
        H2032_COLUMNS.add(col("vehicleContainer", "集装箱车", 110));
        H2032_COLUMNS.add(col("tonsContainer", "吨位-集装箱", 120));
        H2032_COLUMNS.add(col("vehicleWhole", "整车", 90));
        H2032_COLUMNS.add(col("tonsWhole", "吨位-整车", 110));
        H2032_COLUMNS.add(col("freightTotal", "货运量合计", 110));
        H2032_COLUMNS.add(col("turnoverTotal", "周转量合计", 110));
        H2032_COLUMNS.add(col("freightContainer", "货运量-集装箱", 130));
        H2032_COLUMNS.add(col("freightCoal", "货运量-煤炭", 120));
        H2032_COLUMNS.add(col("freightOilGas", "货运量-油气", 120));
        H2032_COLUMNS.add(col("freightCrudeOil", "货运量-原油", 120));
        H2032_COLUMNS.add(col("freightMetalOre", "货运量-金属矿石", 140));
        H2032_COLUMNS.add(col("freightIronOre", "货运量-铁矿石", 130));
        H2032_COLUMNS.add(col("freightBuilding", "货运量-建材", 120));
        H2032_COLUMNS.add(col("freightGrain", "货运量-粮食", 120));
        H2032_COLUMNS.add(col("avgTonnage", "平均吨位", 100));
        H2032_COLUMNS.add(col("avgDistance", "平均运距", 100));
        H2032_COLUMNS.add(col("vehicleTotal", "车辆数合计(辆)", 130));
        H2032_COLUMNS.add(col("tonsTotal", "标记吨位数合计(吨)", 150));
        H2032_COLUMNS.add(col("vehicleTractor", "牵引车(辆)", 110));
        H2032_COLUMNS.add(col("vehicleTrailer", "挂车(辆)", 110));
        H2032_COLUMNS.add(col("tonsTrailer", "吨位-挂车(吨)", 130));
        H2032_COLUMNS.add(col("vehicleContainer", "集装箱车(辆)", 120));
        H2032_COLUMNS.add(col("tonsContainer", "吨位-集装箱(吨)", 140));
        H2032_COLUMNS.add(col("vehicleWhole", "整车(辆)", 110));
        H2032_COLUMNS.add(col("tonsWhole", "吨位-整车(吨)", 130));
        H2032_COLUMNS.add(col("freightTotal", "货运量合计(吨)", 130));
        H2032_COLUMNS.add(col("turnoverTotal", "周转量合计(吨公里)", 150));
        H2032_COLUMNS.add(col("freightContainer", "货运量-集装箱(吨)", 140));
        H2032_COLUMNS.add(col("freightCoal", "货运量-煤炭(吨)", 140));
        H2032_COLUMNS.add(col("freightOilGas", "货运量-油气(吨)", 140));
        H2032_COLUMNS.add(col("freightCrudeOil", "货运量-原油(吨)", 140));
        H2032_COLUMNS.add(col("freightMetalOre", "货运量-金属矿石(吨)", 140));
        H2032_COLUMNS.add(col("freightIronOre", "货运量-铁矿石(吨)", 140));
        H2032_COLUMNS.add(col("freightBuilding", "货运量-建材(吨)", 140));
        H2032_COLUMNS.add(col("freightGrain", "货运量-粮食(吨)", 140));
        H2032_COLUMNS.add(col("avgTonnage", "平均吨位(吨)", 120));
        H2032_COLUMNS.add(col("avgDistance", "平均运距(公里)", 120));
        H2032_COLUMNS.add(col("unitLeader", "单位负责人", 110));
        H2032_COLUMNS.add(col("statsLeader", "统计负责人", 110));
        H2032_COLUMNS.add(col("contactPerson", "填表人", 100));
@@ -413,94 +610,95 @@
        AUTH_COLUMNS.add(col("reportPeriod", "报表期", 100));
        AUTH_COLUMNS.add(col("enterpriseName", "企业名称", 240));
        AUTH_COLUMNS.add(col("tractorCount", "牵引车数", 100));
        AUTH_COLUMNS.add(col("trailerCount", "挂车数", 100));
        AUTH_COLUMNS.add(col("otherCount", "其他车数", 100));
        AUTH_COLUMNS.add(col("trailerTons", "挂车吨位", 110));
        AUTH_COLUMNS.add(col("otherTons", "其他吨位", 110));
        AUTH_COLUMNS.add(col("tractorCount", "牵引车数(辆)", 110));
        AUTH_COLUMNS.add(col("trailerCount", "挂车数(辆)", 110));
        AUTH_COLUMNS.add(col("otherCount", "其他车数(辆)", 110));
        AUTH_COLUMNS.add(col("trailerTons", "挂车吨位(吨)", 120));
        AUTH_COLUMNS.add(col("otherTons", "其他吨位(吨)", 120));
        TRACK_COLUMNS.add(col("reportPeriod", "报表期", 100));
        TRACK_COLUMNS.add(col("enterpriseName", "企业名称", 240));
        TRACK_COLUMNS.add(col("monthlyMileage", "月度里程", 120));
        TRACK_COLUMNS.add(col("trackedVehicles", "轨迹车辆数", 120));
        TRACK_COLUMNS.add(col("monthlyMileage", "月度里程(公里)", 130));
        TRACK_COLUMNS.add(col("trackedVehicles", "轨迹车辆数(辆)", 130));
        SPLIT_COLUMNS.add(col("reportPeriod", "报表期", 100));
        SPLIT_COLUMNS.add(col("periodType", "口径", 90));
        SPLIT_COLUMNS.add(col("regionName", "市州", 130));
        SPLIT_COLUMNS.add(col("aboveScaleFreight", "规上货运量", 120));
        SPLIT_COLUMNS.add(col("aboveScaleTurnover", "规上周转量", 120));
        SPLIT_COLUMNS.add(col("aboveScaleRank", "规上排名", 100));
        SPLIT_COLUMNS.add(col("aboveScaleYoy", "规上同比", 100));
        SPLIT_COLUMNS.add(col("belowScaleFreight", "规下货运量", 120));
        SPLIT_COLUMNS.add(col("belowScaleTurnover", "规下周转量", 120));
        SPLIT_COLUMNS.add(col("belowScaleRank", "规下排名", 100));
        SPLIT_COLUMNS.add(col("belowScaleYoy", "规下同比", 100));
        SPLIT_COLUMNS.add(col("totalFreight", "合计货运量", 120));
        SPLIT_COLUMNS.add(col("totalTurnover", "合计周转量", 120));
        SPLIT_COLUMNS.add(col("totalRank", "合计排名", 100));
        SPLIT_COLUMNS.add(col("totalYoy", "合计同比", 100));
        SPLIT_COLUMNS.add(col("aboveScaleFreight", "规上货运量(万吨)", 140));
        SPLIT_COLUMNS.add(col("aboveScaleTurnover", "规上周转量(万吨公里)", 170));
        SPLIT_COLUMNS.add(col("aboveScaleRank", "规上排名(名)", 110));
        SPLIT_COLUMNS.add(col("aboveScaleYoy", "规上同比(%)", 110));
        SPLIT_COLUMNS.add(col("belowScaleFreight", "规下货运量(万吨)", 140));
        SPLIT_COLUMNS.add(col("belowScaleTurnover", "规下周转量(万吨公里)", 170));
        SPLIT_COLUMNS.add(col("belowScaleRank", "规下排名(名)", 110));
        SPLIT_COLUMNS.add(col("belowScaleYoy", "规下同比(%)", 110));
        SPLIT_COLUMNS.add(col("totalFreight", "合计货运量(万吨)", 140));
        SPLIT_COLUMNS.add(col("totalTurnover", "合计周转量(万吨公里)", 170));
        SPLIT_COLUMNS.add(col("totalRank", "合计排名(名)", 110));
        SPLIT_COLUMNS.add(col("totalYoy", "合计同比(%)", 110));
        FREIGHT_COLUMNS.add(col("reportPeriod", "报表期", 100));
        FREIGHT_COLUMNS.add(col("regionName", "市州", 130));
        for (int m = 1; m <= 12; m++) {
            FREIGHT_COLUMNS.add(col(String.format("freightM%02d", m), "货运量" + m + "月", 110));
            FREIGHT_COLUMNS.add(col(String.format("freightM%02d", m), "货运量" + m + "月(万吨)", 140));
        }
        for (int m = 1; m <= 12; m++) {
            FREIGHT_COLUMNS.add(col(String.format("lastFreightM%02d", m), "去年货运量" + m + "月", 130));
            FREIGHT_COLUMNS.add(col(String.format("lastFreightM%02d", m), "去年货运量" + m + "月(万吨)", 160));
        }
        for (int m = 1; m <= 12; m++) {
            FREIGHT_COLUMNS.add(col(String.format("turnoverM%02d", m), "周转量" + m + "月", 120));
            FREIGHT_COLUMNS.add(col(String.format("turnoverM%02d", m), "周转量" + m + "月(万吨公里)", 160));
        }
        for (int m = 1; m <= 12; m++) {
            FREIGHT_COLUMNS.add(col(String.format("lastTurnoverM%02d", m), "去年周转量" + m + "月", 140));
            FREIGHT_COLUMNS.add(col(String.format("lastTurnoverM%02d", m), "去年周转量" + m + "月(万吨公里)", 180));
        }
        H2031_COLUMNS.add(col("reportPeriod", "报表期", 100));
        H2031_COLUMNS.add(col("regionCode", "所属地区", 100));
        H2031_COLUMNS.add(col("city", "市州", 110));
        H2031_COLUMNS.add(col("enterpriseCode", "企业代码", 130));
        H2031_COLUMNS.add(col("enterpriseName", "企业名称", 220));
        H2031_COLUMNS.add(col("unifiedCreditCode", "统一社会信用代码", 180));
        H2031_COLUMNS.add(col("reportUnit", "填报单位", 160));
        H2031_COLUMNS.add(col("vehicleTotal", "客运车辆合计", 110));
        H2031_COLUMNS.add(col("seatTotal", "核定载客位合计", 130));
        H2031_COLUMNS.add(col("vehicleSchedule", "班线车辆数", 110));
        H2031_COLUMNS.add(col("seatSchedule", "班线载客位", 110));
        H2031_COLUMNS.add(col("vehicleCharter", "包车车辆数", 110));
        H2031_COLUMNS.add(col("seatCharter", "包车载客位", 110));
        H2031_COLUMNS.add(col("passengerTotal", "客运量合计", 110));
        H2031_COLUMNS.add(col("turnoverTotal", "周转量合计", 110));
        H2031_COLUMNS.add(col("passengerClass1", "客运量一类", 110));
        H2031_COLUMNS.add(col("passengerClass2", "客运量二类", 110));
        H2031_COLUMNS.add(col("passengerClass3", "客运量三类", 110));
        H2031_COLUMNS.add(col("passengerClass4", "客运量四类", 110));
        H2031_COLUMNS.add(col("passengerCharter", "客运量包车", 110));
        H2031_COLUMNS.add(col("turnoverClass1", "周转量一类", 110));
        H2031_COLUMNS.add(col("turnoverClass2", "周转量二类", 110));
        H2031_COLUMNS.add(col("turnoverClass3", "周转量三类", 110));
        H2031_COLUMNS.add(col("turnoverClass4", "周转量四类", 110));
        H2031_COLUMNS.add(col("turnoverCharter", "周转量包车", 110));
        H2031_COLUMNS.add(col("avgDistanceTotal", "平均运距合计", 120));
        H2031_COLUMNS.add(col("avgDistanceClass1", "一类平均运距", 120));
        H2031_COLUMNS.add(col("avgDistanceClass2", "二类平均运距", 120));
        H2031_COLUMNS.add(col("avgDistanceClass3", "三类平均运距", 120));
        H2031_COLUMNS.add(col("avgDistanceClass4", "四类平均运距", 120));
        H2031_COLUMNS.add(col("avgDistanceCharter", "包车平均运距", 120));
        H2031_COLUMNS.add(col("vehicleTotal", "客运车辆合计(辆)", 130));
        H2031_COLUMNS.add(col("seatTotal", "核定载客位合计(座)", 150));
        H2031_COLUMNS.add(col("vehicleSchedule", "班线车辆数(辆)", 130));
        H2031_COLUMNS.add(col("seatSchedule", "班线载客位(座)", 130));
        H2031_COLUMNS.add(col("vehicleCharter", "包车车辆数(辆)", 130));
        H2031_COLUMNS.add(col("seatCharter", "包车载客位(座)", 130));
        H2031_COLUMNS.add(col("passengerTotal", "客运量合计(人)", 130));
        H2031_COLUMNS.add(col("turnoverTotal", "周转量合计(人公里)", 140));
        H2031_COLUMNS.add(col("passengerClass1", "客运量一类(人)", 120));
        H2031_COLUMNS.add(col("passengerClass2", "客运量二类(人)", 120));
        H2031_COLUMNS.add(col("passengerClass3", "客运量三类(人)", 120));
        H2031_COLUMNS.add(col("passengerClass4", "客运量四类(人)", 120));
        H2031_COLUMNS.add(col("passengerCharter", "客运量包车(人)", 130));
        H2031_COLUMNS.add(col("turnoverClass1", "周转量一类(人公里)", 140));
        H2031_COLUMNS.add(col("turnoverClass2", "周转量二类(人公里)", 140));
        H2031_COLUMNS.add(col("turnoverClass3", "周转量三类(人公里)", 140));
        H2031_COLUMNS.add(col("turnoverClass4", "周转量四类(人公里)", 140));
        H2031_COLUMNS.add(col("turnoverCharter", "周转量包车(人公里)", 150));
        H2031_COLUMNS.add(col("avgDistanceTotal", "平均运距合计(公里)", 140));
        H2031_COLUMNS.add(col("avgDistanceClass1", "一类平均运距(公里)", 140));
        H2031_COLUMNS.add(col("avgDistanceClass2", "二类平均运距(公里)", 140));
        H2031_COLUMNS.add(col("avgDistanceClass3", "三类平均运距(公里)", 140));
        H2031_COLUMNS.add(col("avgDistanceClass4", "四类平均运距(公里)", 140));
        H2031_COLUMNS.add(col("avgDistanceCharter", "包车平均运距(公里)", 140));
        BUS_COLUMNS.add(col("reportPeriod", "报表期", 100));
        BUS_COLUMNS.add(col("regionCode", "所属地区", 100));
        BUS_COLUMNS.add(col("city", "市州", 110));
        BUS_COLUMNS.add(col("enterpriseName", "企业名称", 220));
        BUS_COLUMNS.add(col("opVehicles", "运营车数", 100));
        BUS_COLUMNS.add(col("stopTotal", "站点总个数", 110));
        BUS_COLUMNS.add(col("stopCity", "城市内站点", 110));
        BUS_COLUMNS.add(col("passengerVolume", "客运量", 100));
        BUS_COLUMNS.add(col("passengerCity", "城市内客运量", 120));
        BUS_COLUMNS.add(col("turnover", "旅客周转量", 110));
        BUS_COLUMNS.add(col("turnoverCity", "城市内周转量", 120));
        BUS_COLUMNS.add(col("avgDistance", "平均运距", 100));
        BUS_COLUMNS.add(col("avgDistanceCity", "城市内平均运距", 130));
        BUS_COLUMNS.add(col("passengerChengxiang", "城际城乡客运量", 130));
        BUS_COLUMNS.add(col("turnoverChengxiang", "城际城乡周转量", 130));
        BUS_COLUMNS.add(col("avgDistanceChengxiang", "城际城乡平均运距", 140));
        BUS_COLUMNS.add(col("opVehicles", "运营车数(辆)", 120));
        BUS_COLUMNS.add(col("stopTotal", "站点总个数(个)", 130));
        BUS_COLUMNS.add(col("stopCity", "城市内站点(个)", 130));
        BUS_COLUMNS.add(col("passengerVolume", "客运量(万人次)", 120));
        BUS_COLUMNS.add(col("passengerCity", "城市内客运量(万人次)", 150));
        BUS_COLUMNS.add(col("turnover", "旅客周转量(万人公里)", 170));
        BUS_COLUMNS.add(col("turnoverCity", "城市内周转量(万人公里)", 180));
        BUS_COLUMNS.add(col("avgDistance", "平均运距(公里)", 120));
        BUS_COLUMNS.add(col("avgDistanceCity", "城市内平均运距(公里)", 150));
        BUS_COLUMNS.add(col("passengerChengxiang", "城际城乡客运量(万人次)", 160));
        BUS_COLUMNS.add(col("turnoverChengxiang", "城际城乡周转量(万人公里)", 190));
        BUS_COLUMNS.add(col("avgDistanceChengxiang", "城际城乡平均运距(公里)", 160));
        BUS_COLUMNS.add(col("ratePassengerMom", "客运量环比", 100));
        BUS_COLUMNS.add(col("ratePassengerCityMom", "城市内环比", 100));
        BUS_COLUMNS.add(col("rateChengxiangMom", "城际城乡环比", 110));
@@ -513,22 +711,22 @@
        TAXI_COLUMNS.add(col("reportPeriod", "报表期", 100));
        TAXI_COLUMNS.add(col("regionCode", "所属地区", 100));
        TAXI_COLUMNS.add(col("city", "市州", 110));
        TAXI_COLUMNS.add(col("tripTotal", "载客车次总数", 120));
        TAXI_COLUMNS.add(col("tripCity", "载客车次_城市内", 130));
        TAXI_COLUMNS.add(col("passengerVolume", "客运量", 100));
        TAXI_COLUMNS.add(col("passengerCity", "城市内客运量", 120));
        TAXI_COLUMNS.add(col("turnover", "旅客周转量", 110));
        TAXI_COLUMNS.add(col("turnoverCity", "城市内周转量", 120));
        TAXI_COLUMNS.add(col("opVehicles", "运营车辆数", 110));
        TAXI_COLUMNS.add(col("avgDistance", "平均运距", 100));
        TAXI_COLUMNS.add(col("avgDistanceCity", "城市内平均运距", 130));
        TAXI_COLUMNS.add(col("passengersPerTrip", "单车次载客人数", 130));
        TAXI_COLUMNS.add(col("tripTotal", "载客车次总数(车次)", 150));
        TAXI_COLUMNS.add(col("tripCity", "载客车次_城市内(车次)", 160));
        TAXI_COLUMNS.add(col("passengerVolume", "客运量(万人次)", 120));
        TAXI_COLUMNS.add(col("passengerCity", "城市内客运量(万人次)", 150));
        TAXI_COLUMNS.add(col("turnover", "旅客周转量(万人公里)", 170));
        TAXI_COLUMNS.add(col("turnoverCity", "城市内周转量(万人公里)", 180));
        TAXI_COLUMNS.add(col("opVehicles", "运营车辆数(辆)", 130));
        TAXI_COLUMNS.add(col("avgDistance", "平均运距(公里)", 120));
        TAXI_COLUMNS.add(col("avgDistanceCity", "城市内平均运距(公里)", 150));
        TAXI_COLUMNS.add(col("passengersPerTrip", "单车次载客人数(人/车次)", 170));
        TAXI_COLUMNS.add(col("rateTripMom", "载客车次环比", 110));
        TAXI_COLUMNS.add(col("rateTripYoy", "载客车次同比", 110));
        TAXI_COLUMNS.add(col("ratePassengerMom", "客运量环比", 100));
        TAXI_COLUMNS.add(col("ratePassengerYoy", "客运量同比", 100));
        TAXI_COLUMNS.add(col("passengerCityRatio", "城市内客运量占比", 140));
        TAXI_COLUMNS.add(col("avgDistanceChengxiang", "城际城乡平均运距", 140));
        TAXI_COLUMNS.add(col("avgDistanceChengxiang", "城际城乡平均运距(公里)", 160));
        TAXI_COLUMNS.add(col("verifyExplanation", "核实解释", 220));
        TAXI_AUTH_COLUMNS.add(col("reportPeriod", "报表期", 100));
        TAXI_AUTH_COLUMNS.add(col("city", "市州", 110));
@@ -545,17 +743,19 @@
        PAUTH_COLUMNS.add(col("reportPeriod", "报表期", 100));
        PAUTH_COLUMNS.add(col("enterpriseCode", "企业代码", 130));
        PAUTH_COLUMNS.add(col("enterpriseName", "企业名称", 240));
        PAUTH_COLUMNS.add(col("vehicleCount", "车辆数", 100));
        PAUTH_COLUMNS.add(col("seatCount", "载客位数", 100));
        PAUTH_COLUMNS.add(col("vehicleCount", "车辆数(辆)", 110));
        PAUTH_COLUMNS.add(col("seatCount", "载客位数(座)", 120));
        INVEST_MONTHLY_COLUMNS.add(col("reportPeriod", "报表期", 100));
        INVEST_MONTHLY_COLUMNS.add(col("projectId", "项目ID", 80));
        INVEST_MONTHLY_COLUMNS.add(col("projectName", "项目名称", 280));
        INVEST_MONTHLY_COLUMNS.add(col("city", "市州", 90));
        INVEST_MONTHLY_COLUMNS.add(col("yearPlan", "本年计划投资(万元)", 140));
        INVEST_MONTHLY_COLUMNS.add(col("yearCum", "自年初累计完成(万元)", 160));
        INVEST_MONTHLY_COLUMNS.add(col("monthDone", "本月完成投资(万元)", 150));
        INVEST_MONTHLY_COLUMNS.add(col("startCum", "自开始建设累计完成(万元)", 180));
        INVEST_MONTHLY_COLUMNS.add(col("progressStage", "建设阶段", 120));
        INVEST_MONTHLY_COLUMNS.add(col("progressDesc", "形象进度", 320));
        INVEST_MONTHLY_COLUMNS.add(col("buildingArea", "建筑面积", 110));
        INVEST_MONTHLY_COLUMNS.add(col("buildingArea", "建筑面积(平方米)", 140));
        INVEST_PROJECT_COLUMNS.add(col("projectName", "项目名称", 260));
        INVEST_PROJECT_COLUMNS.add(col("category", "类别", 100));
        INVEST_PROJECT_COLUMNS.add(col("city", "市州", 90));
@@ -565,7 +765,7 @@
        INVEST_PROJECT_COLUMNS.add(col("startTime", "开工年", 90));
        INVEST_PROJECT_COLUMNS.add(col("endTime", "完工年", 90));
        INVEST_PROJECT_COLUMNS.add(col("totalInvestment", "总投资(万元)", 130));
        INVEST_PROJECT_COLUMNS.add(col("buildingArea", "建筑面积", 110));
        INVEST_PROJECT_COLUMNS.add(col("buildingArea", "建筑面积(平方米)", 140));
        INVEST_PROJECT_COLUMNS.add(col("approvalGk", "工可或核准批复文号", 200));
        INVEST_PROJECT_COLUMNS.add(col("approvalCs", "初设或施工图批复文号", 200));
        INVEST_PROJECT_COLUMNS.add(col("source", "来源", 100));
@@ -578,31 +778,56 @@
        INVEST_SYSTEM_COLUMNS.add(col("monthDone", "本月完成投资(万元)", 150));
        ENERGY_VEHICLE_COLUMNS.add(col("reportPeriod", "报表期", 100));
        ENERGY_VEHICLE_COLUMNS.add(col("regionCode", "所属地区", 100));
        ENERGY_VEHICLE_COLUMNS.add(col("city", "市州", 110));
        ENERGY_VEHICLE_COLUMNS.add(col("enterpriseName", "企业名称", 220));
        ENERGY_VEHICLE_COLUMNS.add(col("plateNo", "车牌号", 110));
        ENERGY_VEHICLE_COLUMNS.add(col("vehicleType", "车辆类型", 130));
        ENERGY_VEHICLE_COLUMNS.add(col("fuelType", "燃料类型", 110));
        ENERGY_VEHICLE_COLUMNS.add(col("manufactureYear", "出厂年份", 100));
        ENERGY_VEHICLE_COLUMNS.add(col("markedTonnage", "标记吨位", 100));
        ENERGY_VEHICLE_COLUMNS.add(col("markedTonnage", "标记吨位(吨)", 120));
        ENERGY_VEHICLE_COLUMNS.add(col("totalMileage", "总行驶里程(公里)", 150));
        ENERGY_VEHICLE_COLUMNS.add(col("loadedMileage", "重载里程(公里)", 140));
        ENERGY_VEHICLE_COLUMNS.add(col("emptyMileage", "空载里程(公里)", 140));
        ENERGY_VEHICLE_COLUMNS.add(col("freight", "货运量(吨)", 120));
        ENERGY_VEHICLE_COLUMNS.add(col("turnover", "周转量(吨公里)", 140));
        ENERGY_VEHICLE_COLUMNS.add(col("tripCount", "车次", 90));
        ENERGY_VEHICLE_COLUMNS.add(col("tripCount", "车次(次)", 100));
        ENERGY_VEHICLE_COLUMNS.add(col("fuelUnit", "燃料单位", 100));
        ENERGY_VEHICLE_COLUMNS.add(col("fuelConsumption", "燃料消耗量", 120));
        ENERGY_VEHICLE_COLUMNS.add(col("avgDistance", "平均运距", 110));
        ENERGY_VEHICLE_COLUMNS.add(col("avgLoadedTonnage", "平均载重吨位", 130));
        ENERGY_VEHICLE_COLUMNS.add(col("avgTripMileage", "平均车次里程", 130));
        ENERGY_VEHICLE_COLUMNS.add(col("fuelPer100km", "百公里油耗", 120));
        ENERGY_VEHICLE_COLUMNS.add(col("turnoverFuel", "周转量油耗", 120));
        ENERGY_VEHICLE_COLUMNS.add(col("fuelConsumption", "燃料消耗量(按燃料单位)", 170));
        ENERGY_VEHICLE_COLUMNS.add(col("avgDistance", "平均运距(公里)", 130));
        ENERGY_VEHICLE_COLUMNS.add(col("avgLoadedTonnage", "平均载重吨位(吨)", 150));
        ENERGY_VEHICLE_COLUMNS.add(col("avgTripMileage", "平均车次里程(公里)", 150));
        ENERGY_VEHICLE_COLUMNS.add(col("fuelPer100km", "百公里油耗(按燃料单位)", 170));
        ENERGY_VEHICLE_COLUMNS.add(col("turnoverFuel", "周转量油耗(按燃料单位)", 170));
        ENERGY_AUTH_COLUMNS.add(col("reportPeriod", "报表期", 100));
        ENERGY_AUTH_COLUMNS.add(col("plateNo", "车牌号", 110));
        ENERGY_AUTH_COLUMNS.add(col("vehicleType", "车辆类型", 130));
        ENERGY_AUTH_COLUMNS.add(col("fuelType", "燃料类型", 110));
        ENERGY_AUTH_COLUMNS.add(col("markedTonnage", "标记吨位", 100));
        ENERGY_AUTH_COLUMNS.add(col("tractionQuality", "牵引质量", 110));
        ENERGY_AUTH_COLUMNS.add(col("markedTonnage", "标记吨位(吨)", 120));
        ENERGY_AUTH_COLUMNS.add(col("tractionQuality", "牵引质量(吨)", 130));
        PAX_INDIVIDUAL_COLUMNS.add(col("reportPeriod", "报表期", 100));
        PAX_INDIVIDUAL_COLUMNS.add(col("regionCode", "所属地区", 110));
        PAX_INDIVIDUAL_COLUMNS.add(col("city", "市州", 110));
        PAX_INDIVIDUAL_COLUMNS.add(col("enterpriseCode", "企业代码", 130));
        PAX_INDIVIDUAL_COLUMNS.add(col("enterpriseName", "企业名称", 220));
        PAX_INDIVIDUAL_COLUMNS.add(col("passengerCount", "个体客运量(人)", 140));
        PAX_INDIVIDUAL_COLUMNS.add(col("turnover", "个体旅客周转量(人公里)", 180));
        WYC_TOTAL_COLUMNS.add(col("reportPeriod", "报表期", 100));
        WYC_TOTAL_COLUMNS.add(col("pinK", "全省网约车客运量(万人次)", 210));
        WYC_TOTAL_COLUMNS.add(col("pinCK", "其中城市内客运量(万人次)", 210));
        WYC_TOTAL_COLUMNS.add(col("pinZ", "全省网约车周转量(万人公里)", 220));
        WYC_TOTAL_COLUMNS.add(col("pinCZ", "其中城市内周转量(万人公里)", 220));
        WYC_ORDER_COLUMNS.add(col("region", "地区", 110));
        WYC_ORDER_COLUMNS.add(col("period", "期间", 100));
        WYC_ORDER_COLUMNS.add(col("orderCount", "订单数(单)", 130));
        WYC_ORDER_COLUMNS.add(col("orderShare", "订单占比", 100));
        WYC_ORDER_COLUMNS.add(col("pax", "客运量(万人次)", 140));
        WYC_ORDER_COLUMNS.add(col("turnover", "旅客周转量(万人公里)", 180));
        WYC_ORDER_COLUMNS.add(col("cityPax", "其中城市内客运量(万人次)", 190));
        WYC_ORDER_COLUMNS.add(col("cityTurnover", "其中城市内旅客周转量(万人公里)", 230));
        WYC_ORDER_COLUMNS.add(col("note", "说明", 200));
    }
}
traffic-audit-server/src/main/java/com/trafficaudit/dataimport/service/CityRollupService.java
New file
@@ -0,0 +1,636 @@
package com.trafficaudit.dataimport.service;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.trafficaudit.common.util.RegionUtil;
import com.trafficaudit.dataimport.entity.CityBusMonthly;
import com.trafficaudit.dataimport.entity.CityTaxiMonthly;
import com.trafficaudit.dataimport.entity.FreightTurnoverImport;
import com.trafficaudit.dataimport.entity.H2032EnterpriseMonthly;
import com.trafficaudit.dataimport.entity.PassengerEnterpriseMonthly;
import com.trafficaudit.dataimport.entity.PassengerIndividualMonthly;
import com.trafficaudit.dataimport.entity.WycOrderMonthly;
import com.trafficaudit.dataimport.mapper.CityBusMonthlyMapper;
import com.trafficaudit.dataimport.mapper.CityTaxiMonthlyMapper;
import com.trafficaudit.dataimport.mapper.FreightTurnoverImportMapper;
import com.trafficaudit.dataimport.mapper.H2032EnterpriseMonthlyMapper;
import com.trafficaudit.dataimport.mapper.PassengerEnterpriseMonthlyMapper;
import com.trafficaudit.dataimport.mapper.PassengerIndividualMonthlyMapper;
import com.trafficaudit.dataimport.mapper.WycOrderMonthlyMapper;
import com.trafficaudit.reportexport.calc.WycSplitCalc;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
 * æ•°æ®æŸ¥çœ‹ - æŒ‰å¸‚州汇总(任意起止月)。
 *
 * å£å¾„(2026-09-22 ä¸Žç”¨æˆ·ç¡®è®¤ï¼‰ï¼š
 *  1) æµé‡ç±»åˆ—(客运量/周转量/货运量/订单数)跨期求和;
 *  2) æ—¶ç‚¹ç±»åˆ—(车辆数、企业数、站点数)不参与汇总,不出现在结果里;
 *  3) æ¯”率类列按累计口径重算:累计同比 = æœ¬æœŸç´¯è®¡ Ã· ä¸Šå¹´åŒæœŸç´¯è®¡ âˆ’ 1;平均运距 = ç´¯è®¡å‘¨è½¬é‡ Ã· ç´¯è®¡å®¢è¿é‡ï¼›
 *  4) æŽ’名默认留空,可由前端选择"按累计值重排";
 *  5) ç»“æžœ = 17 å¸‚州(RegionUtil è§„范名/顺序)+ å…¨çœåˆè®¡è¡Œã€‚
 */
@Service
public class CityRollupService {
    public static final String TOTAL_CITY = "全省合计";
    @Resource
    private CityBusMonthlyMapper cityBusMapper;
    @Resource
    private CityTaxiMonthlyMapper cityTaxiMapper;
    @Resource
    private H2032EnterpriseMonthlyMapper h2032Mapper;
    @Resource
    private PassengerEnterpriseMonthlyMapper h2031Mapper;
    @Resource
    private PassengerIndividualMonthlyMapper individualMapper;
    @Resource
    private WycOrderMonthlyMapper wycOrderMapper;
    @Resource
    private FreightTurnoverImportMapper freightTurnoverMapper;
    @Resource
    private WycSplitCalc wycSplitCalc;
    /** æ±‡æ€»åˆ—定义。kind:FLOW æ±‚å’Œ / AVG åˆ†å­Ã·åˆ†æ¯ / YOY æœ¬æœŸç´¯è®¡â†”上年同期累计 / YOYS åŒè¡ŒåŽ»å¹´å­—æ®µ / RANK æŒ‰æŸè¾“出列重排名次 */
    private static class Col {
        final String prop;
        final String label;
        final int width;
        final String kind;
        final String src;
        final String den;
        final String last;
        final String rankBy;
        Col(String prop, String label, int width, String kind, String src, String den, String last, String rankBy) {
            this.prop = prop;
            this.label = label;
            this.width = width;
            this.kind = kind;
            this.src = src;
            this.den = den;
            this.last = last;
            this.rankBy = rankBy;
        }
    }
    private static Col flow(String prop, String label, int width, String src) {
        return new Col(prop, label, width, "FLOW", src, null, null, null);
    }
    private static Col avg(String prop, String label, String src, String den) {
        return new Col(prop, label, 130, "AVG", src, den, null, null);
    }
    private static Col yoy(String prop, String label, String src) {
        return new Col(prop, label, 150, "YOY", src, null, null, null);
    }
    private static Col yoys(String prop, String label, String src, String last) {
        return new Col(prop, label, 150, "YOYS", src, null, last, null);
    }
    private static Col rank(String prop, String label, String rankBy) {
        return new Col(prop, label, 110, "RANK", null, null, null, rankBy);
    }
    private static final Map<String, String> TYPE_LABELS = new LinkedHashMap<>();
    private static final Map<String, List<Col>> SPECS = new LinkedHashMap<>();
    static {
        TYPE_LABELS.put("cityBus", "城市公共交通(按市州汇总)");
        SPECS.put("cityBus", Arrays.asList(
                flow("passengerVolume", "客运量(万人次)", 140, "passengerVolume"),
                flow("turnover", "旅客周转量(万人公里)", 180, "turnover"),
                flow("passengerCity", "城市内客运量(万人次)", 170, "passengerCity"),
                flow("turnoverCity", "城市内周转量(万人公里)", 190, "turnoverCity"),
                flow("passengerChengxiang", "城际城乡客运量(万人次)", 190, "passengerChengxiang"),
                flow("turnoverChengxiang", "城际城乡周转量(万人公里)", 210, "turnoverChengxiang"),
                avg("avgDistance", "平均运距(公里)", "turnover", "passengerVolume"),
                yoy("passengerYoy", "客运量累计同比(%)", "passengerVolume"),
                rank("passengerRank", "客运量排名", "passengerVolume")));
        TYPE_LABELS.put("cityTaxi", "巡游出租汽车(按市州汇总)");
        SPECS.put("cityTaxi", Arrays.asList(
                flow("passengerVolume", "客运量(万人次)", 140, "passengerVolume"),
                flow("turnover", "旅客周转量(万人公里)", 180, "turnover"),
                flow("passengerCity", "城市内客运量(万人次)", 170, "passengerCity"),
                flow("turnoverCity", "城市内周转量(万人公里)", 190, "turnoverCity"),
                flow("tripTotal", "载客车次总数(车次)", 170, "tripTotal"),
                flow("tripCity", "载客车次_城市内(车次)", 190, "tripCity"),
                avg("avgDistance", "平均运距(公里)", "turnover", "passengerVolume"),
                yoy("passengerYoy", "客运量累计同比(%)", "passengerVolume"),
                rank("passengerRank", "客运量排名", "passengerVolume")));
        TYPE_LABELS.put("h2032", "道路货物运输企业(按市州汇总)");
        SPECS.put("h2032", Arrays.asList(
                flow("freightTotal", "货运量(吨)", 150, "freightTotal"),
                flow("turnoverTotal", "货运周转量(吨公里)", 180, "turnoverTotal"),
                avg("avgDistance", "平均运距(公里)", "turnoverTotal", "freightTotal"),
                yoy("freightYoy", "货运量累计同比(%)", "freightTotal"),
                rank("freightRank", "货运量排名", "freightTotal"),
                rank("turnoverRank", "周转量排名", "turnoverTotal")));
        TYPE_LABELS.put("h2031", "公路旅客运输企业(按市州汇总)");
        SPECS.put("h2031", Arrays.asList(
                flow("passengerTotal", "客运量(人)", 140, "passengerTotal"),
                flow("turnoverTotal", "旅客周转量(人公里)", 180, "turnoverTotal"),
                avg("avgDistance", "平均运距(公里)", "turnoverTotal", "passengerTotal"),
                yoy("passengerYoy", "客运量累计同比(%)", "passengerTotal"),
                rank("passengerRank", "客运量排名", "passengerTotal")));
        TYPE_LABELS.put("passengerIndividual", "个体客运量/周转量(按市州汇总)");
        SPECS.put("passengerIndividual", Arrays.asList(
                flow("passengerCount", "个体客运量(人)", 150, "passengerCount"),
                flow("turnover", "个体旅客周转量(人公里)", 190, "turnover"),
                yoy("passengerYoy", "客运量累计同比(%)", "passengerCount")));
        TYPE_LABELS.put("wycOrder", "网约车(按市州、拆分口径汇总)");
        SPECS.put("wycOrder", Arrays.asList(
                flow("orderCount", "订单数(单)", 150, "orderCount"),
                flow("pax", "客运量(万人次)", 140, "pax"),
                flow("turnover", "旅客周转量(万人公里)", 180, "turnover"),
                flow("cityPax", "城市内客运量(万人次)", 170, "cityPax"),
                flow("cityTurnover", "城市内旅客周转量(万人公里)", 210, "cityTurnover"),
                yoy("paxYoy", "客运量累计同比(%)", "pax"),
                rank("paxRank", "客运量排名", "pax")));
        TYPE_LABELS.put("freightTurnover", "货运量周转量(按市州汇总)");
        SPECS.put("freightTurnover", Arrays.asList(
                flow("freight", "货运量(万吨)", 140, "freightM"),
                flow("turnover", "周转量(万吨公里)", 170, "turnoverM"),
                yoys("freightYoy", "货运量累计同比(%)", "freightM", "lastFreightM"),
                yoys("turnoverYoy", "周转量累计同比(%)", "turnoverM", "lastTurnoverM"),
                rank("freightRank", "货运量排名", "freight"),
                rank("turnoverRank", "周转量排名", "turnover")));
    }
    public List<Map<String, Object>> supportedTypes() {
        List<Map<String, Object>> list = new ArrayList<>();
        for (Map.Entry<String, String> e : TYPE_LABELS.entrySet()) {
            Map<String, Object> m = new LinkedHashMap<>();
            m.put("type", e.getKey());
            m.put("label", e.getValue());
            list.add(m);
        }
        return list;
    }
    /** æŒ‰å¸‚州汇总 */
    public Map<String, Object> summary(String type, String from, String to, boolean recomputeRank) {
        List<Col> cols = SPECS.get(type);
        if (cols == null) {
            throw new RuntimeException("该数据类型暂不支持按市州汇总:" + type);
        }
        String f = trimPeriod(from);
        String t = trimPeriod(to);
        if (f == null || t == null) {
            throw new RuntimeException("请先选择起止月(例如 2026-01 ~ 2026-08)");
        }
        if (f.compareTo(t) > 0) {
            String tmp = f;
            f = t;
            t = tmp;
        }
        String lastFrom = yearBefore(f);
        String lastTo = yearBefore(t);
        Map<String, Map<String, Double>> cur = sumByCity(longRows(type, f, t), cols);
        Map<String, Map<String, Double>> last = sumByCity(longRows(type, lastFrom, lastTo), cols);
        List<Map<String, Object>> records = new ArrayList<>();
        // å…¨çœåˆè®¡è¡Œæ”¾åœ¨æœ€å‰é¢ï¼ˆç”¨æˆ·è¦æ±‚,放在武汉市之上)
        records.add(outRow(cols, mergeAll(cur), mergeAll(last), TOTAL_CITY));
        for (String city : RegionUtil.cityList()) {
            records.add(outRow(cols, cur.get(city), last.get(city), city));
        }
        if (recomputeRank) {
            applyRank(records, cols);
        }
        List<Map<String, Object>> columns = new ArrayList<>();
        columns.add(colMeta("city", "市州", 120));
        for (Col c : cols) {
            columns.add(colMeta(c.prop, c.label, c.width));
        }
        Map<String, Object> res = new LinkedHashMap<>();
        res.put("type", type);
        res.put("label", TYPE_LABELS.get(type));
        res.put("from", f);
        res.put("to", t);
        res.put("lastFrom", lastFrom);
        res.put("lastTo", lastTo);
        res.put("rankMode", recomputeRank ? "recompute" : "blank");
        res.put("columns", columns);
        res.put("records", records);
        return res;
    }
    /** å¯¼å‡ºä¸º xlsx(数值保留全精度,显示格式 2 ä½å°æ•° / ç™¾åˆ†æ¯”) */
    public byte[] exportExcel(String type, String from, String to, boolean recomputeRank) throws IOException {
        Map<String, Object> data = summary(type, from, to, recomputeRank);
        @SuppressWarnings("unchecked")
        List<Map<String, Object>> columns = (List<Map<String, Object>>) data.get("columns");
        @SuppressWarnings("unchecked")
        List<Map<String, Object>> records = (List<Map<String, Object>>) data.get("records");
        String label = String.valueOf(data.get("label"));
        String title = label + " " + data.get("from") + " ~ " + data.get("to") + "(累计)";
        try (XSSFWorkbook wb = new XSSFWorkbook(); ByteArrayOutputStream bos = new ByteArrayOutputStream()) {
            XSSFSheet sheet = wb.createSheet("按市州汇总");
            Font bold = wb.createFont();
            bold.setBold(true);
            XSSFCellStyle titleStyle = wb.createCellStyle();
            titleStyle.setFont(bold);
            XSSFCellStyle headStyle = wb.createCellStyle();
            headStyle.setFont(bold);
            headStyle.setAlignment(HorizontalAlignment.CENTER);
            headStyle.setBorderBottom(BorderStyle.THIN);
            XSSFCellStyle numStyle = wb.createCellStyle();
            numStyle.setDataFormat(wb.createDataFormat().getFormat("0.00"));
            XSSFCellStyle pctStyle = wb.createCellStyle();
            pctStyle.setDataFormat(wb.createDataFormat().getFormat("0.00%"));
            XSSFRow titleRow = sheet.createRow(0);
            XSSFCell titleCell = titleRow.createCell(0);
            titleCell.setCellValue(title);
            titleCell.setCellStyle(titleStyle);
            XSSFRow headRow = sheet.createRow(1);
            for (int i = 0; i < columns.size(); i++) {
                XSSFCell cell = headRow.createCell(i);
                cell.setCellValue(String.valueOf(columns.get(i).get("label")));
                cell.setCellStyle(headStyle);
            }
            Font totalFont = wb.createFont();
            totalFont.setBold(true);
            XSSFCellStyle totalStyle = wb.createCellStyle();
            totalStyle.setFont(totalFont);
            int r = 2;
            for (Map<String, Object> rec : records) {
                boolean isTotal = TOTAL_CITY.equals(rec.get("city"));
                XSSFRow row = sheet.createRow(r++);
                for (int i = 0; i < columns.size(); i++) {
                    String prop = String.valueOf(columns.get(i).get("prop"));
                    String colLabel = String.valueOf(columns.get(i).get("label"));
                    Object v = rec.get(prop);
                    XSSFCell cell = row.createCell(i);
                    if (v instanceof Number) {
                        cell.setCellValue(((Number) v).doubleValue());
                        cell.setCellStyle(colLabel.contains("同比") ? pctStyle : numStyle);
                    } else {
                        cell.setCellValue(v == null ? "" : String.valueOf(v));
                        if (isTotal) {
                            cell.setCellStyle(totalStyle);
                        }
                    }
                }
            }
            for (int i = 0; i < columns.size(); i++) {
                sheet.setColumnWidth(i, Math.min(40, Math.max(10, Integer.parseInt(String.valueOf(columns.get(i).get("width"))) / 7)) * 256);
            }
            wb.write(bos);
            return bos.toByteArray();
        }
    }
    // ==================== å†…部实现 ====================
    private static String trimPeriod(String p) {
        if (p == null) {
            return null;
        }
        String s = p.trim();
        if (s.length() >= 7) {
            return s.substring(0, 7);
        }
        return s.isEmpty() ? null : s;
    }
    private static String yearBefore(String period) {
        int year = Integer.parseInt(period.substring(0, 4)) - 1;
        return year + period.substring(4);
    }
    private static Map<String, Object> colMeta(String prop, String label, int width) {
        Map<String, Object> m = new LinkedHashMap<>();
        m.put("prop", prop);
        m.put("label", label);
        m.put("width", width);
        return m;
    }
    /** åªæœ‰ 17 ä¸ªè§„范市州名才算市州;"湖北省""全省"等合计行返回 null(避免重复计入) */
    private String cityOrNull(String name) {
        if (name == null) {
            return null;
        }
        String normalized = RegionUtil.normalizeCityName(name);
        return normalized != null && RegionUtil.cityList().contains(normalized) ? normalized : null;
    }
    private String cityOfCode(String regionCode) {
        if (regionCode == null || regionCode.trim().isEmpty()) {
            return null;
        }
        return RegionUtil.cityByCode(regionCode.trim());
    }
    private static double nz(Double v) {
        return v == null ? 0.0 : v;
    }
    private static double num(Object v) {
        if (v instanceof Number) {
            return ((Number) v).doubleValue();
        }
        if (v instanceof String) {
            try {
                return Double.parseDouble(((String) v).trim());
            } catch (Exception ignore) {
                return 0.0;
            }
        }
        return 0.0;
    }
    /** å–某类型在 [from,to] çš„"长表"行:每行含 _city ä¸Žå‚与汇总的源字段 */
    private List<Map<String, Object>> longRows(String type, String from, String to) {
        List<Map<String, Object>> rows = new ArrayList<>();
        switch (type) {
            case "cityBus": {
                List<CityBusMonthly> list = cityBusMapper.selectList(new LambdaQueryWrapper<CityBusMonthly>()
                        .ge(CityBusMonthly::getReportPeriod, from).le(CityBusMonthly::getReportPeriod, to));
                for (CityBusMonthly e : list) {
                    String city = e.getCity() != null ? cityOrNull(e.getCity()) : cityOfCode(e.getRegionCode());
                    if (city == null) {
                        continue;
                    }
                    Map<String, Object> m = BeanUtil.beanToMap(e);
                    m.put("_city", city);
                    rows.add(m);
                }
                break;
            }
            case "cityTaxi": {
                List<CityTaxiMonthly> list = cityTaxiMapper.selectList(new LambdaQueryWrapper<CityTaxiMonthly>()
                        .ge(CityTaxiMonthly::getReportPeriod, from).le(CityTaxiMonthly::getReportPeriod, to));
                for (CityTaxiMonthly e : list) {
                    String city = e.getCity() != null ? cityOrNull(e.getCity()) : cityOfCode(e.getRegionCode());
                    if (city == null) {
                        continue;
                    }
                    Map<String, Object> m = BeanUtil.beanToMap(e);
                    m.put("_city", city);
                    rows.add(m);
                }
                break;
            }
            case "h2032": {
                List<H2032EnterpriseMonthly> list = h2032Mapper.selectList(new LambdaQueryWrapper<H2032EnterpriseMonthly>()
                        .ge(H2032EnterpriseMonthly::getReportPeriod, from).le(H2032EnterpriseMonthly::getReportPeriod, to));
                for (H2032EnterpriseMonthly e : list) {
                    String city = cityOfCode(e.getRegionCode());
                    if (city == null) {
                        continue;
                    }
                    Map<String, Object> m = BeanUtil.beanToMap(e);
                    m.put("_city", city);
                    rows.add(m);
                }
                break;
            }
            case "h2031": {
                List<PassengerEnterpriseMonthly> list = h2031Mapper.selectList(new LambdaQueryWrapper<PassengerEnterpriseMonthly>()
                        .ge(PassengerEnterpriseMonthly::getReportPeriod, from).le(PassengerEnterpriseMonthly::getReportPeriod, to));
                for (PassengerEnterpriseMonthly e : list) {
                    String city = cityOfCode(e.getRegionCode());
                    if (city == null) {
                        continue;
                    }
                    Map<String, Object> m = BeanUtil.beanToMap(e);
                    m.put("_city", city);
                    rows.add(m);
                }
                break;
            }
            case "passengerIndividual": {
                List<PassengerIndividualMonthly> list = individualMapper.selectList(new LambdaQueryWrapper<PassengerIndividualMonthly>()
                        .ge(PassengerIndividualMonthly::getReportPeriod, from).le(PassengerIndividualMonthly::getReportPeriod, to));
                for (PassengerIndividualMonthly e : list) {
                    String city = cityOfCode(e.getRegionCode());
                    if (city == null) {
                        continue;
                    }
                    Map<String, Object> m = BeanUtil.beanToMap(e);
                    m.put("_city", city);
                    rows.add(m);
                }
                break;
            }
            case "wycOrder": {
                List<WycOrderMonthly> list = wycOrderMapper.selectList(new LambdaQueryWrapper<WycOrderMonthly>()
                        .ge(WycOrderMonthly::getReportPeriod, from).le(WycOrderMonthly::getReportPeriod, to));
                List<String> cities = RegionUtil.cityList();
                for (WycOrderMonthly e : list) {
                    Map<String, WycSplitCalc.WycMetrics> byCity = null;
                    try {
                        byCity = wycSplitCalc.calc(e.getReportPeriod()).getByCity();
                    } catch (Exception ignore) {
                        // æ‹†åˆ†è¾“入不全时只汇总订单数
                    }
                    double[] orders = {nz(e.getOrderWuhan()), nz(e.getOrderHuangshi()), nz(e.getOrderShiyan()),
                            nz(e.getOrderYichang()), nz(e.getOrderXiangyang()), nz(e.getOrderEzhou()), nz(e.getOrderJingmen()),
                            nz(e.getOrderXiaogan()), nz(e.getOrderJingzhou()), nz(e.getOrderHuanggang()), nz(e.getOrderXianning()),
                            nz(e.getOrderSuizhou()), nz(e.getOrderEnshi()), nz(e.getOrderXiantao()), nz(e.getOrderQianjiang()),
                            nz(e.getOrderTianmen()), nz(e.getOrderShennong())};
                    for (int i = 0; i < cities.size() && i < orders.length; i++) {
                        Map<String, Object> m = new LinkedHashMap<>();
                        m.put("_city", cities.get(i));
                        m.put("orderCount", orders[i]);
                        WycSplitCalc.WycMetrics mt = byCity == null ? null : byCity.get(cities.get(i));
                        if (mt != null) {
                            m.put("pax", mt.getTotalPax());
                            m.put("turnover", mt.getTotalTurnover());
                            m.put("cityPax", mt.getCityPax());
                            m.put("cityTurnover", mt.getCityTurnover());
                        }
                        rows.add(m);
                    }
                }
                break;
            }
            case "freightTurnover": {
                // è¯¥è¡¨æ¯è¡Œå«"年初至当期"的各月列(行内累计),故累计只用 to é‚£ä¸€è¡Œã€å¯¹åŒºé—´æœˆä»½æ±‚和;
                // ä¸”"湖北省"行等于 17 å¸‚州之和,必须排除,否则重复计入。
                List<FreightTurnoverImport> list = freightTurnoverMapper.selectList(new LambdaQueryWrapper<FreightTurnoverImport>()
                        .ge(FreightTurnoverImport::getReportPeriod, from)
                        .le(FreightTurnoverImport::getReportPeriod, to)
                        .orderByDesc(FreightTurnoverImport::getReportPeriod));
                if (list.isEmpty()) {
                    break;
                }
                // è¯¥è¡¨æ¯è¡Œæ˜¯"年初至当期"的行内累计,取区间内最新一期那一行;结束月无数据时自动回退到最新有数月份
                String latestPeriod = list.get(0).getReportPeriod();
                list = new ArrayList<>();
                for (FreightTurnoverImport e : freightTurnoverMapper.selectList(new LambdaQueryWrapper<FreightTurnoverImport>()
                        .eq(FreightTurnoverImport::getReportPeriod, latestPeriod))) {
                    list.add(e);
                }
                int m1 = Integer.parseInt(from.substring(5, 7));
                int m2 = Integer.parseInt(latestPeriod.substring(5, 7));
                if (m2 < m1) {
                    break;
                }
                for (FreightTurnoverImport e : list) {
                    String city = cityOrNull(e.getRegionName());
                    if (city == null) {
                        continue;
                    }
                    Map<String, Object> src = BeanUtil.beanToMap(e);
                    double freight = 0, turnover = 0, lastFreight = 0, lastTurnover = 0;
                    for (int mm = m1; mm <= m2; mm++) {
                        freight += num(src.get(String.format("freightM%02d", mm)));
                        turnover += num(src.get(String.format("turnoverM%02d", mm)));
                        lastFreight += num(src.get(String.format("lastFreightM%02d", mm)));
                        lastTurnover += num(src.get(String.format("lastTurnoverM%02d", mm)));
                    }
                    Map<String, Object> m = new LinkedHashMap<>();
                    m.put("_city", city);
                    m.put("freightM", freight);
                    m.put("turnoverM", turnover);
                    m.put("lastFreightM", lastFreight);
                    m.put("lastTurnoverM", lastTurnover);
                    rows.add(m);
                }
                break;
            }
            default:
                break;
        }
        return rows;
    }
    /** æŒ‰å¸‚州累计各列用到的源字段 */
    private Map<String, Map<String, Double>> sumByCity(List<Map<String, Object>> rows, List<Col> cols) {
        Map<String, Map<String, Double>> acc = new LinkedHashMap<>();
        for (Map<String, Object> row : rows) {
            Object cityObj = row.get("_city");
            if (cityObj == null) {
                continue;
            }
            String city = String.valueOf(cityObj);
            Map<String, Double> sums = acc.computeIfAbsent(city, k -> new LinkedHashMap<>());
            Set<String> keys = new LinkedHashSet<>();
            for (Col c : cols) {
                if (c.src != null) {
                    keys.add(c.src);
                }
                if (c.den != null) {
                    keys.add(c.den);
                }
                if (c.last != null) {
                    keys.add(c.last);
                }
            }
            for (String key : keys) {
                sums.merge(key, num(row.get(key)), Double::sum);
            }
        }
        return acc;
    }
    private Map<String, Double> mergeAll(Map<String, Map<String, Double>> acc) {
        Map<String, Double> total = new LinkedHashMap<>();
        for (Map<String, Double> sums : acc.values()) {
            for (Map.Entry<String, Double> e : sums.entrySet()) {
                total.merge(e.getKey(), e.getValue(), Double::sum);
            }
        }
        return total;
    }
    private Map<String, Object> outRow(List<Col> cols, Map<String, Double> cur, Map<String, Double> last, String city) {
        Map<String, Object> row = new LinkedHashMap<>();
        row.put("city", city);
        for (Col c : cols) {
            Double value = null;
            switch (c.kind) {
                case "FLOW": {
                    value = cur == null ? null : cur.get(c.src);
                    break;
                }
                case "AVG": {
                    double den = cur == null ? 0.0 : num(cur.get(c.den));
                    double nume = cur == null ? 0.0 : num(cur.get(c.src));
                    value = den > 0 ? nume / den : null;
                    break;
                }
                case "YOY": {
                    double base = last == null ? 0.0 : num(last.get(c.src));
                    double now = cur == null ? 0.0 : num(cur.get(c.src));
                    value = base > 0 ? now / base - 1 : null;
                    break;
                }
                case "YOYS": {
                    double base = cur == null ? 0.0 : num(cur.get(c.last));
                    double now = cur == null ? 0.0 : num(cur.get(c.src));
                    value = base > 0 ? now / base - 1 : null;
                    break;
                }
                default: {
                    value = null; // RANK: ç”± applyRank å¡«
                }
            }
            row.put(c.prop, value);
        }
        return row;
    }
    /** æŒ‰ç´¯è®¡å€¼é‡æ–°æŽ’名(1 = æœ€å¤§ï¼‰ï¼›å…¨çœåˆè®¡è¡Œä¸æŽ’名 */
    private void applyRank(List<Map<String, Object>> records, List<Col> cols) {
        List<Map<String, Object>> cities = new ArrayList<>();
        for (Map<String, Object> r : records) {
            if (!TOTAL_CITY.equals(r.get("city"))) {
                cities.add(r);
            }
        }
        for (Col c : cols) {
            if (!"RANK".equals(c.kind)) {
                continue;
            }
            List<Map<String, Object>> sorted = new ArrayList<>(cities);
            sorted.sort(Comparator.comparingDouble((Map<String, Object> r) -> {
                Object v = r.get(c.rankBy);
                return v instanceof Number ? ((Number) v).doubleValue() : Double.NEGATIVE_INFINITY;
            }).reversed());
            for (int i = 0; i < sorted.size(); i++) {
                Object v = sorted.get(i).get(c.rankBy);
                sorted.get(i).put(c.prop, v instanceof Number ? (i + 1) : null);
            }
        }
    }
}
traffic-audit-server/src/main/java/com/trafficaudit/dataimport/service/DataImportService.java
@@ -2442,6 +2442,41 @@
            || normDash.contains(period) || normDash.contains(period.replace("-0", "-"));
    }
    /**
     * æŠ¥è¡¨æœŸå•元格命中:扫描 sheet å‰ 8 è¡Œï¼Œæ‰¾å½¢å¦‚ 2026.08 / 2026å¹´8月 / 2026-08-24 çš„æŠ¥è¡¨æœŸæ–‡å­—或日期单元格。
     * èƒŒæ™¯ï¼ˆ2026-09-22):潜江单表含 20 ä¸ªåŽ†å² sheet(潜江(1月)…潜江(8月)…),旧逻辑只按「8月」匹配 sheet åï¼Œ
     * ä¼šæŠŠ 2018 å¹´çš„「潜江(8月)」当成 2026-08,导入成 2018 å¹´æ•°æ®ï¼›å½“期 sheet åæ˜¯ã€Œæ½œæ±Ÿï¼ˆ2022.3)」,
     * åªèƒ½é è¡¨å†…报表期(2026.08.24)识别。
     */
    private boolean investSheetPeriodCellHit(Sheet sh, String period) {
        if (sh == null || period == null || !period.matches("\\d{4}-\\d{2}")) return false;
        String year = period.substring(0, 4);
        int month = Integer.parseInt(period.substring(5, 7));
        int last = Math.min(sh.getLastRowNum(), 7);
        for (int r = 0; r <= last; r++) {
            Row row = sh.getRow(r);
            if (row == null) continue;
            int lastCell = Math.max(1, row.getLastCellNum());
            for (int c = 0; c < Math.min(lastCell, 12); c++) {
                Cell cell = row.getCell(c);
                if (cell == null) continue;
                if (cell.getCellType() == CellType.NUMERIC && DateUtil.isCellDateFormatted(cell)) {
                    java.time.LocalDate d = cell.getLocalDateTimeCellValue().toLocalDate();
                    if (d.getYear() == Integer.parseInt(year) && d.getMonthValue() == month) return true;
                    continue;
                }
                String v = cellStr(row, c);
                if (v == null) continue;
                String t = v.trim().replace(" ", "");
                if (t.isEmpty() || t.length() > 30) continue;
                java.util.regex.Matcher mm = java.util.regex.Pattern
                        .compile("(\\d{4})\\s*[å¹´.\\-/]\\s*(\\d{1,2})").matcher(t);
                if (mm.find() && year.equals(mm.group(1)) && month == Integer.parseInt(mm.group(2))) return true;
            }
        }
        return false;
    }
    /** è§£æžå•个市州报表:选 sheet(报表期名优先 + æ•°æ®è¡Œæ•°ï¼‰ï¼ŒæŒ‰åˆ—名映射提取项目行 */
    private void parseInvestCityWorkbook(Workbook wb, String fileName, String category, String period,
                                         Set<String> fiveYearNames, List<InvestCityRow> rows, Map<String, Object> fr) {
@@ -2453,7 +2488,10 @@
            Map<String, Integer> col = findInvestHeader(sh);
            if (col == null) continue;
            int cnt = countInvestRows(sh, col);
            int score = cnt + (cnt > 0 && investSheetMatchesPeriod(sh, period) ? 1000000 : 0);
            // 2026-09-22:表内报表期(单元格)命中权重最高——历史同月 sheet(如潜江(8月))不能盖过当期 sheet
            boolean cellHit = cnt > 0 && investSheetPeriodCellHit(sh, period);
            int score = cnt + (cnt > 0 && investSheetMatchesPeriod(sh, period) ? 1000000 : 0)
                    + (cellHit ? 2000000 : 0);
            if (cnt > 0 && investSheetMatchesPeriod(sh, period)) {
                // å½“期真实报表 sheet åé€šå¸¸å¸¦å¹´ä»½ï¼ˆå¦‚ 2026.8/2026å¹´8月),历史sheet多为纯月份名(8月):带年份的优先
                String norm = sh.getSheetName() == null ? "" : sh.getSheetName().replace(" ", "");
@@ -2618,25 +2656,28 @@
    /** å•个表头单元格 -> å­—段键(null è¡¨ç¤ºä¸æ˜¯è¡¨å¤´å­—段);供表头行判定与列映射共用 */
    private String investHeaderKey(String v) {
        if (v == null) return null;
        String flat = v.replace(" ", "");
        if (v.contains("项目名称")) return "name";
        // 2026-09-22:表头单元格常带换行/全角空格(如天门「自开始建\n设累计完\n成投资\n(万元)」),
        // ç»Ÿä¸€åŽ»æŽ‰å…¨éƒ¨ç©ºç™½åŽå†åˆ¤å®šå…³é”®è¯ï¼›å¦åˆ™ H(自开始建设累计)/J(自年初累计)/K(本月完成) ä¼šåŒ¹é…å¤±è´¥ï¼Œ
        // åˆ—映射落到 -1 â†’ ä¸‰ä¸ªæ•°å€¼è¢«å†™æˆ 0(天门 2026-08 å°±æ˜¯è¿™æ ·ä¸¢çš„ 16677.7/16677.7/500)。
        String flat = v.replaceAll("[\\s\\u3000]+", "");
        if (flat.contains("项目名称")) return "name";
        // ã€ŒåŽ¿ï¼ˆå¸‚ã€åŒºï¼‰ã€çš„å„ç§å†™æ³•ï¼šåŠ/全角括号、顿号/逗号、有无括号,统一归一化后再判定
        String flatCounty = flat.replace("(", "(").replace(")", ")").replace("、", "").replace(",", "").replace(",", "");
        if (flatCounty.contains("县(市区)") || flatCounty.contains("县市区") || flatCounty.contains("区县")) return "county";
        if (v.contains("投资建设") || v.contains("建设单位") || v.contains("项目业主")) return "builder";
        if (v.contains("建设性质")) return "nature";
        if (v.contains("开工")) return "start";
        if (v.contains("竣工") || v.contains("建成")) return "end";
        if ((v.contains("计划总投资") || v.contains("总投资")) && !v.contains("累计")) return "total";
        if (v.contains("自开始建设")) return "startcum";
        if (v.contains("本年计划")) return "yearplan";
        if (v.contains("自年初累计")) return "yearcum";
        if (v.contains("本月完成")) return "monthdone";
        if (v.contains("建设阶段")) return "stage";
        if (v.contains("形象进度") || v.contains("建设进展")) return "desc";
        if (v.contains("工可") && !v.contains("项目名称")) return "gk";
        if (v.contains("初设") && !v.contains("项目名称")) return "cs";
        if (v.contains("建筑面积") && !v.contains("新增")) return "area";
        if (flat.contains("投资建设") || flat.contains("建设单位") || flat.contains("项目业主")) return "builder";
        if (flat.contains("建设性质")) return "nature";
        if (flat.contains("开工")) return "start";
        if (flat.contains("竣工") || flat.contains("建成")) return "end";
        if ((flat.contains("计划总投资") || flat.contains("总投资")) && !flat.contains("累计")) return "total";
        if (flat.contains("自开始建设")) return "startcum";
        if (flat.contains("本年计划")) return "yearplan";
        if (flat.contains("自年初累计")) return "yearcum";
        if (flat.contains("本月完成")) return "monthdone";
        if (flat.contains("建设阶段")) return "stage";
        if (flat.contains("形象进度") || flat.contains("建设进展")) return "desc";
        if (flat.contains("工可") && !flat.contains("项目名称")) return "gk";
        if (flat.contains("初设") && !flat.contains("项目名称")) return "cs";
        if (flat.contains("建筑面积") && !flat.contains("新增")) return "area";
        return null;
    }
traffic-audit-server/src/main/java/com/trafficaudit/reportexport/controller/ReportExportController.java
@@ -99,7 +99,7 @@
    /**
     * æ±‡æ€»å¤§è¡¨å¼‚步导出:立即返回任务号,前端轮询进度、完成后再下载文件。
     * ç”Ÿæˆä¸€æ¬¡çº¦ 10~20 ç§’,走异步可避免点击后长时间无响应;同报表期 10 åˆ†é’Ÿå†…的结果直接复用(期间有导入则自动失效),
     * ç”Ÿæˆä¸€æ¬¡çº¦ 10~20 ç§’,走异步可避免点击后长时间无响应;同报表期结果直接复用(落盘保存、进程重启后仍有效;期间有导入则自动失效),
     * refresh=true å¯å¼ºåˆ¶é‡æ–°ç”Ÿæˆã€‚
     */
    @GetMapping("/exportTask/summaryWorkbook")
traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java
@@ -5781,6 +5781,8 @@
            String curCity = null;
            Set<Long> used = new HashSet<>();
            int filled = 0, kept = 0, dup = 0;
            List<String> skipped = new ArrayList<>();
            Map<String, Integer> skippedByCity = new LinkedHashMap<>();
            for (int r = 8; r <= sheet.getLastRowNum(); r++) {
                Row row = sheet.getRow(r);
                if (row == null) continue;
@@ -5792,11 +5794,16 @@
                if (!a.matches("\\d+(\\.\\d+)?")) continue;
                if (b.isEmpty() || curCity == null) continue;
                InvestmentProject p = matchInvest(projects, b, curCity, "客运站场", used);
                p = preferMonthlyCandidate(projects, p, mByProject, "客运站场", used);
                InvestmentMonthly m = p == null ? null : mByProject.get(p.getId());
                if (p == null || m == null) {
                    kept++;
                    // æœ‰åº“内项目但当月无数据 â†’ è®°ä¸ºå¾…核对;无匹配项目 â†’ ç»“转上月
                    if (p != null) dup++;
                    // 2026-09-22:不再静默结转上月,未覆盖的行必须留痕(行号+市州+项目名+原因)
                    skipped.add("第" + (r + 1) + "行 " + curCity + " " + b
                            + (p == null ? " â†’ åº“内无匹配项目" : " â†’ åº“内无 " + period + " æœˆåº¦æ•°æ®"));
                    skippedByCity.merge(curCity, 1, Integer::sum);
                    continue;
                }
                used.add(p.getId());
@@ -5826,6 +5833,7 @@
            }
            log.info("客运站投资明细表 {}:写入 {} è¡Œï¼Œç»“转母版原值 {} è¡Œï¼ˆå…¶ä¸­åº“内有项目但当月无数据 {} è¡Œï¼‰",
                    period, filled, kept, dup);
            logSkippedRows("客运站投资明细表", period, skipped, skippedByCity);
            return toBytes(wb);
        }
    }
@@ -5866,6 +5874,8 @@
        Map<String, double[]> cityStats = new LinkedHashMap<>();  // å…¨å -> {总数, ç´¯è®¡, è§„划内数, è§„划内累计, è§„划外数, è§„划外累计}
        Set<Long> used = new HashSet<>();
        int filled = 0, kept = 0;
        List<String> skipped = new ArrayList<>();
        Map<String, Integer> skippedByCity = new LinkedHashMap<>();
        for (int i = 0; i < cityRows.size(); i++) {
            int cr = cityRows.get(i);
            String cityLabel = nvl(cellText(sheet.getRow(cr).getCell(0)));
@@ -5888,8 +5898,16 @@
                if (!a.matches("\\d+(\\.\\d+)?")) continue;
                if (b.isEmpty()) continue;
                InvestmentProject p = matchInvest(projects, b, city, "物流园区", used);
                p = preferMonthlyCandidate(projects, p, mByProject, "物流园区", used);
                InvestmentMonthly m = p == null ? null : mByProject.get(p.getId());
                if (p == null || m == null) { kept++; continue; }
                if (p == null || m == null) {
                    kept++;
                    // 2026-09-22:不再静默结转上月,未覆盖的行必须留痕
                    skipped.add("第" + (r + 1) + "行 " + city + " " + b
                            + (p == null ? " â†’ åº“内无匹配项目" : " â†’ åº“内无 " + period + " æœˆåº¦æ•°æ®"));
                    skippedByCity.merge(city, 1, Integer::sum);
                    continue;
                }
                used.add(p.getId());
                // å£å¾„同客运站明细表:只覆盖 H è‡ªå¼€å§‹å»ºè®¾ç´¯è®¡ / J è‡ªå¹´åˆç´¯è®¡ / K æœ¬æœˆå®Œæˆ / M å½¢è±¡è¿›åº¦
                if (m.getStartCum() != null) putNum(row, 7, m.getStartCum());
@@ -6020,6 +6038,7 @@
            log.warn("物流站场投资明细公式求值失败: {}", e.getMessage());
        }
        log.info("物流站场投资明细 {}:写入 {} è¡Œï¼Œç»“转母版原值 {} è¡Œ", period, filled, kept);
        logSkippedRows("物流站场投资明细", period, skipped, skippedByCity);
        return toBytesHssf(wb);
    }
@@ -6314,6 +6333,40 @@
        return full != null && RegionUtil.cityList().contains(full);
    }
    /**
     * åŒåï¼ˆå½’一化后一致)多档时,优先选「当月有数据」的那一档。
     * èƒŒæ™¯ï¼ˆ2026-09-22):十堰「快递物流产业园二期」在库内有两档 id=154(竣工 2026,月度只到 7 æœˆï¼‰ä¸Ž
     * id=181(竣工 2029,有 8 æœˆï¼‰ï¼Œæ¨¡æ¿è¡Œåå‰ç¼€ä¸Ž 154 ä¸€è‡´ â†’ å¯¼å‡ºå–到 154 çš„ 7 æœˆå€¼ã€‚
     */
    private InvestmentProject preferMonthlyCandidate(List<InvestmentProject> pool, InvestmentProject p,
                                                    Map<Long, InvestmentMonthly> mByProject,
                                                    String category, Set<Long> excludeIds) {
        if (p == null || mByProject.containsKey(p.getId())) return p;
        String norm = normInvestName(p.getProjectName());
        if (norm.isEmpty()) return p;
        InvestmentProject better = null;
        for (InvestmentProject c : pool) {
            if (c == null || c.getId().equals(p.getId())) continue;
            if (excludeIds != null && excludeIds.contains(c.getId())) continue;
            if (category != null && !category.equals(c.getCategory())) continue;
            if (!mByProject.containsKey(c.getId())) continue;
            if (!norm.equals(normInvestName(c.getProjectName()))) continue;
            if (better == null || c.getId() > better.getId()) better = c;
        }
        return better != null ? better : p;
    }
    /** æœªæŒ‰å½“月数据覆盖的行必须留痕:逐行列出行号+市州+项目名,避免「静默结转上期值」再次发生 */
    private void logSkippedRows(String reportName, String period, List<String> skipped, Map<String, Integer> byCity) {
        if (skipped == null || skipped.isEmpty()) return;
        log.warn("{} {}:{} è¡ŒæœªæŒ‰å½“月数据覆盖(结转母版原值),需人工核对源文件/库内数据:",
                reportName, period, skipped.size());
        int limit = Math.min(skipped.size(), 50);
        for (int i = 0; i < limit; i++) log.warn("  [未覆盖] {}", skipped.get(i));
        if (skipped.size() > limit) log.warn("  â€¦å¦æœ‰ {} è¡Œæœªé€è¡Œåˆ—出", skipped.size() - limit);
        if (byCity != null && !byCity.isEmpty()) log.warn("  æœªè¦†ç›–行按市州统计:{}", byCity);
    }
    /** åœ¨å€™é€‰é¡¹ç›®æ± ä¸­æŒ‰åç§°åŒ¹é… DB é¡¹ç›®ï¼ˆå¯é€‰ å¸‚å·ž/类别 è¿‡æ»¤ + åŽ¿åŒºå‰ç¼€æ¶ˆæ­§ï¼‰ï¼Œæœªå‘½ä¸­è¿”å›ž null */
    private InvestmentProject matchInvest(List<InvestmentProject> pool, String name, String cityFull, String category) {
        return matchInvest(pool, name, cityFull, category, null);
@@ -6362,7 +6415,8 @@
        if (name == null) return "";
        String s = name.trim();
        s = s.replaceAll("[((]", "").replaceAll("[))]", "");
        s = s.replaceAll("[·•—-_\\-]", "");
        // 2026-09-22:补充半/全角句点、顿号、分号等(库内「中国供销.公安商贸物流园」因半角句点匹配不上模板行)
        s = s.replaceAll("[·•—-_\\-..。、,,;;::]", "");
        s = s.replaceAll("[ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹ]", "I");
        s = s.replaceAll("^(湖北省|武汉市|黄石市|十堰市|宜昌市|襄阳市|鄂州市|荆门市|孝感市|荆州市|黄冈市|咸宁市|随州市|恩施州|仙桃市|潜江市|天门市|神农架林区)", "");
        s = s.replaceAll("^(?:[\\u4e00-\\u9fa5]{2,4}(?:县|市|区))", "");
traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportTaskService.java
@@ -1,18 +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;
@@ -26,10 +35,13 @@
 * ç›®çš„(2026-09-20 ç”¨æˆ·ä¸ŠæŠ¥ã€Œç‚¹ä¸‹è½½è¦ç­‰ä¸€ä¼šï¼Œæ•°æ®å¤šäº†ä¼šä¸ä¼šå¡æ­»ã€ï¼‰ï¼š
 * 1) ç‚¹å‡»åŽç«‹åˆ»æœ‰åé¦ˆï¼Œä¸å†é•¿æ—¶é—´æ— å“åº”ï¼›
 * 2) ç”Ÿæˆè¿‡ç¨‹ä¸å ç”¨ HTTP è¯·æ±‚线程,避免多人同时点把容器拖死(工作线程固定 1 ä¸ªï¼Œå¤šä½™è¯·æ±‚显示「排队中」);
 * 3) åŒä¸€æŠ¥è¡¨æœŸ 10 åˆ†é’Ÿå†…的结果可复用,避免每次重算整本约 4 ä¸‡æ ¼å…¬å¼ã€‚
 * 3) åŒä¸€æŠ¥è¡¨æœŸçš„结果可复用(**落盘保存,进程重启后依然有效**),避免每次重算整本约 4 ä¸‡æ ¼å…¬å¼ã€‚
 *
 * ç¼“存正确性守卫:只有当「距上次生成不超过 TTL」且「期间没有任何新的数据导入(import_batch æœ€å¤§ id æœªå˜ï¼‰ã€
 * æ—¶æ‰å¤ç”¨ï¼›å¯¼å…¥å³å¤±æ•ˆï¼Œé¿å…æŠŠè¿‡æœŸæŠ¥è¡¨ç»™ç”¨æˆ·ã€‚前端仍提供「重新生成」强制刷新。
 * ç¼“存正确性守卫=**数据指纹**:指纹由「汇总大表依赖的源表内容校验和」+「母版等文件身份(大小/修改时间)」算出,
 * åªæœ‰æŒ‡çº¹ä¸€è‡´ï¼ˆä¸”结果不超过 7 å¤©ï¼‰æ‰å¤ç”¨ã€‚因此:
 *   - æŠ•资/能耗/审核等**与汇总大表无关**的导入不再让缓存失效;
 *   - æ¢æ¯ç‰ˆã€æ”¹å‚照件、动相关源表(含原地 UPDATE)都会让缓存失效,不会把旧表当新表发出。
 * å‰ç«¯ä»æä¾›ã€Œé‡æ–°ç”Ÿæˆã€å¼ºåˆ¶é‡ç®—(跳过缓存)。落盘位置:{summary.template-dir}/_cache/<key>_v<指纹>.xlsx
 */
@Slf4j
@Service
@@ -40,13 +52,54 @@
    /** ç”Ÿæˆç»“果保留时长:期间可反复下载,过后自动清理 */
    private static final long RESULT_TTL_MS = 30 * 60 * 1000L;
    /** åŒä¸€æŠ¥è¡¨æœŸç»“果复用时长(且期间无新导入时才复用) */
    private static final long CACHE_TTL_MS = 10 * 60 * 1000L;
    /** åŒä¸€æŠ¥è¡¨æœŸç»“果复用上限:只要期间没有新导入就一直沿用;超过该天数不再复用(防止陈年结果被当新表发出) */
    private static final long CACHE_MAX_AGE_MS = 7L * 24 * 60 * 60 * 1000;
    /** è½ç›˜ç¼“存子目录(相对 summary.template-dir) */
    private static final String CACHE_SUBDIR = "_cache";
    @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() {
        String rel = summaryTemplateDir;
        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 base = new File(root);
            if (base.isDirectory()) {
                File dir = new File(base, CACHE_SUBDIR);
                if (!dir.isDirectory() && !dir.mkdirs()) continue;
                return dir;
            }
        }
        return null;
    }
    /** ç¼“存文件名前缀(不含数据版本与扩展名):key é‡Œçš„非法字符统一替换 */
    private String cacheFilePrefix(String type, String period, String mode, Integer toMonth) {
        return (cacheKey(type, period, mode, toMonth)).replaceAll("[^0-9A-Za-z_-]", "_");
    }
    private final Map<String, Task> tasks = new ConcurrentHashMap<>();
    /** åŒæŠ¥è¡¨æœŸæœ€è¿‘一次成功结果:key -> task */
@@ -64,24 +117,28 @@
        private final String period;
        private final String mode;
        private final Integer toMonth;
        private final long createdAt = System.currentTimeMillis();
        /** ç”Ÿæˆæ—¶çš„æ•°æ®ç‰ˆæœ¬ï¼ˆimport_batch æœ€å¤§ id),用于判断缓存是否过期 */
        private final long importVersion;
        private volatile long createdAt = System.currentTimeMillis();
        /** ç”Ÿæˆæ—¶çš„æ•°æ®æŒ‡çº¹ï¼ˆæºè¡¨æ ¡éªŒå’Œ + æ¯ç‰ˆæ–‡ä»¶èº«ä»½ï¼‰ï¼Œç”¨äºŽåˆ¤æ–­ç¼“存是否过期 */
        private final String fingerprint;
        private volatile String status = "PENDING"; // PENDING/RUNNING/DONE/FAILED
        private volatile int percent = 0;
        private volatile String step = "排队中";
        private volatile String error;
        private volatile byte[] data;
        /** è½ç›˜ç¼“存文件:内存数据被清理后仍可从这里取(跨进程重启复用) */
        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) {
@@ -93,11 +150,24 @@
        public String getStatus() { return status; }
        public boolean isDone() { return "DONE".equals(status) && data != null; }
        public boolean isDone() {
            return "DONE".equals(status) && (data != null || (cacheFile != null && cacheFile.isFile()));
        }
        public boolean isFromCache() { return fromCache; }
        public byte[] getData() { return data; }
        public byte[] getData() {
            if (data != null) return data;
            File f = cacheFile;
            if (f != null && f.isFile()) {
                try {
                    return java.nio.file.Files.readAllBytes(f.toPath());
                } catch (Exception e) {
                    log.warn("读取导出缓存文件失败:{} {}", f.getAbsolutePath(), e.getMessage());
                }
            }
            return null;
        }
        public String getFileName() { return fileName; }
@@ -114,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();
@@ -125,18 +196,28 @@
    /**
     * æäº¤å¯¼å‡ºä»»åŠ¡ã€‚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;
                log.info("报表导出任务命中缓存:{} {}(生成于 {})", type, period, new Date(hit.finishedAt));
                hit.staleCache = false; // å‘½ä¸­ç¼“存时不能残留上一次「结果已失效」的提示
                log.info("报表导出任务命中内存缓存:{} {}(生成于 {})", type, period, new Date(hit.finishedAt));
                return hit;
            }
            Task disk = loadFromDisk(key, type, period, mode, toMonth, fingerprint);
            if (disk != null) {
                tasks.put(disk.id, disk);
                cache.put(key, disk);
                log.info("报表导出任务命中落盘缓存:{} {}(生成于 {},文件 {})", type, period,
                        new Date(disk.finishedAt), disk.cacheFile.getName());
                return disk;
            }
        }
        Task running = findRunning(key);
@@ -144,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;
@@ -168,6 +251,7 @@
            t.status = "DONE";
            t.finishedAt = System.currentTimeMillis();
            cache.put(cacheKey(t.type, t.period, t.mode, t.toMonth), t);
            writeToDisk(t, data);
            log.info("报表导出任务完成:{} {} ç”¨æ—¶ {} ms,{} å­—节", t.type, t.period, t.finishedAt - start, data.length);
        } catch (Throwable e) {
            t.status = "FAILED";
@@ -186,23 +270,99 @@
        return null;
    }
    private boolean cacheUsable(Task t) {
        if (t == null || !"DONE".equals(t.status) || t.data == null) return false;
        if (System.currentTimeMillis() - t.finishedAt > CACHE_TTL_MS) return false;
        long now = importVersion();
        if (now < 0 || t.importVersion < 0) return false; // å–不到数据版本时不冒风险复用
        return now == t.importVersion;
    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;
        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;
        }
    }
@@ -218,7 +378,65 @@
        }
        for (Iterator<Map.Entry<String, Task>> it = cache.entrySet().iterator(); it.hasNext(); ) {
            Task t = it.next().getValue();
            if (t.finishedAt <= 0 || now - t.finishedAt > CACHE_TTL_MS) it.remove();
            if (t.finishedAt <= 0 || now - t.finishedAt > CACHE_MAX_AGE_MS) it.remove();
        }
        File dir = cacheDir();
        if (dir == null) return;
        File[] fs = dir.listFiles((d, n) -> n.endsWith(".xlsx"));
        if (fs == null) return;
        for (File f : fs) {
            if (now - f.lastModified() > CACHE_MAX_AGE_MS && !f.delete()) {
                log.warn("清理过期导出缓存失败:{}", f.getAbsolutePath());
            }
        }
    }
    /** ç”ŸæˆæˆåŠŸåŽæŠŠç»“æžœè½ç›˜ï¼Œä¾›è¿›ç¨‹é‡å¯åŽå¤ç”¨ï¼›å†™ç›˜å¤±è´¥åªå‘Šè­¦ï¼Œä¸å½±å“æœ¬æ¬¡å¯¼å‡º */
    private void writeToDisk(Task t, byte[] data) {
        try {
            File dir = cacheDir();
            if (dir == null) 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" + 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) {
                for (File f : siblings) {
                    if (!f.getName().equals(target.getName()) && !f.delete()) {
                        log.warn("清理旧版本导出缓存失败:{}", f.getAbsolutePath());
                    }
                }
            }
        } catch (Exception e) {
            log.warn("导出结果落盘失败(不影响本次导出,仅无法跨重启复用):{}", e.getMessage());
        }
    }
    /** ä»Žè½ç›˜ç¼“存里找「同一报表期 + åŒä¸€æ•°æ®æŒ‡çº¹ + æœªè¶…期」的结果;没有返回 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;
            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, fingerprint);
            t.cacheFile = f;
            t.createdAt = finished; // å¤ç”¨åŽ†å²ç»“æžœï¼šä»¥ç”Ÿæˆæ—¶é—´ä½œä¸ºèµ·ç‚¹ï¼Œé¿å… elapsedMs å‡ºçŽ°è´Ÿæ•°
            t.fileName = "生成_道路运输量汇总表_" + period + ".xlsx";
            t.status = "DONE";
            t.percent = 100;
            t.step = "完成";
            t.finishedAt = finished;
            t.fromCache = true;
            return t;
        } catch (Exception e) {
            log.warn("读取落盘导出缓存失败:{}", e.getMessage());
            return null;
        }
    }
traffic-audit-web/src/views/DataView.vue
@@ -17,29 +17,59 @@
      <el-main>
        <h3>导入数据查看</h3>
        <div class="toolbar">
          <span class="toolbar-label">报表期</span>
          <el-date-picker v-model="period" type="month" placeholder="报表期(全部)" value-format="yyyy-MM" clearable style="width:150px" @change="doQuery"></el-date-picker>
          <template v-if="!isRollup">
            <span class="toolbar-label">报表期</span>
            <el-date-picker v-model="period" type="month" placeholder="报表期(全部)" value-format="yyyy-MM" clearable style="width:150px" @change="doQuery"></el-date-picker>
          </template>
          <span class="toolbar-sep"></span>
          <span class="toolbar-label">数据类型</span>
          <el-radio-group v-model="activeModule" size="small" @change="onModuleChange">
            <el-radio-button v-for="g in modules" :key="g.key" :label="g.key">{{ g.name }}</el-radio-button>
          </el-radio-group>
          <el-select v-model="type" size="small" style="width:250px" placeholder="选择数据类型" @change="onTypeSelect">
            <el-option-group :label="activeTypes.name">
              <el-option v-for="t in activeTypes.types" :key="t.value" :label="t.label" :value="t.value"></el-option>
          <el-select v-model="type" size="small" style="width:300px" placeholder="选择数据类型" filterable
                     popper-class="data-type-select" :title="currentTypeLabel" @change="onTypeSelect">
            <el-option-group v-for="g in modules" :key="g.key" :label="g.name">
              <el-option v-for="t in g.types" :key="t.value" :label="t.label" :value="t.value"></el-option>
            </el-option-group>
          </el-select>
          <el-input v-model="keyword" placeholder="企业/市州名称" clearable style="width:180px" @keyup.enter.native="doQuery"></el-input>
          <el-button type="primary" size="small" @click="doQuery">查询</el-button>
          <template v-if="canRollup">
            <span class="toolbar-label">视图</span>
            <el-radio-group v-model="viewMode" size="small" @change="onViewChange">
              <el-radio-button label="detail">明细</el-radio-button>
              <el-radio-button label="rollup">按市州汇总</el-radio-button>
            </el-radio-group>
          </template>
          <template v-if="isRollup">
            <span class="toolbar-label">起止月</span>
            <el-date-picker v-model="from" type="month" placeholder="起始月" value-format="yyyy-MM" style="width:130px"></el-date-picker>
            <span>~</span>
            <el-date-picker v-model="to" type="month" placeholder="结束月" value-format="yyyy-MM" style="width:130px"></el-date-picker>
            <span class="toolbar-label">排名</span>
            <el-select v-model="rankMode" size="small" style="width:150px">
              <el-option label="留空" value="blank"></el-option>
              <el-option label="按累计值重排" value="recompute"></el-option>
            </el-select>
            <el-button type="primary" size="small" @click="loadSummary">汇总</el-button>
            <el-button type="success" size="small" icon="el-icon-download" @click="exportSummary">导出 Excel</el-button>
          </template>
          <template v-if="hasPeriodType">
            <span class="toolbar-label">口径</span>
            <el-select v-model="periodType" size="small" style="width:110px" @change="doQuery">
              <el-option label="全部" value=""></el-option>
              <el-option label="当月" value="MONTH"></el-option>
              <el-option label="累计" value="CUMULATIVE"></el-option>
            </el-select>
          </template>
          <template v-if="!isRollup">
            <el-input v-model="keyword" placeholder="企业/市州名称" clearable style="width:180px" @keyup.enter.native="doQuery"></el-input>
            <el-button type="primary" size="small" @click="doQuery">查询</el-button>
          </template>
          <el-button size="small" icon="el-icon-full-screen" @click="toggleFullscreen">全屏查看</el-button>
        </div>
        <div class="load-hint">共 {{ total }} æ¡è®°å½•,已加载 {{ records.length }} æ¡</div>
        <div class="load-hint">共 {{ total }} æ¡è®°å½•,已加载 {{ records.length }} æ¡<span v-if="isRollup && summaryHint" class="rollup-hint"> | {{ summaryHint }}</span></div>
        <div class="table-wrap" ref="tableWrap">
          <div class="table-area">
            <el-table :data="records" border v-loading="loading" size="small" style="width:100%" height="100%">
              <el-table-column v-for="c in visibleColumns" :key="c.prop" :prop="c.prop" :label="c.label" :min-width="c.width" show-overflow-tooltip>
              <el-table-column v-for="c in renderColumns" :key="c.prop" :prop="c.prop" :label="c.label" :min-width="c.width" :fixed="c.fixed ? 'left' : false" show-overflow-tooltip>
                <template slot-scope="scope">
                  <span>{{ formatCell(scope.row[c.prop]) }}</span>
                  <span>{{ formatCell(scope.row[c.prop], c.prop) }}</span>
                </template>
              </el-table-column>
            </el-table>
@@ -71,14 +101,17 @@
        {
          key: 'passenger', name: '公路旅客', types: [
            { value: 'h2031', label: '公路旅客运输月度生产情况' },
            { value: 'passengerAuth', label: '运政车辆数' }
            { value: 'passengerAuth', label: '运政车辆数' },
            { value: 'passengerIndividual', label: '个体客运量/周转量' }
          ]
        },
        {
          key: 'city', name: '城市客运', types: [
            { value: 'cityBus', label: '城市公共交通月度运营情况' },
            { value: 'cityTaxi', label: '巡游出租汽车运营服务情况月报' },
            { value: 'cityTaxiAuth', label: '出租车运政车辆' }
            { value: 'cityTaxiAuth', label: '出租车运政车辆' },
            { value: 'wycTotal', label: '网约车总数' },
            { value: 'wycOrder', label: '网约车订单及全省总量' }
          ]
        },
        {
@@ -98,6 +131,13 @@
      activeModule: 'freight',
      type: 'h2032',
      period: '',
      periodType: '',
      viewMode: 'detail',
      rollupTypes: [],
      from: '',
      to: '',
      rankMode: 'blank',
      summaryHint: '',
      keyword: '',
      page: 1,
      size: 50,
@@ -109,18 +149,53 @@
    }
  },
  computed: {
    canRollup() {
      return (this.rollupTypes || []).some(t => t.type === this.type)
    },
    isRollup() {
      return this.viewMode === 'rollup' && this.canRollup
    },
    // è§„上规下拆分等表有"口径"列(当月/累计),把它做成上方筛选而不是表格列
    hasPeriodType() {
      return (this.columns || []).some(c => c.prop === 'periodType')
    },
    currentTypeLabel() {
      for (const g of this.modules) {
        const t = g.types.find(x => x.value === this.type)
        if (t) return g.name + ' Â· ' + t.label
      }
      return this.type
    },
    activeTypes() {
      const g = this.modules.find(x => x.key === this.activeModule) || this.modules[0]
      return g
    },
    visibleColumns() {
      const hiddenProps = ['enterpriseCode', 'unifiedCreditCode', 'reportUnit']
      const hiddenLabels = ['企业代码', '统一社会信用代码', '填报单位']
      return (this.columns || []).filter(c =>
        hiddenProps.indexOf(c.prop) < 0 && hiddenLabels.indexOf(c.label) < 0)
      return (this.columns || []).filter(c => this.keepColumn(c))
    },
    // å·¦ä¾§å†»ç»“"这是谁的数据"的列:市州/地区 + ä¼ä¸š(项目)名称/车牌号,最多 3 åˆ—。
    // æŠ¥è¡¨æœŸä¸Žæ‰€å±žåœ°åŒºä¸å‚与冻结(报表期是筛选条件,所属地区是区划代码,已由市州列替代)。
    renderColumns() {
      const stickyProps = ['city', 'regionName', 'region', 'periodType', 'enterpriseName', 'projectName', 'plateNo']
      const cols = this.visibleColumns
      let count = 0
      while (count < cols.length && count < 3 && stickyProps.indexOf(cols[count].prop) >= 0) {
        count++
      }
      return cols.map((c, i) => Object.assign({}, c, { fixed: i < count }))
    }
  },
  methods: {
    // æ•°æ®æŸ¥çœ‹ç»Ÿä¸€åˆ—过滤:内部标识列不展示;报表期(由筛选条件体现)与所属地区(区划代码,已被市州列替代)不展示
    keepColumn(c) {
      if (!c) return false
      // å£å¾„列上移为筛选;拆分表货运量三列源文件未提供(全空)故不展示
      const hiddenProps = ['enterpriseCode', 'unifiedCreditCode', 'reportUnit', 'projectId', 'regionCode', 'reportPeriod',
        'periodType', 'aboveScaleFreight', 'belowScaleFreight', 'totalFreight']
      const hiddenLabels = ['企业代码', '统一社会信用代码', '填报单位', '项目ID', '所属地区', '报表期', '口径']
      if (hiddenProps.indexOf(c.prop) >= 0 || hiddenLabels.indexOf(c.label) >= 0) return false
      return true
    },
    onModuleChange(key) {
      const g = this.modules.find(x => x.key === key)
      if (!g || !g.types.length) return
@@ -129,7 +204,69 @@
      }
      this.doQuery()
    },
    onTypeSelect() { this.doQuery() },
    loadRollupTypes() {
      api.get('/data/rollupTypes').then(res => {
        // æ‹¦æˆªå™¨å·²è¿”回响应体,故 res.data å³ç±»åž‹æ•°ç»„
        this.rollupTypes = (res && res.data) || []
      }).catch(() => { this.rollupTypes = [] })
    },
    onViewChange() {
      this.records = []
      this.total = 0
      if (this.isRollup) {
        if (!this.to) this.to = this.period || this.defaultMonth()
        if (!this.from) this.from = this.to.substring(0, 4) + '-01'
        this.loadSummary()
      } else {
        this.summaryHint = ''
        this.doQuery()
      }
    },
    defaultMonth() {
      const now = new Date()
      return now.getFullYear() + '-' + ('0' + (now.getMonth() + 1)).slice(-2)
    },
    loadSummary() {
      if (!this.from || !this.to) { this.$message.warning('请先选择起止月'); return }
      this.loading = true
      api.get('/data/summary', { params: { type: this.type, from: this.from, to: this.to, rankMode: this.rankMode }, timeout: 120000 })
        .then(res => {
          const d = res.data || {}
          this.columns = d.columns || []
          this.records = d.records || []
          this.total = this.records.length
          this.summaryHint = (d.label || '') + ' ' + d.from + ' ~ ' + d.to + ' ç´¯è®¡ï¼›åŒæ¯”基数 ' + d.lastFrom + ' ~ ' + d.lastTo
            + ';排名口径:' + (d.rankMode === 'recompute' ? '按累计值重排' : '留空')
        })
        .catch(e => { if (!e || !e._toast) this.$message.error('汇总查询失败') })
        .finally(() => { this.loading = false })
    },
    exportSummary() {
      if (!this.from || !this.to) { this.$message.warning('请先选择起止月'); return }
      api.get('/data/export', {
        params: { type: this.type, from: this.from, to: this.to, rankMode: this.rankMode },
        responseType: 'blob', timeout: 180000
      }).then(res => {
        const blob = new Blob([res], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' })
        const url = window.URL.createObjectURL(blob)
        const a = document.createElement('a')
        a.href = url
        a.download = '按市州汇总_' + this.type + '_' + this.from + '_' + this.to + '.xlsx'
        document.body.appendChild(a)
        a.click()
        document.body.removeChild(a)
        window.URL.revokeObjectURL(url)
        this.$message.success('汇总表已导出')
      }).catch(() => this.$message.error('导出失败'))
    },
    onTypeSelect() {
      const g = this.modules.find(x => x.types.some(t => t.value === this.type))
      if (g) this.activeModule = g.key
      this.periodType = ''
      this.viewMode = 'detail'
      this.summaryHint = ''
      this.doQuery()
    },
    doQuery() {
      this.page = 1
      this.records = []
@@ -143,13 +280,14 @@
          type: this.type,
          period: this.period || undefined,
          keyword: this.keyword || undefined,
          periodType: this.periodType || undefined,
          page: this.page,
          size: this.size
        }
      }).then(res => {
        const d = res.data || {}
        this.records = d.records || []
        this.columns = (d.columns || []).filter(c => ['enterpriseCode', 'unifiedCreditCode', 'reportUnit'].indexOf(c.prop) < 0 && ['企业代码', '统一社会信用代码', '填报单位'].indexOf(c.label) < 0)
        this.columns = d.columns || []
        this.total = d.total || 0
        if (this.page > 1 && this.records.length === 0) {
          this.page = 1
@@ -185,6 +323,7 @@
          type: this.type,
          period: this.period || undefined,
          keyword: this.keyword || undefined,
          periodType: this.periodType || undefined,
          page: nextPage,
          size: this.size
        }
@@ -198,7 +337,7 @@
        this.records = this.records.concat(addRows)
        this.page = nextPage
        if (d.total != null) this.total = d.total
        if (d.columns && d.columns.length) this.columns = d.columns.filter(c => ['enterpriseCode', 'unifiedCreditCode', 'reportUnit'].indexOf(c.prop) < 0 && ['企业代码', '统一社会信用代码', '填报单位'].indexOf(c.label) < 0)
        if (d.columns && d.columns.length) this.columns = d.columns
      }).catch(e => {
        if (e && e._toast) return
        this.$message.error('加载更多失败')
@@ -235,9 +374,21 @@
        document.exitFullscreen()
      }
    },
    formatCell(v) {
    // æ˜¾ç¤ºæ ¼å¼åŒ–(不改动底层数据,导出仍为全精度):
    //  - æ¯”率类列(环比/同比/增速/占比)库内是小数(0.045 = 4.5%),显示为百分比;
    //  - æŽ’名类列显示整数;
    //  - å…¶ä½™æ•°å€¼åƒåˆ†ä½ã€ä¿ç•™ä¸¤ä½å°æ•°ï¼›æ•´æ•°åŽŸæ ·ã€‚
    formatCell(v, prop) {
      if (v === null || v === undefined || v === '') return '-'
      return v
      const s = typeof v === 'string' ? v.trim() : v
      if (typeof v !== 'number' && !/^-?\d+(\.\d+)?$/.test(String(s))) return v
      const n = Number(s)
      if (!isFinite(n)) return v
      const key = String(prop || '').toLowerCase()
      if (/rank/.test(key)) return Math.round(n).toLocaleString('zh-CN')
      if (/(rate|yoy|mom|growth|ratio|percent|share)/.test(key)) return (n * 100).toFixed(2) + '%'
      if (Number.isInteger(n)) return n.toLocaleString('zh-CN')
      return n.toLocaleString('zh-CN', { minimumFractionDigits: 2, maximumFractionDigits: 2 })
    }
  },
  mounted() {
@@ -245,6 +396,7 @@
    if (q.type) this.type = q.type
    if (q.period) this.period = q.period
    if (q.keyword) this.keyword = q.keyword
    this.loadRollupTypes()
    this.loadData()
    window.addEventListener('scroll', this.onScroll, { passive: true })
    if (this.$refs.tableWrap) {
@@ -272,10 +424,27 @@
#app .toolbar-label { color:#606266; font-weight:600; white-space:nowrap; }
#app .toolbar-sep { width:1px; height:22px; background:#DCDFE6; margin:0 2px; }
#app .load-hint { color:#909399; font-size:12px; margin-bottom:6px; }
#app .rollup-hint { color:#409EFF; }
#app .table-wrap { display:flex; flex-direction:column; height:calc(100vh - 250px); min-height:300px; }
#app .table-area { flex:1 1 auto; min-height:0; overflow:hidden; }
#app .table-area .el-table { width:100%; height:100%; }
#app .table-area:fullscreen { padding:20px; background:#fff; overflow:auto; }
#app .table-wrap:fullscreen { padding:20px; background:#fff; overflow:auto; display:flex; flex-direction:column; height:100vh; }
#app .table-wrap:fullscreen .table-area { flex:1 1 auto; min-height:0; }
</style>
</style>
<style>
/* æ•°æ®ç±»åž‹ä¸‹æ‹‰ï¼šElement UI é»˜è®¤æŠŠåˆ†ç»„标题做成 12px ç°è‰²å°å­—,看起来"比选项更小更淡"。
   è¿™é‡ŒæŠŠå®ƒæ”¹æˆæ˜Žç¡®çš„组标题样式(加深、加粗、略大、带底色),与选项形成有意的层级。 */
.data-type-select .el-select-group__title {
  font-size: 13px;
  font-weight: 700;
  color: #303133;
  line-height: 28px;
  background: #F5F7FA;
  padding-left: 12px;
  letter-spacing: .5px;
}
.data-type-select .el-select-group__title::after { display: none; }
.data-type-select .el-select-group { padding-bottom: 6px; }
.data-type-select .el-select-group .el-select-dropdown__item { padding-left: 20px; }
</style>
traffic-audit-web/src/views/ReportExport.vue
@@ -162,21 +162,27 @@
        </el-dialog>
        <!-- æ±‡æ€»å¤§è¡¨å¼‚步生成进度(生成一次约 10~20 ç§’,避免点击后长时间无响应) -->
        <el-dialog title="正在生成汇总大表" :visible.sync="taskVisible" width="460px"
        <el-dialog :title="taskDialogTitle" :visible.sync="taskVisible" width="460px"
                   :close-on-click-modal="false" :show-close="taskFinished">
          <div class="task-body">
            <el-progress :percentage="taskInfo.percent || 0" :status="taskInfo.status === 'FAILED' ? 'exception' : (taskDone ? 'success' : null)"
                         :stroke-width="14"></el-progress>
            <p class="task-step">{{ taskInfo.step || '排队中' }}</p>
            <p class="task-meta" v-if="taskInfo.period">报表期 {{ taskInfo.period }} {{ taskInfo.fromCache ? '上次生成用时' : '已用' }} {{ (taskInfo.elapsedMs / 1000).toFixed(1) }} ç§’</p>
            <p class="task-meta" v-if="taskInfo.fromCache">本次直接使用 {{ taskCacheTime }} ç”Ÿæˆçš„结果(10 åˆ†é’Ÿå†…且期间没有新导入数据)。如需按最新数据重算,请点「重新生成」。</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>,文件在浏览器默认下载目录。
            </p>
            <p class="task-error" v-else-if="taskDone">自动下载没成功,可点「保存文件」再存一次。</p>
            <p class="task-error" v-if="taskInfo.status === 'FAILED'">{{ taskInfo.error }}</p>
          </div>
          <span slot="footer">
            <el-button size="small" type="primary" :disabled="!taskDone" @click="downloadTaskFile">{{ taskInfo.fromCache ? '下载' : '保存文件' }}</el-button>
            <el-button size="small" v-if="taskDone && !taskDownloaded" @click="downloadTaskFile()">保存文件</el-button>
            <el-button size="small" :disabled="taskRunning" @click="restartTask">重新生成</el-button>
            <el-button size="small" v-if="taskRunning" @click="minimizeTask">后台运行</el-button>
            <el-button size="small" v-else @click="closeTask">关闭</el-button>
            <el-button size="small" v-else type="primary" @click="closeTask">关闭</el-button>
          </span>
        </el-dialog>
      </el-main>
@@ -212,6 +218,10 @@
      taskVisible: false,
      taskInfo: {},
      taskTimer: null,
      // è¿›åº¦å¼¹çª—:完成后会自动下载一次,这里记录「是否已下载」与文件信息(已下载就不再显示下载按钮)
      taskDownloaded: false,
      taskFileName: '',
      taskFileSize: 0,
      taskKey: 'summaryWorkbook',
      modules: [
        {
@@ -320,6 +330,18 @@
      const d = new Date(t)
      const p = (n) => String(n).padStart(2, '0')
      return d.getFullYear() + '-' + p(d.getMonth() + 1) + '-' + p(d.getDate()) + ' ' + p(d.getHours()) + ':' + p(d.getMinutes()) + ':' + p(d.getSeconds())
    },
    // å¼¹çª—标题随任务状态变化,避免「已完成」还写着「正在生成」
    taskDialogTitle() {
      const s = this.taskInfo && this.taskInfo.status
      if (s === 'FAILED') return '汇总大表生成失败'
      if (s === 'DONE') return '汇总大表已生成'
      return '正在生成汇总大表'
    },
    taskFileSizeText() {
      const n = this.taskFileSize || 0
      if (!n) return ''
      return n >= 1048576 ? (n / 1048576).toFixed(2) + ' MB' : Math.round(n / 1024) + ' KB'
    }
  },
  watch: {
@@ -524,6 +546,9 @@
      this.stopTaskPolling()
      this.taskInfo = { status: 'PENDING', percent: 0, step: '提交任务', period: this.period, elapsedMs: 0 }
      this.taskVisible = true
      this.taskDownloaded = false
      this.taskFileName = ''
      this.taskFileSize = 0
      this.loading = 'gen-' + this.curModule.key
      const params = Object.assign({}, this.buildParams(), { refresh: refresh ? 'true' : 'false' })
      api.get('/report/exportTask/summaryWorkbook', { params, timeout: 60000 })
@@ -536,7 +561,7 @@
            return
          }
          this.taskInfo = res.data
          if (this.taskInfo.status === 'DONE') { this.loading = ''; this.downloadTaskFile(); return }
          if (this.taskInfo.status === 'DONE') { this.loading = ''; this.downloadTaskFile(true); return }
          if (this.taskInfo.status === 'FAILED') { this.loading = ''; return }
          this.pollTask()
        })
@@ -568,7 +593,7 @@
            if (this.taskInfo.status === 'DONE') {
              this.stopTaskPolling()
              this.loading = ''
              this.downloadTaskFile()
              this.downloadTaskFile(true)
            } else if (this.taskInfo.status === 'FAILED') {
              this.stopTaskPolling()
              this.loading = ''
@@ -581,12 +606,19 @@
    stopTaskPolling() {
      if (this.taskTimer) { clearInterval(this.taskTimer); this.taskTimer = null }
    },
    downloadTaskFile() {
    // auto=true è¡¨ç¤ºã€Œä»»åŠ¡å®ŒæˆåŽçš„è‡ªåŠ¨ä¸‹è½½ã€ï¼›ç”¨æˆ·ç‚¹æŒ‰é’®æ—¶ä¸º false
    downloadTaskFile(auto) {
      const id = this.taskInfo && this.taskInfo.taskId
      if (!id) return
      const name = this.taskInfo.fileName || ('生成_道路运输量汇总表_' + this.period + '.xlsx')
      this.taskFileName = name
      api.get('/report/exportTask/' + id + '/file', { responseType: 'blob', timeout: 120000 })
        .then(res => { this.downloadBlob(res, name); this.$message.success('报表导出成功') })
        .then(res => {
          this.taskFileSize = (res && res.size) || 0
          this.taskDownloaded = true
          this.downloadBlob(res, name)
          this.$message.success(auto ? '生成完成,已自动下载' : '报表导出成功')
        })
        .catch(err => this.failWith(err))
    },
    restartTask() { this.startSummaryTask(true) },
@@ -756,6 +788,7 @@
.task-step { margin: 12px 0 4px; font-size: 14px; color:#303133; }
.task-meta { margin: 2px 0; font-size: 12px; color:#909399; line-height: 1.6; }
.task-error { margin: 8px 0 0; font-size: 13px; color:#F56C6C; word-break: break-all; }
.task-done { margin: 8px 0 0; font-size: 13px; color:#67C23A; line-height: 1.6; }
</style>
<style>