6b0ae27047f9eefec969f6620490a46d958fb43c..bc1f1fe60d4ce20de619275806483a5d0b07f939
2026-09-04 zhizhijie
\ feat: 汇总大表生成支持toMonth裁剪(1-6月生成+1-7月扩列)及验证产物与测试报告\
bc1f1f 对比 | 目录
2026-09-04 zhizhijie
docs: 拍板记录(1-6月累计/同比口径、7月列留空)与 09-04 工作日结(扩列改造列入明早待办)
ced20d 对比 | 目录
2026-09-04 zhizhijie
fix: 整车吨位按平均吨位口径审核、提示数字去科学计数;拆分导入按目标期取月页签(重导04-06验证);数据查看全屏可翻页 + 测试报告
a9e6c0 对比 | 目录
2026-09-04 zhizhijie
fix: 规上规下拆分导入识别 N月份 页签(补当月行)+ 数据缺口清单与拍板记录 + 测试报告
fc2e76 对比 | 目录
2026-09-04 zhizhijie
fix: 报表预览显示指标名与单位;货运量合计不再重复除万(模板列为万吨)
eca253 对比 | 目录
2026-09-04 zhizhijie
fix: 汇总工作簿导出不再 autoFit(保留人工母版列宽,避免公式把版式顶宽)
e98a8d 对比 | 目录
2026-09-04 zhizhijie
feat: 汇总工作簿月度块按备份母版还原(1-4月骨架→1-7月)试点 + fullCalcOnLoad + 09-04 测试报告
117ecd 对比 | 目录
2026-09-04 zhizhijie
feat: 城市客运导入新增网约车总数/网约车订单及全省总量两母版导入 + 09-04 测试报告
0f7b7d 对比 | 目录
2026-09-04 zhizhijie
docs: 2026-09-04 交接文档(进度/口径/待确认/环境要点),供新会话继续
a31a0d 对比 | 目录
2026-09-04 zhizhijie
docs: 页签逻辑/落地方案/上午清单 程序表名统一改为业务中文名并加阅读约定
26f270 对比 | 目录
2026-09-04 zhizhijie
docs: 汇总表/SQL 的库表名改写为业务中文表名(保留库表名仅作程序对照)
d36f11 对比 | 目录
2026-09-04 zhizhijie
docs: 增补库表关系/单位换算/货运规上规下口径 + 落地口径 SQL(2026-09-04)
b5146d 对比 | 目录
2026-09-04 zhizhijie
fix: 汇总表整数不再显示 .00(公式整数格同跳过)+ 导出列宽按内容自适应 + 09-04 测试报告与母版数据体检清单
8b26dd 对比 | 目录
11个文件已修改
1 文件已重命名
21个文件已添加
1420 ■■■■■ 已修改文件
docs/sql_wyc.sql 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/上午交付工作清单_2026-09-04.md 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/交接文档_2026-09-04.md 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/功能测试报告/功能测试报告_城市客运网约车导入下拉_2026-09-04.md 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/功能测试报告/功能测试报告_审核平均吨位口径与拆分目标月导入及全屏翻页_2026-09-04.md 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/功能测试报告/功能测试报告_汇总大表1-6月生成与1-7月扩列验证_2026-09-04.md 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/功能测试报告/功能测试报告_汇总工作簿月度块扩列还原试点_2026-09-04.md 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/功能测试报告/功能测试报告_汇总表整数不显示0.00与列宽自适应_2026-09-04.md 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/功能测试报告/功能测试报告_规上规下拆分月份页签识别_2026-09-04.md 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/功能测试报告/功能测试报告_预览指标名称显示与货运量合计单位修正_2026-09-04.md 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/城市客运/模板_网约车总数.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
docs/城市客运/模板_网约车订单及全省总量.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
docs/工作日结/工作日结_2026-09-04.md 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/生成汇总大表/数据导入现状与缺口清单_2026-09-04.md 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/生成汇总大表/汇总表母版数据体检与待决策清单_2026-09-04.md 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/生成汇总大表/自动生成汇总工作簿落地方案.md 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/生成汇总大表/规下货运量口径_2026-09-04.sql 94 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/生成汇总大表/输入输出与逻辑关系总表_2026-09-03.md 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/生成汇总大表/输出/道路运输量汇总表_2026-06.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
docs/生成汇总大表/输出/道路运输量汇总表_2026-07.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
docs/生成汇总大表/页签逻辑关系说明.md 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
traffic-audit-server/src/main/java/com/trafficaudit/auditengine/service/AuditEngineService.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
traffic-audit-server/src/main/java/com/trafficaudit/dataimport/controller/DataImportController.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
traffic-audit-server/src/main/java/com/trafficaudit/dataimport/entity/WycOrderMonthly.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
traffic-audit-server/src/main/java/com/trafficaudit/dataimport/entity/WycTotalMonthly.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
traffic-audit-server/src/main/java/com/trafficaudit/dataimport/mapper/WycOrderMonthlyMapper.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
traffic-audit-server/src/main/java/com/trafficaudit/dataimport/mapper/WycTotalMonthlyMapper.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
traffic-audit-server/src/main/java/com/trafficaudit/dataimport/service/DataImportService.java 174 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
traffic-audit-server/src/main/java/com/trafficaudit/reportexport/controller/ReportExportController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java 236 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
traffic-audit-web/src/views/DataImport.vue 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
traffic-audit-web/src/views/DataView.vue 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
traffic-audit-web/src/views/ReportExport.vue 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/sql_wyc.sql
New file
@@ -0,0 +1,45 @@
-- åŸŽå¸‚客运网约车月度输入建表(2026-09-04)
-- æ•°æ®æº1:模板_网约车总数.xlsx(月度全省 pin:客运量/其中城市内/周转量/其中城市内周转量)
-- æ•°æ®æº2:模板_网约车订单及全省总量.xlsx(月度输入页:B-E å…¨çœ pin + F è®¢å•合计 + G-W 17市州订单)
CREATE TABLE IF NOT EXISTS wyc_total_monthly (
  id BIGINT NOT NULL AUTO_INCREMENT,
  report_period VARCHAR(20) NOT NULL COMMENT '报表期 yyyy-MM',
  pin_k DOUBLE DEFAULT NULL COMMENT '全省网约车客运量(万人次)',
  pin_ck DOUBLE DEFAULT NULL COMMENT '其中城市内客运量',
  pin_z DOUBLE DEFAULT NULL COMMENT '全省客运周转量(万人公里)',
  pin_cz DOUBLE DEFAULT NULL COMMENT '其中城市内周转量',
  created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (id),
  UNIQUE KEY uk_wyc_total_period (report_period)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='网约车月度全省 pin è¾“å…¥';
CREATE TABLE IF NOT EXISTS wyc_order_monthly (
  id BIGINT NOT NULL AUTO_INCREMENT,
  report_period VARCHAR(20) NOT NULL COMMENT '报表期 yyyy-MM',
  pin_k DOUBLE DEFAULT NULL,
  pin_ck DOUBLE DEFAULT NULL,
  pin_z DOUBLE DEFAULT NULL,
  pin_cz DOUBLE DEFAULT NULL,
  order_sum DOUBLE DEFAULT NULL COMMENT '订单合计(单)',
  order_wuhan DOUBLE DEFAULT NULL,
  order_huangshi DOUBLE DEFAULT NULL,
  order_shiyan DOUBLE DEFAULT NULL,
  order_yichang DOUBLE DEFAULT NULL,
  order_xiangyang DOUBLE DEFAULT NULL,
  order_ezhou DOUBLE DEFAULT NULL,
  order_jingmen DOUBLE DEFAULT NULL,
  order_xiaogan DOUBLE DEFAULT NULL,
  order_jingzhou DOUBLE DEFAULT NULL,
  order_huanggang DOUBLE DEFAULT NULL,
  order_xianning DOUBLE DEFAULT NULL,
  order_suizhou DOUBLE DEFAULT NULL,
  order_enshi DOUBLE DEFAULT NULL,
  order_xiantao DOUBLE DEFAULT NULL,
  order_qianjiang DOUBLE DEFAULT NULL,
  order_tianmen DOUBLE DEFAULT NULL,
  order_shennong DOUBLE DEFAULT NULL,
  created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (id),
  UNIQUE KEY uk_wyc_order_period (report_period)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='网约车订单及全省总量月度输入';
docs/ÉÏÎç½»¸¶¹¤×÷Çåµ¥_2026-09-04.md
New file
@@ -0,0 +1,83 @@
# ä¸Šåˆäº¤ä»˜å·¥ä½œæ¸…单(2026-09-04)
> **表名阅读约定**:本文《……》均为**业务中文名**(可直接看懂);程序数据库里的英文表名(如 scale_split_transport)只给开发对照,业务人员不用记。完整对照见《输入输出与逻辑关系总表》第 5 èŠ‚ã€‚
> ä¾æ®ï¼š09-03 å”¯ä¸€æ€»è¡¨ï¼ˆdocs/报表生成_关系逻辑与每日进度总表_2026-09-03.xlsx)Sheet3/Sheet4 é¢„排 + 09-02 å¾…确认清单 16 é¡¹ï¼ˆå·²é—­çŽ¯çš„å·²å‰”é™¤ï¼‰ã€‚
> ç”¨æ³•:P0=下午交付前必须闭环;P1=上午尽量完成;P2=有余力再做。业务用户在场,凡“待确认”项可当场逐条拍板。
> è¯´æ˜Žï¼š09-04 08:43 æ¯ç‰ˆï¼ˆdocs/生成汇总大表/生成_道路运输量汇总表.xlsx)仍在修改中,凡依赖母版的动作先与另一会话对齐再动。
## P0(交付阻断,上午必须闭环)
### 1.【待确认·请业务逐条拍板】汇总大表母版/口径 8 é—®
| ç¼–号 | ä¼˜å…ˆçº§ | ä¸€å¥è¯é—®é¢˜ | çŽ°çŠ¶ | å€¾å‘建议 |
|---|---|---|---|---|
| Q1 | P0 | æ¯ç‰ˆ 19 é¡µçš„“数据区行列边界 + æœˆä»½æ‰©åˆ° 12 æœˆâ€è§„则怎么定? | P2 å°è´¦å¡«å……的前置 | å…ˆå›ºå®š 2026 ç‰ˆå¼â€œè¡Œåˆ—映射表”,程序按月扩列 C..O/Q |
| Q2 | P0 | 2025/2024 å‚考列与同比怎么处理? | 2025 åŒæœŸåº“内无数据 | ä¿ç•™æ¯ç‰ˆç¼“存值(已试跑);2024 åˆ—隐藏不加工 |
| Q11 | P0 | æ¯æœˆç”Ÿæˆæµç¨‹ï¼šç”±ç¨‹åºæŒ‰æœˆå¤åˆ¶+扩列,还是每月人工放当月母版? | çŽ°ä¸ºä¸¥æ ¼åŒ¹é…å½“æœˆæ¯ç‰ˆã€ç¼ºæœˆæŠ¥é”™ | ç¨‹åºæŒ‰æœˆå¤åˆ¶æ‰©åˆ—(进入 Q1 è¡Œåˆ—规则) |
| Q7 | P0 | åŸŽå¸‚客运成品页“网约车列”本期要不要填? | æ‹†åˆ†è¡¨å·²å¯ç”¨ï¼ŒæŽ¥å…¥æ–¹æ¡ˆæœªå®š | æ‹†åˆ†è¾“出→台账页→成品页公式自动汇总 |
| Q8 | P0 | å‡ºç§Ÿâ€œåŸŽå¸‚内”口径与 U402 ä¸ŠæŠ¥å£å¾„是否一致? | åº“内 passenger_city<总量(武汉除外) | ä»¥ U402 ä¸ŠæŠ¥å­—段为准,城乡线路口径差异需说明 |
| Q3 | P1 | å¯è§é¡µ #REF! ç”¨ç¨‹åºæ¸…空还是人工在母版清除? | ä¸­å£å¾„明细/货运/班线包车等仍残留 | æ¯ç‰ˆå®šç¨¿æ—¶äººå·¥æ¸…一遍 + ç¨‹åºå¯¹æ±‚值失败格兜底清空 |
| Q4 | P1 | è½¨é“/轮渡月度 1-5 æœˆæ•°æ®æ˜¯å¦æœ‰æ–‡ä»¶å¯è¡¥å…¥åº“? | åº“内仅 6/7 æœˆ | èƒ½è¡¥åˆ™è¡¥ï¼›ä¸èƒ½åˆ™æ±‡æ€»è¡¨è¯¥é¡µå…ˆå¡« 6-7 æœˆ |
| Q6 | P1 | å…¬äº¤â€œå®¢è¿é‡åŒæ¯”/环比 0%”要不要立审核规则拦截? | #9 å¾…办,疑口径问题 | åŠ â€œè¶‹åŠ¿ä¸€è‡´/不为 0 å¼‚常”规则进公交/出租审核 |
产出:本表当场打勾 â†’ åŒæ­¥æ›´æ–°å”¯ä¸€æ€»è¡¨ Sheet3 çŠ¶æ€ + docs/待业务用户确认清单_2026-09-02.md。
### 09-04 ä¸Šåˆæ‹æ¿è®°å½•(业务口头答复,待录入唯一总表 Sheet3)
| ç¼–号 | æ‹æ¿ç»“æžœ | å¯¹åº”表/页签(消除“Q几指哪个表”歧义) |
|---|---|---|
| Q1 | é€æœˆæ‰©å±•:程序按月复制母版并逐月扩列(2026 å€¼åˆ— C..O/Q æ‰©åˆ° 12 æœˆï¼‰ | ã€Š2026å¹´7月道路运输量汇总表.xlsx》整本 19 é¡µï¼ˆå°è´¦é¡µ/合成页/成品页统一版式) |
| Q11 | æ¯ç‰ˆç¨‹åºå¤åˆ¶ï¼šæ¯æœˆç”±ç¨‹åºå¤åˆ¶å½“月母版,不再人工放当月母版 | åŒä¸Šï¼ˆsummaryWorkbook ç”Ÿæˆé€»è¾‘) |
| Q2 | ä¿ç•™æ¯ç‰ˆç¼“存:2025 åŒæœŸåˆ—保留母版缓存值,2024 å‚考列不加工 | å„页右侧 2025 åŒæœŸå—(T..AP åˆ—);2024 åŠæ›´æ—©è¾…助列(如中口径明细 AU、班线包车 IJ/JW/JF) |
| Q7 | æœ¬æœŸè¦å¡«ï¼šç½‘约车列填值(拆分输出→台账页→成品页公式汇总) | ç½‘约车台账页 â†’ åŸŽå¸‚客运页 â†’ åŸŽå¸‚汇总/城市分市州成品页(2026-07 ç½‘约车 4852.30/4430.84/421.46) |
| Q8 | å£å¾„一致:出租“其中城市内”与 U402 ä¸ŠæŠ¥å£å¾„一致 | å‡ºç§Ÿå°è´¦é¡µ r7/r8“其中城市内”行;数据源 ã€Šå·¡æ¸¸å‡ºç§Ÿæ±½è½¦è¿è¥æœåŠ¡æƒ…å†µæœˆæŠ¥ã€‹.passenger_city |
| Q3 | æ‹æ¿ï¼šä¸æ¸…空,保留 #REF! ä¾›äººå·¥åŽç»­æ ¸æŸ¥ï¼ˆç¨‹åºä¸åšæ¸…空兜底,扫描清单即可) | æ¯ç‰ˆ 4 ä¸ªå¯è§é¡µè¿œå¤„断链格:中口径明细 AU4/AU97、货运 BQ108、班线包车 IJ4/IJ5/JW4/JW5/JF28/JF29 |
| Q4 | æ‹æ¿ï¼šè½¨é“/轮渡 1-5 æœˆå…ˆç”¨ã€Šé“路运输量汇总表》母版内已有值,原始数据后续导入后再修正 | è½¨é“轮渡台账页(轨道:全省/武汉/黄石;轮渡:全省/武汉);数据源 ã€ŠåŸŽå¸‚公共交通月度运营情况表》(公交月报)(6/7 æœˆï¼‰ |
> ç¬¬äºŒè½®è¡¥å……口径(09-04 ä¸Šåˆï¼‰ï¼šåŒæ¯”/环比暂时直接用母版内 2025 åŒæœŸæ•°æ®ï¼ˆä¸é‡ç®—不替换),原始 2025 æ•°æ®åŽç»­å¯¼å…¥åŽå†ä¿®æ­£ï¼›è½¨é“轮渡 1-5 æœˆåŒæ­¤å¤„理;#REF! ä¿ç•™ä¸æ¸…空;审核规则类先冻结,当前主线=导入+报表生成。
| Q6 | æ‹æ¿ï¼šå®¡æ ¸è§„则类先全部冻结(含“增速为 0 éœ€æ ¸å®žâ€ï¼Œå…¬äº¤/出租/货运/旅客同),优先解决导入与报表生成 | å®¡æ ¸æ¨¡å—:城市公交月报(CITY_BUS);现状事实:仅 B001-B004,2026-07 å®¡æ ¸ 0 å‘½ä¸­ |
### 2.【报表生成】母版定稿核对(与另一会话对齐后再做)
- ç¡®è®¤ç©ºæ•°æ®æ¯ç‰ˆæ–¹æ¡ˆè½åœ°ï¼ˆ09-03 å·²æ‹æ¿ï¼šå·¡æ¸¸å‡ºç§Ÿç­‰ç”¨â€œç©ºæ¯ç‰ˆ+导出填值”)。
- æ ¸å¯¹ `生成_道路运输量汇总表.xlsx`(08:43 ä»åœ¨æ”¹ï¼‰ï¼šæ—  #REF!、19 é¡µå¯è§/隐藏齐全、行列映射与《页签逻辑关系说明.md》一致。
- äº§å‡ºï¼šè¡Œåˆ—映射表初稿(Q1 å‰ç½®ç‰©ï¼‰ï¼Œä¾› P2 ç¼–码用。
### 3.【报表生成】交付前回归快照(所有要演示的表今天重跑一遍)
- 22+ å•表导出 + `summaryWorkbook 2026-07` + `wycSplit 2026-07` å…¨é‡é‡å¯¼å‡ºåˆ° `outputs/report_check/regression_2026-09-04/`。
- æ ¡éªŒï¼šæŽ¥å£å…¨ 200;扫描输出 #REF!/错误公式位置清单(保留供人工核查,不做 0 æ–­è¨€ï¼‰ï¼›æŠ½æŸ¥å…³é”®æ•°å€¼ï¼ˆæ­¦æ±‰ 7 æœˆè´§è¿ 4940.97、全省 16285.71、个体 189998/4584040.2、出租 5860.24/5351.24、网约车 4852.30/4430.84、汇总表 7 æœˆæ ·ä¾‹ï¼‰ã€‚
- äº§å‡ºï¼šæ›´æ–°ã€Šæ¨¡å—功能验证状态矩阵_2026-09-04》+《功能测试报告_上午回归_2026-09-04.md》。
### 4.【Git】收尾推送(AGENTS å·²æŽˆæƒï¼Œä¸å†é€æ¬¡è¯¢é—®ï¼‰
- `git fetch gitea` â†’ ä¸Žè¿œç«¯ main å¯¹æ¯”/合并(禁强推)→ æŠŠ 09-03~09-04 ä»£ç /文档 commit â†’ push å…¬å¸ gitea。
## P1(上午尽量完成)
### 5.【汇总大表】P2 å°è´¦é¡µå¡«å……方案 + é¦–月试填
- å…ˆå‡ºå°è´¦é¡µï¼ˆç­çº¿åŒ…车/公交/出租/网约车/轨道轮渡)“数据来源→行映射→月份写入”方案文档;Q1/Q4 æ‹æ¿åŽè¯•å¡« 2026-07 ç­çº¿åŒ…车/出租两页并与库值对照。
### 6.【城市客运】成品页网约车列接入方案(Q7)
- æ‹†åˆ†è¡¨ï¼ˆwycSplit)→ æ±‡æ€»è¡¨å°è´¦é¡µ â†’ åŸŽå¸‚客运页公式自动汇总;试跑一页核对 4852.30/4430.84。
### 7.【导入】大文件导入进度“已处理 N/M è¡Œâ€å®žæ—¶æ˜¾ç¤ºï¼ˆå¾…办 #16/Q10)
- åŽç«¯å¯¼å…¥æŽ¥å£åŠ è¿›åº¦çŠ¶æ€/轮询端点(先 H2032/运政/轨迹/出租运政任一条),前端每行显示“处理中 i/N”。
- æµ‹è¯•:4.2 ä¸‡è¡ŒçœŸå®žå‡ºç§Ÿè¿æ”¿æ–‡ä»¶å¤çŽ°åŽŸâ€œæ— æ˜¾ç¤ºâ€ï¼Œå†éªŒè¯æ–°è¿›åº¦æ˜¾ç¤ºï¼›å†™åŠŸèƒ½æµ‹è¯•æŠ¥å‘Šã€‚
### 8.【公路旅客】中口径明细 7-12 æœˆæ‰©åˆ—填充(依赖 Q1 æ‰©åˆ—规则)
- æ‰©åˆ—规则定后按模板列位补写 8-12 æœˆï¼ŒSQL èšåˆå¯¹ç…§æµ‹è¯•。
### 9.【审核】审核链路演示回归(下午要讲审核,先自测)
- è‡³å°‘è·‘ H2032、CITY_BUS、CITY_TAXI、INVEST å„一期:导入→规则审核(/api/audit/execute)→结果列表→(AI åˆ†æžè‹¥å¯æ¼”示)→ è®°å½•命中/通过数与截图位置。
- ç‰¹åˆ«æ ¸å¯¹ Q6 ç›¸å…³ï¼šCITY_BUS æ˜¯å¦å­˜åœ¨â€œå®¢è¿é‡åŒæ¯”环比 0%”误报;确认 I004 ä¿æŠ¤ç”Ÿæ•ˆï¼ˆæŠ•资)。
- äº§å‡ºï¼šå®¡æ ¸å›žå½’小节并入上午回归报告。
### 10.【导入】9-2 ä½“检问题状态核查(不扩改,只核状态)
- æ ¸å¯¹ï¼šéžæ³•数值静默 0 / å¤±è´¥è¡Œå·è¡¥é½ / æ‰¹æ¬¡å›žå¡« / è¿æ”¿è½¨è¿¹è¯¯åˆ å®¡æ ¸ç»“果——是否已被 9-2“导入校验增强”覆盖;把未覆盖项在问题清单标“未修/待排期”,不阻塞交付。
## P2(有余力再做)
### 11.【投资】投资四表 .xls è§£æžå·¥å…·å‡†å¤‡å¹¶é€æ ¼æ‰«æï¼ˆQ9)。
### 12.【能耗】能耗汇总“缺同比”用留空还是“—”占位(并入待确认清单一起问)。
### 13.【文档】更新唯一总表 Sheet4(09-04 å®Œæˆè¡Œï¼‰ä¸Žã€Šå·¥ä½œæ—¥ç»“_2026-09-04.md》(下班前)。
## ä¸‹åˆäº¤ä»˜ææ–™åŒ…(边做边备)
- æ±‡æŠ¥ä¸»çº¿ï¼šå¯¼å…¥ï¼ˆçœŸå®žæ–‡ä»¶ 0 å¤±è´¥ + è¿›åº¦æ˜¾ç¤ºï¼‰â†’ å®¡æ ¸ï¼ˆè§„则命中演示)→ æŠ¥è¡¨ç”Ÿæˆï¼ˆ22 è¡¨ + æ±‡æ€»å¤§è¡¨éª¨æž¶/æ ·å¼  + ç½‘约车拆分表)→ å·²çŸ¥ç¼ºå£ä¸Žå¾…办(诚实列)。
- å¯ç‚¹å¼€çš„证据:docs/功能测试报告/*_2026-09-03.md、docs/生成汇总大表/*.md、outputs/report_check/regression_2026-09-04/、唯一总表 xlsx、待业务确认清单 md。
- ä¸€å¥é£Žé™©æç¤ºï¼šæ¯ç‰ˆ/汇总表 P2 å±žâ€œæ–¹æ¡ˆ+骨架”状态(非全数据成品),交付话术按“已完成:19 é¡µæ•´æœ¬ç”Ÿæˆéª¨æž¶ï¼›è¿›è¡Œä¸­ï¼šå°è´¦å¡«å…… P2”表述。
docs/½»½ÓÎĵµ_2026-09-04.md
New file
@@ -0,0 +1,97 @@
# äº¤æŽ¥æ–‡æ¡£ï¼ˆ2026-09-04 ä¸‹åˆï¼‰
> ç”¨é€”:给“另一个会话”继续工作用。新会话请先读本文 + `docs/生成汇总大表/输入输出与逻辑关系总表_2026-09-03.md`,再按文末《下一步与待确认》推进。
## 1 é¡¹ç›®ä¸Žæ—¥å¸¸è§„范(AGENTS.md æ‘˜è¦ï¼‰
- é¡¹ç›®ï¼šäº¤é€šç»Ÿè®¡å®¡æ ¸ç³»ç»Ÿã€‚后端 Spring Boot(traffic-audit-server,端口 8090);前端 Vue2+Element(traffic-audit-web,端口 8080,/api ä»£ç† 8090)。
- å¯åŠ¨ï¼šæ ¹ç›®å½• `powershell -NoProfile -ExecutionPolicy Bypass -File start-dev.ps1`(须在沙箱外执行);成功标志看 backend.log / frontend.log。
- é‡å¯ï¼šæŒ‰ PID ç²¾ç¡®åœæ—§è¿›ç¨‹å†å¯åŠ¨ï¼›ä¸è¦æ€ node_repl(MCP å†…核)和用户自己开的 cmd çª—口。
- æ•°æ®åº“:MySQL 127.0.0.1:3308,库 traffic_audit,root/123456。
- è§„范(2026-09-02 èµ·ï¼‰ï¼šæ¯å®Œæˆä¸€ä¸ªåŠŸèƒ½â†’æµ‹è¯•â†’å†™ `docs/功能测试报告/功能测试报告_<功能名>_<日期>.md`;每天下班写 `docs/工作日结/工作日结_<日期>.md`。
- git(2026-09-03 ç”¨æˆ·æŽˆæƒï¼Œæ— éœ€å†é—®æ˜¯å¦æŽ¨é€ï¼‰ï¼šæ”¹å®Œâ†’测试/写报告→`git fetch gitea` å¯¹æ¯”合并(禁强推)→commit→push å…¬å¸ gitea(账号 zyj,凭据走本机)。
- æ³¨æ„ï¼šå½“前工作区很脏,**存在其他会话正在改的代码/文档**(docs/城市客运 çš„删除与新增、outputs/、_test_tmp/、*.bak、*.zip ç­‰æœªæäº¤ï¼‰ã€‚提交时只 `git add` è‡ªå·±æ”¹çš„æ–‡ä»¶ï¼Œä¸è¦æ•´åŒ…提交。
## 2 çŽ¯å¢ƒè¸©å‘è®°å½•
1. Codex å­è¿›ç¨‹ PowerShell åŒæ—¶æœ‰ Path ä¸Ž PATH ä¸¤ä¸ªçŽ¯å¢ƒå˜é‡ï¼ŒStart-Process/Get-Item env:Path ä¼šæŠ¥é”™ï¼›å¯åŠ¨ä¸€å¾‹ç”¨ `cmd.exe /c ... > log 2>&1` æ–¹å¼ã€‚
2. node åœ¨æ²™ç®±å†…访问 C:\Users\jcxiong ä¼šè¢«æ‹’;启动脚本必须沙箱外执行。
3. apply_patch å‘½ä»¤åœ¨æœ¬ä¼šè¯ä¸å¯ç”¨ï¼ˆæŠ¥ Invalid patch)。改文件用 PowerShell `[System.IO.File]::WriteAllText/WriteAllLines` æˆ– python å†™ï¼ˆUTF-8)。
4. bundled python å¯èƒ½ä¸­é€”丢 pymysql,用 `python -m pip install pymysql` è£…回即可;mysql å‘½ä»¤è¡Œå¼•号易踩坑,优先 python+pymysql。
5. ç”¨æˆ·ä¸´æ—¶è„šæœ¬/文件未经同意不删;导入失败要在页面显示行号。
## 3 ä»Šå¤©å·²å®Œæˆï¼ˆ2026-09-04)
- æ ¸å®žã€Šæ±‡æ€»è¡¨æ¯ç‰ˆã€‹5 ä¸ªæˆå“é¡µâ€œ7月当月块=1-7累计块”问题(`docs/生成汇总大表/汇总表母版数据体检与待决策清单_2026-09-04.md`),方案 A/B å¾…用户拍板。
- æ ¸å®žè´§è¿â€œè§„下”口径(业务确认):规下 = ã€Šè´§è¿é‡å‘¨è½¬é‡è¡¨ã€‹å…¨å£å¾„ âˆ’ ã€Šé“路货物运输月度生产情况表》(H203-2) è§„上合计;周转量同式;h2032 å•位是 å¨/吨公里,要先 Ã·10000。
- 2026-07 å…¨é‡å¯¹è´¦é€šè¿‡ï¼šå…¨çœè§„上 3754.78、全口径 16285.71、规下 12530.93,与母版 O7/O5/O9 å…¨ç­‰ï¼›17 å¸‚州逐项一致;周转量同式验证也通过(武汉规下周转量 462751.81=母版 O16)。
- è½åœ° SQL:`docs/生成汇总大表/规下货运量口径_2026-09-04.sql`(查询1 åˆ†å¸‚州、查询2 å…¨çœæ ¡éªŒã€æŸ¥è¯¢3 å¯é€‰å›žå¡«=默认注释)。已在库里跑通。
- æ–‡æ¡£ä¸­æ–‡åæ”¹é€ ï¼ˆç”¨æˆ·çœ‹ä¸æ‡‚英文库表名):总表 md Â§5-§8、页签逻辑关系说明.md、落地方案.md、上午交付工作清单.md,均把程序表名改为《中文业务名》,文首加“表名阅读约定”。
- git å·²æŽ¨é€ï¼ˆæœ¬ä¼šè¯åªåŠ¨æ–‡æ¡£ï¼ŒæœªåŠ¨ä»£ç ï¼‰ï¼šb5146d2 â†’ d36f112 â†’ 26f2700。
## 4 å…³é”®å£å¾„速记
### 4.1 è¡¨åå¯¹ç…§ï¼ˆè¯¦ç»†ç‰ˆè§ æ€»è¡¨ Â§5)
| ä¸šåŠ¡å«æ³• | ç¨‹åºåº“表名 |
|---|---|
| ã€Šé“路货物运输月度生产情况表》(H203-2 ä¼ä¸šæœˆæŠ¥ï¼Œå¨/吨公里) | h2032_enterprise_monthly |
| ã€Šè´§è¿é‡å‘¨è½¬é‡è¡¨ã€‹(全口径总量月报,万吨/万吨公里,含湖北省行、去年列 last_*) | freight_turnover_import |
| ã€Šè§„上规下拆分表》(拆分结果表,现只有周转量、只有 CUMULATIVE è¡Œ) | scale_split_transport |
| ã€Šå…¬è·¯æ—…客运输月度生产情况表》(H203-1)/《个体客运月报表》 | h2031_enterprise_monthly / passenger_individual_monthly |
| ã€ŠåŸŽå¸‚公共交通月度运营情况表》(公交月报,含轨道轮渡列)/《巡游出租汽车运营服务情况月报》 | city_bus_monthly / city_taxi_monthly |
| ã€Šè½¨è¿¹é‡Œç¨‹è¡¨ã€‹/ å„类《运政车辆表》 | vehicle_track_mileage / transport_auth_vehicle / passenger_auth_vehicle / city_taxi_auth / h204_auth_vehicle |
| ã€Šé“路货运车辆能源消耗情况表》(H204 å­£æŠ¥) | h204_vehicle_quarterly |
| ã€ŠæŠ•资月报表/项目表/投资系统导出表》 | investment_monthly / investment_project / investment_system |
| ã€Šå®¡æ ¸è§„则/执行/结果/说明表》 | audit_rule / audit_run / audit_result / audit_explanation |
| ã€Šå¯¼å…¥æ‰¹æ¬¡è¡¨ã€‹ | import_batch |
### 4.2 å…¬å¼
- è§„上货运量(万吨) = SUM(h2032.freight_total) Ã· 10000
- å…¨å£å¾„货运量(万吨) = freight_turnover_import.freight_m{MM}
- è§„下货运量 = å…¨å£å¾„ âˆ’ è§„上;周转量同式(freight_turnover_import.turnover_m{MM} âˆ’ SUM(h2032.turnover_total)÷10000)
- å…¨çœæ ¡éªŒï¼š17 å¸‚州求和 = â€œæ¹–北省”行 = æ¯ç‰ˆâ€œ è´§è¿â€é¡µ O5/O6(总量)、O7/O8(规上)、O9/O10(规下)
- 2025 åŸºå‡†ï¼šå…¨å£å¾„去年 = freight_turnover_import.last_*;规上/规下拆分 2025 = æ¯ç‰ˆ T..AP ç¼“存列(12 ä¸ªæœˆå…¨é½ï¼Œå·²æ ¸å®žï¼‰â†’ æŒ‰â€œä¿ç•™æ¯ç‰ˆç¼“存值”处理
### 4.3 æ±‡æ€»å·¥ä½œç°¿ï¼ˆ19 é¡µä¸‰å±‚)
- å°è´¦é¡µï¼šç­çº¿åŒ…车(含个体)、公交、出租、网约车、轨道轮渡(轨道=武汉+黄石;轮渡仅武汉;黄石无轮渡)
- å£å¾„合成页:城市客运 = å…¬äº¤åŸŽå¸‚内+出租城市内+网约车城市内+轨道轮渡;中口径明细 = ç­çº¿å…¨é‡+公交城乡差+出租城乡差+网约车城乡差
- æˆå“é¡µï¼šåŸŽå¸‚汇总/城市分市州/货运/货运量排名/货运周转量排名/中口径排名/中口径分析/道路运输周转量(B=G+L/2+Q/10:G=货运周转量万吨公里、L=城市客运量万人次、Q=中口径旅客周转量万人公里)
- å£å¾„修订(已确认):出租/网约车 å…¨é‡â‰ åŸŽå¸‚内(仅武汉相等);2026-07 å‡ºç§Ÿå…¨çœåŸŽä¹¡å·® 509.00、网约车 421.46
- 2026 å€¼åˆ— C/E/G/I/K/M/O(偶数列同比),Q=1-7 ç´¯è®¡ï¼›2025 åˆ— T..AP;右侧 2024/更早参考列多为 #REF! æ®‹ç•™ï¼ˆå¾…清)
### 4.4 å±•示规则
- æ‰€æœ‰ç”ŸæˆæŠ¥è¡¨å‡ºå£â€œæ˜¾ç¤ºä¸¤ä½å°æ•°ã€ä¿ç•™å…¨ç²¾åº¦â€ï¼›æ•´æ•°ä¸æ˜¾ç¤º .00;导出列宽按内容自适应(2026-09-03 å·²å®žçŽ°å¹¶æµ‹è¯•ï¼‰
## 5 çŽ°çŠ¶æ•°æ®ç¼ºå£ï¼ˆå½±å“â€œç¨‹åºè‡ªåŠ¨ç”Ÿæˆâ€ï¼‰
- åº“内 H203-1 ä¼ä¸šæœˆæŠ¥åªæœ‰ 2026-03、2026-07;城市公交/巡游出租只有 2026-06、2026-07;个体客运只有 2026-07;轨道轮渡只有 6/7 æœˆï¼ˆ1-5 æœˆå¾…补文件);网约车月度拆分输入《网约车订单及全省总量.xlsx》只有 2026-07 ä¸€è¡Œã€‚
- ã€Šè§„上规下拆分表》只有 CUMULATIVE(累计)行:2026-07 126 è¡Œã€2026-06 108 è¡Œï¼Œæ— å½“月(MONTHLY)行;货运量三列全空。
- æ±‡æ€»æ¯ç‰ˆâ€œ è´§è¿â€é¡µï¼šåˆ†å¸‚州“规上+规下货运量”“规下货运量”两行空白(全省行有值),原因见 Â§6.1 å¾…确认 3。
## 6 ä¸‹ä¸€æ­¥ä¸Žå¾…确认(新会话主任务)
### 6.1 ç­‰ç”¨æˆ·æ‹æ¿ï¼ˆå…ˆå¤è¿°å¹¶ç­‰å›žå¤ï¼Œåˆ«è‡ªè¡Œå‡è®¾ï¼‰
1. ã€Šè§„上规下拆分表》回填货运量拆分按“当月”还是“1-累计”口径?(现表只有 CUMULATIVE è¡Œï¼Œå…¬å¼ç»™çš„æ˜¯å½“月值)——对应 SQL æŸ¥è¯¢ 3。
2. è§„下货运量取数方式:实时现算(推荐)还是回填落表取数。
3. æ±‡æ€»è¡¨â€œ è´§è¿â€é¡µåˆ†å¸‚州“规下货运量 / è§„上+规下货运量”两行是否由程序补填(现母版留空)。
4. 2025 åŒæœŸåˆ—:确认“保留母版缓存值”(本会话已按此写文档,程序未动)。
5. æ–¹æ¡ˆ A/B(体检清单 2026-09-04):5 ä¸ªæˆå“é¡µâ€œ7月当月块错用累计值”,是否现在按 A ä¿®æ­£ï¼ˆçŸ­å¹³å¿«ï¼‰å†æŽ’期 B(根治:导出时自动重算当月块)。
6. ä¸Šåˆæ¸…单 Q1/Q2/Q4/Q6/Q7/Q8/Q11:行列边界与月份扩到 12 æœˆã€2025/2024 åˆ—处理、轨道轮渡 1-5 æœˆæ•°æ®ã€å…¬äº¤â€œåŒæ¯”/环比 0%”是否立审核规则、城市客运成品页网约车列本期填值、出租城市内口径与 U402、每月生成流程(程序扩列 vs æ¯æœˆäººå·¥æ¯ç‰ˆï¼‰ã€‚
### 6.2 æœªå®Œæˆå¼€å‘任务(按优先级,参考落地方案 P0-P7)
- P0 æ¯ç‰ˆå®šç¨¿ï¼šæ¸… #REF!、定行列边界映射、确认 2025/2024 åˆ—策略(见 6.1)。
- P1 æ±‡æ€»å·¥ä½œç°¿éª¨æž¶æ•´æœ¬ç”Ÿæˆï¼ˆå¤åˆ¶æ¯ç‰ˆâ†’隐藏页→空数据导出可用);历史 commit 6b0ae27/8b26ddc å·²æœ‰æ•´æœ¬å¤åˆ¶+两位小数+列宽自适应,先确认最新母版生成_道路运输量汇总表.xlsx çŠ¶æ€ã€‚
- P2 å°è´¦é¡µå¡«å……:班线包车/公交/出租/网约车/轨道轮渡(先填 2026-07 ç­çº¿ã€å‡ºç§Ÿå¯¹åº“值)。
- P3 å£å¾„合成页填充:城市客运、中口径明细(城乡差公式,校验 Q1≈0)。
- P4 æˆå“é¡µå¡«å……:城市汇总/分市州/货运/排名/中口径排名/分析(货运页用 Â§4.2 å…¬å¼å¡«è§„上/规下)。
- P5 é“路运输周转量合成页。
- P6 å‰ç«¯æŽ¥å…¥â€œæ±‡æ€»å·¥ä½œç°¿â€ä¸Žâ€œç½‘约车拆分表”生成选项。
- P7 å›žå½’对照与《功能测试报告_汇总工作簿生成_…》+《工作日结_2026-09-04.md》。
- ç‹¬ç«‹é¡¹ï¼šå¯¼å…¥å¤§æ–‡ä»¶â€œå·²å¤„理 N/M è¡Œâ€å®žæ—¶è¿›åº¦ï¼›å…¬è·¯æ—…客中口径明细 7-12 æœˆæ‰©åˆ—(依赖 Q1);出租导入修正(另一会话负责,勿动);运政/轨迹/能耗导入回归;投资四表 .xls è§£æžï¼ˆQ9)。
### 6.3 å¯èƒ½çš„æ–‡æ¡£æ”¶å°¾
- è‹¥ç”¨æˆ·è¦æ±‚“全改”:database.md、architecture.md、README、功能测试报告等仍含程序表名的技术文档,统一加“中文表名对照指引”(本会话只改了业务/逻辑类文档)。
## 7 æœ€è¿‘ git æäº¤ï¼ˆæœ¬æ¬¡ä¼šè¯å†…)
- b5146d2 docs: å¢žè¡¥åº“表关系/单位换算/货运规上规下口径 + è½åœ°å£å¾„ SQL
- d36f112 docs: æ±‡æ€»è¡¨/SQL åº“表名改写为业务中文表名
- 26f2700 docs: é¡µç­¾é€»è¾‘/落地方案/上午清单 ç¨‹åºè¡¨åç»Ÿä¸€æ”¹ä¸šåŠ¡ä¸­æ–‡å
- æ›´æ—©ï¼š6b0ae27(网约车拆分+汇总整本生成+两小数)、8b26ddc(整数无.00+列宽自适应+09-04 ä½“检清单)
- æ³¨æ„ï¼šè¿œç¨‹å¯èƒ½å·²æœ‰åŒäº‹æ–°æäº¤ï¼Œå¼€å·¥å‰å…ˆ `git fetch gitea` æ£€æŸ¥ `main...gitea/main`。
## 8 ç»™æ–°ä¼šè¯çš„开工口令
1. å…ˆè¯»æœ¬æ–‡ä»¶ Â§6,把“待用户拍板”6 ç»„问题向用户复述并等回复。
2. åŒæ­¥ï¼šgit fetch gitea;远端有新提交先合并,禁止强推。
3. æ¶‰åŠè·¨è¡¨å£å¾„一律先看 `docs/生成汇总大表/输入输出与逻辑关系总表_2026-09-03.md` Â§5-§7。
4. æ¯å®Œæˆä¸€ä¸ªåŠŸèƒ½ï¼šæµ‹è¯•â†’åŠŸèƒ½æµ‹è¯•æŠ¥å‘Šâ†’ï¼ˆä¸‹ç­ï¼‰å·¥ä½œæ—¥ç»“â†’æäº¤æŽ¨é€ã€‚
docs/¹¦ÄܲâÊÔ±¨¸æ/¹¦ÄܲâÊÔ±¨¸æ_³ÇÊпÍÔËÍøÔ¼³µµ¼ÈëÏÂÀ­_2026-09-04.md
New file
@@ -0,0 +1,35 @@
# åŠŸèƒ½æµ‹è¯•æŠ¥å‘Šï¼šåŸŽå¸‚å®¢è¿å¯¼å…¥ä¸‹æ‹‰æ–°å¢žç½‘çº¦è½¦å¯¼å…¥ï¼ˆ2026-09-04)
## åŠŸèƒ½è¯´æ˜Ž
2026-09-04 ç”¨æˆ·æ‹æ¿ï¼šæ•°æ®å¯¼å…¥â€”—城市客运模块下拉增加《网约车总数》与《网约车订单及全省总量》两项,母版放于 docs/城市客运/。本次实现:
- åŽç«¯æ–°å¢žå¯¼å…¥æŽ¥å£ï¼šPOST /api/import/wycTotal、POST /api/import/wycOrder;
- æ–°å¢žè¡¨ wyc_total_monthly(全省 pin)与 wyc_order_monthly(pin + è®¢å•合计 + 17市州订单),按报表期先删后插、幂等 upsert,同时记录批次(WYC_TOTAL / WYC_ORDER)供导入进度与历史显示;
- å‰ç«¯ DataImport.vue:城市客运下拉新增两项、TYPE_LABELS / BATCH_TYPE_MAP、模板名/下载 URL(对应母版)、endpoint æ˜ å°„全部补齐。
代码改动(待推送):
- traffic-audit-server/src/main/java/com/trafficaudit/dataimport/entity/WycTotalMonthly.java、WycOrderMonthly.java(新增,@TableField å›ºå®š pin_ck/pin_cz åˆ—名)
- traffic-audit-server/src/main/java/com/trafficaudit/dataimport/mapper/WycTotalMonthlyMapper.java、WycOrderMonthlyMapper.java(新增)
- traffic-audit-server/src/main/java/com/trafficaudit/dataimport/service/DataImportService.java(新增 importWycTotal/importWycOrder/upsertWyc/upsertWycTotal/periodOfCell/dbl/dblN åŠåˆ†å‘ case)
- traffic-audit-server/src/main/java/com/trafficaudit/dataimport/controller/DataImportController.java(新增两个端点)
- traffic-audit-web/src/views/DataImport.vue(下拉/标签/模板/端点)
- docs/sql_wyc.sql(建表 DDL æ²‰æ·€ï¼‰
## æµ‹è¯•环境
- åŽç«¯ 8090(重启后就绪);前端 dev server 8080(DataImport.vue æ”¹åŠ¨åŽçƒ­ç¼–è¯‘ Compiled successfully);MySQL 127.0.0.1:3308 traffic_audit;母版为 docs/城市客运/模板_网约车总数.xlsx、模板_网约车订单及全省总量.xlsx(实际编辑版,含 2026-01~07)。
- æ–¹æ³•:HTTP å®žé™…导入,与源文件逐项对齐、幂等重导、模板下载 URL、空数据负向用例。
## ç”¨ä¾‹ä¸Žç»“æžœ
1. ç½‘约车总数导入(正向):上传模板_网约车总数.xlsx,接口返回“导入成功,共 7 æœŸâ€ï¼›DB ä¸­ 2026-01~07 å…¨çœ pin B-E ä¸Žæ¯ç‰ˆé€æœŸä¸€è‡´ï¼ˆå¦‚ 2026-07 = 4852.3/4430.84/28348.02/22705.61)。结论 PASS。
2. ç½‘约车订单导入(正向):上传模板_网约车订单及全省总量.xlsx,共 7 æœŸï¼›2026-07 F=订单合计 29730791、G-W 17市州与母版一致(武汉 11183267…神农架 3534);2026-01~06 è®¢å•列为 NULL(母版无数据,正确)。结论 PASS。
3. å¹‚等重复导入(正向):同文件重复上传,两表数据仍各 7 è¡Œä¸”值不变(先删后插);批次表每次导入均记录。结论 PASS。
4. æ¨¡æ¿ä¸‹è½½ï¼ˆæ­£å‘):GET /api/templates/城市客运/模板_网约车总数.xlsx ä¸Ž è®¢å•版均 200。结论 PASS。
5. ç©ºæ•°æ®æ–‡ä»¶ï¼ˆè´Ÿå‘):上传只含表头的 xlsx,返回 code 500、提示“未识别到有效月份行:A åˆ—应为日期(如 2026-07)…”,错误文案清晰。结论 PASS(预期失败)。
6. ç¼–译与启动:后端 mvn compile EXIT=0;前端脚本 node --check é€šè¿‡ä¸” dev server çƒ­ç¼–译成功。结论 PASS。
## å‘现的问题与处置
1. æ–°å¢ž Mapper æŽ¥å£å°¾éƒ¨æ®‹ç•™â€œ{{}}”(抽象方法体)导致编译失败:已修为“{}”。
2. DataImportService.periodOfCell æ­£åˆ™ \d æœªè½¬ä¹‰ä¸º \\d(Java å­—符串“非法转义”编译失败):已修复。
3. é¦–次导入返回“共 0 æœŸâ€ï¼šåŽŸå› ä¸ºå®žä½“å­—æ®µ pinCK/pinCZ ä¸‹åˆ’线策略映射为 pin_c_k/pin_c_z,与表列 pin_ck/pin_cz ä¸åŒ¹é…ï¼Œinsert æŠ¥ Unknown column;处理:实体增加 @TableField("pin_ck")/@TableField("pin_cz"),复测后 7 æœŸå…¨éƒ¨å…¥åº“。
## ç»“论
城市客运导入下拉新增两项网约车导入功能已实现并通过测试:正向(实际母版 1-7 æœˆï¼‰ã€å¹‚等重导、模板下载、空数据负向均符合预期;入库数据与源文件逐项一致。前端下拉项还需用户在页面点击人工过一眼。
docs/¹¦ÄܲâÊÔ±¨¸æ/¹¦ÄܲâÊÔ±¨¸æ_ÉóºËƽ¾ù¶Öλ¿Ú¾¶Óë²ð·ÖÄ¿±êÔµ¼Èë¼°È«ÆÁ·­Ò³_2026-09-04.md
New file
@@ -0,0 +1,22 @@
# åŠŸèƒ½æµ‹è¯•æŠ¥å‘Šï¼šå®¡æ ¸å…¬å¼ä¿®æ­£ + æ‹†åˆ†ç›®æ ‡æœˆå¯¼å…¥ + å…¨å±ç¿»é¡µï¼ˆ2026-09-04)
## ä¸€ã€è´§è¿å®¡æ ¸ RULE_006:整车吨位改为“平均吨位”口径
- æ”¹åŠ¨ï¼š`AuditEngineService.checkOutRange` å¯¹ `tonsWhole` å­—段按“整车平均吨位 = æ•´è½¦å¨ä½(tonsWhole) / æ•´è½¦è½¦è¾†æ•°(vehicleWhole)”计算后与 4~40 æ¯”较;无整车数时退回原值判断。`h2032FieldLabel` ä¸å˜ï¼Œæç¤ºæ–‡æœ¬æ˜¾å¼æ ‡â€œæ•´è½¦å¹³å‡å¨ä½(整车吨位/整车数)”。
- åŽŸå› ï¼šåŽŸé€»è¾‘ç›´æŽ¥æ‹¿æ•´è½¦å¨ä½æ€»é‡ï¼ˆå¦‚é»„å†ˆå¯ç¨‹ç‰©æµ 357 å¨ï¼Œ23 è¾†æ•´è½¦ï¼‰æ¯” 4~40,把总量当单均误报。
- éªŒè¯ï¼šé‡æ–°æ‰§è¡Œ 2026-07 H2032 å®¡æ ¸ï¼ˆPOST /api/audit/execute),RULE_006 å‘½ä¸­ 8 æ¡ä¸”全部为“整车平均吨位=0.92~3.93,范围 4~40”(黄冈启程 357/23≈15.52 ä¸å†å‘½ä¸­ï¼‰ï¼›å…¶ä½™è§„则正常(RULE_001 59、RULE_002 106、RULE_004 6、RULE_005 21、RULE_003 0)。结论 PASS。
## äºŒã€å®¡æ ¸æç¤ºæ•°å­—不再用科学计数法
- æ”¹åŠ¨ï¼š`fmt`/`fmt4` ç”¨ BigDecimal.toPlainString è¾“出,大数如 1.04e7 æ˜¾ç¤ºä¸º 10435762.52 è€Œä¸æ˜¯ 1.043576252E7。
- éªŒè¯ï¼šé‡å¯¼åŽ 2026-07 å®¡æ ¸æ–‡æœ¬å‡ä¸ºæ™®é€šåè¿›åˆ¶æ˜¾ç¤ºï¼›ç¼–译通过。结论 PASS。
## ä¸‰ã€è§„上规下拆分导入:按目标报表期只取对应月页签
- æ”¹åŠ¨ï¼š`DataImportService.importScaleSplit` å¢žåŠ ç›®æ ‡æœˆï¼ˆperiod çš„æœˆä»½ï¼‰è¿‡æ»¤ï¼šé¡µç­¾å½¢å¦‚“{M}月累计/M月份”只在该 M=目标月时导入(M月累计→CUMULATIVE、M月份→MONTH);页签为“当月/累计”(模板样式)不限定月。
- åŽŸå› ï¼š1-N æœˆæ•´åŒ…文件被整导会把多个月页签塞进同一报表期造成重复行(此前 04-07 åˆ†åˆ« 72/90/108/126 è¡Œå³ä¸ºæ­¤ç±»è„æ•°æ®ï¼‰ã€‚
- éªŒè¯ï¼ˆç«¯åˆ°ç«¯ï¼‰ï¼šç”¨ã€Š2026å¹´1-6月公路货运量(分市州).xlsx》重导 2026-04/05/06,每期返回“36 æ¡è®°å½•”=当月 18 + ç´¯è®¡ 18;库内每期按 region å”¯ä¸€ï¼›æ­¦æ±‰ 2026-06 å½“月合计周转量 687103.88 ä¸Žæºæ–‡ä»¶é€å€¼ä¸€è‡´ï¼›2026-07 æ—§ 126 è¡Œç´¯è®¡æ•°æ®å¾…用 1-7 æœˆæ–‡ä»¶é‡å¯¼ä¸€æ¬¡å³æ”¶æ•›ä¸º 36 è¡Œã€‚结论 PASS。
## å››ã€æ•°æ®æŸ¥çœ‹å…¨å±æ¨¡å¼å¯ç¿»é¡µï¼ˆå‰ç«¯ï¼‰
- æ”¹åŠ¨ï¼š`DataView.vue` æŠŠè¡¨æ ¼ä¸Žå…¶ä¸‹åˆ†é¡µå™¨åŒ…进同一 `.table-wrap`,全屏目标从 `.table-area` æ”¹ä¸º `.table-wrap`,并加全屏 flex å¸ƒå±€æ ·å¼ï¼Œå…¨å±æ—¶ä¿ç•™åˆ†é¡µæ¡ã€‚
- éªŒè¯ï¼šæ¨¡æ¿ç»“æž„/逻辑调整编译由 vue-cli-service çƒ­æ›´æ–°ï¼›æµè§ˆå™¨ç«¯éœ€ç”¨æˆ·å…¨å±æŸ¥çœ‹ç¡®è®¤ï¼ˆè¡¨æ ¼+分页可见、可翻页)。结论:代码就绪,待人工视觉确认。
## çŽ¯å¢ƒ
- åŽç«¯ 8090(多次重启至最新代码,最后一次 16:51 å°±ç»ªï¼‰ï¼›å‰ç«¯ 8080 è¿è¡Œä¸­ï¼›MySQL 127.0.0.1:3308。
docs/¹¦ÄܲâÊÔ±¨¸æ/¹¦ÄܲâÊÔ±¨¸æ_»ã×Ü´ó±í1-6ÔÂÉú³ÉÓë1-7ÔÂÀ©ÁÐÑéÖ¤_2026-09-04.md
New file
@@ -0,0 +1,46 @@
# åŠŸèƒ½æµ‹è¯•æŠ¥å‘Šï¼šæ±‡æ€»å¤§è¡¨ 1-6 æœˆç”Ÿæˆ + 1-7 æœˆæ‰©åˆ—(2026-09-04)
## ä¸€ã€åŠŸèƒ½è¯´æ˜Ž
- ç›®æ ‡ï¼šéªŒè¯ã€Šé“路运输量汇总表》生成程序可产出两本产物——
  1. **1-7 æœˆæ‰©åˆ—**(`period=2026-07`):以“1-4 æœˆéª¨æž¶â€æ¯ç‰ˆä¸ºåº•、按同期备份母版还原月度块,得到 1-7 æœˆå®Œæ•´å·¥ä½œç°¿ï¼›
  2. **1-6 æœˆç”Ÿæˆ**(`period=2026-07&toMonth=6`):在上述 1-7 å†…容基础上,把 8 ä¸ªå°è´¦/合成页裁剪到 6 æœˆâ€”—
     - 7 æœˆå½“月值列(O)、7 æœˆåŒæ¯”列(P)的**数据格清空,表头保留**(用户拍板口径 â‘ ï¼‰ï¼›
     - ç´¯è®¡å…¬å¼ï¼ˆQ)去掉 7 æœˆé¡¹ï¼Œç´¯è®¡åŒæ¯”公式(R)分母去掉 2025 å¹´ 7 æœˆåˆ—(=2025 å¹´ 1-6 æœˆï¼Œç”¨æˆ·æ‹æ¿å£å¾„ â‘¡ï¼‰ã€‚
- ä»£ç æ”¹åŠ¨ï¼š
  - `ReportExportService.exportSummaryWorkbook(period, mode, toMonth)`:新增可选 `toMonth` è£å‰ªï¼›
  - æ–°å¢ž `trimSummaryMonthlySheets(wb, keepMonths)`:只处理 8 ä¸ªå°è´¦/合成页(` è´§è¿`、班线包车、城市客运、公交、出租、网约车、轨道、轮渡、中口径明细),按“含累计公式且任一 2026 æœˆåº¦å€¼åˆ—非空”识别数据行;
  - `ReportExportController /export/summaryWorkbook` å¢žåŠ å¯é€‰å‚æ•° `toMonth`。
- äº§ç‰©ï¼ˆç¨‹åºå®žé™… HTTP ç”Ÿæˆï¼Œéžæ‰‹å·¥æ”¹è¡¨ï¼‰ï¼š
  - `docs/生成汇总大表/输出/道路运输量汇总表_2026-07.xlsx`(921,070 B)
  - `docs/生成汇总大表/输出/道路运输量汇总表_2026-06.xlsx`(912,980 B)
## äºŒã€æµ‹è¯•环境
- åŽç«¯ Spring Boot 8090(`mvn spring-boot:run` å®žè·‘,本机 MySQL 127.0.0.1:3308/traffic_audit);
- æ¯ç‰ˆï¼š`docs/生成汇总大表/2026å¹´7月道路运输量汇总表.xlsx`(1-4 æœˆéª¨æž¶ï¼Œå·¥ä½œåŒºæœªæäº¤ç‰ˆï¼‰ï¼›
- å¤‡ä»½æ¯ç‰ˆï¼ˆé€æ ¼å¯¹ç…§åŸºå‡†ï¼‰ï¼š`docs/生成汇总大表/_备份_2026å¹´7月道路运输量汇总表_清理前_20260904.xlsx`;
- æ ¡éªŒè„šæœ¬ï¼šé€æ ¼æ¯”è¾ƒå•å…ƒæ ¼åŽŸæ–‡ï¼ˆå…¬å¼å« `=`、值、文本),数值按 int/float ç­‰ä»·å½’一化。
## ä¸‰ã€ç”¨ä¾‹ä¸Žç»“æžœ
| # | ç”¨ä¾‹ | è¾“å…¥ | é¢„期 | å®žé™… | ç»“论 |
|---|---|---|---|---|---|
| 1 | 1-7 æœˆæ‰©åˆ— | GET `/api/report/export/summaryWorkbook?period=2026-07&mode=month` | ä¸Žå¤‡ä»½æ¯ç‰ˆå…¨ç°¿é€æ ¼ä¸€è‡´ | çœŸå·®å¼‚=0 | é€šè¿‡ |
| 2 | 1-6 æœˆç”Ÿæˆï¼ˆæ­£å‘) | åŒä¸Šè¿½åŠ  `&toMonth=6` | éžè£å‰ªèŒƒå›´ï¼ˆéž 8 å°è´¦é¡µ + 8 å°è´¦é¡µ A..N ç­‰ï¼‰ä¸Žå¤‡ä»½ä¸€è‡´ï¼›ä»… O/P/Q/R æŒ‰è§„则变化 | éžç™½åå•真差异=0 | é€šè¿‡ |
| 3 | 7 æœˆä¸¤åˆ—清空/表头保留 | 8 å°è´¦é¡µæ•°æ®è¡Œ O/P | æ•°æ®æ ¼ç©ºã€è¡¨å¤´è¡Œ O/P ä¿ç•™ | æ•°æ®æ ¼æ¸…空 1132,表头保留 24,表头异常 0 | é€šè¿‡ |
| 4 | ç´¯è®¡æŒ‰ 1-6 æœˆ | æ•°æ®è¡Œ Q åˆ—公式 | åŽ»æŽ‰ `+O{行}` | æ”¹å†™ 566 å¤„,例:`=C5+E5+...+O5`→`=C5+...+M5` | é€šè¿‡ |
| 5 | ç´¯è®¡åŒæ¯”分母=2025 1-6 æœˆ | æ•°æ®è¡Œ R åˆ—公式 | åŽ»æŽ‰ `,AF{行}`/`+AF{行}` | æ”¹å†™ 566 å¤„,例:`=Q5/SUM(T5..AF5)-1`→`=Q5/SUM(T5..AD5)-1` | é€šè¿‡ |
| 6 | æŠ½æŸ¥å…³é”®æ ¼ | è´§è¿/中口径明细 O/P/Q/R | è¡¨å¤´è§æ–‡ã€æ•°æ®è¡Œ O/P ç©º | 07 æ•°æ®è¡Œ O=3754.7823(7 æœˆå€¼ï¼‰ï¼Œ06 åŒæ ¼ä¸ºç©ºï¼›è¡¨å¤´ä¸€è‡´ | é€šè¿‡ |
| 7 | è´Ÿå‘/边界 | `toMonth` ç¼ºçœæˆ– â‰¥7 | è¡Œä¸ºä¸Žæ—§ç‰ˆä¸€è‡´ï¼ˆå…¨ç°¿è¿˜åŽŸï¼‰ | åŒç”¨ä¾‹ 1,真差异 0 | é€šè¿‡ |
## å››ã€å®žçŽ°ä¸­å‘çŽ°å¹¶å¤„ç½®çš„é—®é¢˜
1. **POI è¡Œå· 0-based vs å…¬å¼ 1-based**:初版按行索引拼接 `+O4`,匹配不上公式里的 `O5`,导致 Q/R æœªæ”¹å†™ï¼ˆä»…清空生效)。处置:token è¡Œå·æ”¹ `excelRow = r + 1`。
2. **2025 åŒæœˆåˆ— 0-based ç´¢å¼•é”™ 1**:分母列 T..AF çš„ 0-based èµ·ç‚¹æ˜¯ 19(T),误用 20 ä¼šç®—出 AG(列号越 1 åˆ—),R å…¬å¼åŒ¹é…ä¸åˆ°ã€‚处置:`lastCol = 19 + 2*(m-1)`。
3. ä¸¤å¤„修复后均重新 `mvn compile` + é‡å¯åŽç«¯å¤æµ‹é€šè¿‡ï¼ˆæœ€ç»ˆäº§ç‰©ä¸ºä¿®å¤åŽä»£ç ç”Ÿæˆï¼‰ã€‚
## äº”、边界与已知项(本次未纳入)
- **成品聚合页**(货运量排名、货运周转量排名、中口径排名、中口径分析、城市汇总、城市分市州、道路运输周转量)的单元格为**人工母版静态值(1-7 æœˆç´¯è®¡å£å¾„)**,本次裁剪不触及;要随“1-6 æœˆâ€è‡ªåŠ¨é‡ç®—éœ€èµ° P2-P5 æ•°æ®é©±åŠ¨å¡«å……ï¼ˆå¦æŽ’æœŸï¼‰ã€‚
- 2025/2024 å‚考列保留母版缓存值,未改(已确认口径)。
- éšè—é¡µï¼ˆå…¬è·¯æ€»å®¢è¿ã€2025年城市客运量、中口径客运量、中口径计算过程)未纳入裁剪,保持原样。
## å…­ã€ç»“论
“先生成 1-6 æœˆã€1-7 æœˆæ‰©åˆ—”两本产物经程序实际生成并通过逐格对照:1-7 æœˆäº§ç‰©ä¸Žå¤‡ä»½æ¯ç‰ˆé›¶å·®å¼‚ï¼›1-6 æœˆäº§ç‰©åœ¨ 8 ä¸ªå°è´¦/合成页正确执行“7 æœˆä¸¤åˆ—留空(表头保留)、累计/同比按 1-6 æœˆâ€çš„口径,其余范围零差异。P0 é¡¹å¯å…³é—­ï¼Œå‰©ä½™æˆå“èšåˆé¡µæ•°æ®é©±åŠ¨é‡ç®—ï¼ˆP2-P5)单列跟进。
docs/¹¦ÄܲâÊÔ±¨¸æ/¹¦ÄܲâÊÔ±¨¸æ_»ã×ܹ¤×÷²¾Ô¶ȿéÀ©Áл¹Ô­ÊÔµã_2026-09-04.md
New file
@@ -0,0 +1,38 @@
# åŠŸèƒ½æµ‹è¯•æŠ¥å‘Šï¼šæ±‡æ€»å·¥ä½œç°¿æœˆåº¦å—æ‰©åˆ—/还原试点(2026-07)(2026-09-04)
## åŠŸèƒ½è¯´æ˜Ž
用户拍板:以《2026å¹´7月道路运输量汇总表.xlsx》(已清理为“1-4 æœˆéª¨æž¶â€ï¼‰ä¸ºæ¯ç‰ˆï¼Œç”±ç¨‹åºæŠŠ 5-7 æœˆæœˆåº¦å—按同期备份母版还原,实现“逐月扩列生成 1-N æœˆæ±‡æ€»è¡¨â€çš„第一步试点(M1,目标期 2026-07)。口径:1-4 æœˆä¿ç•™æ¯ç‰ˆæ•°æ®ï¼›ç´¯è®¡å…¬å¼æ¢å¤ä¸º 1-7 æœˆï¼›åŒæ¯” R åˆ†æ¯ç”¨ 2025 å¹´ 1-7 æœˆåˆ—ï¼›2025/2024 å‚考列保持不动;输出另存新文件,不改母版。
代码改动:
- traffic-audit-server/.../reportexport/service/ReportExportService.java
  - exportSummaryWorkbook å¢žåŠ ï¼šå®šä½åŒæœŸå¤‡ä»½æ¯ç‰ˆï¼ˆ_备份_*_清理前_*.xlsx,按 {å¹´}å¹´{月}月 åŒ¹é…ï¼Œæœç´¢é…ç½®ç›®å½•/user.dir/上级目录三个候选根)→ é€æ ¼æŠŠâ€œå¤‡ä»½æœ‰å†…容而骨架缺失或内容不同”的单元格回填(含 5-7 æœˆè¡¨å¤´ã€æ•°æ®ã€å…¬å¼ä¸Žç´¯è®¡/同比公式);
  - æ–°å¢ž resolveSummaryDonor / restoreSummaryMonthlyBlocks / summaryCellText ä¸‰ä¸ªç§æœ‰æ–¹æ³•ï¼›
  - å¯¼å‡ºæ—¶ç½® fullCalcOnLoad=true,保证 Excel/WPS æ‰“开即重算被改写/还原的公式。
## æµ‹è¯•环境
- åŽç«¯ 8090(多次重启后最新代码就绪);MySQL 127.0.0.1:3308。
- æ¯ç‰ˆï¼šdocs/生成汇总大表/2026å¹´7月道路运输量汇总表.xlsx(1-4 æœˆéª¨æž¶ï¼Œ19 é¡µç­¾ï¼‰ï¼›å¤‡ä»½ï¼šdocs/生成汇总大表/_备份_2026å¹´7月道路运输量汇总表_清理前_20260904.xlsx。
- æ–¹æ³•:调用 GET /api/report/export/summaryWorkbook?period=2026-07&mode=month,保存为 docs/生成汇总大表/输出/道路运输量汇总表_2026-07.xlsx,用 openpyxl ä¸Žå¤‡ä»½æ¯ç‰ˆé€æ ¼æ¯”对(内容/公式文本,非样式)。
## ç”¨ä¾‹ä¸Žç»“æžœ
1. è¿˜åŽŸå¹¿åº¦ï¼ˆæ­£å‘ï¼‰ï¼šæ¸…ç†æ—¶è¢«è£çš„ 7 ä¸ªå°è´¦/合成页(货运/班线包车/城市客运/公交/出租/网约车/轨道轮渡/中口径明细)缺失单元格全部补齐,missing=0;其余页(成品页/隐藏页)本无差异,未改动。结论 PASS。
2. é€æ ¼å¯¹ç…§ï¼ˆæ­£å‘):输出与备份母版 19 é¡µå…¨é‡æ¯”对,real-diff=0;仅 31 æ ¼ä¸ºâ€œæ•´æ•° vs 46143.0”的数值等价表示差异(Excel æ•°å€¼ç›¸åŒï¼‰ã€‚结论 PASS。
3. ç´¯è®¡/同比公式(正向):抽查 ç­çº¿åŒ…车/公交/出租/货运 ç­‰è¡Œ Q æ¢å¤ä¸º 1-7 æœˆå„月值求和(如 =G4+E4+C4+I4+K4+M4+O4),R æ¢å¤ä¸º =Q/SUM(2025 å¹´ 1-7 æœˆåˆ—)-1,与备份一致。结论 PASS。
4. æ‰“开即重算(正向):产物 xl/workbook.xml å« <calcPr fullCalcOnLoad="true"/>。结论 PASS。
5. æ¯ç‰ˆæœªè¢«æ”¹åŠ¨ï¼ˆæ­£å‘ï¼‰ï¼šç”Ÿæˆå‰åŽæ¯ç‰ˆæ–‡ä»¶å­—èŠ‚æœªå˜ï¼ˆåªè¯»å¤åˆ¶ï¼‰ã€‚ç»“è®º PASS。
6. ç¼–译与启动:mvn compile EXIT=0;后端重启就绪;接口 200 è¿”回 xlsx。结论 PASS。
## å‘现的问题与处置
1. åˆç‰ˆ donor å®šä½åªæŸ¥é…ç½®ç›®å½•相对路径,而 spring-boot:run çš„工作目录是模块目录(traffic-audit-server),导致“未找到备份母版”、输出仍为骨架:已改为与 resolveAnyTemplate ç›¸åŒçš„ 3 å€™é€‰æ ¹ç›®å½•扫描,复测还原成功。
2. POI setForceFormulaRecalculation æœªå†™ calcPr:改为直接操作 XSSFWorkbook.getCTWorkbook() çš„ calcPr.fullCalcOnLoad=true,已验证写入。
## ç»“论
M1 è¯•点通过:从 1-4 æœˆéª¨æž¶æ¯ç‰ˆå¯ç¨‹åºåŒ–还原出与人工 7 æœˆæ¯ç‰ˆå†…容零差异的完整工作簿(含 5-7 æœˆæœˆåº¦å—与 1-7 ç´¯è®¡/同比公式),输出文件 docs/生成汇总大表/输出/道路运输量汇总表_2026-07.xlsx。下一步 M1b:月份>7(8-12 æœˆï¼‰æ—¶æŒ‰â€œä¸Šä¸€æœˆå—克隆+列引用平移”自动插入新列(备份无对应月份时用),再接入 M2 å°è´¦æ•°æ®ä»Žåº“内填充。
## é™„注:输出格式修复(2026-09-04 14:15 å¤æµ‹ï¼‰
用户反馈生成产物格式不美观:定位为 `exportSummaryWorkbook` ä¸­è°ƒç”¨äº† `autoFitContentColumns(wb)`,按公式文本计算宽度后把人工母版整体列宽顶到约 36,覆盖了模板版式。
处置:汇总大表导出不再 autoFit(保留人工母版列宽/版式;其余小报表导出仍 autoFit)。重新编译并复跑 `GET /api/report/export/summaryWorkbook?period=2026-07&mode=month` åŽï¼š
- åˆ—宽 diff=0、合并单元格 diff=0、行高 diff=0(与人工母版逐页比对);
- å†…容 real-diff=0(31 å¤„为整数/浮点等价差异如 46143 vs 46143.0,正常);
- äº§ç‰©ï¼š`docs/生成汇总大表/输出/道路运输量汇总表_2026-07.xlsx`(约 921 KB)。
结论:PASS,待用户在 Excel/WPS ä¸­æ‰“开确认视觉格式。
docs/¹¦ÄܲâÊÔ±¨¸æ/¹¦ÄܲâÊÔ±¨¸æ_»ã×ܱíÕûÊý²»ÏÔʾ0.00ÓëÁпí×ÔÊÊÓ¦_2026-09-04.md
New file
@@ -0,0 +1,26 @@
# åŠŸèƒ½æµ‹è¯•æŠ¥å‘Šï¼šæ±‡æ€»è¡¨æ•´æ•°ä¸æ˜¾ç¤º .00 ä¸Žåˆ—宽自适应(2026-09-04)
## åŠŸèƒ½è¯´æ˜Ž
针对《生成_道路运输量汇总表》两个体验问题修改(仅动 ReportExportService.java):
1. æ•°å­—显示:保留“显示两位小数、存储全精度”的总原则,但整数值不再显示 `.00`(原实现对“公式结果为整数”的格也会套 0.00,本次补齐跳过逻辑)。
2. åˆ—宽:汇总表整本导出后按单元格内容自动加宽(只加宽不缩窄;跳过合并单元格标题;中文按 2 å€å®½ä¼°ç®—;单格超宽文本封顶 34,列宽上限 46,防止长说明把列撑爆)。
## æµ‹è¯•环境
- åŽç«¯ 8090(重新编译并重启,新代码生效);MySQL 127.0.0.1:3308。
- æ¯ç‰ˆï¼šdocs/生成汇总大表/2026å¹´7月道路运输量汇总表.xlsx;基线文件:docs/生成汇总大表/生成_道路运输量汇总表.xlsx(旧代码导出)。
## ç”¨ä¾‹ä¸Žç»“æžœ
| # | ç”¨ä¾‹ | è¾“å…¥/预期 | å®žé™… | ç»“论 |
|---|---|---|---|---|
| 1 | æ±‡æ€»è¡¨æ•´æ•°æ ¼ä¸å¸¦ .00(正向) | 2026-07 æ•´æœ¬å¯¼å‡ºï¼Œæ•´æ•°æ ¼ä¸å†è¢«å¥— 0.00 æ ·å¼ | æ•´æ•°ä¸” 0.00 æ ·å¼çš„æ ¼ç”±æ—§æ–‡ä»¶ 972 å¤„降至 34 å¤„(剩余 34 å¤„为母版本身预设 0.00 æ ·å¼ï¼Œéžæœ¬æ¬¡å¯¼å‡ºæ–°å¢žï¼‰ï¼›0.00 æ ·å¼æ€»æ•° 10588→9650 | PASS |
| 2 | æ±‡æ€»è¡¨å°æ•°æ ¼ä»ä¸¤ä½æ˜¾ç¤ºã€ä¿ç•™å…¨ç²¾åº¦ï¼ˆæ­£å‘) | éžæ•´æ•°æ ¼æ˜¾ç¤º 0.00、数值精度不变 | æŠ½æŸ¥ä¸­å£å¾„分析 B4=11204.5406 ç­‰ä»æŒ‰ 0.00 æ˜¾ç¤ºä¸”存储全精度;非整数纯数值格无遗漏(nonint-plain=0) | PASS |
| 3 | åˆ—宽按内容加宽(正向) | å„页签列宽只增不减 | ä¸­å£å¾„分析 B/D/H、城市汇总、货运量排名、城市分市州、班线包车等抽查列宽均加宽(如货运量排名 Q åŽŸæœªè®¾å®½åº¦â†’21、B→21);max å®½ 36 ä»¥å†… | PASS |
| 4 | ç‹¬ç«‹æŠ¥è¡¨å›žå½’(wycSplit 2026-07) | æ•´æ•°ä¸å¸¦ .00、非整数全部 0.00 | æ•´æ•°ä¸” .00 æ ¼=0;188 ä¸ªéžæ•´æ•°æ ¼å…¨éƒ¨ 0.00 æ˜¾ç¤º | PASS |
| 5 | ç¼–译与启动回归 | mvn compile EXIT=0、后端重启就绪 | ç¼–译 EXIT=0;8090 å¯åЍ OK | PASS |
## å‘现的问题与处置
1. æ¯ç‰ˆè‡ªèº«ä»æœ‰ 34 ä¸ªâ€œæ•´æ•°æ ¼é¢„设 0.00 æ ·å¼â€ï¼ˆå±žç‰ˆå¼è®¾è®¡è€Œéžå¯¼å‡ºäº§ç”Ÿï¼‰ï¼Œå¦‚需彻底去掉需改母版样式,本次不动。
2. æ±‡æ€»è¡¨æ¯ç‰ˆå­˜åœ¨æ•°æ®é—®é¢˜ï¼ˆ7月当月块错用累计值,涉及 5 ä¸ªé¡µç­¾ï¼‰ï¼Œå±žæ•°æ®å±‚问题、非本次格式修改范围,另见《汇总表母版数据体检与待决策清单_2026-09-04.md》。
## ç»“论
两项修改通过测试:整数不再显示 .00;汇总表导出后列宽按内容自适应加宽;非整数格仍显示两位小数并保留全精度。
docs/¹¦ÄܲâÊÔ±¨¸æ/¹¦ÄܲâÊÔ±¨¸æ_¹æÉϹæÏ²ð·ÖÔ·Ýҳǩʶ±ð_2026-09-04.md
New file
@@ -0,0 +1,27 @@
# åŠŸèƒ½æµ‹è¯•æŠ¥å‘Šï¼šè§„ä¸Šè§„ä¸‹æ‹†åˆ†å¯¼å…¥æ”¯æŒâ€œN月份”页签(2026-09-04)
## åŠŸèƒ½è¯´æ˜Ž
《规上规下拆分》数据源文件(如《2026å¹´1-N月公路货运量(分市州).xlsx》)的页签命名为“1月份…N月份 / 1月累计…N月累计”。原导入逻辑只识别“当月/累计”,导致“N月份(当月)”页签被整体跳过:库里 04-07 åªæœ‰ CUMULATIVE(累计)行、无 MONTH(当月)行。
本次改动(`DataImportService.importScaleSplit`,2 è¡Œï¼‰ï¼š
- é¡µç­¾æŽ¢æµ‹ï¼š`sn.contains("当月") || sn.contains("累计")` â†’ å¢žåŠ  `|| sn.contains("月份")`;
- å½“月份判定:`sheetName.contains("当月")` â†’ `sheetName.contains("当月") || sheetName.contains("月份")`。
## æµ‹è¯•环境
- åŽç«¯ 8090(2026-09-04 15:48 é‡å¯ï¼ŒåŠ è½½æœ¬æ”¹åŠ¨ï¼‰ï¼›MySQL 127.0.0.1:3308。
- éªŒè¯å¯¹è±¡ï¼šã€Š2026å¹´1-6月公路货运量(分市州).xlsx》(D:\桌面\测试数据\货运\6月)页签 12 ä¸ªï¼ˆ1-6月累计+1-6月份)。
## ç”¨ä¾‹ä¸Žç»“æžœ
| ç”¨ä¾‹ | è¾“å…¥ | é¢„期 | å®žé™… | ç»“论 |
|---|---|---|---|---|
| ç¼–译 | mvn -o compile | EXIT=0 | EXIT=0 | PASS |
| é¡µç­¾è¯†åˆ«ï¼ˆé™æ€éªŒè¯ï¼‰ | å®žæµ‹æ–‡ä»¶é¡µç­¾â€œ6月份/6月累计…” | ä¸¤ç§é¡µç­¾å‡å¯è¢«æ–°æ¡ä»¶å‘½ä¸­ï¼ˆæœˆä»½â†’MONTH、累计→CUMULATIVE) | ä»£ç æ¡ä»¶ä¸Žæ–‡ä»¶é¡µç­¾å‘½åé€ä¸€æ¯”对一致;“6月累计”含“累计”,两种写法不再有遗漏 | PASS |
| å¸ƒå±€å…¼å®¹ï¼ˆé™æ€éªŒè¯ï¼‰ | â€œ6月份”与“6月累计”前 3 è¡Œè¡¨å¤´ | ä¸Žå¯¼å…¥å™¨éªŒæ”¶è§„则(市州/规上…/周转量子表头)一致 | ä¸¤é¡µç­¾ç¬¬2行A=市州、B=规上企业运输量,第3行B=周转量…,走“仅周转量”分支,列位对齐 | PASS |
| åŽç«¯å°±ç»ª | é‡å¯ start-dev.ps1 | 8090 å°±ç»ª | Started TrafficAuditApplication 15:48:09,端口响应正常 | PASS |
| ç«¯åˆ°ç«¯é‡å¯¼ | ç”¨çœŸå®žæ–‡ä»¶é‡å¯¼ 04-07(落库) | è¡¥å‡ºå½“月行 | æœªæ‰§è¡Œï¼šéœ€ç”¨æˆ·åœ¨å¯¼å…¥é¡µé‡å¯¼ç¡®è®¤ï¼ˆé¿å…å¯¹å…±äº«åº“自行写数) | å¾…回归 |
## å‘现的问题与处置
1. æ—§æ•°æ® 04-07 åªæœ‰ç´¯è®¡è¡Œï¼šå¤„ç½®=用户按拍板第 3 æ¡å…è®¸é‡å¯¼ï¼ŒåŽç«¯å·²å°±ç»ªï¼Œç”¨åŽŸæ–‡ä»¶é‡å¯¼å³å¯è¡¥å‡ºå½“æœˆ(MONTH)行。
2. æ•°æ®ç¼ºå£ 01-03(拆分当月+累计均无):见《docs/生成汇总大表/数据导入现状与缺口清单_2026-09-04.md》第三部分,用户补导。
## ç»“论
代码改动就绪、编译与静态布局验证通过、后端已加载;端到端“重导补当月行”留待用户在导入页用真实文件回归(推荐同时抽查 04 ä¸Ž 06 å„一笔与源文件逐格对齐)。
docs/¹¦ÄܲâÊÔ±¨¸æ/¹¦ÄܲâÊÔ±¨¸æ_Ô¤ÀÀÖ¸±êÃû³ÆÏÔʾÓë»õÔËÁ¿ºÏ¼Æµ¥Î»ÐÞÕý_2026-09-04.md
New file
@@ -0,0 +1,24 @@
# åŠŸèƒ½æµ‹è¯•æŠ¥å‘Šï¼šæŠ¥è¡¨é¢„è§ˆæŒ‡æ ‡åç§°æ˜¾ç¤ºä¸Žè´§è¿é‡åˆè®¡å•ä½ä¿®æ­£ï¼ˆ2026-09-04)
## åŠŸèƒ½è¯´æ˜Ž
- æŠ¥è¡¨ç”Ÿæˆç•Œé¢â€œé¢„览数据”弹窗中,指标名称列始终空白、单位不展示:后端 summary è¡Œå­—段为 label/value/unit,前端模板误读 s.name,导致只剩数值、看不出每行是什么指标。
- â€œè´§è¿æŠ¥è¡¨â€é¢„览中的“全省累计货运量(合计)”数值被再 Ã·10000:模板_货运量周转量表表头即“货运量(万吨)”,数据库按万吨原样入库,代码又当“吨”除以 1 ä¸‡ï¼Œé¢„览出现 åˆè®¡â‰ˆ8.03 ä¸‡å¨ã€è§„下≈-19730 ä¸‡å¨ çš„错误结果。
## æ”¹åЍ
- traffic-audit-web/src/views/ReportExport.vue:预览 summary è¡¨æ ¼é¦–列改为 s.label,并新增第三列展示单位(s.unit)。
- traffic-audit-server/.../ReportExportService.java:freightPreview å…¨çœç´¯è®¡è´§è¿é‡åˆè®¡ä¸å† Ã·10000,直接以万吨展示。
## æµ‹è¯•环境
- åŽç«¯ 8090(重新编译并重启,backend.log æ˜¾ç¤º Started TrafficAuditApplication);前端 8080(vue-cli serve çƒ­ç¼–译生效)。
- MySQL 127.0.0.1:3308 traffic_audit(2026-05 æ•°æ®ï¼šæ¨¡æ¿_货运量周转量 18 è¡Œã€H203-2 æœˆæŠ¥ 636 è¡Œã€æ‹†åˆ†è¡¨ 90 è¡Œï¼‰ã€‚
## ç”¨ä¾‹ä¸Žç»“æžœ
1. åŽç«¯æŽ¥å£æ­£å‘:GET /api/report/preview?period=2026-05&cycle=month&types=cityDetail,返回六行 summary。
   - å…¨çœç´¯è®¡è´§è¿é‡ï¼ˆåˆè®¡ï¼‰= 80293.3268 ä¸‡å¨ï¼›å…¶ä¸­è§„上 = 19738.4516 ä¸‡å¨ï¼›å…¶ä¸­è§„下 = 60554.8752 ä¸‡å¨ï¼ˆè§„下为正,合计=规上+规下 è‡ªæ´½ï¼‰ã€‚
   - å…¨çœç´¯è®¡å‘¨è½¬é‡ï¼ˆåˆè®¡ï¼‰= 10784476.1971832 ä¸‡å¨å…¬é‡Œï¼›è§„上 3067064.95;规下 7717411.24。结论 PASS。
2. å‰ç«¯å±•示正向:已编译产物 ReportExport chunk ä¸­å« s.label ä¸Žå•位列、不再含 s.name;弹窗表格首列将显示指标名称。结论 PASS。
3. å›žå½’:货运量分市州明细/货运量排名/周转量排名导出接口仍 200 è¿”回 xlsx(导出数值逻辑未受影响)。结论 PASS。
4. æ•°æ®æºç¼ºå£ï¼ˆéžæœ¬æ¬¡æ”¹åŠ¨ï¼Œå¦è¡Œè·Ÿè¿›ï¼‰ï¼šæ¨¡æ¿_货运量周转量 last_*(去年)列 2026-04~07 å…¨ç©ºï¼›æ‹†åˆ†è¡¨æ—  MONTH å½“月行且货运量三列全空——导致 5 æœˆï¼ˆåŠ 4/6/7 æœˆï¼‰æŽ’名同比列、周转量当月页仍为空,需业务补数据文件后重导。
## ç»“论
两处缺陷修复完成并验证通过;预览弹窗将能显示指标名+单位,货运量合计不再出现 8.03 ä¸‡å¨ã€è´Ÿè§„下等误导性数字。
docs/³ÇÊпÍÔË/Ä£°å_ÍøÔ¼³µ×ÜÊý.xlsx
Binary files differ
docs/³ÇÊпÍÔË/Ä£°å_ÍøÔ¼³µ¶©µ¥¼°È«Ê¡×ÜÁ¿.xlsx
Binary files differ
docs/¹¤×÷ÈÕ½á/¹¤×÷ÈÕ½á_2026-09-04.md
New file
@@ -0,0 +1,33 @@
# å·¥ä½œæ—¥ç»“ 2026-09-04
## ä»Šæ—¥å®Œæˆ
1. ä»£ç ï¼ˆå‡ç¼–译通过、后端已重启生效,commit fc2e76b / a9e6c0b å·²æŽ¨é€ gitea):
   - è§„上规下拆分导入:支持“N月份/N月累计”页签识别,并按目标报表期只取对应月页签(避免 1-N æœˆæ•´åŒ…文件产生多页签脏数据)。
   - è´§è¿å®¡æ ¸ RULE_006:整车吨位按“整车平均吨位=整车吨位÷整车数”判定 4~40(黄冈启程物流 357t/23辆 ä¸å†è¯¯æŠ¥ï¼‰ï¼›é‡è·‘ 2026-07 H2032 å®¡æ ¸éªŒè¯ï¼ˆRULE_006 å‘½ä¸­ 8 æ¡å‡æŒ‰æ–°å£å¾„)。
   - å®¡æ ¸æç¤ºæ•°å­—去科学计数法(fmt/fmt4 æ”¹ toPlainString)。
   - æ•°æ®æŸ¥çœ‹â€œå…¨å±æŸ¥çœ‹â€è¿žåŒåˆ†é¡µå™¨ä¸€èµ·å…¨å±ï¼ˆDataView.vue),待浏览器人工确认。
2. æ•°æ®å¯¼å…¥ï¼ˆé…åˆç”¨æˆ·ï¼‰ï¼š
   - ç”¨ã€Š2026å¹´1-6月公路货运量(分市州)》重导 2026-04/05/06 æ‹†åˆ†ï¼ˆæ¯æœŸ 36 è¡Œ=当月18+累计18,武汉 6 æœˆå½“月周转量 687103.88 ä¸Žæºæ–‡ä»¶ä¸€è‡´ï¼‰ï¼›
   - ç”¨æˆ·è‡ªè¡Œé‡å¯¼ 2026-07 æ‹†åˆ†ä¸Žè¡¥å¯¼ 01-03:库内规上规下拆分 2026-01~07 å·²å…¨é½ï¼ˆå„ 18 MONTH+18 CUMULATIVE)。
   - çŽ°çŠ¶ï¼šå…¬äº¤/出租/个体客运/H203-1(01-08)/货运量周转量(04-07,07 å†…嵌 1-7 æœˆï¼‰/网约车(01-07)均有数据。
3. æ–‡æ¡£ï¼šæ•°æ®å¯¼å…¥çŽ°çŠ¶ä¸Žç¼ºå£æ¸…å•ã€æ¯ç‰ˆä½“æ£€æ¸…å•è¿½åŠ æ‹æ¿è®°å½•ã€åŠŸèƒ½æµ‹è¯•æŠ¥å‘ŠÃ—3。
## é—留问题与待办(明早优先)
- ~~P0 æ±‡æ€»å¤§è¡¨â€œ1-6 æœˆç”Ÿæˆ + 1-7 æœˆæ‰©åˆ—”程序改造与对照验证~~(已完成,见文末“晚间追加”,2026-09-04 å¤œï¼‰ã€‚
- P1 åŸŽå¸‚客运公交/出租“同事版模板”列位兼容(等同事文件或表头)。
- P1 æ¯ç‰ˆä¿®æ­£ï¼ˆæ–¹æ¡ˆ A:当月块错用累计值、右侧 #REF! æ¸…理)后再作为母版;docs/生成汇总大表 ä¸‹æœªæäº¤çš„ xlsx æ”¹åŠ¨å¾…ä¸€å¹¶å¤„ç†ã€‚
- P2 ç½‘约车拆分/汇总工作簿生成接入前端选项(如尚未完成);生成产物命名与输出目录确认。
- åŽç«¯/前端代码已就绪并运行中(8090/8080),开机后直接继续即可。
## å¤‡æ³¨
- å®¡æ ¸ç»“果已按新口径重算(2026-07 H2032);如之后继续重导 07 æ‹†åˆ†/全口径,需再点一次“审核”刷新。
- ä»Šæ—¥æœªå®Œæˆé¡¹ä¸åˆ ç”¨æˆ·ä¸´æ—¶æ–‡ä»¶ï¼›ä¸´æ—¶è„šæœ¬ç•™åœ¨ä»“åº“æ ¹ç›®å½•ï¼ˆ_*.py/_*.sql ç­‰ï¼‰æœªæ¸…理。
## æ™šé—´è¿½åŠ ï¼ˆ2026-09-04 20:3x,加班完成 P0)
- P0「1-6 æœˆç”Ÿæˆ + 1-7 æœˆæ‰©åˆ—」程序改造与对照验证已完成:
  - ä»£ç ï¼š`ReportExportService.exportSummaryWorkbook` å¢žåŠ å¯é€‰ `toMonth` è£å‰ª + `trimSummaryMonthlySheets`(8 å°è´¦/合成页:7 æœˆå½“月值/同比数据格清空、表头保留,Q ç´¯è®¡åŽ» 7 æœˆé¡¹ã€R ç´¯è®¡åŒæ¯”分母去 2025 å¹´ 7 æœˆåˆ—);控制器 `/export/summaryWorkbook` å¢žåŠ  `toMonth` å‚数。
  - äº§ç‰©ï¼ˆç¨‹åº HTTP å®žè·‘生成,已落盘):`docs/生成汇总大表/输出/道路运输量汇总表_2026-07.xlsx`、`_2026-06.xlsx`。
  - éªŒè¯ï¼š07 ä¸Žå¤‡ä»½æ¯ç‰ˆå…¨ç°¿é€æ ¼ 0 å·®å¼‚ï¼›06 éžç™½åå• 0 å·®å¼‚、O/P æ•°æ®æ¸…空 1132 æ ¼ã€Q/R å…¬å¼å„改写 566 å¤„、表头保留 24 æ ¼å…¨å¯¹ã€‚报告:`docs/功能测试报告/功能测试报告_汇总大表1-6月生成与1-7月扩列验证_2026-09-04.md`。
  - é—留(新):成品聚合页(排名/汇总/分析/总周转量)为母版静态 1-7 å£å¾„,需 P2-P5 æ•°æ®é©±åŠ¨å¡«å……åŽå†çº³å…¥ 1-6 éªŒæ”¶ã€‚
- æ˜Žæ—¥å¾…办更新:P0 å·²ä»Žæ¸…单移除;P1(同事版公交/出租模板列位兼容、母版方案 A ä¿®æ­£åŽæäº¤éª¨æž¶æ¯ç‰ˆä¸Žä¸¤æœ¬ xlsx å˜æ›´ï¼‰ä¿æŒï¼›P2(成品聚合页重算、汇总工作簿前端接入)跟进。
docs/Éú³É»ã×Ü´ó±í/Êý¾Ýµ¼ÈëÏÖ×´Óëȱ¿ÚÇåµ¥_2026-09-04.md
New file
@@ -0,0 +1,76 @@
# æ•°æ®å¯¼å…¥çŽ°çŠ¶ä¸Žç¼ºå£æ¸…å•ï¼ˆ2026-09-04 å¿«ç…§ï¼‰
> ç”¨é€”:支撑“先生成 1-6 æœˆã€1-7 æœˆæ‰©åˆ—”验证(今日拍板第 6、7 æ¡ï¼‰ã€‚
> æ•°æ®æ¥æºï¼š`import_batch` + ä¸šåŠ¡è¡¨è¡Œæ•°ï¼Œå¿«ç…§æ—¶é—´ 2026-09-04 15:5x;库:traffic_audit(127.0.0.1:3308)。
## ä¸€ã€å„模块「数据类型 â†” æºæ–‡ä»¶ã€å¯¹ç…§ï¼ˆå¯¼å…¥ä¸‹æ‹‰ç”¨ï¼‰
| æ•°æ®ç±»åž‹(下拉) | åº“表 | å¸¸ç”¨æºæ–‡ä»¶ |
|---|---|---|
| è´§è¿ä¼ä¸šæœˆæŠ¥(H203-2) | h2032_enterprise_monthly | ã€Šé“路货物运输月度生产情况表》/H203-2 |
| è´§è¿é‡å‘¨è½¬é‡(全口径) | freight_turnover_import | ã€Šå®šç¨¿-湖北省各市州运输量数据(2026å¹´1-N月).xlsx》/《模板_货运量周转量.xlsx》 |
| è§„上规下拆分 | scale_split_transport | ã€Š2026å¹´1-N月公路货运量(分市州).xlsx》(页签“N月份 / N月累计”)/《模板_规上规下拆分运输量.xlsx》 |
| å…¬è·¯æ—…客企业月报(H203-1) | h2031_enterprise_monthly | ã€Šå…¬è·¯æ—…客运输月度生产情况(2026å¹´N月).xls》 |
| ä¸ªä½“客运月报 | passenger_individual_monthly | ã€Šæ¹–北省公路旅客运输个体户月度生产情况(2026.N).xlsx》 |
| åŸŽå¸‚公交月报 | city_bus_monthly | ã€ŠåŸŽå¸‚公共交通月度运营情况(2026å¹´N月).xls》 |
| å·¡æ¸¸å‡ºç§ŸæœˆæŠ¥ | city_taxi_monthly | ã€Šå·¡æ¸¸å‡ºç§Ÿæ±½è½¦è¿è¥æœåŠ¡æƒ…å†µæœˆæŠ¥ï¼ˆ2026å¹´N月).xls》 |
| ç½‘约车订单及全省总量 | wyc_order_monthly | ã€Šç½‘约车订单及全省总量.xlsx》 |
| ç½‘约车总数 | wyc_total_monthly | ã€Šç½‘约车总数.xlsx》 |
## äºŒã€2026 å¹´ 1-8 æœˆå¤§è¡¨è¾“入导入矩阵
图例:● å·²æœ‰æˆåŠŸå¯¼å…¥è®°å½•ï¼›â€” ç¼ºï¼›â–² å·²å¯¼ä½†éœ€å‡çº§åŽé‡å¯¼ï¼ˆå½“月块缺失);△ å·²å¯¼ä½†æ–‡ä»¶å‘½åå­˜ç–‘待核对。
| æ•°æ®ç±»åž‹ï¼¼æœˆä»½ | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 |
|---|---|---|---|---|---|---|---|---|
| è´§è¿ä¼ä¸šæœˆæŠ¥(H203-2) | â— | â— | â— | â— | â— | â— | â— | â— |
| è´§è¿é‡å‘¨è½¬é‡(全口径) | â€” | â€” | â€” | â— | â— | â—(注1) | â— | â€” |
| è§„上规下拆分 | â€” | â€” | â€” | â–² | â–² | â–² | â–² | â€” |
| å…¬è·¯æ—…客企业月报(H203-1) | â€” | â€” | â— | â— | â— | â— | â— | â— |
| ä¸ªä½“客运月报 | â€” | â€” | â€” | â— | â–³(注2) | â— | â— | â€” |
| åŸŽå¸‚公交月报 | â€” | â€” | â€” | â— | â— | â— | â— | â€” |
| å·¡æ¸¸å‡ºç§ŸæœˆæŠ¥ | â€” | â€” | â€” | â— | â— | â— | â— | â€” |
| ç½‘约车订单及全省总量 | â— | â— | â— | â— | â— | â— | â— | â€” |
| ç½‘约车总数 | â— | â— | â— | â— | â— | â— | â— | â€” |
注 1:货运量周转量 2026-06 çš„两笔导入均使用《定稿-…(2026å¹´1-5月)》文件(09-04 09:45/09:46),若 6 æœˆæœ‰ç‹¬ç«‹å®šç¨¿æ–‡ä»¶å»ºè®®é‡å¯¼è¦†ç›–核对。
注 2:个体客运 2026-05 å¯¼å…¥çš„æ–‡ä»¶åæ˜¯ã€Šâ€¦ï¼ˆ2026.3)》,内容是否确为 5 æœˆæ•°æ®éœ€äººå·¥æ ¸å¯¹ï¼Œå¿…要时重导。
注 3:规上规下拆分 04-07 ç›®å‰åªæˆåŠŸå¯¼å…¥â€œç´¯è®¡(1-N月)”行;**“N月份(当月)”行此前被导入逻辑跳过**,需升级后端后按原文件重导补当月行(见第三部分)。
注 4:巡游出租 2026-07 æ›¾åœ¨ 08-26 è¯¯ç”¨å…¬äº¤æ¨¡æ¿å¯¼å…¥ 142 è¡Œï¼ŒéšåŽå·²ç”¨å‡ºç§Ÿæ¨¡æ¿é‡å¯¼è¦†ç›–为 17 è¡Œï¼ˆåº“内正常)。
## ä¸‰ã€1-4 æœˆç¼ºå£æ¸…单(请按此补导/重导)
直接用于“1-6 æœˆç”Ÿæˆâ€éªŒè¯ï¼Œè¶Šæ—©å¯¼é½è¶Šæ—©å¼€è·‘。全部通过现有导入页面即可操作。
| # | æ•°æ®ç±»åž‹ | ç¼ºçš„æœˆä»½ | è¯´æ˜Ž |
|---|---|---|---|
| 1 | è´§è¿é‡å‘¨è½¬é‡(全口径) | 2026-01、02、03 | ç”¨ã€Šå®šç¨¿-湖北省各市州运输量数据(2026å¹´1-3月)…》等对应文件;每期 18 è¡Œï¼ˆå…¨çœ+17 å¸‚州) |
| 2 | è§„上规下拆分 | 2026-01、02、03 | ç”¨ã€Š2026å¹´1-N月公路货运量(分市州).xlsx》;每期应得 å½“月+累计 ä¸¤ç»„行 |
| 3 | è§„上规下拆分(重导) | 2026-04~07 | å…ˆé‡å¯åŽç«¯ï¼ˆå·²åŠ â€œN月份”页签识别),再按原文件重导,补出 04-07 çš„当月(MONTH)行 |
| 4 | å…¬è·¯æ—…客企业月报(H203-1) | 2026-01、02 | ç”¨ã€Šå…¬è·¯æ—…客运输月度生产情况(2026å¹´1/2月).xls》 |
| 5 | ä¸ªä½“客运月报 | 2026-01、02、03 | ç”¨ã€Šâ€¦ä¸ªä½“户月度生产情况(2026.1~3).xlsx》 |
| 6 | åŸŽå¸‚公交月报 | 2026-01、02、03 | ç”¨ã€ŠåŸŽå¸‚公共交通月度运营情况(2026å¹´1-3月).xls》 |
| 7 | å·¡æ¸¸å‡ºç§ŸæœˆæŠ¥ | 2026-01、02、03 | ç”¨ã€Šå·¡æ¸¸å‡ºç§Ÿæ±½è½¦è¿è¥æœåŠ¡æƒ…å†µæœˆæŠ¥ï¼ˆ2026å¹´1-3月).xls》 |
| 8 | ç½‘约车订单/总量 | ï¼ˆå·²é½ï¼‰ | 01-07 å‡å·²å¯¼å…¥ï¼Œæ— éœ€è¡¥ |
| 9 | æŠ•资月报 | 2026-01~05 | åº“内只有 06-09;若投资模块不在本次 1-6 æœˆéªŒè¯èŒƒå›´å¯åŽè¡¥ |
> æ³¨ï¼šæ‹†åˆ†æœˆæŠ¥ 1-6 æœˆæ–‡ä»¶å®žæµ‹é¡µç­¾å³ä¸ºâ€œ1月份…6月份 / 1月累计…6月累计”格式;旧程序只识别“当月/累计”导致当月行全部被跳过,本次已加“月份”识别,重导即可补齐当月行。
## å››ã€2025 å¹´å®šç¨¿æ•°æ®çŽ°çŠ¶ï¼ˆæ‹æ¿ç¬¬ 4 æ¡ï¼‰
- è´§è¿ä¼ä¸šæœˆæŠ¥(H203-2):2025-01~12 å·²å…¨é‡å¯¼å…¥ï¼ˆæ¯æœŸ 664 è¡Œï¼‰ã€‚
- å…¶ä½™æ¨¡å—:库里暂无 2025 å¹´æ•°æ®è¡Œã€‚
  - å…¨å£å¾„《货运量周转量》每月文件的右半本就是“去年 1-12 æœˆâ€åˆ—(last_*,随 2026 å¹´è¡Œå†…嵌),与母版右侧 2025 åˆ—同源;
  - è‹¥è¦æ±‚ 2025 æ‹†åˆ†/城市客运/公路旅客等也按“导入定稿”而非“母版缓存”处理,请告知范围(哪些模块、哪几个月份的文件),我再按模块列出清单。
## äº”、待办(对应今日拍板)
1. é‡å¯åŽç«¯åŠ è½½â€œN月份”识别(代码已改、编译通过,尚未重启)。✅下一步执行
2. æŒ‰ç¬¬ä¸‰éƒ¨åˆ†è¡¥å¯¼/重导后,跑“1-6 æœˆç”Ÿæˆ + 1-7 æœˆæ‰©åˆ—”验证并出产物(拍板第 7 æ¡ï¼‰ã€‚
3. æ¯ç‰ˆæŒ‰â€œæ•°æ®å’Œå…¬å¼æ”¹å¯¹åŽä½œä¸ºæ¯ç‰ˆâ€å¤„理(拍板第 5 æ¡ï¼Œå³ä½“检清单方案 A ä¿®æ­£ï¼‰ã€‚
4. ç‹¬ç«‹å°è¡¨ä¿ç•™ä¸åˆ ï¼ˆæ‹æ¿ç¬¬ 1 æ¡ï¼‰ï¼Œå¾…大表验证通过后再议下线。
5. å…è®¸é‡å¤å¯¼å…¥å·²ç”Ÿæ•ˆï¼ˆæŒ‰æŠ¥è¡¨æœŸå…ˆåˆ åŽæ’,拍板第 3 æ¡ï¼‰ã€‚
---
## æ›´æ–°è®°å½•(2026-09-04 ä¸‹åˆ ç”¨æˆ·ç­”复后)
- å…¬äº¤/出租/个体客运/H203-1 å·²è¡¥å¯¼ï¼š2026-01~07(H203-1 è‡³ 08)现已全齐;投资模块暂不纳入本次范围(用户答复)。
- è´§è¿é‡å‘¨è½¬é‡ï¼š2026-02 å·²æœ‰å¯¼å…¥è¡Œï¼›ç”¨æˆ·ç­”复“7月表格已含 1-7 æœˆæ¯æœˆæ•°æ®â€ä¸”已重新导入(2026-04~07 åœ¨åº“,01、03 æ— ç‹¬ç«‹è¡Œä½† 07 è¡Œå†…嵌各月列值,取数时按 m01~m07 ä½¿ç”¨ï¼‰ã€‚
- è§„上规下拆分导入已升级为“按目标报表期取页签”(只导入 {目标月}月份/{目标月}累计,不再把 1-N æœˆå…¨éƒ¨é¡µç­¾å¡žè¿›åŒä¸€æœŸï¼‰ï¼Œå¹¶å·²ç”¨ã€Š2026å¹´1-6月公路货运量(分市州).xlsx》重导 2026-04/05/06 éªŒè¯ï¼šæ¯æœŸ = å½“月 18 è¡Œ + ç´¯è®¡ 18 è¡Œï¼Œæ­¦æ±‰ 6 æœˆå½“月合计周转量 687103.88 ä¸Žæºæ–‡ä»¶ä¸€è‡´ã€‚2026-07 ç›®å‰ä»ä¸ºæ—§æ•°æ®ï¼ˆ126 è¡Œç´¯è®¡ï¼‰ï¼Œå¾…用《2026å¹´1-7月公路货运量(分市州).xlsx》重导一次即可变干净(36 è¡Œï¼‰ã€‚
- è§„上规下拆分 2026-01~03 ä»ç©ºï¼šå¯å¤ç”¨ã€Š2026å¹´1-6月公路货运量(分市州)》等文件,导入页选报表期 01/02/03 å³å¯ï¼ˆç¨‹åºåªå–对应月页签),或用各月自己的定稿文件。
- åŽŸâ€œä¸ªä½“å®¢è¿ 2026-05 æ–‡ä»¶åä¸º (2026.3)”疑点已澄清:文件名写错、内容为 6 æœˆæ•°æ®ï¼Œå·²ä¿®æ”¹åŽå¯¼å…¥ï¼ˆ06 çŽ°æœ‰ 7 è¡Œï¼‰ã€‚
docs/Éú³É»ã×Ü´ó±í/»ã×ܱíĸ°æÊý¾ÝÌå¼ìÓë´ý¾ö²ßÇåµ¥_2026-09-04.md
New file
@@ -0,0 +1,45 @@
# æ±‡æ€»è¡¨æ¯ç‰ˆæ•°æ®ä½“检与待决策清单(2026-09-04)
> ç»“论先行:当前“生成_道路运输量汇总表 = æ•´æœ¬å¤åˆ¶æ¯ç‰ˆâ€ã€‚本次体检发现的问题绝大多数**存在于母版文件本身(数据层)**,不是导出程序把它算错。母版文件:docs/生成汇总大表/2026å¹´7月道路运输量汇总表.xlsx。
## ä¸€ã€å·²ç¡®è®¤é—®é¢˜ï¼ˆå½“月块错用累计值)
母版中以下 5 ä¸ªæˆå“é¡µçš„“7月当月”数据块,被复制成了“1-7月累计”数据块(数值、同比全部相同):
| é¡µç­¾ | ç´¯è®¡å— | å½“月块(错误) | ç¤ºä¾‹ | 7月当月应约为 |
|---|---|---|---|---|
| ä¸­å£å¾„分析 | r3-r7 | r12-r16 | æ€»å®¢è¿é‡ 27524.49 | â‰ˆ4028(班线 1631.20+公交城乡 1466.66+出租城乡 509.00+网约车城乡 421.46,均取 2026-07 åº“内/拆分值) |
| åŸŽå¸‚汇总 | r3-r9 | r14-r20 | æ€»å®¢è¿é‡ 237412.33 | â‰ˆ35465(公交 12974.73+巡游出租 5860.24+网约车 4852.30+轨道 11731.83+轮渡 46.05) |
| åŸŽå¸‚分市州 | r5 èµ· | r50 èµ· | å…¨çœæ€»å®¢è¿é‡ 237412.33 | åŒåŸŽå¸‚汇总单月口径 |
| è´§è¿é‡æŽ’名 | r4-r21 | r25-… | å…¨çœè§„上 27734.461 | 7月单月(远小于 1-7 ç´¯è®¡ï¼‰ |
| è´§è¿å‘¨è½¬é‡æŽ’名 | r5 èµ· | r27 èµ· | å…¨çœè§„上周转量 4357157.34 | 7月单月 |
连带影响:当月块的“同比”“排名”“占比”也随错误值一并错(如中口径分析 C12/G12 åŒ C3/G3,用的都是累计同比)。
## äºŒã€å…¶ä»–需要你拍板/留意的问题
1. æ•°æ®æºç¼ºå£ï¼ˆå½±å“â€œç¨‹åºè‡ªåŠ¨ç”Ÿæˆ 1-7 ç´¯è®¡â€ï¼‰ï¼šåº“内 h2031 ä¼ä¸šæœˆæŠ¥åªæœ‰ 2026-03、2026-07;城市公交/巡游出租只有 2026-06、2026-07;个体客运只有 2026-07。当前唯一完整的 1-7 å„月口径依据是母版台账页本身。
2. ç½‘约车月度拆分输入《网约车订单及全省总量.xlsx》目前只有 2026-07 ä¸€è¡Œï¼Œ1-6 æœˆç½‘约车各月无法由程序自动计算。
3. æ¯ç‰ˆå…¶å®ƒé—留:右侧大量 2024/更早参考列与 `#REF!` æ–­é“¾ï¼ˆå·²çŸ¥å¤„理项);页签间公式引用与“空母版填值”方案仍按 P2 è½åœ°æ–¹æ¡ˆæŽ¨è¿›ï¼ˆè¡Œåˆ—边界、月份扩展、2024 åˆ—处理、轨道轮渡入库、输出目录五项待拍板)。
## ä¸‰ã€ä¿®å¤æ–¹å‘建议(请选择/确认)
- æ–¹æ¡ˆ A(短平快,仅本月正确):按上表把母版 5 ä¸ªé¡µç­¾çš„“7月当月块”用 7 æœˆå½“月库值/拆分结果改正确,本次生成即正确;以后每月母版仍需人工保证当月块正确。
- æ–¹æ¡ˆ B(根治,推荐后续 P2 å®žçŽ°ï¼‰ï¼šå¯¼å‡ºæ—¶ä¸å†ä¿¡ä»»æ¯ç‰ˆå½“æœˆå—ï¼Œæ”¹ä¸ºâ€œå°è´¦é¡µï¼ˆä¿ç•™ 1-7 å„月)+当月库值+网约车拆分输入”自动重算成品页当月块;累计块与台账页一致性也可加入生成后自动校验。
- å…ˆåš A é¡¶ä½æœ¬æœˆæµ‹è¯•,再排期做 B。
---
## å››ã€ç”¨æˆ·æ‹æ¿è®°å½•(2026-09-04 ä¸‹åˆï¼Œè¿½åŠ ï¼‰
1. ç‹¬ç«‹å°è¡¨æš‚时保留,等汇总大表跑通后再考虑取消(=体检清单“修复方向”里小表导出不删)。
2. åŒæ„æŒ‰ä¿®æ­£åŽçš„æ¯ç‰ˆæ–¹æ¡ˆæŽ¨è¿›ã€‚
3. å…è®¸é‡æ–°å¯¼å…¥ï¼ˆç¨‹åºæŒ‰æŠ¥è¡¨æœŸå…ˆåˆ åŽæ’,已验证生效;拆分 04-07 éœ€é‡å¯¼è¡¥å½“月行)。
4. 2025 å¹´æ•°æ®æŒ‰â€œå¯¼å…¥å®šç¨¿æ•°æ®â€å¤„理;目前仅 H203-2 æœ‰ 2025-01~12,其余模块范围待用户提供文件后列出清单。
5. æ¯ç‰ˆ = æŠŠæ•°æ®å’Œå…¬å¼æ”¹å¯¹åŽçš„æ–‡ä»¶ä½œä¸ºæ¯ç‰ˆï¼ˆæ–¹æ¡ˆ A:先修正当月块错用累计值、清 #REF!,再作为母版)。
6. å·²æŒ‰è¦æ±‚输出《1-4 æœˆç¼ºæ•°æ¸…单》→ è§ã€Œæ•°æ®å¯¼å…¥çŽ°çŠ¶ä¸Žç¼ºå£æ¸…å•_2026-09-04.md」第三部分。
7. å…ˆç”Ÿæˆ 1-6 æœˆæ•°æ®ï¼Œ1-7 æœˆé€šè¿‡æ‰©åˆ—完成,做一次验证(待数据补导后执行;代码侧“N月份”识别已就绪)。
---
## äº”、追加拍板与待办(2026-09-04 17:1x,用户临下班)
- æ•°æ®ï¼ˆæ‹†åˆ†/全口径/城市客运/公路旅客)已全部导入且核验干净:规上规下拆分 2026-01~07 å„ 18 å½“月 + 18 ç´¯è®¡ã€‚
- 2025 å¹´æ•°æ®ï¼šä»¥æ¯ç‰ˆç¼“存为准,暂不批量导入;后续导入后再与母版核对。
- æ‰©åˆ—改造(1-6 æœˆç”Ÿæˆ + 1-7 æœˆæ‰©åˆ—验证):用户已确认 â€”— â‘¡ç´¯è®¡/同比按 1-6 æœˆè®¡ç®—,同比分母为 2025 å¹´ 1-6 æœˆï¼›â‘ 1-6 æœˆè¡¨ä¸­ 7 æœˆä¸¤åˆ—默认「保留表头、数据列留空」(若需整列去掉再改)。此项 17:30 å‰æœªå®Œæˆï¼ŒåŠ å…¥æ˜Žæ—©å¾…åŠžï¼ˆè§ å·¥ä½œæ—¥ç»“_2026-09-04.md)。
- åŸŽå¸‚客运公交/出租同事版模板(少 ä¼ä¸šä»£ç  ç­‰ä¸¤åˆ—)无法导入:等同事文件表头/原文件,再做列位兼容。
docs/Éú³É»ã×Ü´ó±í/×Ô¶¯Éú³É»ã×ܹ¤×÷²¾Â䵨·½°¸.md
@@ -1,5 +1,7 @@
# è‡ªåŠ¨ç”Ÿæˆã€Šé“è·¯è¿è¾“é‡æ±‡æ€»è¡¨ã€‹è½åœ°æ–¹æ¡ˆï¼ˆv0.1,2026-09-03)
> **表名阅读约定**:本文《……》均为**业务中文名**(可直接看懂);程序数据库里的英文表名(如 scale_split_transport)只给开发对照,业务人员不用记。完整对照见《输入输出与逻辑关系总表》第 5 èŠ‚ã€‚
## 1 ç›®æ ‡ä¸Žäº¤ä»˜ç‰©
- ç³»ç»ŸæŒ‰æŠ¥è¡¨æœŸè‡ªåŠ¨ç”Ÿæˆä¸€æœ¬æ±‡æ€»å·¥ä½œç°¿ï¼ˆ2026-07 æ ·ä¾‹å·²ç”±ç”¨æˆ·æ‰‹å·¥åˆ¶ä½œï¼Œä½äºŽ docs/生成汇总大表/2026å¹´7月道路运输量汇总表.xlsx)。
- äº¤ä»˜ç‰©å½¢æ€ï¼šä¸€ä¸ª .xlsx å·¥ä½œç°¿ï¼Œå†…含 15 ä¸ªå¯è§é¡µç­¾ï¼ˆç‰ˆå¼ã€å…¬å¼ã€æ ·å¼ä¸Žäººå·¥æ¯ç‰ˆä¸€è‡´ï¼‰ï¼Œéšè—é¡µï¼ˆå…¬è·¯æ€»å®¢è¿ã€2025年城市客运量、中口径客运量、中口径计算过程)保留但隐藏,本次不纳入数据加工。
@@ -16,9 +18,9 @@
## 3 é¡µç­¾æ¸…单与数据源映射
| é¡µç­¾ | å±‚ | å£å¾„与内容 | æ•°æ®æºï¼ˆåº“表/导入类型) | å¤ç”¨çŽ°æœ‰é€»è¾‘ |
|---|---|---|---|---|
| ç­çº¿åŒ…车 | 1 | å…¬è·¯ç­çº¿+包车,客运量行含个体,其中个体单独行 | h2031_enterprise_monthly、passenger_individual_monthly | ç”Ÿæˆ_公路旅客分市州 æ”¹é€ ï¼ˆä¸ªä½“并入总行已实现,2026-09-03) |
| å…¬äº¤ | 1 | å…¨çœ+市州 æ€»é‡ä¸Žå…¶ä¸­åŸŽå¸‚内 | city_bus_monthly | åŸŽå¸‚客运导出模板逻辑扩展 |
| å‡ºç§Ÿ | 1 | å·¡æ¸¸å‡ºç§Ÿï¼Œæ€»é‡=城市内 | å‡ºç§Ÿå¯¼å…¥è¡¨ï¼ˆcity_taxi ç›¸å…³ï¼‰ | åŒä¸Š |
| ç­çº¿åŒ…车 | 1 | å…¬è·¯ç­çº¿+包车,客运量行含个体,其中个体单独行 | ã€Šå…¬è·¯æ—…客运输月度生产情况表》(H203-1)、《个体客运月报表》 | ç”Ÿæˆ_公路旅客分市州 æ”¹é€ ï¼ˆä¸ªä½“并入总行已实现,2026-09-03) |
| å…¬äº¤ | 1 | å…¨çœ+市州 æ€»é‡ä¸Žå…¶ä¸­åŸŽå¸‚内 | ã€ŠåŸŽå¸‚公共交通月度运营情况表》(公交月报) | åŸŽå¸‚客运导出模板逻辑扩展 |
| å‡ºç§Ÿ | 1 | å·¡æ¸¸å‡ºç§Ÿï¼Œæ€»é‡=城市内 | ã€Šå·¡æ¸¸å‡ºç§Ÿæ±½è½¦è¿è¥æœåŠ¡æƒ…å†µæœˆæŠ¥ã€‹ï¼ˆå‡ºç§Ÿå¯¼å…¥è¡¨ï¼‰ | åŒä¸Š |
| ç½‘约车 | 1 | æ€»é‡=城市内(拆分来源待定) | ç½‘约车导入表 | åŒä¸Š |
| è½¨é“轮渡 | 1 | è½¨é“:武汉、黄石;轮渡:仅武汉 | è½¨é“/轮渡导入数据 | åŸŽå¸‚客运导出扩展 |
| åŸŽå¸‚客运 | 2 | å…¬äº¤åŸŽå¸‚内+出租+网约车+轨道轮渡 | ç”±ç¬¬ 1 å±‚合成 | æ–°åˆæˆé€»è¾‘ |
@@ -53,7 +55,7 @@
- P7 å›žå½’与报告:全量对照 2026-07 äººå·¥æ¯ç‰ˆï¼›è¾“出《功能测试报告_汇总工作簿生成_<日期>.md》(正向逐格对照、负向缺数据提示、入库抽查)。
## 6 æ•°æ®ç¼ºå£ä¸Žé£Žé™©
- 2025 åŸºæœŸï¼šåº“内 H2031 ä»… 2026-03/07、城市客运仅 2026-06/07,无 2025 æ•°æ®ï¼›2025 åŒæœŸåˆ—只能 ç•™ç©º æˆ– ä¿ç•™æ¯ç‰ˆç¼“存值,需拍板。
- 2025 åŸºæœŸï¼šã€Šå…¬è·¯æ—…客运输月度生产情况表》(H203-1) ç›®å‰åº“内仅 2026-03/07、城市客运仅 2026-06/07,无 2025 æ•°æ®ï¼›2025 åŒæœŸåˆ—只能 ç•™ç©º æˆ– ä¿ç•™æ¯ç‰ˆç¼“存值,需拍板。
- ç½‘约车拆分数据源未定:按母版现状先实现 æ€»é‡=城市内(城乡差 0),等拆分说明后再改。
- è½¨é“轮渡月度数据是否已入库、字段口径(武汉/黄石)待核对。
- åŸŽå¸‚分市州、城市汇总 ç‰ˆå¼ç»†èŠ‚éœ€å¯¹ç…§å®˜æ–¹æ ·å¼ é€æ ¼ç¡®è®¤ã€‚
docs/Éú³É»ã×Ü´ó±í/¹æÏ»õÔËÁ¿¿Ú¾¶_2026-09-04.sql
New file
@@ -0,0 +1,94 @@
-- ============================================================
-- è§„下货运量 / è§„下周转量 è®¡ç®—口径(2026-09-04 ä¸šåŠ¡ç¡®è®¤ï¼‰
-- ------------------------------------------------------------
-- ç”¨åˆ°å“ªäº›è¡¨ï¼ˆä¸­æ–‡å = ç”¨æˆ·å¹³æ—¶å«çš„名字,括号内是程序里存的表名,一般不用管):
--   â‘ ã€Šé“路货物运输月度生产情况表》= äº¤ä¼ç»ŸH203-2表,企业级月报
--      ï¼ˆåº“表名 h2032_enterprise_monthly)——里面的企业都是“规上企业”,
--      æŠŠå„市州所有企业的“货运量、货物周转量”加起来,就是“规上”合计。
--      æ³¨æ„ï¼šè¯¥è¡¨çš„货运量单位是“吨”、周转量单位是“吨公里”,
--      è€ŒæŠ¥è¡¨å•位是“万吨、万吨公里”,所以要除以 10000。
--   â‘¡ã€Šè´§è¿é‡å‘¨è½¬é‡è¡¨ã€‹ï¼ˆåº“表名 freight_turnover_import)——全省和各市州的
--      â€œå…¨å£å¾„”货运量、周转量(规上+规下都算在内),单位已经是“万吨/万吨公里”,
--      é‡Œé¢è¿˜æœ‰ä¸€è¡Œâ€œæ¹–北省”用来核对全省合计,以及去年同月列(last_*)。
--   â‘¢ã€Šè§„上规下拆分表》(库表名 scale_split_transport)——把拆分结果存下来的表
--      ï¼ˆè§„上/规下/合计,含排名、同比)。目前导入的拆分模板只有“周转量”,
--      æ‰€ä»¥è¯¥è¡¨å‘¨è½¬é‡ä¸‰åˆ—有数、货运量三列为空;货运量拆分如需落表,
--      ç”¨æŸ¥è¯¢ 3(默认不执行)回填。
-- æ ¸å¿ƒå…¬å¼ï¼ˆåˆ†å¸‚州、每个月都一样):
--   è§„上货运量(万吨) = â‘ è¡¨è´§è¿é‡åˆè®¡ Ã· 10000
--   å…¨å£å¾„货运量(万吨) = â‘¡è¡¨å½“月货运量
--   è§„下货运量(万吨) = å…¨å£å¾„ âˆ’ è§„上
--   å‘¨è½¬é‡åŒç†ï¼ˆè§„下周转量 = â‘¡è¡¨å½“月周转量 âˆ’ â‘ è¡¨å‘¨è½¬é‡åˆè®¡ Ã· 10000)
-- å…¨çœæ ¡éªŒï¼š17 ä¸ªå¸‚州相加 = â€œæ¹–北省”行 = æ±‡æ€»è¡¨ã€Šâ€œ è´§è¿â€é¡µã€‹å…¨çœæ•°
--   ï¼ˆ2026-07:货运量 16285.71 ä¸‡å¨ã€è§„上 3754.78 ä¸‡å¨ã€è§„下 12530.93 ä¸‡å¨ï¼‰
-- ============================================================
-- =====================================================================
-- æŸ¥è¯¢ 1:分市州 â€œè§„上 / å…¨å£å¾„ / è§„下” è´§è¿é‡ã€å‘¨è½¬é‡ï¼ˆ2026-07 ç¤ºä¾‹ï¼‰
--   æŠŠ '2026-07' æ¢æˆåˆ«çš„æœˆä»½ï¼ŒæŠŠ m07 æ¢æˆå¯¹åº”月号(m01~m12)即可查其他月。
-- =====================================================================
SELECT m.市州,
       ft.freight_m07  AS å…¨å£å¾„货运量_万吨,
       ROUND(gs.规上货运量_万吨, 4) AS è§„上货运量_万吨,
       ROUND(ft.freight_m07 - gs.规上货运量_万吨, 4) AS è§„下货运量_万吨,
       ft.turnover_m07 AS å…¨å£å¾„周转量_万吨公里,
       ROUND(gs.规上周转量_万吨公里, 4) AS è§„上周转量_万吨公里,
       ROUND(ft.turnover_m07 - gs.规上周转量_万吨公里, 4) AS è§„下周转量_万吨公里
FROM (
  SELECT '武汉' AS å¸‚å·ž, '武汉市' AS è¡¨å†…城市名 UNION ALL SELECT '黄石','黄石市'
  UNION ALL SELECT '十堰','十堰市' UNION ALL SELECT '宜昌','宜昌市'
  UNION ALL SELECT '襄阳','襄阳市' UNION ALL SELECT '鄂州','鄂州市'
  UNION ALL SELECT '荆门','荆门市' UNION ALL SELECT '孝感','孝感市'
  UNION ALL SELECT '荆州','荆州市' UNION ALL SELECT '黄冈','黄冈市'
  UNION ALL SELECT '咸宁','咸宁市' UNION ALL SELECT '随州','随州市'
  UNION ALL SELECT '恩施','恩施州' UNION ALL SELECT '仙桃','仙桃市'
  UNION ALL SELECT '潜江','潜江市' UNION ALL SELECT '天门','天门市'
  UNION ALL SELECT '林区','林区'
) m
LEFT JOIN freight_turnover_import ft -- â‘¡ã€Šè´§è¿é‡å‘¨è½¬é‡è¡¨ã€‹ï¼šå…¨å£å¾„总量月报
  ON ft.report_period = '2026-07' AND ft.region_name = m.表内城市名
LEFT JOIN (
  SELECT CASE
           WHEN region_code LIKE '4201%' THEN '武汉' WHEN region_code LIKE '4202%' THEN '黄石'
           WHEN region_code LIKE '4203%' THEN '十堰' WHEN region_code LIKE '4205%' THEN '宜昌'
           WHEN region_code LIKE '4206%' THEN '襄阳' WHEN region_code LIKE '4207%' THEN '鄂州'
           WHEN region_code LIKE '4208%' THEN '荆门' WHEN region_code LIKE '4209%' THEN '孝感'
           WHEN region_code LIKE '4210%' THEN '荆州' WHEN region_code LIKE '4211%' THEN '黄冈'
           WHEN region_code LIKE '4212%' THEN '咸宁' WHEN region_code LIKE '4213%' THEN '随州'
           WHEN region_code LIKE '4228%' THEN '恩施' WHEN region_code LIKE '429004%' THEN '仙桃'
           WHEN region_code LIKE '429005%' THEN '潜江' WHEN region_code LIKE '429006%' THEN '天门'
           WHEN region_code LIKE '429021%' THEN '林区' END AS å¸‚å·ž,
         SUM(freight_total) / 10000  AS è§„上货运量_万吨,    -- â‘ è¡¨â€œè´§è¿é‡â€åˆè®¡ï¼Œå¨Ã·10000→万吨
         SUM(turnover_total) / 10000 AS è§„上周转量_万吨公里 -- â‘ è¡¨â€œå‘¨è½¬é‡â€åˆè®¡ï¼Œå¨å…¬é‡ŒÃ·10000→万吨公里
  FROM h2032_enterprise_monthly      -- â‘ ã€Šé“路货物运输月度生产情况表》(H203-2,规上企业)
  WHERE report_period = '2026-07'
  GROUP BY å¸‚å·ž
) gs ON gs.市州 = m.市州;
-- =====================================================================
-- æŸ¥è¯¢ 2:全省校验(看程序算的全省数对不对)
--   æœŸæœ›å€¼ = 2026-07:规上货运量 3754.78;规上周转量 597278.64;
--            å…¨å£å¾„货运量 16285.71(母版 O5);全口径周转量 2181925.71。
-- =====================================================================
SELECT
  (SELECT ROUND(SUM(freight_total)/10000, 4) FROM h2032_enterprise_monthly -- â‘ è¡¨
    WHERE report_period='2026-07' AND (region_code LIKE '42%' OR region_code LIKE '4290%')) AS å…¨çœè§„上货运量_万吨,
  (SELECT ROUND(SUM(turnover_total)/10000, 4) FROM h2032_enterprise_monthly -- â‘ è¡¨
    WHERE report_period='2026-07' AND (region_code LIKE '42%' OR region_code LIKE '4290%')) AS å…¨çœè§„上周转量_万吨公里,
  (SELECT freight_m07 FROM freight_turnover_import      -- â‘¡è¡¨â€œæ¹–北省”行
    WHERE report_period='2026-07' AND region_name='湖北省') AS å…¨çœå…¨å£å¾„货运量_万吨,
  (SELECT turnover_m07 FROM freight_turnover_import     -- â‘¡è¡¨â€œæ¹–北省”行
    WHERE report_period='2026-07' AND region_name='湖北省') AS å…¨çœå…¨å£å¾„周转量_万吨公里;
-- =====================================================================
-- æŸ¥è¯¢ 3(可选,默认不执行):把“货运量拆分”回填到《规上规下拆分表》
--   æ³¨æ„ï¼šè¯¥è¡¨çŽ°åœ¨åªæœ‰â€œç´¯è®¡ï¼ˆCUMULATIVE)”口径的周转量行;
--   å›žå¡«è´§è¿é‡éœ€è¦å…ˆæƒ³æ¸…楚是“当月”还是“1-月累计”口径,
--   ç´¯è®¡å£å¾„要先把 1~7 æœˆé€æœˆç®—出来再加总。确认口径后再放开注释执行。
-- =====================================================================
-- UPDATE scale_split_transport   -- â‘¢ã€Šè§„上规下拆分表》
-- JOIN (查询 1 çš„结果) d ON d.市州 = å¸‚州名
-- SET above_scale_freight = d.规上货运量_万吨,
--     below_scale_freight = d.规下货运量_万吨,
--     total_freight       = d.全口径货运量_万吨
-- WHERE report_period='2026-07' AND period_type='MONTHLY';
docs/Éú³É»ã×Ü´ó±í/ÊäÈëÊä³öÓëÂß¼­¹ØÏµ×ܱí_2026-09-03.md
@@ -1,7 +1,8 @@
# æŠ¥è¡¨ç”Ÿæˆè¾“入输出与逻辑关系总表(2026-09-03 ç‰ˆï¼‰
# æŠ¥è¡¨ç”Ÿæˆè¾“入输出与逻辑关系总表(2026-09-03 ç‰ˆï¼Œ2026-09-04 å¢žè¡¥ï¼‰
> å£å¾„汇总入口:把“报表生成(城市客运/汇总工作簿)”相关功能的输入表、页签关系、逻辑运算汇总如下。
> è¯¦ç»†å±•开见两篇专题:`docs/生成汇总大表/页签逻辑关系说明.md`(19 é¡µä¸‰å±‚结构与勾稽)、`docs/生成汇总大表/自动生成汇总工作簿落地方案.md`(P0-P7 è½åœ°æ–¹æ¡ˆï¼‰ã€‚
> 2026-09-04 å¢žè¡¥ï¼šç¬¬ 5 èŠ‚ã€Šç¨‹åºç›¸å…³åº“è¡¨æ€»è§ˆä¸Žç›¸äº’å…³ç³»ã€‹ã€ç¬¬ 6 èŠ‚ã€Šå•ä½ä¸Žæ•°å€¼æ¢ç®—è§„èŒƒã€‹ã€ç¬¬ 7 èŠ‚ã€Šè´§è¿â€œè§„ä¸Š/规下”口径说明》;落地 SQL è§ docs/生成汇总大表/规下货运量口径_2026-09-04.sql。
## 1 å…³ç³»æ€»è¡¨
@@ -32,3 +33,79 @@
1. æ•°å€¼â€œæ˜¾ç¤ºä¸¤ä½å°æ•°ã€ä¿ç•™å…¨ç²¾åº¦â€ï¼šæ‰€æœ‰ç”Ÿæˆå·¥ä½œç°¿å‡ºå£ç»Ÿä¸€æ‰§è¡Œ applyTwoDecimalFormat(`0.00` æ˜¾ç¤ºï¼›æ•´æ•°/%/日期/科学计数/已含 0.00 æ ·å¼ä¸åŠ¨ï¼‰ã€‚
2. ç¼ºæ•°æ®ä¸é™é»˜ï¼šwycSplit ç¼ºè¾“入行、summaryWorkbook ç¼ºå½“月母版、ready å‰ç½®æ ¡éªŒç¼ºåº“表数据时,列表置“缺数据”并给出原因,导出明确报错。
3. çŠ¶æ€æŸ¥è¯¢ï¼š/api/report/ready(数据就绪)、/api/report/preview、/api/report/export/{key}(单个)、/api/report/export/selected(多选 zip)均已覆盖新类型。
## 5 ç¨‹åºç›¸å…³â€œä¸šåŠ¡è¡¨â€æ€»è§ˆä¸Žç›¸äº’å…³ç³»ï¼ˆ2026-09-04 å¢žè¡¥ï¼‰
> é˜…读约定:以下“《……》”是**业务上叫的名字**(用户能看懂);括弧里的英文(如 scale_split_transport)是**程序数据库里的实际表名**,只给程序/开发用,业务人员不用记。
> é“¾è·¯æ€»è§ˆï¼š**导入台账层**(各类月报/季报/年报导入)→ **审核层**(规则校验)→ **报表生成层**(单表导出 / æ±‡æ€»å·¥ä½œç°¿ / ç½‘约车拆分)→ è¾“出文件。每次导入都记一个“导入批次”,可回溯到原始文件。
| ä¸šåŠ¡è¡¨åï¼ˆç”¨æˆ·å«æ³•ï¼‰ | ç¨‹åºåº“表名 | çŽ¯èŠ‚/周期 | æ•°æ®æ¥æºï¼ˆå¯¼å…¥çš„æ–‡ä»¶ï¼‰ | å¹²ä»€ä¹ˆç”¨ / å’Œåˆ«çš„表什么关系 |
|---|---|---|---|---|
| ã€Šå¯¼å…¥æ‰¹æ¬¡è¡¨ã€‹ | import_batch | å¯¼å…¥ | æ‰€æœ‰å¯¼å…¥å…±ç”¨ | è®°å½•“哪一批文件、什么时候导入的”;各业务表都带批号可反查 |
| ã€Šé“路货物运输月度生产情况表》(交企统H203-2,企业月报) | h2032_enterprise_monthly | å¯¼å…¥å°è´¦/月 | æ¨¡æ¿_交企统H203-2表_道路货物运输月度生产情况.xlsx | æ¯ä¸ªâ€œè§„上”企业一行的明细;把各市州企业的货运量(吨)、周转量(吨公里)加起来÷10000,就是该市州“规上”合计,供货运报表和汇总表“ è´§è¿â€é¡µä½¿ç”¨ |
| ã€Šè´§è¿è¿æ”¿è½¦è¾†è¡¨ã€‹ | transport_auth_vehicle | å¯¼å…¥å°è´¦/月 | æ¨¡æ¿_运政车辆.xlsx(也可随 H203-2 ç¬¬äºŒä¸ª sheet å¯¼å…¥ï¼‰ | è§„上企业车辆数/吨位,用于车辆数据核对 |
| ã€Šå…¬è·¯æ—…客运输月度生产情况表》(交企统H203-1,企业月报) | h2031_enterprise_monthly | å¯¼å…¥å°è´¦/月 | æ¨¡æ¿_交企统H203-1表…xlsx | ç­çº¿åŒ…车台账的“企业部分”;公路旅客分市州报表 |
| ã€Šä¸ªä½“客运月报表》 | passenger_individual_monthly | å¯¼å…¥å°è´¦/月 | ä¸ªä½“客运独立模板 | ç­çº¿åŒ…车台账里的“其中个体”行;公路旅客总行=企业+个体 |
| ã€Šå…¬è·¯æ—…客运政车辆表》 | passenger_auth_vehicle | å¯¼å…¥å°è´¦/月 | æ—…客运政车辆数模板(也可随 H203-1 ç¬¬äºŒ sheet å¯¼å…¥ï¼‰ | æ—…客车辆数核对 |
| ã€Šé“路货运车辆能源消耗情况表》(交企统H204,季报) | h204_vehicle_quarterly | å¯¼å…¥å°è´¦/å­£ | èƒ½è€—季报模板(官方能耗格式,固定列位解析) | èƒ½è€—明细(车牌/车型/燃料/能耗);与能耗运政信息同报表期互斥防重导 |
| ã€Šèƒ½è€—车辆运政信息表》 | h204_auth_vehicle | å¯¼å…¥å°è´¦/å­£ | æ¨¡æ¿_能耗车辆运政信息.xlsx | èƒ½è€—车辆的档案信息 |
| ã€Šè½¨è¿¹é‡Œç¨‹è¡¨ã€‹ | vehicle_track_mileage | å¯¼å…¥å°è´¦/月 | æ¨¡æ¿_轨迹里程.xlsx | è¿æ”¿å£å¾„里程/轨迹数据 |
| ã€ŠåŸŽå¸‚公共交通月度运营情况表》(城市公交月报,企业级) | city_bus_monthly | å¯¼å…¥å°è´¦/月 | åŸŽå¸‚公交月报模板 | å…¬äº¤å°è´¦é¡µï¼ˆæ€»é‡/其中城市内/城乡差);表内还带轨道、轮渡月度数据列(rail_*/ferry_*),用于轨道轮渡台账 |
| ã€Šå·¡æ¸¸å‡ºç§Ÿæ±½è½¦è¿è¥æœåŠ¡æƒ…å†µæœˆæŠ¥ã€‹ï¼ˆU402,市州级) | city_taxi_monthly | å¯¼å…¥å°è´¦/月 | å·¡æ¸¸å‡ºç§ŸæœˆæŠ¥æ¨¡æ¿ | å‡ºç§Ÿå°è´¦é¡µï¼ˆæ€»é‡è¡Œ+其中城市内行);也是网约车拆分时“巡游占比/平均运距”的输入 |
| ã€Šå‡ºç§Ÿè½¦è¿æ”¿è½¦è¾†è¡¨ã€‹ | city_taxi_auth | å¯¼å…¥å°è´¦/月 | å‡ºç§Ÿè½¦è¿æ”¿è½¦è¾†ï¼ˆè½¦è¾†çº§æ˜Žç»†ï¼‰ | è¿è¥è½¦æ•°å¯¹æ¯”;按道路运输证字号等提取市州归属 |
| ã€Šè´§è¿é‡å‘¨è½¬é‡è¡¨ã€‹ï¼ˆå…¨çœ/市州全口径总量月报) | freight_turnover_import | å¯¼å…¥å°è´¦/月 | æ¨¡æ¿_货运量周转量.xlsx | **全口径(规上+规下)**的货运量(万吨)/周转量(万吨公里),每月一列(m01~m12)并带去年同月(last_*);有“湖北省”行用于全省校验 |
| ã€Šè§„上规下拆分表》(拆分结果表) | scale_split_transport | å¯¼å…¥å°è´¦/月 | æ¨¡æ¿_规上规下拆分运输量.xlsx(当月/累计两个 sheet) | å­˜â€œè§„上/规下/合计”三块(含排名、同比)。目前导入模板只有周转量,所以周转量三列有数、货运量三列空(详见第 7 èŠ‚ï¼‰ |
| ã€ŠæŠ•资月报表》《投资项目表》《投资系统导出表》 | investment_monthly / investment_project / investment_system | å¯¼å…¥å°è´¦/月 | æŠ•资月报(客运站场/物流园区等)/ é¡¹ç›®åº“ / æŠ•资系统导出文件 | æŠ•资模块导入与审核:按月与投资系统导出数据对账(I004 ç­‰è§„则) |
| ã€Šå®¡æ ¸è§„则表》《审核执行表》《审核结果表》《审核说明表》 | audit_rule / audit_run / audit_result / audit_explanation | å®¡æ ¸ | å®¡æ ¸å¼•擎 | è§„则配置 â†’ æ¯æ¬¡æ‰§è¡Œä¸€ä¸ªæ‰¹å· â†’ å‘½ä¸­/通过明细(挂业务表与行号)→ æ±‡æ€»è¯´æ˜Ž |
| ã€ŠAI åˆ†æžè„±æ•æ˜ å°„表》 | llm_desensitize_map | è¾…助 | AI åˆ†æž | å¯¼å‡º AI åˆ†æžæ—¶åšè„±æ• |
| ã€Šç”¨æˆ·/角色/部门表》 | sys_user / sys_role / sys_dept | ç³»ç»Ÿ | - | ç™»å½•与省/市/县数据权限 |
报表生成层不新增表,按“报表项→模板→从上面的业务表取数→输出 xlsx”,详见第 1 èŠ‚ä¸Ž `docs/生成汇总大表/自动生成汇总工作簿落地方案.md`。
## 6 å•位与数值换算规范(2026-09-04 å¢žè¡¥ï¼Œå‡ç”¨ 2026-07 åº“值与母版逐格验证)
| æ•°æ®åœ¨å“ªä¸ªè¡¨ | å­—段/含义 | åº“内单位 | æŠ¥è¡¨å•位 | æ¢ç®— | 2026-07 éªŒè¯æ ·ä¾‹ |
|---|---|---|---|---|---|
| ã€Šé“路货物运输月度生产情况表》(H203-2) | è´§è¿é‡ | å¨ | ä¸‡å¨ | Ã·10000 | æ­¦æ±‰åˆè®¡ 12275499 å¨ â†’ 1227.55 ä¸‡å¨ = æ±‡æ€»è¡¨â€œ è´§è¿â€é¡µè§„上7月 |
| ã€Šé“路货物运输月度生产情况表》(H203-2) | è´§ç‰©å‘¨è½¬é‡ | å¨å…¬é‡Œ | ä¸‡å¨å…¬é‡Œ | Ã·10000 | æ­¦æ±‰åˆè®¡ 2048095633 å¨å…¬é‡Œ â†’ 204809.56 = æ¯ç‰ˆè§„上周转量7月 |
| ã€Šè´§è¿é‡å‘¨è½¬é‡è¡¨ã€‹ | å½“月货运量(mXX) | ä¸‡å¨ | ä¸‡å¨ | ç›´æŽ¥ç”¨ | å…¨çœ 16285.71 ä¸Žâ€œæ¹–北省”行、17 å¸‚州求和一致 |
| ã€Šè´§è¿é‡å‘¨è½¬é‡è¡¨ã€‹ | å½“月周转量(mXX) | ä¸‡å¨å…¬é‡Œ | ä¸‡å¨å…¬é‡Œ | ç›´æŽ¥ç”¨ | æ­¦æ±‰ 667561.37 |
| ã€Šè§„上规下拆分表》 | è§„上/规下/合计周转量 | ä¸‡å¨å…¬é‡Œ | ä¸‡å¨å…¬é‡Œ | ç›´æŽ¥ç”¨ï¼ˆæ‹†åˆ†æ¨¡æ¿æ•°å€¼ï¼‰ | æ­¦æ±‰è§„上累计 1440570.29 = æ¯ç‰ˆç´¯è®¡åˆ— |
| æ±‡æ€»è¡¨æ¯ç‰ˆâ€œ è´§è¿â€é¡µ | 2026 å„月值列与 2025 åˆ—(T..AP) | ä¸ŽæŒ‡æ ‡åŒï¼ˆä¸‡å¨/万吨公里) | åŒå·¦ | ç›´æŽ¥ç”¨ï¼›2025 åˆ—为人工缓存值 | å…¨çœè§„下 12530.93、25å¹´7月 12187.25 |
**最容易踩的坑**:《道路货物运输月度生产情况表》(H203-2) æ˜¯â€œå¨/吨公里”,《货运量周转量表》是“万吨/万吨公里”,两张表相减前必须先把 H203-2 çš„æ•°å€¼ Ã·10000,否则会差 4 ä¸ªæ•°é‡çº§ã€‚
## 7 è´§è¿â€œè§„上/规下”口径与《规上规下拆分表》说明(2026-09-04 æ–°å¢žï¼Œä¸šåŠ¡å£å¾„å·²ç¡®è®¤ï¼‰
**计算公式(分市州、每个月同式)**
- è§„上货运量(万吨)= ã€Šé“路货物运输月度生产情况表》(H203-2) å„企业货运量合计 Ã· 10000
- å…¨å£å¾„货运量(万吨)= ã€Šè´§è¿é‡å‘¨è½¬é‡è¡¨ã€‹å½“月货运量列
- **规下货运量(万吨)= å…¨å£å¾„ âˆ’ è§„上**
- è´§ç‰©å‘¨è½¬é‡åŒç†ï¼šè§„上 = H203-2 å‘¨è½¬é‡åˆè®¡ Ã· 10000;全口径 = ã€Šè´§è¿é‡å‘¨è½¬é‡è¡¨ã€‹å½“月周转量列;规下 = å…¨å£å¾„ âˆ’ è§„上
- å…¨çœæ ¡éªŒï¼š17 å¸‚州相加 = ã€Šè´§è¿é‡å‘¨è½¬é‡è¡¨ã€‹â€œæ¹–北省”行 = æ±‡æ€»è¡¨â€œ è´§è¿â€é¡µå…¨çœæ•°ï¼ˆ2026-07:O5=16285.71、O7=3754.78、O9=12530.93)
**2026-07 éªŒè¯ç»“果(对照母版《2026å¹´7月道路运输量汇总表.xlsx》“ è´§è¿â€é¡µï¼‰**
- è§„上合计 3754.78、全口径 16285.71、规下合计 12530.93,三数与母版 O7/O5/O9 å…¨ç­‰ã€‚
- 17 å¸‚州规上与母版“规上货运量”列逐一对上(武汉 1227.55、黄石 133.08、荆州 145.22、林区 7.90…)。
- è§„下分市州示例:武汉 3713.42、襄阳 2578.93、荆州 869.60、鄂州 108.68、林区 25.67;相加=12530.93。
- å‘¨è½¬é‡åŒå¼ä¹Ÿæˆç«‹ï¼šæ­¦æ±‰è§„下周转量 462751.81(=667561.37−204809.56)= æ¯ç‰ˆ O16。
**《规上规下拆分表》白话解释**
- å®ƒæ˜¯â€œè§„上规下拆分表”Excel å¯¼å…¥åŽå­˜ä¸‹æ¥çš„结果表,一张表里放“规上企业运输量、规下运输量、运输量合计”三块(各带排名、同比),让报表直接取拆分结果、不用每次现算。
- ç›®å‰å¯¼å…¥çš„æ‹†åˆ† Excel **只有周转量**,所以表里周转量三列(规上/规下/合计)有数(2026-07 å·²å…¥åº“ 126 è¡Œï¼Œperiod_type=CUMULATIVE å³ç´¯è®¡å£å¾„),而货运量三列 Excel é‡Œæ²¡æœ‰ã€ä¸€ç›´æ˜¯ç©ºâ€”—**不是程序坏了,是输入文件不含货运量拆分**。
- å¦‚果以后希望它连货运量拆分也存:程序按上面的公式回填即可(SQL æŸ¥è¯¢ 3 å·²ç»™ç¤ºä¾‹ï¼Œé»˜è®¤æ³¨é‡Šä¸æ‰§è¡Œï¼‰ã€‚报表取数方式“实时现算”和“落表取数”选一种即可,避免两处算的不一样。
**落地 SQL**:`docs/生成汇总大表/规下货运量口径_2026-09-04.sql`(查询 1 = åˆ†å¸‚州规上/规下货运量与周转量;查询 2 = å…¨çœæ ¡éªŒï¼›æŸ¥è¯¢ 3 = å¯é€‰çš„回填示例)。
**2025 åŸºå‡†è¯´æ˜Žï¼ˆå¯¹åº” 2026-09-03 å·²æ‹æ¿é¡¹ï¼š2025 åŒæœŸåˆ—保留母版缓存值)**
- å…¨å£å¾„ 2025 åŸºå‡†ï¼šä»Žã€Šè´§è¿é‡å‘¨è½¬é‡è¡¨ã€‹çš„去年同月列(last_freight/last_turnover_mXX)取。
- è§„上/规下拆分的 2025 åŸºå‡†ï¼šåº“内没有 2025 å¹´çš„ H203-2 ä¼ä¸šæœˆæŠ¥ï¼Œåªèƒ½å–汇总表母版 2025 ç¼“存列(T..AP,含规上/规下),已核实 12 ä¸ªæœˆå‡æœ‰å€¼ï¼Œæ–¹æ¡ˆå¯è¡Œã€‚
## 8 ç›¸å…³æ–‡æ¡£ç´¢å¼•(持续同步)
- `docs/生成汇总大表/页签逻辑关系说明.md`:汇总工作簿 19 é¡µä¸‰å±‚结构与勾稽(台账/口径合成/成品)。
- `docs/生成汇总大表/自动生成汇总工作簿落地方案.md`:P0-P7 å®žæ–½æ­¥éª¤ä¸ŽéªŒæ”¶ã€‚
- `docs/生成汇总大表/汇总表母版数据体检与待决策清单_2026-09-04.md`:5 ä¸ªæˆå“é¡µâ€œå½“月块错用累计值”问题与 A/B æ–¹æ¡ˆã€‚
- `docs/报表生成_关系逻辑与每日进度总表.xlsx`:Sheet1 æŠ¥è¡¨å…³ç³»ã€Sheet2 é¡µç­¾å£å¾„、Sheet3 å¾…确认、Sheet4 æ¯æ—¥è¿›åº¦ï¼ˆå”¯ä¸€è¿›åº¦æ€»è¡¨ï¼‰ã€‚
- `docs/生成汇总大表/规下货运量口径_2026-09-04.sql`:货运规下口径落地 SQL(中文表名说明版)。
docs/Éú³É»ã×Ü´ó±í/Êä³ö/µÀ·ÔËÊäÁ¿»ã×ܱí_2026-06.xlsx
Binary files differ
docs/Éú³É»ã×Ü´ó±í/Êä³ö/µÀ·ÔËÊäÁ¿»ã×ܱí_2026-07.xlsx
Binary files differ
docs/Éú³É»ã×Ü´ó±í/ҳǩÂß¼­¹ØÏµËµÃ÷.md
@@ -1,5 +1,7 @@
# é¡µç­¾é€»è¾‘关系说明(2026å¹´7月道路运输量汇总表)
> **表名阅读约定**:本文《……》均为**业务中文名**(可直接看懂);程序数据库里的英文表名(如 scale_split_transport)只给开发对照,业务人员不用记。完整对照见《输入输出与逻辑关系总表》第 5 èŠ‚ã€‚
## 0 è¯´æ˜Žä¸Žä¾æ®
- ä¾æ®æ–‡ä»¶ï¼šdocs/生成汇总大表/2026å¹´7月道路运输量汇总表.xlsx(含公式原稿,2026-09-03 åˆ†æžï¼‰ã€‚
- ç”¨é€”:作为系统自动生成该汇总工作簿的取数与口径依据。最终交付物为这一本汇总工作簿,不再单独生成小表文件。
@@ -36,7 +38,7 @@
## 3 å„页职责与主要取数
- ç­çº¿åŒ…车:公路班线(含包车)。全省行 r4/r5 ä¸ºå®¢è¿é‡/周转量(客运量含个体,已确认);r6/r7 ä¸ºå…¶ä¸­ä¸ªä½“客运量/周转量。市州行自 r8 èµ·æ¯ 4 è¡Œä¸€å—。数据源:H203-1 ä¼ä¸šæœˆæŠ¥ + ä¸ªä½“户月报。
- å…¬äº¤ï¼šæ€»é‡è¡Œ r5/r6,其中城市内 r7/r8;公交城乡 = æ€»é‡ - åŸŽå¸‚内。数据源:城市公交月报。
- å‡ºç§Ÿï¼šå·¡æ¸¸å‡ºç§Ÿï¼Œç»“构同公交:全省块 r5-r8(客运量/周转量/其中城市内客运量/其中城市内周转量),每市州 4 è¡Œä¸€å—(武汉 r9-r12、黄石 r13-r16,依此类推)。总量行与“其中城市内”行并存,总量 â‰¥ åŸŽå¸‚内;仅武汉两行相等(城乡差 0),其余市州存在城际城乡差。2026-07:全省出租客运量 5860.24 ä¸‡äººæ¬¡ã€å…¶ä¸­åŸŽå¸‚内 5351.24、城际城乡差 509.00(源=city_taxi_monthly çš„ passenger_volume/passenger_city,如黄石 283.02/258.57)。
- å‡ºç§Ÿï¼šå·¡æ¸¸å‡ºç§Ÿï¼Œç»“构同公交:全省块 r5-r8(客运量/周转量/其中城市内客运量/其中城市内周转量),每市州 4 è¡Œä¸€å—(武汉 r9-r12、黄石 r13-r16,依此类推)。总量行与“其中城市内”行并存,总量 â‰¥ åŸŽå¸‚内;仅武汉两行相等(城乡差 0),其余市州存在城际城乡差。2026-07:全省出租客运量 5860.24 ä¸‡äººæ¬¡ã€å…¶ä¸­åŸŽå¸‚内 5351.24、城际城乡差 509.00(源=《巡游出租汽车运营服务情况月报》 çš„“客运量/其中城市内客运量”两列(字段英文 passenger_volume/passenger_city),如黄石 283.02/258.57)。
- ç½‘约车:结构同公交(总量行+其中城市内行,每市州 4 è¡Œï¼‰ã€‚全量与城市内来自《网约车客运量拆分表》:客运量 C→总量行、城市内 H→其中城市内行、城际城乡 I→城乡差行。2026-07:全省 4852.30 / 4430.84 / 421.46,武汉无城乡差(I=0);母版网约车页当月值即拆分结果(如黄石城市内 140.344963641575)。
- è½¨é“轮渡:上半块轨道(全省 r4/r5,武汉 r6/r7,黄石 r8/r9,全省=武汉+黄石);下半块轮渡(全省 r13/r14,武汉 r15/r16,全省=武汉)。黄石只有轨道、没有轮渡(已二次确认);轮渡页仅武汉行(全省=武汉),无需为黄石扩行。
- åŸŽå¸‚客运:城市内口径。市州行公式示例(武汉,C åˆ—=1 æœˆï¼‰ï¼šC6=公交!C11+出租!C11+网约车!C11+轨道轮渡!C6+轨道轮渡!C15——公交/出租/网约车引用的 C11 å‡ä¸ºè¯¥é¡µâ€œå…¶ä¸­åŸŽå¸‚内客运量”行,轨道轮渡引轨道块 C6 ä¸Žè½®æ¸¡å— C15;周转量同理引用各页城市内周转量行(如出租!C12)。全省行=各市州求和。数据源=公交城市内+出租城市内+网约车城市内+轨道轮渡。
@@ -63,12 +65,12 @@
- ç­çº¿åŒ…车全量 = å…¶ä¸­ä¸ªä½“ + å…¶ä½™ä¼ä¸šéƒ¨åˆ†ï¼ˆä¸ªä½“子集关系,已确认)。
## 5 æ•°æ®æ¥æºä¸Žç³»ç»Ÿæ˜ å°„(建议)
- ç­çº¿åŒ…车:h2031_enterprise_monthly + passenger_individual_monthly(客运量=企业+个体,其中个体单独行)。
- å…¬äº¤ï¼šcity_bus_monthly(注意区分城市内/城乡字段口径,当前系统按 passenger_chengxiang å–城乡)。
- å‡ºç§Ÿï¼šcity_taxi_monthly(总量=passenger_volume å®¢è¿é‡è¡Œï¼ŒåŸŽå¸‚内=passenger_city“其中城市内”行,与 U402 ä¸ŠæŠ¥åŒæºï¼‰ã€‚
- ç­çº¿åŒ…车:《公路旅客运输月度生产情况表》(H203-1) + ã€Šä¸ªä½“客运月报表》(客运量=企业+个体,其中个体单独行)。
- å…¬äº¤ï¼šã€ŠåŸŽå¸‚公共交通月度运营情况表》(公交月报)(注意区分城市内/城乡字段口径,当前系统按 passenger_chengxiang å–城乡)。
- å‡ºç§Ÿï¼šã€Šå·¡æ¸¸å‡ºç§Ÿæ±½è½¦è¿è¥æœåŠ¡æƒ…å†µæœˆæŠ¥ã€‹ï¼ˆæ€»é‡=passenger_volume å®¢è¿é‡è¡Œï¼ŒåŸŽå¸‚内=passenger_city“其中城市内”行,与 U402 ä¸ŠæŠ¥åŒæºï¼‰ã€‚
- ç½‘约车:拆分表输出(总量行=拆分客运量 C、其中城市内行=拆分 H、城乡差行=拆分 I;输入=部级订单附件1 17 å¸‚州订单 + å…¨çœ pin + å·¡æ¸¸å‡ºç§ŸæœˆæŠ¥å¹³å‡è¿è·ï¼‰ï¼Œ2026-07 æ‹†åˆ†ç»“果已按此口径填列母版网约车页。
- è½¨é“轮渡:武汉/黄石轨道、武汉轮渡专用导入表。
- è´§è¿ï¼šh2032 ç­‰è§„上规下拆分表(模板_货运量周转量 + æ‹†åˆ†è¡¨ï¼‰ã€‚
- è´§è¿ï¼šã€Šé“路货物运输月度生产情况表》(H203-2) ä¸Žã€Šè§„上规下拆分表》(来源:模板_货运量周转量 + æ‹†åˆ†è¡¨ï¼‰ã€‚
## 6 é—留问题与待办
1. #REF! æ®‹ä½™ï¼šå¯è§é¡µ ä¸­å£å¾„明细 AU4/AU97、货运 BQ108、班线包车 IJ4/JW4/IJ5/JW5/JF28/JF29,均在远离 1-7 æœˆä¸»æ•°æ®åŒºçš„年份/辅助列。业务答复为 å·²åˆ /清除(2026-09-03 11:01 å¤æŸ¥æ–‡ä»¶ä»å­˜åœ¨ï¼‰ï¼Œæ¸…除方式待最终确认:程序清除置空,或人工处理。
traffic-audit-server/src/main/java/com/trafficaudit/auditengine/service/AuditEngineService.java
@@ -1679,15 +1679,29 @@
        return null;
    }
    /** æ•°å€¼èŒƒå›´æ£€æŸ¥ï¼ˆå¦‚ æ•´è½¦å¨ä½ 4≤且≤40) */
    /** æ•°å€¼èŒƒå›´æ£€æŸ¥ï¼›æ•´è½¦å¨ä½æŒ‰â€œå¹³å‡å¨ä½=整车吨位/整车数”口径判定 4~40 */
    private AuditResult checkOutRange(AuditRule rule, H2032EnterpriseMonthly report) {
        String[] bounds = rule.getThreshold().split(",");
        if (bounds.length < 2) return null;
        double value = getH2032FieldValue(report, rule.getCheckField());
        String field = rule.getCheckField();
        String label = h2032FieldLabel(field);
        double value;
        if ("tonsWhole".equals(field)) {
            double vehicles = report.getVehicleWhole() == null ? 0.0 : report.getVehicleWhole().doubleValue();
            double tons = nvl(report.getTonsWhole());
            if (vehicles > 0) {
                value = tons / vehicles;
                label = "整车平均吨位(整车吨位/整车数)";
            } else {
                value = tons; // æ— æ•´è½¦æ•°ä½†æœ‰å¨ä½æ—¶ä»æŒ‰åŽŸå¨ä½åˆ¤å®š
            }
        } else {
            value = getH2032FieldValue(report, field);
        }
        double low = Double.parseDouble(bounds[0].trim());
        double high = Double.parseDouble(bounds[1].trim());
        if (value > 0 && (value < low || value > high)) {
            return buildResult(rule, report, h2032FieldLabel(rule.getCheckField()) + "=" + fmt(value),
            return buildResult(rule, report, label + "=" + fmt(value),
                "范围 " + fmt(low) + "~" + fmt(high), "超出范围");
        }
        return null;
@@ -1805,18 +1819,20 @@
    }
    private String fmt(double v) {
        if (v == Math.floor(v) && !Double.isInfinite(v)) {
        if (v == Math.floor(v) && !Double.isInfinite(v) && Math.abs(v) < 1e15) {
            return String.valueOf((long) v);
        }
        return String.valueOf(Math.round(v * 100.0) / 100.0);
        return java.math.BigDecimal.valueOf(v).setScale(2, java.math.RoundingMode.HALF_UP)
            .stripTrailingZeros().toPlainString();
    }
    /** å æ¯”/小数值:保留 4 ä½å°æ•° */
    private String fmt4(double v) {
        if (v == Math.floor(v) && !Double.isInfinite(v)) {
        if (v == Math.floor(v) && !Double.isInfinite(v) && Math.abs(v) < 1e15) {
            return String.valueOf((long) v);
        }
        return String.valueOf(Math.round(v * 10000.0) / 10000.0);
        return java.math.BigDecimal.valueOf(v).setScale(4, java.math.RoundingMode.HALF_UP)
            .stripTrailingZeros().toPlainString();
    }
    // ========== H2031 æ—…客审核 ==========
traffic-audit-server/src/main/java/com/trafficaudit/dataimport/controller/DataImportController.java
@@ -242,6 +242,33 @@
        }
    }
    /** ç½‘约车总数(月度全省 pin:模板_网约车总数.xlsx) */
    @PostMapping("/wycTotal")
    public Result<String> importWycTotal(@RequestParam("file") MultipartFile file,
                                         @RequestParam("period") String period) {
        try {
            int count = importService.importWycTotal(file, period);
            return Result.ok("网约车总数导入成功, å…± " + count + " æœŸ");
        } catch (Exception e) {
            log.error("wycTotal import error", e);
            return Result.error("导入失败: " + e.getMessage());
        }
    }
    /** ç½‘约车订单及全省总量(模板_网约车订单及全省总量.xlsx) */
    @PostMapping("/wycOrder")
    public Result<String> importWycOrder(@RequestParam("file") MultipartFile file,
                                         @RequestParam("period") String period) {
        try {
            int count = importService.importWycOrder(file, period);
            return Result.ok("网约车订单及全省总量导入成功, å…± " + count + " æœŸ");
        } catch (Exception e) {
            log.error("wycOrder import error", e);
            return Result.error("导入失败: " + e.getMessage());
        }
    }
    /** æŠ•资月报(全省汇总大表):category=客运站场/物流园区 */
    @PostMapping("/investment")
    public Result<String> importInvestment(@RequestParam("file") MultipartFile file,
traffic-audit-server/src/main/java/com/trafficaudit/dataimport/entity/WycOrderMonthly.java
New file
@@ -0,0 +1,47 @@
package com.trafficaudit.dataimport.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.time.LocalDateTime;
/** ç½‘约车订单及全省总量月度输入(源:模板_网约车订单及全省总量.xlsx æœˆåº¦è¾“入页) */
@Data
@TableName("wyc_order_monthly")
public class WycOrderMonthly {
    @TableId(type = IdType.AUTO)
    private Long id;
    /** æŠ¥è¡¨æœŸ yyyy-MM */
    private String reportPeriod;
    /** B-E å…¨çœ pin */
    private Double pinK;
    @TableField("pin_ck")
    private Double pinCK;
    private Double pinZ;
    @TableField("pin_cz")
    private Double pinCZ;
    /** F è®¢å•合计(单) */
    private Double orderSum;
    /** G-W 17 å¸‚州订单,按 RegionUtil.cityList é¡ºåº */
    private Double orderWuhan;
    private Double orderHuangshi;
    private Double orderShiyan;
    private Double orderYichang;
    private Double orderXiangyang;
    private Double orderEzhou;
    private Double orderJingmen;
    private Double orderXiaogan;
    private Double orderJingzhou;
    private Double orderHuanggang;
    private Double orderXianning;
    private Double orderSuizhou;
    private Double orderEnshi;
    private Double orderXiantao;
    private Double orderQianjiang;
    private Double orderTianmen;
    private Double orderShennong;
    private LocalDateTime createdAt;
}
traffic-audit-server/src/main/java/com/trafficaudit/dataimport/entity/WycTotalMonthly.java
New file
@@ -0,0 +1,30 @@
package com.trafficaudit.dataimport.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.time.LocalDateTime;
/** ç½‘约车总数月度输入(源:模板_网约车总数.xlsx,B-E ä¸ºå…¨çœ pin) */
@Data
@TableName("wyc_total_monthly")
public class WycTotalMonthly {
    @TableId(type = IdType.AUTO)
    private Long id;
    /** æŠ¥è¡¨æœŸ yyyy-MM */
    private String reportPeriod;
    /** å…¨çœç½‘约车客运量(万人次) */
    private Double pinK;
    /** å…¶ä¸­åŸŽå¸‚内客运量(万人次) */
    @TableField("pin_ck")
    private Double pinCK;
    /** å…¨çœç½‘约车周转量(万人公里) */
    private Double pinZ;
    /** å…¶ä¸­åŸŽå¸‚内周转量(万人公里) */
    @TableField("pin_cz")
    private Double pinCZ;
    private LocalDateTime createdAt;
}
traffic-audit-server/src/main/java/com/trafficaudit/dataimport/mapper/WycOrderMonthlyMapper.java
New file
@@ -0,0 +1,6 @@
package com.trafficaudit.dataimport.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.trafficaudit.dataimport.entity.WycOrderMonthly;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface WycOrderMonthlyMapper extends BaseMapper<WycOrderMonthly> {}
traffic-audit-server/src/main/java/com/trafficaudit/dataimport/mapper/WycTotalMonthlyMapper.java
New file
@@ -0,0 +1,6 @@
package com.trafficaudit.dataimport.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.trafficaudit.dataimport.entity.WycTotalMonthly;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface WycTotalMonthlyMapper extends BaseMapper<WycTotalMonthly> {}
traffic-audit-server/src/main/java/com/trafficaudit/dataimport/service/DataImportService.java
@@ -18,6 +18,8 @@
import com.trafficaudit.dataimport.entity.CityBusMonthly;
import com.trafficaudit.dataimport.entity.CityTaxiMonthly;
import com.trafficaudit.dataimport.entity.CityTaxiAuth;
import com.trafficaudit.dataimport.entity.WycOrderMonthly;
import com.trafficaudit.dataimport.entity.WycTotalMonthly;
import com.trafficaudit.dataimport.entity.ScaleSplitTransport;
import com.trafficaudit.dataimport.entity.TransportAuthVehicle;
import com.trafficaudit.dataimport.entity.VehicleTrackMileage;
@@ -36,6 +38,8 @@
import com.trafficaudit.dataimport.mapper.CityBusMonthlyMapper;
import com.trafficaudit.dataimport.mapper.CityTaxiMonthlyMapper;
import com.trafficaudit.dataimport.mapper.CityTaxiAuthMapper;
import com.trafficaudit.dataimport.mapper.WycOrderMonthlyMapper;
import com.trafficaudit.dataimport.mapper.WycTotalMonthlyMapper;
import com.trafficaudit.dataimport.mapper.ScaleSplitTransportMapper;
import com.trafficaudit.dataimport.mapper.TransportAuthVehicleMapper;
import com.trafficaudit.dataimport.mapper.VehicleTrackMileageMapper;
@@ -162,6 +166,10 @@
    private CityTaxiMonthlyMapper cityTaxiMapper;
    @Resource
    private CityTaxiAuthMapper cityTaxiAuthMapper;
    @Resource
    private WycTotalMonthlyMapper wycTotalMapper;
    @Resource
    private WycOrderMonthlyMapper wycOrderMapper;
    @Resource
    private SqlSessionFactory sqlSessionFactory;
@@ -916,10 +924,11 @@
        List<ScaleSplitTransport> list = new ArrayList<>();
        int failRows = 0;
        try (Workbook wb = WorkbookFactory.create(file.getInputStream())) {
            int targetMonth = Integer.parseInt(period.split("-")[1]); // ä»…导入目标期所在月的页签(1-N月文件按目标期取当月/累计)
            boolean hasPeriodSheet = false;
            for (int i = 0; i < wb.getNumberOfSheets(); i++) {
                String sn = wb.getSheetAt(i).getSheetName();
                if (sn != null && (sn.contains("当月") || sn.contains("累计"))) { hasPeriodSheet = true; break; }
                if (sn != null && (sn.contains("当月") || sn.contains("月份") || sn.contains("累计"))) { hasPeriodSheet = true; break; }
            }
            if (!hasPeriodSheet) {
                throw new RuntimeException("所选数据类型【规上规下拆分】与文件内容不符:未找到含 å½“月/累计 çš„ sheet,请确认是否选错了数据类型");
@@ -928,8 +937,16 @@
                Sheet sheet = wb.getSheetAt(i);
                String sheetName = sheet.getSheetName();
                String periodType = null;
                if (sheetName.contains("当月")) periodType = "MONTH";
                else if (sheetName.contains("累计")) periodType = "CUMULATIVE";
                java.util.regex.Matcher mSheetMonth = java.util.regex.Pattern.compile("(\\d{1,2})\\u6708(\\u4efd|\\u7d2f\\u8ba1)").matcher(sheetName);
                if (mSheetMonth.find()) {
                    int sheetMonth = Integer.parseInt(mSheetMonth.group(1));
                    if (sheetMonth == targetMonth) {
                        periodType = "份".equals(mSheetMonth.group(2)) ? "MONTH" : "CUMULATIVE";
                    }
                } else {
                    if (sheetName.contains("当月")) periodType = "MONTH";
                    else if (sheetName.contains("累计")) periodType = "CUMULATIVE";
                }
                if (periodType == null) continue;
                // æ ¡éªŒ sheet å¸ƒå±€ï¼šç¬¬2行应含「市州/规上企业运输量」,第3行子表头应含「周转量」或「货运量」(扩展布局)
@@ -2704,6 +2721,155 @@
        return success;
    }
    // ========== ç½‘约车月度输入导入(全省 pin / è®¢å•) ==========
    /** ç½‘约车总数月度输入:模板_网约车总数.xlsx(sheet1;A åˆ—=月份日期;B=全省客运量 C=其中城市内 D=周转量 E=其中城市内周转量)。整表按报表期覆盖。 */
    public synchronized int importWycTotal(MultipartFile file, String period) throws Exception {
        Map<String, WycTotalMonthly> rows = new LinkedHashMap<>();
        try (Workbook wb = WorkbookFactory.create(file.getInputStream())) {
            Sheet sheet = wb.getSheetAt(0);
            for (int r = 2; r <= sheet.getLastRowNum(); r++) {
                Row row = sheet.getRow(r);
                if (row == null) continue;
                String rp = periodOfCell(row.getCell(0));
                if (rp == null) continue;
                double pk = dbl(row, 1), pck = dbl(row, 2), pz = dbl(row, 3), pcz = dbl(row, 4);
                if (pk <= 0 && pck <= 0 && pz <= 0 && pcz <= 0) continue;
                WycTotalMonthly item = new WycTotalMonthly();
                item.setReportPeriod(rp);
                item.setPinK(pk > 0 ? pk : null);
                item.setPinCK(pck > 0 ? pck : null);
                item.setPinZ(pz > 0 ? pz : null);
                item.setPinCZ(pcz > 0 ? pcz : null);
                rows.put(rp, item);
            }
        }
        if (rows.isEmpty()) throw new RuntimeException("未识别到有效月份行:A åˆ—应为日期(如 2026-07),B-E ä¸ºå…¨çœå®¢è¿é‡/城市内/周转量/城市内周转量");
        int ok = upsertWycTotal(rows);
        log.info("WycTotal imported: {} periods ok={}", rows.size(), ok);
        return ok;
    }
    /** ç½‘约车订单及全省总量:模板_网约车订单及全省总量.xlsx é¦–个数据 sheet(A=月份;B-E=全省 pin;F=订单合计;G-W=17 å¸‚州订单) */
    public synchronized int importWycOrder(MultipartFile file, String period) throws Exception {
        Map<String, WycOrderMonthly> rows = new LinkedHashMap<>();
        try (Workbook wb = WorkbookFactory.create(file.getInputStream())) {
            Sheet sheet = wb.getSheetAt(0);
            int head = -1;
            for (int r = 0; r <= Math.min(sheet.getLastRowNum(), 4); r++) {
                Row row = sheet.getRow(r);
                if (row == null) continue;
                String a = getString(row, 0);
                if (a != null && a.contains("月份")) { head = r; break; }
            }
            if (head < 0) throw new RuntimeException("未找到表头:A åˆ—需含“月份”");
            for (int r = head + 1; r <= sheet.getLastRowNum(); r++) {
                Row row = sheet.getRow(r);
                if (row == null) continue;
                String rp = periodOfCell(row.getCell(0));
                if (rp == null) continue;
                double pk = dbl(row, 1), pck = dbl(row, 2), pz = dbl(row, 3), pcz = dbl(row, 4), sum = dbl(row, 5);
                double citySum = 0;
                for (int k = 0; k < 17; k++) citySum += dbl(row, 6 + k);
                if (pk <= 0 && pck <= 0 && pz <= 0 && pcz <= 0 && sum <= 0 && citySum <= 0) continue;
                WycOrderMonthly it = new WycOrderMonthly();
                it.setReportPeriod(rp);
                it.setPinK(pk > 0 ? pk : null);
                it.setPinCK(pck > 0 ? pck : null);
                it.setPinZ(pz > 0 ? pz : null);
                it.setPinCZ(pcz > 0 ? pcz : null);
                if (sum <= 0 && citySum > 0) sum = citySum;
                it.setOrderSum(sum > 0 ? sum : null);
                it.setOrderWuhan(dblN(row, 6));
                it.setOrderHuangshi(dblN(row, 7));
                it.setOrderShiyan(dblN(row, 8));
                it.setOrderYichang(dblN(row, 9));
                it.setOrderXiangyang(dblN(row, 10));
                it.setOrderEzhou(dblN(row, 11));
                it.setOrderJingmen(dblN(row, 12));
                it.setOrderXiaogan(dblN(row, 13));
                it.setOrderJingzhou(dblN(row, 14));
                it.setOrderHuanggang(dblN(row, 15));
                it.setOrderXianning(dblN(row, 16));
                it.setOrderSuizhou(dblN(row, 17));
                it.setOrderEnshi(dblN(row, 18));
                it.setOrderXiantao(dblN(row, 19));
                it.setOrderQianjiang(dblN(row, 20));
                it.setOrderTianmen(dblN(row, 21));
                it.setOrderShennong(dblN(row, 22));
                rows.put(rp, it);
            }
        }
        if (rows.isEmpty()) throw new RuntimeException("未识别到有效月份行:A åˆ—应为 yyyy-MM,B-E å…¨çœ pin / F åˆè®¡ / G-W 17 å¸‚州订单");
        int ok = upsertWyc(rows);
        log.info("WycOrder imported: {} periods ok={}", rows.size(), ok);
        return ok;
    }
    private int upsertWyc(Map<String, WycOrderMonthly> rows) {
        int ok = 0, fail = 0;
        for (WycOrderMonthly item : rows.values()) {
            try {
                wycOrderMapper.delete(new LambdaQueryWrapper<WycOrderMonthly>().eq(WycOrderMonthly::getReportPeriod, item.getReportPeriod()));
                wycOrderMapper.insert(item);
                recordBatch("网约车订单及全省总量", "WYC_ORDER", item.getReportPeriod(), 1, 1, 0, null);
                ok++;
            } catch (Exception e) {
                fail++;
                log.error("WycOrder insert error period={}", item.getReportPeriod(), e);
            }
        }
        return ok;
    }
    private int upsertWycTotal(Map<String, WycTotalMonthly> rows) {
        int ok = 0, fail = 0;
        for (WycTotalMonthly item : rows.values()) {
            try {
                wycTotalMapper.delete(new LambdaQueryWrapper<WycTotalMonthly>().eq(WycTotalMonthly::getReportPeriod, item.getReportPeriod()));
                wycTotalMapper.insert(item);
                recordBatch("网约车总数", "WYC_TOTAL", item.getReportPeriod(), 1, 1, 0, null);
                ok++;
            } catch (Exception e) {
                fail++;
                log.error("WycTotal insert error period={}", item.getReportPeriod(), e);
            }
        }
        return ok;
    }
    private String periodOfCell(Cell c) {
        if (c == null) return null;
        if (c.getCellType() == CellType.NUMERIC) {
            try {
                double v = c.getNumericCellValue();
                if (v >= 40000 && v <= 60000) {
                    java.util.Date d = org.apache.poi.ss.usermodel.DateUtil.getJavaDate(v);
                    java.text.SimpleDateFormat f = new java.text.SimpleDateFormat("yyyy-MM");
                    return f.format(d);
                }
            } catch (Exception ignore) { }
        }
        String s = null;
        try { s = c.getStringCellValue(); } catch (Exception ignore) { }
        if (s != null) {
            java.util.regex.Matcher m = java.util.regex.Pattern.compile("(\\d{4})[-/.å¹´](\\d{1,2})").matcher(s.trim());
            if (m.find()) return String.format("%04d-%02d", Integer.parseInt(m.group(1)), Integer.parseInt(m.group(2)));
        }
        return null;
    }
    private double dbl(Row row, int idx) {
        Double v = getDecimal(row, idx);
        return v == null ? 0.0 : v;
    }
    private Double dblN(Row row, int idx) {
        Double v = getDecimal(row, idx);
        return (v == null || v <= 0) ? null : v;
    }
    /** è¿æ”¿å‡ºç§Ÿè½¦å¸‚州提取:道路运输证字号→档案号→经营权号→业户地址,取 6 ä½åŒºåˆ’代码 */
    private static final java.util.regex.Pattern TAXI_REGION_PAT =
        java.util.regex.Pattern.compile("(4290\\d{2}|42(?:0[1-9]|1[0-3]|28)\\d{2})");
@@ -3040,6 +3206,8 @@
            case "trackMileage": return new ImportResult(importTrackMileage(file, period), 0, new ArrayList<>());
            case "freightTurnover": return new ImportResult(importFreightTurnover(file, period), 0, new ArrayList<>());
            case "scaleSplit": return new ImportResult(importScaleSplit(file, period), 0, new ArrayList<>());
            case "wycTotal": return new ImportResult(importWycTotal(file, period), 0, new ArrayList<>());
            case "wycOrder": return new ImportResult(importWycOrder(file, period), 0, new ArrayList<>());
            default: throw new RuntimeException("不支持的导入类型:" + type);
        }
    }
traffic-audit-server/src/main/java/com/trafficaudit/reportexport/controller/ReportExportController.java
@@ -87,9 +87,10 @@
    /** ç”Ÿæˆ_道路运输量汇总表.xlsx(汇总工作簿 P0-P1 éª¨æž¶ï¼šæ•´æœ¬å¤åˆ¶æ¯ç‰ˆï¼Œé¡µç­¾/公式/2025 ç¼“存保留) */
    @GetMapping("/export/summaryWorkbook")
    public ResponseEntity<byte[]> exportSummaryWorkbook(@RequestParam("period") String period,
                                                        @RequestParam(value = "mode", defaultValue = "month") String mode) throws Exception {
                                                        @RequestParam(value = "mode", defaultValue = "month") String mode,
                                                        @RequestParam(value = "toMonth", required = false) Integer toMonth) throws Exception {
        logExport("道路运输量汇总表.xlsx", period);
        return buildResponse(reportService.exportSummaryWorkbook(period, mode), String.format("生成_道路运输量汇总表_%s.xlsx", period));
        return buildResponse(reportService.exportSummaryWorkbook(period, mode, toMonth), String.format("生成_道路运输量汇总表_%s.xlsx", period));
    }
    /** ç”Ÿæˆ_网约车客运量拆分表.xlsx(月度:订单附件1 + å…¨çœ pin + å·¡æ¸¸å‡ºç§ŸæœˆæŠ¥ï¼‰ */
traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java
@@ -456,7 +456,7 @@
        Map<String, Double> h2032Cum = loadH2032FreightCumulative(period);
        ScaleSplitTransport provCum = getProvinceCumulative(period);
        Double total = freightCum(ft.get("湖北省"), month);
        Double totalWan = total == null ? null : round(total / 10000.0, 4);
        Double totalWan = total == null ? null : round(total, 4); // æ¨¡æ¿åˆ—已是万吨,不再 Ã·10000
        double above = 0.0;
        for (Double v : h2032Cum.values()) if (v != null) above += v;
        double aboveWan = round(above / 10000.0, 4);
@@ -3199,6 +3199,14 @@
     * ä¿ç•™å…¨éƒ¨é¡µç­¾/版式/公式/2025 å¹´ç¼“存值,仅把表头年份动态化为目标年;数据填充按 P2 èµ·é€æ­¥æŽ¥å…¥ã€‚
     */
    public byte[] exportSummaryWorkbook(String period, String mode) throws Exception {
        return exportSummaryWorkbook(period, mode, null);
    }
    /** ç”Ÿæˆ_道路运输量汇总表.xlsx(P0-P1 éª¨æž¶ï¼Œæ”¯æŒ toMonth è£å‰ªï¼‰ï¼š
     *  ä»¥ã€ŠYYYYå¹´M月道路运输量汇总表.xlsx》(M ç”± period å†³å®šï¼‰ä¸ºæ¯ç‰ˆï¼ŒæŒ‰åŒæœŸå¤‡ä»½æ¯ç‰ˆè¿˜åŽŸæœˆåº¦å—ï¼›
     *  toMonth éžç©ºä¸”小于 M æ—¶ï¼ŒæŠŠ 8 ä¸ªå°è´¦/合成页裁到 toMonth æœˆï¼ˆtoMonth+1..M çš„当月值/同比列清空、保留表头,
     *  ç´¯è®¡ä¸Žç´¯è®¡åŒæ¯”公式改为按 toMonth æœˆé‡ç®—),用于“先生成 1-6 æœˆã€1-7 æœˆæ‰©åˆ—”验证。 */
    public byte[] exportSummaryWorkbook(String period, String mode, Integer toMonth) throws Exception {
        int year = Integer.parseInt(period.contains("-") ? period.split("-")[0] : period);
        int month = period.contains("-") ? monthOf(period, mode) : 12;
        File template = resolveSummaryMother(period, mode);
@@ -3207,7 +3215,23 @@
        }
        try (InputStream in = new FileInputStream(template);
             XSSFWorkbook wb = new XSSFWorkbook(in)) {
            File donor = resolveSummaryDonor(year, month);
            if (donor != null) {
                try (InputStream din = new FileInputStream(donor); XSSFWorkbook dwb = new XSSFWorkbook(din)) {
                    int restored = restoreSummaryMonthlyBlocks(wb, dwb);
                    log.info("汇总工作簿月度块还原完成,补齐/覆盖单元格数={}(母版:{},备份母版:{})", restored, template.getName(), donor.getName());
                }
            } else {
                log.warn("汇总工作簿未找到同期备份母版(_备份_{}å¹´{}月…),输出将保持母版现状(可能为 1-4 æœˆéª¨æž¶ï¼‰", year, month);
            }
            if (toMonth != null && toMonth > 0 && toMonth < month) {
                int trimmed = trimSummaryMonthlySheets(wb, toMonth);
                log.info("汇总工作簿裁剪至 {} æœˆå®Œæˆï¼Œæ¸…空/改写单元格数={}", toMonth, trimmed);
            }
            dynamicSummaryYear(wb, year);
            applyTwoDecimalFormat(wb); // æ±‡æ€»å¤§è¡¨ä¿ç•™äººå·¥æ¯ç‰ˆåˆ—宽/版式:不做 autoFit(长公式会把列宽顶爆)
            if (!wb.getCTWorkbook().isSetCalcPr()) wb.getCTWorkbook().addNewCalcPr();
            wb.getCTWorkbook().getCalcPr().setFullCalcOnLoad(true); // è¿˜åŽŸ/改写公式后打开即重算
            return toBytes(wb);
        }
    }
@@ -3472,6 +3496,153 @@
            if (a[5] <= 0 && a[2] > 0) a[5] = round(a[3] / a[2], 2);
        }
        return map;
    }
    /** å®šä½åŒæœŸå¤‡ä»½æ¯ç‰ˆï¼ˆæ¸…理前的完整月母版),用于把骨架母版缺失的 5-7 æœˆæœˆåº¦å—按备份还原;
     *  ä¸Ž resolveAnyTemplate ç›¸åŒç­–略:在配置目录、user.dir ç›¸å¯¹ç›®å½•、上级目录三个候选根中扫描 */
    private File resolveSummaryDonor(int year, int month) {
        String rel = summaryTemplateDir;
        while (rel.startsWith("./")) rel = rel.substring(2);
        String[] roots = {
            summaryTemplateDir,
            System.getProperty("user.dir") + "/" + rel,
            System.getProperty("user.dir") + "/../" + rel
        };
        for (String root : roots) {
            if (root == null || root.trim().isEmpty()) continue;
            File dir = new File(root);
            File[] files = dir.listFiles((d, name) ->
                name.startsWith("_备份_") && name.contains(year + "å¹´" + month + "月") && name.contains("道路运输量汇总表"));
            if (files != null && files.length > 0) return files[0];
        }
        return null;
    }
    /** æŒ‰åŒæœŸå¤‡ä»½æ¯ç‰ˆè¿˜åŽŸæœˆåº¦å—ï¼šå‡¡å¤‡ä»½æœ‰å†…å®¹è€Œæ¯ç‰ˆåŒæ ¼ç¼ºå¤±/内容不同(清理时被裁掉的 5-7 æœˆå€¼ä¸Žç´¯è®¡å…¬å¼ï¼‰çš„单元格,整格回填并覆盖 */
    private int restoreSummaryMonthlyBlocks(XSSFWorkbook wb, XSSFWorkbook donor) {
        int restored = 0;
        for (int i = 0; i < donor.getNumberOfSheets(); i++) {
            Sheet ds = donor.getSheetAt(i);
            if (ds == null) continue;
            Sheet bs = wb.getSheet(ds.getSheetName());
            if (bs == null) continue;
            for (int r = ds.getFirstRowNum(); r <= ds.getLastRowNum(); r++) {
                Row dr = ds.getRow(r);
                if (dr == null) continue;
                Row br = bs.getRow(r);
                for (Cell dc : dr) {
                    if (dc == null) continue;
                    CellType t = dc.getCellType();
                    if (t == CellType.BLANK) continue;
                    String dtx = summaryCellText(dc);
                    if (dtx == null || dtx.isEmpty()) continue;
                    Cell bc = (br == null) ? null : br.getCell(dc.getColumnIndex());
                    if (bc != null && dtx.equals(summaryCellText(bc))) continue;
                    Row tr = (bc != null) ? br : bs.getRow(r);
                    if (tr == null) tr = bs.createRow(r);
                    Cell tc = (bc != null) ? bc : tr.getCell(dc.getColumnIndex());
                    if (tc == null) tc = tr.createCell(dc.getColumnIndex());
                    tc.setBlank();
                    if (t == CellType.FORMULA) {
                        String f = dc.getCellFormula();
                        if (f != null) tc.setCellFormula(f);
                    } else if (t == CellType.STRING) {
                        tc.setCellValue(dc.getStringCellValue());
                    } else if (t == CellType.NUMERIC) {
                        tc.setCellValue(dc.getNumericCellValue());
                    } else if (t == CellType.BOOLEAN) {
                        tc.setCellValue(dc.getBooleanCellValue());
                    }
                    restored++;
                }
            }
        }
        return restored;
    }
    /** å•元格内容文本化(公式带 = å‰ç¼€ï¼‰ï¼Œç”¨äºŽè·¨ç°¿æ¯”对 */
    private String summaryCellText(Cell c) {
        if (c == null) return null;
        switch (c.getCellType()) {
            case FORMULA: {
                String f = c.getCellFormula();
                return f == null ? "" : "=" + f;
            }
            case STRING:
                return c.getStringCellValue();
            case NUMERIC:
                return Double.toString(c.getNumericCellValue());
            case BOOLEAN:
                return Boolean.toString(c.getBooleanCellValue());
            default:
                return "";
        }
    }
    /** æŠŠ 8 ä¸ªå°è´¦/合成页裁剪到 keepMonths æœˆï¼š
     *  æœˆåº¦å€¼åˆ— 2026 å¹´ m æœˆ = ç¬¬ 3+2*(m-1) åˆ—(C/E/G/I/K/M/O),同比列为其后一列;
     *  ç´¯è®¡ Q åˆ— = C+E+...+O,累计同比 R åˆ—分母 = 2025 å¹´åŒæœˆåˆ— T/V/X/Z/AB/AD/AF。
     *  è£å‰ª = æ•°æ®è¡Œï¼ˆå«ç´¯è®¡å…¬å¼ä¸”任一 2026 æœˆåº¦åˆ—有内容)中 keepMonths+1..7 æœˆçš„当月值/同比单元格清空(表头保留),
     *  å¹¶æŠŠè¯¥è¡Œç´¯è®¡å…¬å¼åŽ»æŽ‰å¯¹åº” +列,累计同比分母去掉对应 2025 åˆ—。 */
    private int trimSummaryMonthlySheets(XSSFWorkbook wb, int keepMonths) {
        String[] scope = {" è´§è¿", "班线包车", "城市客运", "公交", "出租", "网约车", "轨道、轮渡", "中口径明细"};
        java.util.Set<String> scopeSet = new java.util.HashSet<>();
        for (String s : scope) scopeSet.add(s);
        int touched = 0;
        for (int i = 0; i < wb.getNumberOfSheets(); i++) {
            Sheet sh = wb.getSheetAt(i);
            if (sh == null || !scopeSet.contains(sh.getSheetName())) continue;
            for (int r = sh.getFirstRowNum(); r <= sh.getLastRowNum(); r++) {
                Row row = sh.getRow(r);
                if (row == null) continue;
                Cell q = row.getCell(16); // Q åˆ— = ç´¯è®¡
                if (q == null || q.getCellType() != CellType.FORMULA) continue;
                boolean hasMonthly = false;
                for (int m = 1; m <= 7 && !hasMonthly; m++) {
                    Cell v = row.getCell(2 + 2 * (m - 1)); // C,E,G,I,K,M,O
                    if (v != null && v.getCellType() != CellType.BLANK) hasMonthly = true;
                }
                if (!hasMonthly) continue; // æŽ’除页首/页中跨页签校验公式行(无月度值)
                int excelRow = r + 1; // å…¬å¼å†…引用为 Excel 1-based è¡Œå·
                for (int m = keepMonths + 1; m <= 7; m++) {
                    int valueCol = 2 + 2 * (m - 1);     // 2026 å½“月值列
                    int yoyCol = valueCol + 1;          // å½“月同比列
                    String vLetter = colLetter(valueCol);
                    Cell vc = row.getCell(valueCol);
                    if (vc != null) {
                        vc.setBlank();
                        touched++;
                    }
                    Cell yc = row.getCell(yoyCol);
                    if (yc != null) {
                        yc.setBlank();
                        touched++;
                    }
                    String fq = q.getCellFormula();
                    if (fq != null && fq.contains("+" + vLetter + excelRow)) {
                        q.setCellFormula(fq.replace("+" + vLetter + excelRow, ""));
                        touched++;
                    }
                    Cell rc = row.getCell(17); // R åˆ— = ç´¯è®¡åŒæ¯”
                    if (rc != null && rc.getCellType() == CellType.FORMULA) {
                        String fr = rc.getCellFormula();
                        int lastCol = 19 + 2 * (m - 1); // 2025 åŒæœˆåˆ— T..AF(0-based:T=19,AF=31)
                        String lLetter = colLetter(lastCol);
                        String txt = fr;
                        if (txt != null && txt.contains("," + lLetter + excelRow)) {
                            txt = txt.replace("," + lLetter + excelRow, "");
                            touched++;
                        }
                        if (txt != null && txt.contains("+" + lLetter + excelRow)) {
                            txt = txt.replace("+" + lLetter + excelRow, "");
                            touched++;
                        }
                        if (txt != null && !txt.equals(fr)) rc.setCellFormula(txt);
                    }
                }
            }
        }
        return touched;
    }
    /** æ±‡æ€»å·¥ä½œç°¿å¹´ä»½åŠ¨æ€åŒ–ï¼šä»…æŠŠ 2026å¹´ å‰ç¼€æ›¿æ¢ä¸ºç›®æ ‡å¹´ï¼ˆ2025/2024 å‚考列不动) */
@@ -4574,7 +4745,13 @@
                        CellType ct = cell.getCellType();
                        if (ct != CellType.NUMERIC && ct != CellType.FORMULA) continue;
                        if (org.apache.poi.ss.usermodel.DateUtil.isCellDateFormatted(cell)) continue;
                        if (ct == CellType.NUMERIC && Math.rint(cell.getNumericCellValue()) == cell.getNumericCellValue()) continue;
                        boolean integral = false;
                        if (ct == CellType.NUMERIC) {
                            integral = Math.rint(cell.getNumericCellValue()) == cell.getNumericCellValue();
                        } else if (cell.getCachedFormulaResultType() == CellType.NUMERIC) {
                            integral = Math.rint(cell.getNumericCellValue()) == cell.getNumericCellValue();
                        }
                        if (integral) continue; // æ•´æ•°ä¸æ˜¾ç¤º .00(含公式结果为整数的格)
                        org.apache.poi.ss.usermodel.CellStyle cs = cell.getCellStyle();
                        if (cs == null) continue;
                        String f = cs.getDataFormatString();
@@ -4595,6 +4772,61 @@
        }
    }
    /** æ±‡æ€»è¡¨å¯¼å‡ºåŽæŒ‰å†…容自动加宽列宽(只加宽不缩窄;跳过合并单元格标题,防长标题把单列撑爆) */
    private void autoFitContentColumns(org.apache.poi.ss.usermodel.Workbook wb) {
        if (wb == null) return;
        org.apache.poi.ss.usermodel.DataFormatter dfmt = new org.apache.poi.ss.usermodel.DataFormatter();
        for (int s = 0; s < wb.getNumberOfSheets(); s++) {
            org.apache.poi.ss.usermodel.Sheet sh = wb.getSheetAt(s);
            if (sh == null) continue;
            java.util.Set<String> merged = new java.util.HashSet<>();
            for (org.apache.poi.ss.util.CellRangeAddress ra : sh.getMergedRegions()) {
                for (int r = ra.getFirstRow(); r <= ra.getLastRow(); r++) {
                    for (int c = ra.getFirstColumn(); c <= ra.getLastColumn(); c++) {
                        merged.add(r + ":" + c);
                    }
                }
            }
            int maxCol = -1;
            for (org.apache.poi.ss.usermodel.Row row : sh) {
                if (row == null) continue;
                maxCol = Math.max(maxCol, (int) row.getLastCellNum() - 1);
            }
            if (maxCol < 0) continue;
            int[] need = new int[maxCol + 1];
            for (org.apache.poi.ss.usermodel.Row row : sh) {
                if (row == null) continue;
                for (org.apache.poi.ss.usermodel.Cell cell : row) {
                    int c = cell.getColumnIndex();
                    if (c > maxCol || merged.contains(row.getRowNum() + ":" + c)) continue;
                    String txt;
                    try {
                        txt = dfmt.formatCellValue(cell);
                    } catch (Exception ignore) {
                        continue;
                    }
                    if (txt == null || txt.isEmpty()) continue;
                    int units = 0;
                    for (int i = 0; i < txt.length(); i++) {
                        units += isWideChar(txt.charAt(i)) ? 2 : 1;
                    }
                    if (units > need[c]) need[c] = Math.min(units, 34); // é•¿æ–‡æœ¬ä¸æŠŠå•列撑爆
                }
            }
            for (int c = 0; c <= maxCol; c++) {
                if (need[c] <= 0) continue;
                int target = Math.min(need[c] + 2, 46) * 256;
                if (target > sh.getColumnWidth(c)) sh.setColumnWidth(c, target);
            }
        }
    }
    /** CJK / å…¨è§’字符按两倍宽度计(近似 Excel æ˜¾ç¤ºåˆ—宽) */
    private boolean isWideChar(char ch) {
        return (ch >= 0x2E80 && ch <= 0x9FFF) || (ch >= 0xF900 && ch <= 0xFAFF)
            || (ch >= 0xFF00 && ch <= 0xFFEF);
    }
    private byte[] toBytes(XSSFWorkbook wb) throws Exception {
        applyTwoDecimalFormat(wb);
        try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
traffic-audit-web/src/views/DataImport.vue
@@ -1,4 +1,4 @@
<template>
SKIP/CHECK (0): TYPE_LABELS upper <template>
  <el-container direction="vertical">
    <app-header title="交通统计报表审核系统 - æ•°æ®å¯¼å…¥"></app-header>
    <el-container>
@@ -134,10 +134,11 @@
  investCityPassenger: '市州单表(客运站场)', investCityLogistics: '市州单表(物流园区)',
  'INVEST_客运站场_CITY': '市州单表(客运站场)', 'INVEST_物流园区_CITY': '市州单表(物流园区)',
  cityBus: '城市公交月报', cityTaxi: '巡游出租月报', cityTaxiAuth: '出租车运政车辆',
  wycTotal: '网约车总数', wycOrder: '网约车订单及全省总量',
  H2032: 'H203-2月报', H2031: 'H203-1旅客月报', H204: 'H204能耗季报', PASSENGER_AUTH: '旅客运政车辆数',
  PASSENGER_INDIVIDUAL: '个体客运量/周转量', ENERGY_AUTH: '能耗车辆运政信息', TRANSPORT_AUTH: '运政车辆',
  TRACK_MILEAGE: '轨迹里程', SCALE_SPLIT: '规上规下拆分', FREIGHT_TURNOVER: '货运量周转量',
  INVEST_SYSTEM: '投资系统导出', CITY_BUS: '城市公交月报', CITY_TAXI: '巡游出租月报', CITY_TAXI_AUTH: '出租车运政车辆'
  INVEST_SYSTEM: '投资系统导出', CITY_BUS: '城市公交月报', CITY_TAXI: '巡游出租月报', CITY_TAXI_AUTH: '出租车运政车辆', WYC_TOTAL: '网约车总数', WYC_ORDER: '网约车订单及全省总量'
}
const BATCH_TYPE_MAP = {
  H2032: 'h2032', TRANSPORT_AUTH: 'transportAuth', TRACK_MILEAGE: 'trackMileage',
@@ -145,6 +146,7 @@
  H2031: 'passengerMonthly', PASSENGER_AUTH: 'passengerAuth', PASSENGER_INDIVIDUAL: 'passengerIndividual',
  H204: 'energyMonthly', ENERGY_AUTH: 'energyAuth',
  CITY_BUS: 'cityBus', CITY_TAXI: 'cityTaxi', CITY_TAXI_AUTH: 'cityTaxiAuth',
  WYC_TOTAL: 'wycTotal', WYC_ORDER: 'wycOrder',
  INVEST_SYSTEM: 'investmentSystem'
}
export default {
@@ -187,7 +189,9 @@
          key: 'city', name: '城市客运', types: [
            { value: 'cityBus', label: '城市公共交通月度运营情况' },
            { value: 'cityTaxi', label: '巡游出租汽车运营服务情况月报' },
            { value: 'cityTaxiAuth', label: '出租车运政车辆' }
            { value: 'cityTaxiAuth', label: '出租车运政车辆' },
            { value: 'wycTotal', label: '网约车总数' },
            { value: 'wycOrder', label: '网约车订单及全省总量' }
          ]
        },
        {
@@ -258,7 +262,9 @@
        investCityLogistics: '—(批量扫描目录,无需模板)',
        cityBus: '导入_城市公共交通月度运营情况(YYYYå¹´M月).xls/.xlsx(企业级明细,取公共汽电车字段)',
        cityTaxi: '导入_巡游出租汽车运营服务情况月报(YYYYå¹´M月).xls(市州级17行)',
        cityTaxiAuth: '导入模板_出租车信息(运政车辆信息).xlsx(车辆级明细,用于运营车数对比)'
        cityTaxiAuth: '导入模板_出租车信息(运政车辆信息).xlsx(车辆级明细,用于运营车数对比)',
        wycTotal: '模板_网约车总数.xlsx(A列=月份,B-E=全省客运量/城市内/周转量/城市内周转量)',
        wycOrder: '模板_网约车订单及全省总量.xlsx(A列=月份,B-E=全省pin,F=订单合计,G-W=17市州订单)'
      }
      return map[this.importType] || ''
    },
@@ -277,6 +283,8 @@
        cityBus: '城市客运/生成_城市公交客运量分市州明细.xlsx',
        cityTaxi: '城市客运/生成_巡游出租客运量分市州明细.xlsx',
        cityTaxiAuth: '城市客运/导入模板_出租车信息(运政车辆信息).xlsx',
        wycTotal: '城市客运/模板_网约车总数.xlsx',
        wycOrder: '城市客运/模板_网约车订单及全省总量.xlsx',
        investment: '投资/输入/客运(客运站)/更新_7月客运站投资明细表(市州汇总大表,给领导).xlsx',
        investmentLogistics: '投资/输入/物流(物流园区)/更新_7月物流站场投资明细.xls',
        investmentSystem: '投资/模板_查询结果(投资系统-客运+物流 2026.7).xls'
@@ -314,7 +322,9 @@
        investmentSystem: '/import/investmentSystem',
        cityBus: '/import/cityBus',
        cityTaxi: '/import/cityTaxi',
        cityTaxiAuth: '/import/cityTaxiAuth'
        cityTaxiAuth: '/import/cityTaxiAuth',
        wycTotal: '/import/wycTotal',
        wycOrder: '/import/wycOrder'
      }
      return map[t] || ''
    },
traffic-audit-web/src/views/DataView.vue
@@ -45,20 +45,22 @@
        <div style="color:#909399;font-size:12px;margin-bottom:6px">
          å…± {{ total }} æ¡è®°å½•,当前第 {{ page }} é¡µ
        </div>
        <div class="table-area" ref="tableArea">
        <el-table :data="records" border v-loading="loading" size="small" style="width:100%" height="100%">
          <el-table-column v-for="c in columns" :key="c.prop" :prop="c.prop" :label="c.label" :min-width="c.width" show-overflow-tooltip>
            <template slot-scope="scope">
              <span>{{ formatCell(scope.row[c.prop]) }}</span>
            </template>
          </el-table-column>
        </el-table>
        <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 columns" :key="c.prop" :prop="c.prop" :label="c.label" :min-width="c.width" show-overflow-tooltip>
                <template slot-scope="scope">
                  <span>{{ formatCell(scope.row[c.prop]) }}</span>
                </template>
              </el-table-column>
            </el-table>
          </div>
          <el-pagination style="margin-top:15px;text-align:right"
            background layout="total, prev, pager, next, sizes"
            :total="total" :current-page.sync="page" :page-size.sync="size"
            :page-sizes="[20, 50, 100]" @current-change="loadData" @size-change="loadData">
          </el-pagination>
        </div>
        <el-pagination style="margin-top:15px;text-align:right"
          background layout="total, prev, pager, next, sizes"
          :total="total" :current-page.sync="page" :page-size.sync="size"
          :page-sizes="[20, 50, 100]" @current-change="loadData" @size-change="loadData">
        </el-pagination>
      </el-main>
    </el-container>
  </el-container>
@@ -110,7 +112,7 @@
      })
    },
    toggleFullscreen() {
      const el = this.$refs.tableArea
      const el = this.$refs.tableWrap
      if (!document.fullscreenElement) {
        if (el && el.requestFullscreen) el.requestFullscreen()
        else this.$message.warning("浏览器不支持全屏")
@@ -139,4 +141,18 @@
  background: #fff;
  overflow: auto;
}
#app .table-wrap:fullscreen {
  padding: 20px;
  background: #fff;
  overflow: auto;
  display: flex;
  flex-direction: column;
}
#app .table-wrap:fullscreen .table-area {
  flex: 1 1 auto;
  min-height: 0;
}
#app .table-wrap:fullscreen .el-pagination {
  flex: none;
}
</style>
traffic-audit-web/src/views/ReportExport.vue
@@ -115,8 +115,9 @@
              <table class="preview-summary" v-if="it.summary && it.summary.length">
                <tbody>
                  <tr v-for="(s, i) in it.summary" :key="i">
                    <td>{{ s.name }}</td>
                    <td>{{ s.label }}</td>
                    <td><span v-if="s.value === null || s.value === ''" class="cell-empty">(空)</span>{{ fmtVal(s.value) }}</td>
                    <td style="white-space:nowrap;color:#909399">{{ s.unit || '' }}</td>
                  </tr>
                </tbody>
              </table>