82100d611b8b7bd33ee8d199d07a4797e781d6cc..49fea21571a4060aa8570cbf220088352e2ccf15
2026-09-16 zhizhijie
docs(工作日结): 补记 2026-09-16 收工记录(origin 已推 80e0879、gitea 仍不通、未提交项与明日计划)
49fea2 对比 | 目录
2026-09-16 zhizhijie
fix(summary): 修 2026-07 导出件「Excel 打不开」+ 补齐 7 月母版 2021/2022/2023 累计列
80e087 对比 | 目录
2026-09-16 zhizhijie
docs(问题汇总): 补充第十二节 —— 货运页签累计列派生口径、母版改动方式、PowerShell/git 文本坑与遗留问题增量
e29485 对比 | 目录
2026-09-16 zhizhijie
fix(summary): 货运页签累计列改为市州汇总派生,修 2021/2022/2023 累计对不上
8fd1e1 对比 | 目录
2026-09-16 zhizhijie
docs(工作日结): 补记本轮 git 结果(origin 已推 27574bc;gitea HTTP 无响应待补推)
854496 对比 | 目录
2026-09-16 zhizhijie
docs(核对): 货运页签累计列定位(2021累计列母版缺失/2022写死常量)+ 9/16 导入数据体检(H2032 2026-09 期次错误、H...
27574b 对比 | 目录
2026-09-16 zhizhijie
chore: 把 docs 下未入库的项目文档与数据一并提交;忽略 Office 锁文件 ~$*
559e93 对比 | 目录
2026-09-16 zhizhijie
docs(比对): 汇总大表 vs 8月定稿逐表比对报告;工作日结补记 2024 年重导与比对
cb8ea4 对比 | 目录
2026-09-16 zhizhijie
docs(工作日结): 补记收尾 git 实际结果(e7cddc4 已推 origin;gitea 仍 Connection was reset)
170483 对比 | 目录
2026-09-16 zhizhijie
fix(report): 预览弹窗行数文案按报表类型区分
e7cddc 对比 | 目录
2026-09-16 zhizhijie
docs(工作日结): 2026-09-16 补记本轮 git 实际结果(origin 推送成功、gitea 网络不可达未推)
b0c8b4 对比 | 目录
2026-09-16 zhizhijie
feat(h2031): 适配模板新增「统一社会信用代码/填报单位」两列并入库;fix(import): 补录 2023 年货运量周转量;fix(lo...
24b4c2 对比 | 目录
2026-09-16 zhizhijie
feat(import): 货运量周转量支持多年度工作簿(21-26年)一次性入库;fix(report): 汇总大表预览删除中口径之后的明细表
0cfd6e 对比 | 目录
2026-09-16 zhizhijie
docs(工作日结): 2026-09-16 补记 git 实际结果(origin 推送成功、gitea 因网络无响应未推)
44ced8 对比 | 目录
2026-09-16 zhizhijie
fix(cors): 放行内网网段来源,修复局域网 IP 访问时登录 403
0d2a5f 对比 | 目录
15个文件已修改
61个文件已添加
2075 ■■■■■ 已修改文件
.gitignore 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/8月规上货物周转量与运距分析报告_草稿_2026-09-10.md 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/database.md 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/init.sql 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/交通统计报表审核系统_功能与完成情况汇报_2026-09-14.docx 补丁 | 查看 | 原始文档 | blame | 历史
docs/公路旅客/模板_交企统H203-1表_公路旅客运输月度生产情况.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
docs/功能测试报告/功能测试报告_2026-07母版补齐与导出件打不开修复_2026-09-16.md 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/功能测试报告/功能测试报告_H2031模板新增列适配_2026-09-16.md 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/功能测试报告/功能测试报告_局域网IP访问登录CORS修复_2026-09-16.md 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/功能测试报告/功能测试报告_汇总大表预览删除中口径后明细表_2026-09-16.md 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/功能测试报告/功能测试报告_登录验证码容错与报表预览整改_2026-09-16.md 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/功能测试报告/功能测试报告_货运量周转量2023年数据补录_2026-09-16.md 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/功能测试报告/功能测试报告_货运量周转量多年度导入_2026-09-16.md 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/功能测试报告/功能测试报告_货运页签累计列修复与脏期清理_2026-09-16.md 176 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/功能测试报告/汇总大表与定稿比对_2026-09-16.md 251 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/功能测试报告/货运累计列核对与导入数据体检_2026-09-16.md 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/城市客运/网约车拆分.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
docs/城市客运/网约车拆分_2026年7月.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
docs/审核界面月报模板/模板_公路旅客运输月度生产情况(2026).xlsx 补丁 | 查看 | 原始文档 | blame | 历史
docs/审核界面月报模板/模板_城市公共交通月度运营情况(2026)(1).xlsx 补丁 | 查看 | 原始文档 | blame | 历史
docs/审核界面月报模板/模板_审核结果.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
docs/审核界面月报模板/模板_审核结果_.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
docs/审核界面月报模板/模板_巡游出租汽车运营服务情况月报(2026)(1).xlsx 补丁 | 查看 | 原始文档 | blame | 历史
docs/审核界面月报模板/模板_道路货物运输月度生产情况(2026)(1).xlsx 补丁 | 查看 | 原始文档 | blame | 历史
docs/工作日结/工作日结_2026-09-05.md 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/工作日结/工作日结_2026-09-16.md 382 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/投资/输入7月的内容要与《模板_查询结果(投资系统-客运+物流 2026.7)》进行校验,存在数据不一致的弹窗提示.txt 补丁 | 查看 | 原始文档 | blame | 历史
docs/报表生成_关系逻辑与每日进度总表.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
docs/生成汇总大表/2026年7月道路运输量汇总表.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
docs/生成汇总大表/2026年8月道路运输量汇总表.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
docs/生成汇总大表/2026年8月道路运输量汇总表_版式原型.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
docs/生成汇总大表/汇总表预览格式.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
docs/生成汇总大表/生成_道路运输量汇总表.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
docs/生成汇总大表/输出/生成_道路运输量汇总表_2026-07_格式验证.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
docs/生成汇总大表/输出/生成_道路运输量汇总表_2026-07_验证.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
docs/生成汇总大表/输出/生成_道路运输量汇总表_2026-08_四页数据驱动_2026-09-13.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
docs/生成汇总大表/输出/生成_道路运输量汇总表_2026-08_排名刷新与同比百分数_2026-09-11.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
docs/生成汇总大表/输出/生成_道路运输量汇总表_2026-08_格式验证.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
docs/生成汇总大表/输出/生成_道路运输量汇总表_2026-08_清理验证.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
docs/生成汇总大表/输出/道路运输量汇总表_2026-07_排名左块删除验证.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
docs/生成汇总大表/输出/道路运输量汇总表_2026-07_版式统一验证.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
docs/生成汇总大表/输出/道路运输量汇总表_2026-08_扩列验证.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
docs/生成汇总大表/输出/道路运输量汇总表_2026-08_版式统一验证.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
docs/生成汇总大表/预览界面.png 补丁 | 查看 | 原始文档 | blame | 历史
docs/货运企业平均运距增幅筛查名单_2026-08与累计_2026-09-05.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
docs/货运企业平均运距增幅筛查名单_2026-08与累计_8月累计均50口径_2026-09-05.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
docs/货运需导入的数据/货运/2025年月报/道路货物运输月度生产情况(2025年10月).xls 补丁 | 查看 | 原始文档 | blame | 历史
docs/货运需导入的数据/货运/2025年月报/道路货物运输月度生产情况(2025年11月).xls 补丁 | 查看 | 原始文档 | blame | 历史
docs/货运需导入的数据/货运/2025年月报/道路货物运输月度生产情况(2025年12月).xls 补丁 | 查看 | 原始文档 | blame | 历史
docs/货运需导入的数据/货运/2025年月报/道路货物运输月度生产情况(2025年1月).xls 补丁 | 查看 | 原始文档 | blame | 历史
docs/货运需导入的数据/货运/2025年月报/道路货物运输月度生产情况(2025年2月).xls 补丁 | 查看 | 原始文档 | blame | 历史
docs/货运需导入的数据/货运/2025年月报/道路货物运输月度生产情况(2025年3月).xls 补丁 | 查看 | 原始文档 | blame | 历史
docs/货运需导入的数据/货运/2025年月报/道路货物运输月度生产情况(2025年4月).xls 补丁 | 查看 | 原始文档 | blame | 历史
docs/货运需导入的数据/货运/2025年月报/道路货物运输月度生产情况(2025年5月).xls 补丁 | 查看 | 原始文档 | blame | 历史
docs/货运需导入的数据/货运/2025年月报/道路货物运输月度生产情况(2025年6月).xls 补丁 | 查看 | 原始文档 | blame | 历史
docs/货运需导入的数据/货运/2025年月报/道路货物运输月度生产情况(2025年7月).xls 补丁 | 查看 | 原始文档 | blame | 历史
docs/货运需导入的数据/货运/2025年月报/道路货物运输月度生产情况(2025年8月).xls 补丁 | 查看 | 原始文档 | blame | 历史
docs/货运需导入的数据/货运/2025年月报/道路货物运输月度生产情况(2025年9月).xls 补丁 | 查看 | 原始文档 | blame | 历史
docs/货运需导入的数据/货运/2026年1-7月报/道路货物运输月度生产情况(2026年1月).xls 补丁 | 查看 | 原始文档 | blame | 历史
docs/货运需导入的数据/货运/2026年1-7月报/道路货物运输月度生产情况(2026年2月).xls 补丁 | 查看 | 原始文档 | blame | 历史
docs/货运需导入的数据/货运/2026年1-7月报/道路货物运输月度生产情况(2026年3月).xls 补丁 | 查看 | 原始文档 | blame | 历史
docs/货运需导入的数据/货运/2026年1-7月报/道路货物运输月度生产情况(2026年4月).xls 补丁 | 查看 | 原始文档 | blame | 历史
docs/货运需导入的数据/货运/2026年1-7月报/道路货物运输月度生产情况(2026年5月).xls 补丁 | 查看 | 原始文档 | blame | 历史
docs/货运需导入的数据/货运/2026年1-7月报/道路货物运输月度生产情况(2026年6月).xls 补丁 | 查看 | 原始文档 | blame | 历史
docs/货运需导入的数据/货运/2026年1-7月报/道路货物运输月度生产情况(2026年7月).xls 补丁 | 查看 | 原始文档 | blame | 历史
docs/问题汇总/问题与注意事项汇总_2026-09-16.md 289 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
traffic-audit-server/src/main/java/com/trafficaudit/common/config/CorsConfig.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
traffic-audit-server/src/main/java/com/trafficaudit/dataimport/controller/DataViewController.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
traffic-audit-server/src/main/java/com/trafficaudit/dataimport/entity/PassengerEnterpriseMonthly.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
traffic-audit-server/src/main/java/com/trafficaudit/dataimport/service/DataImportService.java 173 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
traffic-audit-server/src/main/resources/application.yml.example 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
traffic-audit-web/src/directives/dialogDrag.js 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
traffic-audit-web/src/main.js 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
traffic-audit-web/src/views/Login.vue 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
traffic-audit-web/src/views/ReportExport.vue 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.gitignore
@@ -38,6 +38,10 @@
Thumbs.db
desktop.ini
 # ==== Office æ‰“开文档时产生的锁文件 ====
~$*
_pylibs/
# ==== ??/?????????====
_shots/
*.nb3
docs/8Ô¹æÉÏ»õÎïÖÜתÁ¿ÓëÔ˾à·ÖÎö±¨¸æ_²Ý¸å_2026-09-10.md
New file
@@ -0,0 +1,99 @@
# 2026å¹´8月规上货物周转量与平均运距分析报告(草稿)
> æ•°æ®æ¥æºï¼šã€Šå…¨çœè§„上货物周转量差异率.xlsx》的「市州汇总」「企业明细」两个页签。企业明细为 **8月当月** å£å¾„,仅含命中问题的企业,不代表市州全部规上企业。
> è‰ç¨¿æ—¥æœŸï¼š2026-09-10
## ä¸€ã€æ€»ä½“情况
2026å¹´8月,全省规上道路货物运输完成货运量 3665.36 ä¸‡å¨ã€è´§ç‰©å‘¨è½¬é‡ 570004.44 ä¸‡å¨å…¬é‡Œï¼ŒåŒæ¯”分别下降 1.37%、增长 9.60%;货车平均运距 155.51 å…¬é‡Œï¼ŒåŒæ¯”增长 11.11%。上报周转量与轨迹里程测算周转量的差异率本月为 4.69%,比上月(7月)的 20.65% æ”¶çª„ 15.96 ä¸ªç™¾åˆ†ç‚¹ã€‚
1-8月累计,全省规上货运量 31399.82 ä¸‡å¨ã€è´§ç‰©å‘¨è½¬é‡ 4927161.77 ä¸‡å¨å…¬é‡Œï¼ŒåŒæ¯”分别下降 7.63% å’Œ 3.44%;累计差异率 29.93%,比1-7月的 34.16% æ”¶çª„ 4.23 ä¸ªç™¾åˆ†ç‚¹ã€‚
总体特征:当月呈现 **“货运量下降、周转量增长、平均运距拉长”**。周转量增速(+9.6%)明显高于货运量(-1.4%),增长主要来自平均运距拉长(+11.1%),而非运输量增加(周转量 = è´§è¿é‡ Ã— å¹³å‡è¿è·ï¼Œè´§è¿é‡ä¸‹é™æ—¶ï¼Œå‘¨è½¬é‡èƒ½å¦å¢žé•¿å®Œå…¨å–决于运距拉长幅度);但累计口径周转量仍为负增长(-3.4%),当月回升尚未扭转累计下降趋势。
## äºŒã€é‡ç‚¹å¸‚州的选取
选取武汉、黄石、宜昌、襄阳、荆州、黄冈、咸宁 7 ä¸ªå¸‚州(表内黄色标注)作为重点分析对象,理由如下:
1. **全省货运主体**:7 ä¸ªå¸‚å·ž 8 æœˆè´§è¿é‡åˆè®¡ 3142.32 ä¸‡å¨ï¼Œå å…¨çœ **85.7%**;1-8 æœˆç´¯è®¡å  86.2%;8 æœˆå‘¨è½¬é‡å  85.2%。货运主体在这里,全省问题的主要来源也在这里。
2. **周转量增长主要由运距拉动**:由于 å‘¨è½¬é‡ = è´§è¿é‡ Ã— å¹³å‡è¿è·ï¼Œåœ¨è´§è¿é‡ä¸‹é™æ—¶ï¼Œå‘¨è½¬é‡èƒ½å¦å¢žé•¿å®Œå…¨å–决于运距的拉长幅度。黄石(货运量 -34.6%、运距 +85.5%、周转量 +21.3%)、襄阳(-22.8%、+32.8%、+2.5%)的运距拉长幅度明显大于全省(+11.1%);荆州(-6.4%、+7.7%、+0.8%)量减而周转量微增,同属货量与周转量不同向。上述市州需核实代表企业运距是否真实。
3. **短途运输特征**:宜昌(87.29 å…¬é‡Œï¼‰ã€å’¸å®ï¼ˆ83.58 å…¬é‡Œï¼‰ã€é»„石(121.73 å…¬é‡Œï¼‰ã€é»„冈(132.00 å…¬é‡Œï¼‰å¹³å‡è¿è·æ˜Žæ˜¾ä½ŽäºŽå…¨çœ 155.51 å…¬é‡Œï¼Œä»¥çŸ­é€”运输为主。
| å¸‚å·ž | 8月货运量(万吨) | å å…¨çœ | 8月平均运距(公里) | 2025å¹´8月运距 | è¿è·åŒæ¯” | 8月货运量同比 | 8月周转量同比 | 8月差异率 |
|---|---|---|---|---|---|---|---|---|
| æ­¦æ±‰ | 1167.83 | 31.9% | 164.68 | 136.62 | +20.5% | +10.6% | +33.3% | +0.6% |
| é»„石 | 131.00 | 3.6% | 121.73 | 65.62 | +85.5% | -34.6% | +21.3% | -11.0% |
| å®œæ˜Œ | 761.88 | 20.8% | 87.29 | 77.01 | +13.4% | +5.5% | +19.6% | +77.0% |
| è¥„阳 | 326.61 | 8.9% | 287.54 | 216.51 | +32.8% | -22.8% | +2.5% | +1.7% |
| è†å·ž | 111.85 | 3.1% | 320.92 | 297.97 | +7.7% | -6.4% | +0.8% | -15.8% |
| é»„冈 | 560.89 | 15.3% | 132.00 | 126.09 | +4.7% | -10.7% | -6.5% | +120.2% |
| å’¸å® | 82.25 | 2.2% | 83.58 | 75.35 | +10.9% | +16.5% | +29.2% | -2.9% |
| **全省** | 3665.36 | 100.0% | 155.51 | 139.96 | +11.1% | -1.4% | +9.6% | +4.7% |
## ä¸‰ã€ä»£è¡¨ä¼ä¸šåˆ†æž
> ä»£è¡¨ä¼ä¸šæŒ‰â€œå‘¨è½¬é‡è§„模大、差异率高、运距同比异常”三个角度选取,每市州 3 å®¶ï¼›è¡¨å†…数据均为 8 æœˆå½“月。
### æ­¦æ±‰
明细内 101 å®¶ï¼Œå…¶ä¸­å·®å¼‚率≥30% çš„ 76 å®¶ã€â‰¥100% çš„ 37 å®¶ï¼Œå¹³å‡è¿è·åŒæ¯”>30% çš„ 44 å®¶ã€‚武汉 8 æœˆå·®å¼‚率仅 +0.57%,企业层面却高度集中,属典型的“大盘正常、个体异常”。
| ä¼ä¸šåç§° | 8月周转量(万吨公里) | 8月货运量(万吨) | å¹³å‡è¿è·(公里) | è¿è·åŒæ¯” | å‘¨è½¬é‡åŒæ¯” | å·®å¼‚率 |
|---|---|---|---|---|---|---|
| æ¹–北圆涔物流有限公司 | 9617.4 | 20.29 | 474.1 | +100.4% | +172.2% | -66.9% |
| æ­¦æ±‰è¥¿é©¬é’¢é“ç‰©æµæœ‰é™å…¬å¸ | 5085.6 | 81.72 | 62.2 | +100.0% | +130.8% | +169.0% |
| æ­¦æ±‰å®é’运贸有限公司 | 900.9 | 14.42 | 62.5 | +182.3% | +304.1% | +337.2% |
### é»„石
明细内仅 3 å®¶ï¼Œå·®å¼‚率均未超过 30%,但 3 å®¶ä¼ä¸šå¹³å‡è¿è·åŒæ¯”全部超过 30%。黄石 8 æœˆè´§è¿é‡åŒæ¯” -34.6%、周转量同比 +21.3%,量价背离在 7 ä¸ªå¸‚州中最明显。
| ä¼ä¸šåç§° | 8月周转量(万吨公里) | 8月货运量(万吨) | å¹³å‡è¿è·(公里) | è¿è·åŒæ¯” | å‘¨è½¬é‡åŒæ¯” | å·®å¼‚率 |
|---|---|---|---|---|---|---|
| æ¹–北鸿茂物流有限责任公司 | 1026.0 | 0.96 | 1073.7 | +56.1% | +119.6% | -11.9% |
| å¤§å†¶æœ‰è‰²ç‰©æµæœ‰é™å…¬å¸ | 107.1 | 2.83 | 37.8 | +67.2% | -81.6% | -0.3% |
| æ¹–北广运远道物流有限公司 | 239.2 | 8.04 | 29.8 | +30.6% | -13.9% | -0.2% |
### å®œæ˜Œ
明细内 50 å®¶ï¼Œå·®å¼‚率全部≥30%,其中 29 å®¶â‰¥100%,8 æœˆå·®å¼‚率 +77.01%,居全省第二,属差异面最广的市州之一。
| ä¼ä¸šåç§° | 8月周转量(万吨公里) | 8月货运量(万吨) | å¹³å‡è¿è·(公里) | è¿è·åŒæ¯” | å‘¨è½¬é‡åŒæ¯” | å·®å¼‚率 |
|---|---|---|---|---|---|---|
| å®œæ˜ŒåŽç¨‹ä¾›åº”链管理有限公司 | 5791.9 | 6.96 | 831.6 | +5.5% | -10.4% | +256.8% |
| å…´å±±åŽ¿å…´å‘æ±½è¿æœ‰é™å…¬å¸ | 4383.1 | 96.00 | 45.7 | +56.4% | +64.5% | +155.7% |
| æ¹–北訸运石化物流有限公司 | 2518.2 | 5.71 | 441.2 | -26.1% | +99.1% | +111.8% |
### è¥„阳
明细内 34 å®¶ï¼Œå·®å¼‚率≥30% çš„ 21 å®¶ã€‚襄阳 8 æœˆè´§è¿é‡åŒæ¯” -22.8%、周转量同比 +2.5%、运距同比 +32.8%,属“货量下降、运距拉长”型。
| ä¼ä¸šåç§° | 8月周转量(万吨公里) | 8月货运量(万吨) | å¹³å‡è¿è·(公里) | è¿è·åŒæ¯” | å‘¨è½¬é‡åŒæ¯” | å·®å¼‚率 |
|---|---|---|---|---|---|---|
| è¥„阳顺发运输有限责任公司 | 5074.1 | 9.11 | 557.2 | +10.1% | -16.9% | +44.7% |
| æž£é˜³å¸‚鑫路源汽车服务有限公司 | 2498.5 | 6.56 | 380.7 | +72.8% | +61.0% | -7.8% |
| è¥„阳市陆海通物流有限公司 | 1040.2 | 4.40 | 236.2 | +121.6% | +696.4% | -27.0% |
### è†å·ž
明细内 22 å®¶ï¼Œå·®å¼‚率≥30% çš„ 18 å®¶ã€â€œå·®å¼‚率+运距”双命中 6 å®¶ã€‚荆州 8 æœˆè´§è¿é‡åŒæ¯” -6.4%、周转量同比 +0.8%。
| ä¼ä¸šåç§° | 8月周转量(万吨公里) | 8月货运量(万吨) | å¹³å‡è¿è·(公里) | è¿è·åŒæ¯” | å‘¨è½¬é‡åŒæ¯” | å·®å¼‚率 |
|---|---|---|---|---|---|---|
| å…¬å®‰åŽ¿ä¸‰æºç‰©æµæœ‰é™å…¬å¸ | 1888.9 | 7.05 | 267.8 | +126.2% | +192.5% | +494.7% |
| è†å·žå¸‚宏达盛物流股份有限公司 | 2017.2 | 3.11 | 649.2 | +133.9% | +27.8% | -57.7% |
| å…¬å®‰åŽ¿æºè¾¾æ±½è½¦è¿è¾“æœåŠ¡æœ‰é™å…¬å¸ | 1596.8 | 6.92 | 230.8 | +11.0% | +89.6% | +110.3% |
### é»„冈
明细内 52 å®¶ï¼Œå·®å¼‚率≥30% çš„ 49 å®¶ã€â‰¥100% çš„ 39 å®¶ï¼Œå¼‚常集中度全省最高;8 æœˆå·®å¼‚率 +120.18%,居全省第一。
| ä¼ä¸šåç§° | 8月周转量(万吨公里) | 8月货运量(万吨) | å¹³å‡è¿è·(公里) | è¿è·åŒæ¯” | å‘¨è½¬é‡åŒæ¯” | å·®å¼‚率 |
|---|---|---|---|---|---|---|
| è•²æ˜¥å¤ªå¹³æ´‹è½¦è¾†è¿è¾“服务有限公司 | 6118.2 | 38.93 | 157.1 | +24.9% | +21.0% | +747.9% |
| é»„梅县广发汽车运输有限公司 | 5009.4 | 6.04 | 829.9 | +0.6% | +11.2% | +321.5% |
| ç½—田县兴达物流运输有限公司 | 2741.4 | 3.83 | 716.2 | -5.9% | -18.3% | +477.5% |
### å’¸å®
明细内 8 å®¶ï¼Œè§„模较小,且差异率多数为负(上报低于测算)。咸宁是 7 ä¸ªå¸‚州中唯一 1-8 æœˆç´¯è®¡â€œè´§è¿é‡å¢žã€å‘¨è½¬é‡é™â€ï¼ˆ+32.2% / -1.3%)的地区,方向与其他市州相反,需单独说明。
| ä¼ä¸šåç§° | 8月周转量(万吨公里) | 8月货运量(万吨) | å¹³å‡è¿è·(公里) | è¿è·åŒæ¯” | å‘¨è½¬é‡åŒæ¯” | å·®å¼‚率 |
|---|---|---|---|---|---|---|
| èµ¤å£å¸‚海通建材有限公司 | 876.9 | 10.87 | 80.7 | +39.4% | +75.1% | -21.4% |
| æ¹–北扬航物流有限公司 | 799.7 | 1.96 | 407.8 | +38.6% | +129.4% | +0.2% |
| å˜‰é±¼è°¦æºç§‘技有限公司 | 520.3 | 6.94 | 75.0 | +90.5% | +285.4% | -14.8% |
docs/database.md
@@ -222,6 +222,8 @@
| region_code | varchar(20) | æ‰€å±žåœ°åŒºï¼ˆè¡Œæ”¿åŒºåˆ’代码) |
| enterprise_code | varchar(50) | ä¼ä¸šä»£ç  |
| enterprise_name | varchar(200) | ä¼ä¸šåç§° |
| unified_credit_code | varchar(50) | ç»Ÿä¸€ç¤¾ä¼šä¿¡ç”¨ä»£ç ï¼ˆæ–°ç‰ˆæ¨¡æ¿æ–°å¢žåˆ—;老模板无此列时为 NULL) |
| report_unit | varchar(200) | å¡«æŠ¥å•位(新版模板新增列;老模板无此列时为 NULL) |
| vehicle_total | int | å®¢è¿è½¦è¾†_总计 |
| seat_total | int | æ ¸å®šè½½å®¢ä½_总计 |
| vehicle_schedule | int | è½¦è¾†æ•°_客运班车(含定线旅游) |
docs/init.sql
@@ -399,6 +399,8 @@
    region_code VARCHAR(20) COMMENT '所属地区',
    enterprise_code VARCHAR(50) COMMENT '企业代码',
    enterprise_name VARCHAR(200) COMMENT '企业名称',
    unified_credit_code VARCHAR(50) COMMENT '统一社会信用代码',
    report_unit VARCHAR(200) COMMENT '填报单位',
    vehicle_total INT COMMENT '客运车辆_总计',
    seat_total INT COMMENT '核定载客位_总计',
    vehicle_schedule INT COMMENT '车辆数_客运班车(含定线旅游客运客车)',
docs/½»Í¨Í³¼Æ±¨±íÉóºËϵͳ_¹¦ÄÜÓëÍê³ÉÇé¿ö»ã±¨_2026-09-14.docx
Binary files differ
docs/¹«Â·ÂÿÍ/Ä£°å_½»ÆóͳH203-1±í_¹«Â·ÂÿÍÔËÊäÔ¶ÈÉú²úÇé¿ö.xlsx
Binary files differ
docs/¹¦ÄܲâÊÔ±¨¸æ/¹¦ÄܲâÊÔ±¨¸æ_2026-07ĸ°æ²¹ÆëÓëµ¼³ö¼þ´ò²»¿ªÐÞ¸´_2026-09-16.md
New file
@@ -0,0 +1,86 @@
# åŠŸèƒ½æµ‹è¯•æŠ¥å‘Š â€” 2026-07 æ¯ç‰ˆè¡¥é½ & å¯¼å‡ºä»¶ã€ŒExcel æ‰“不开」修复
- æ—¥æœŸï¼š2026-09-16
- èŒƒå›´ï¼šæ±‡æ€»å¤§è¡¨ï¼ˆ`/api/report/export/summaryWorkbook`)2026-07 / 2026-08 å¯¼å‡ºï¼›`docs/生成汇总大表/2026å¹´7月道路运输量汇总表.xlsx` æ¯ç‰ˆè¡¥é½
- å…³è”:`docs/问题汇总/问题与注意事项汇总_2026-09-16.md` ç¬¬åä¸‰èŠ‚
## ä¸€ã€èƒŒæ™¯
《 è´§è¿ã€‹é¡µã€Œç´¯è®¡ã€åˆ—口径在 2026-09-16 å·²åœ¨ **8 æœˆæ¯ç‰ˆ** è½åœ°ï¼ˆè§ç¬¬åäºŒèŠ‚ï¼‰ã€‚ç”¨æˆ·ç¡®è®¤ã€Œå¯ä»¥è¡¥é½ã€ï¼Œè¦æ±‚æŠŠåŒä¸€å£å¾„è¡¥åˆ° **7 æœˆæ¯ç‰ˆ**,并解决 7 æœˆå¯¼å‡ºä»¶æ— æ³•用 Excel æ‰“开的问题。
## äºŒã€æµ‹è¯•环境
| é¡¹ | å€¼ |
|---|---|
| åŽç«¯ | Spring Boot,8090(修复后已重启) |
| å‰ç«¯ | Vue,8080 |
| æ•°æ®åº“ | MySQL 127.0.0.1:3308 / traffic_audit |
| Excel åˆ¤æ® | Excel COM `Workbooks.Open`(每例独立实例,测后强杀孤儿进程) |
| ç»“构判据 | Python `zipfile` + `xml.etree` é€éƒ¨ä»¶æ ¡éªŒã€é€æ ¼ `<c>` è§£æž |
## ä¸‰ã€å‘现的根因(两处,均为本次修复对象)
### 3.1 å¯¼å‡ºä»¶æ‰“不开:残留 `<is>` çš„非法单元格
坏件里存在 19 ä¸ª**模式非法**的格子:
```
<c r="E15" s="111" t="n"><v>67.0</v><is><t>67.00</t></is></c>
```
`<is>`(inlineStr)只允许出现在 `t="inlineStr"` çš„æ ¼é‡Œï¼›`t="n"` å´å¸¦ `<is>` å±žäºŽéžæ³•,Excel ç›´æŽ¥åˆ¤å®šã€Œæ— æ³•读取的内容」拒绝打开(COM è¡¨çŽ°ä¸ºã€Œä¸èƒ½å–å¾—ç±» Workbooks çš„ Open å±žæ€§ã€ï¼Œè¿žä¿®å¤æ¨¡å¼ `CorruptLoad=1` ä¹Ÿæ‰“不开)。
**成因**:7 æœˆæ¯ç‰ˆç”± **openpyxl** å†™å‡ºï¼ˆ`docProps/app.xml` = `Microsoft Excel Compatible / Openpyxl 3.1.5`,文本用 `<is>` å­˜å‚¨ï¼‰ã€‚导出时别的写入路径只改 `t`/`<v>`,**不清旧 `<is>`**;而 8 æœˆæ¯ç‰ˆæ˜¯ Excel åŽŸç”Ÿï¼ˆæ–‡æœ¬èµ° sharedStrings),所以同样代码下 8 æœˆä»¶æ­£å¸¸ã€7 æœˆä»¶åã€‚
**为什么只有 7 æœˆå**:7 æœˆå­˜åœ¨åŒæœŸå¤‡ä»½æ¯ç‰ˆ `_备份_2026å¹´7月道路运输量汇总表_清理前_20260904.xlsx`,`restoreSummaryMonthlyBlocks` ä¼šæ•´æ ¼å›žå¡«ï¼›å›žå¡«å†™å…¥ inlineStr æ¯ç‰ˆæ ¼æ—¶ç•™ä¸‹æ—§ `<is>`。8 æœˆæ²¡æœ‰è¯¥ `_备份_*` æ–‡ä»¶ï¼Œä¸èµ°å›žå¡«ï¼Œå› æ­¤ä¸è§¦å‘。
**定位方法**(可复用):坏件与好件除 worksheets/styles/sharedStrings å¤–**全部部件逐字节相同** â†’ ç”¨ zip æ‚交 + Excel é€ä¸€å¼€æ¡£åš leave-one-out,定位到 **sheet9《公交》(17 æ ¼) + sheet12《轨道、轮渡》(2 æ ¼)**。
### 3.2 æ¯ç‰ˆè¡¥é½è¢«å¤‡ä»½æ¯ç‰ˆã€Œç”Ÿæˆåˆå¤æ´»ã€
补好 7 æœˆæ¯ç‰ˆåŽå¯¼å‡ºï¼Œ`货运` é¡µ 2022/2021 ç´¯è®¡**又变回旧写死常量** â€”— å› ä¸º `restoreSummaryMonthlyBlocks` æŠŠå¤‡ä»½æ¯ç‰ˆï¼ˆæ¸…理前、仍是旧常量)整格回填覆盖了母版的新公式。
## å››ã€ä¿®å¤å†…容
| # | ä½ç½® | æ”¹åЍ |
|---|---|---|
| 1 | `ReportExportService.exportSummaryWorkbook` | è½ç›˜å‰æ–°å¢ž `normalizeStaleInlineStrings(wb)`:把所有「非 inlineStr å´æ®‹ç•™ `<is>`」的格子清掉(幂等),并打 warn æ—¥å¿— |
| 2 | `ReportExportService.restoreSummaryMonthlyBlocks` | æ–°å¢ž `skipFreightHistoryBlocks`:《 è´§è¿ã€‹é¡µ **T åˆ—及以后**(2025/2024/2023/2022/2021 å¹´åº¦å— + å„年累计/累计同比列)永不从备份母版回填,避免“生成又复活”(与既有「中口径排名」左块保护同一思路) |
| 3 | `docs/生成汇总大表/2026å¹´7月道路运输量汇总表.xlsx` | Excel COM è¡¥é½ï¼š2025/2024/2023/2022/2021 äº”个年度块共 **360** ä¸ªå—内格(`r7/r9/r8/r10 = SUM(17 å¸‚å·ž)`、`r5=r7+r9`、`r6=r8+r10`)+ **324** ä¸ªç´¯è®¡æ ¼ï¼ˆ`DX=SUM(DK:DV)`、`EM=SUM(EA:EL)`、`DY=IFERROR(DX/SUM(EA:EL)-1,"")`),`CalculateFullRebuild` åŽä¿å­˜ |
> å¤‡ä»½ï¼š`docs/生成汇总大表/_bak_2026å¹´7月道路运输量汇总表_补齐前_20260916.xlsx`(**故意不用 `_备份_` å‰ç¼€**,否则会被 `resolveSummaryDonor` å½“成 donor å›žå¡«ï¼‰ã€‚
## äº”、用例表
| # | ç”¨ä¾‹ | è¾“å…¥ | é¢„期 | å®žé™… | ç»“论 |
|---|---|---|---|---|---|
| 1 | åä»¶å¤çް | 2026-07 å¯¼å‡ºï¼ˆä¿®å¤å‰ï¼‰ | å¯æ‰“å¼€ | Excel æŠ¥ã€Œä¸èƒ½å–å¾—ç±» Workbooks çš„ Open å±žæ€§ã€ï¼Œé‡è¯• 2 æ¬¡ä»å¤±è´¥ | å¤çް |
| 2 | çŽ¯å¢ƒæŽ’é™¤ | 10KB å°ä»¶ / 8 æœˆæ¯ç‰ˆ / 7 æœˆæ¯ç‰ˆ / 09-08 æ—§ 7 æœˆå¯¼å‡º | â€” | å…¨éƒ¨å¯æ‰“开;仅新 7 æœˆå¯¼å‡ºå¤±è´¥ | ç¡®è®¤éžçŽ¯å¢ƒé—®é¢˜ |
| 3 | è·¯å¾„排除 | åä»¶å¤åˆ¶åˆ°å¦ä¸€ç›®å½•改名 | ä»å¤±è´¥ | ä»å¤±è´¥ | ç¡®è®¤æ˜¯æ–‡ä»¶å†…容问题 |
| 4 | éƒ¨ä»¶çº§æ‚交 | åä»¶ + å¥½ä»¶çš„ styles/sharedStrings/worksheets | å®šä½åéƒ¨ä»¶ | åä»¶ styles + åä»¶ sst + **好件全部 sheets** â†’ å¯æ‰“å¼€ | å®šä½åˆ° worksheets |
| 5 | leave-one-out | 19 ä¸ª sheet é€ä¸ªæ¢æˆåä»¶ç‰ˆ | æ‰¾å‡ºå sheet | ä»… **sheet9《公交》/ sheet12《轨道、轮渡》** å¤±è´¥ | å®šä½åˆ° 2 é¡µ |
| 6 | è´Ÿå‘:非法格计数 | ä¿®å¤å‰å¯¼å‡ºä»¶ | â€” | 19 ä¸ª `t="n"` å¸¦ `<is>` | å‘½ä¸­æ ¹å›  |
| 7 | æ­£å‘:修复后 2026-07 | é‡å¯åŽç«¯åŽå¯¼å‡º | å¯æ‰“开、19 é¡µã€ç´¯è®¡å¯¹ | OK sheets=19;`DX5=144979.2825`(`=SUM(DK5:DV5)`)、`DY5=-0.101235487797891`、`EM5=161309.53162`、`CU5=173045.296428512` | é€šè¿‡ |
| 8 | æ­£å‘:修复后 2026-08 | åŒä¸Š | å¯æ‰“开、累计不变 | OK sheets=19;`DZ5=144979.2825`、`EO5=161309.53162`、`CW5=173045.296428512`、`S5=130311.892698249` | é€šè¿‡ |
| 9 | è·¨æœˆä¸€è‡´æ€§ | 7 æœˆ vs 8 æœˆåŒå£å¾„格子 | å®Œå…¨ç›¸ç­‰ | 2022 ç´¯è®¡ / 2021 ç´¯è®¡ / 2023 ç´¯è®¡ ä¸‰ä¸ªæœˆåº¦ â†’ ä¸‰ä¸ªå€¼**完全相等** | é€šè¿‡ |
| 10 | éžæ³•格复扫 | ä¿®å¤åŽ 7 æœˆå¯¼å‡º | 0 ä¸ª | 0 ä¸ª | é€šè¿‡ |
| 11 | æ¯ç‰ˆå¯æ‰“å¼€ | è¡¥é½åŽç”¨ Excel æ‰“å¼€ 7 æœˆæ¯ç‰ˆ | å¯æ‰“å¼€ | å¯æ‰“å¼€ | é€šè¿‡ |
| 12 | æ®‹ç•™æ•°æ®å¤æ ¸ | `2026-09` äº”张表计数 | å…¨ 0 | å…¨ 0(h204 / investment_monthly / h2032 / audit_result / import_batch) | é€šè¿‡ |
## å…­ã€å‘现的问题与处置
1. **7 æœˆå¯¼å‡ºä»¶æ‰“不开**(P0):`normalizeStaleInlineStrings` æ ¹æ²»ï¼›å¯¼å‡ºä»¶ä»Ž 941,960 å­—节(坏)→ 1,310,693 å­—节(好)。
2. **备份母版回填让补齐失效**(P0):`skipFreightHistoryBlocks` ä¿æŠ¤ `货运` T åˆ—及以后。
3. **Excel COM ä¼šç•™å­¤å„¿è¿›ç¨‹**:每例测完必须强杀本次新建的 `EXCEL` è¿›ç¨‹ï¼Œå¦åˆ™åŽç»­ `Workbooks.Open` ä¼š**间歇性假报**同样的错(本次排查初期被此干扰过)。属排查工具坑,已记入问题汇总。
4. **注意**:本次**未**改动 8 æœˆæ¯ç‰ˆä¸Žä»»ä½•入库数据。
## ä¸ƒã€ç»“论
- 2026-07 / 2026-08 ä¸¤ä¸ªå¯¼å‡ºä»¶å‡å¯è¢« Excel æ­£å¸¸æ‰“开(各 19 é¡µï¼‰ï¼Œä¸”《 è´§è¿ã€‹é¡µ 2021/2022/2023 ç´¯è®¡åˆ—口径**完全一致**。
- 7 æœˆæ¯ç‰ˆå·²æŒ‰ 8 æœˆæ¯ç‰ˆå£å¾„补齐(年度块 360 æ ¼ + ç´¯è®¡ 324 æ ¼ï¼‰ï¼Œå¹¶ä»Ž openpyxl è¡€ç¼˜è½¬ä¸º Excel åŽŸç”Ÿã€‚
- ç”¨æˆ·è¦æ±‚的「残留数据全部清除」经复核为 0 æ®‹ç•™ã€‚
## å…«ã€é—ç•™
- 2026-06 / 2026-09 æ— æ¯ç‰ˆ â†’ é¢„览返回 `ready=False`「未找到模板文件」,需新建母版才能出数(用户第 5 é—®çš„延伸)。
- ä»“库根目录 `_*.*` ä¸´æ—¶æŽ’查文件(含本次 `_hyb_*` / `_loo_*` / `_v2_*` / `_final_*`)未删,待用户同意。
docs/¹¦ÄܲâÊÔ±¨¸æ/¹¦ÄܲâÊÔ±¨¸æ_H2031Ä£°åÐÂÔöÁÐÊÊÅä_2026-09-16.md
New file
@@ -0,0 +1,53 @@
# åŠŸèƒ½æµ‹è¯•æŠ¥å‘Šï¼šH203-1 æ¨¡æ¿æ–°å¢žã€Œç»Ÿä¸€ç¤¾ä¼šä¿¡ç”¨ä»£ç  / å¡«æŠ¥å•位」两列适配
- æ—¥æœŸï¼š2026-09-16
- æ¨¡å—:数据导入 / æ•°æ®æŸ¥çœ‹ / æ•°æ®åº“表结构
- ç»“论:**通过**(正向 4 æ¡ã€è´Ÿå‘ 2 æ¡ã€å…¼å®¹ 2 æ¡ã€å…¥åº“抽查 814×2 é¡¹å…¨éƒ¨å¯¹é½ï¼‰
## ä¸€ã€åŠŸèƒ½è¯´æ˜Ž
用户修改了《模板_交企统H203-1表_公路旅客运输月度生产情况》模板,在「企业名称」之后**插入两列**:`统一社会信用代码`、`填报单位`,其余 48 åˆ—整体右移,总列数由 50 â†’ 52。本次改动让后端能读取并入库这两列,同时保证老格式文件兼容。
改动清单:
| å±‚ | æ–‡ä»¶ | æ”¹åЍ |
|----|------|------|
| æ•°æ®åº“ | `h2031_enterprise_monthly` | `ADD COLUMN unified_credit_code VARCHAR(50) NULL AFTER enterprise_name`、`ADD COLUMN report_unit VARCHAR(200) NULL AFTER unified_credit_code` |
| å»ºè¡¨è„šæœ¬ | `docs/init.sql` | åŒæ­¥è¡¥ä¸¤åˆ— |
| æ•°æ®å­—å…¸ | `docs/database.md` | åŒæ­¥è¡¥ä¸¤åˆ—说明 |
| å®žä½“ | `PassengerEnterpriseMonthly.java` | æ–°å¢ž `unifiedCreditCode`、`reportUnit` |
| å¯¼å…¥è§£æž | `DataImportService.java` | `importPassengerMonthly` å†…按表头名取值 |
| å‰ç«¯åˆ—配置 | `DataViewController.java` | `H2031_COLUMNS` æ–°å¢žä¸¤åˆ—(数据查看页可见) |
## äºŒã€æµ‹è¯•环境
- åŽç«¯ï¼š`Started TrafficAuditApplication` / `Tomcat started on port(s): 8090`(重启后新编译,13:30)
- å‰ç«¯ï¼š8080 å·²å°±ç»ªï¼ˆæœ¬æ¬¡æœªæ”¹å‰ç«¯ï¼Œæœªé‡å¯ï¼‰
- æ•°æ®åº“:`traffic_audit` @ 127.0.0.1:3308
- æ–°æ¨¡æ¿ï¼š`docs\公路旅客\模板_交企统H203-1表_公路旅客运输月度生产情况.xlsx`(Sheet1,816×52)
- è€æ ¼å¼ï¼š`D:\桌面\测试数据\公路旅客\八月\公路旅客运输月度生产情况(2026)_2026-09-09 09_18_45.xls`(Sheet0,769×52)
## ä¸‰ã€ç”¨ä¾‹è¡¨
| # | åœºæ™¯ | è¾“å…¥ | é¢„期 | å®žé™… | ç»“论 |
|---|------|------|------|------|------|
| 1 | æ­£å‘-新模板导入 | æ–°æ¨¡æ¿ â†’ `POST /api/import/passengerMonthly?period=2099-07` | æˆåŠŸä¸”æ¡æ•°ä¸Žæºæ–‡ä»¶ä¸€è‡´ | `成功 814 æ¡ï¼Œå¤±è´¥ 0 æ¡` | é€šè¿‡ |
| 2 | æ­£å‘-新列入库 | æŸ¥ `unified_credit_code` / `report_unit` | 814 è¡Œå…¨éƒ¨æœ‰å€¼ | `count=814, c1=814, c2=814` | é€šè¿‡ |
| 3 | å…¥åº“抽查-首行 | æºç¬¬ 1 è¡Œ vs åº“第 1 è¡Œ | é€å­—段一致 | åº“:`enterprise_code=91420105MA4F5Q3R68`、`unified_credit_code=91420105MA4F5Q3R68`、`report_unit=武汉市宏干线公路客运有限公司金地分公司`、`vehicle_total=26`、`passenger_total=12835`,与 Excel å®Œå…¨ä¸€è‡´ | é€šè¿‡ |
| 4 | å…¥åº“抽查-汇总列 | æºæ–‡ä»¶æ±‡æ€» vs åº“汇总 | ä¸€è‡´ | å®¢è¿è½¦è¾† 24584、核定载客位 711018、客运量 16371625、周转量 1023386179,四项全等 | é€šè¿‡ |
| 5 | å…¼å®¹-老格式导入 | è€ `.xls` â†’ `period=2099-09` | æˆåŠŸä¸”æ–°åˆ—æœ‰å€¼ï¼ˆè€æ–‡ä»¶ä¹Ÿå«è¿™ä¸¤åˆ—ï¼‰ | `成功 767 æ¡ï¼Œå¤±è´¥ 0 æ¡`;`c1=767, c2=767` | é€šè¿‡ |
| 6 | å…¼å®¹-老格式数值不变 | 2099-09 vs æ—¢æœ‰ 2026-08(同源同内容) | å®Œå…¨ä¸€è‡´ | n=767 / v=22091 / p=16286506 / t=1158473501,四项全等 | é€šè¿‡ |
| 7 | å…¼å®¹-老格式首行抽查 | Excel COM è¯» `.xls` ç¬¬ 2 è¡Œ vs åº“ | ä¸€è‡´ | æºï¼š`914201005519761659 / 914201005519761659 / æ­¦æ±‰æ·å®‰é¡ºè¾¾æ±½è½¦æœåŠ¡æœ‰é™å…¬å¸ / 24 / 54330`;库同 | é€šè¿‡ |
| 8 | è´Ÿå‘-选错数据类型 | `H203_1_2026-公路旅客运输月度生产情况(2026).xlsx` â†’ passengerMonthly | æ˜Žç¡®æŠ¥é”™ã€ä¸å†™åº“ | `导入失败: æ‰€é€‰æ•°æ®ç±»åž‹ã€å…¬è·¯æ—…客运输月度生产情况】与文件内容不符:表头缺少必需列【企业名称】【客运量_总计】` | é€šè¿‡ |
| 9 | è´Ÿå‘-列右移不影响旧字段 | æ–°æ¨¡æ¿ï¼ˆæ•´ä½“右移 2 åˆ—) | ä¼ä¸šä»£ç /企业名称/车辆/客运量等旧字段取值不变 | è§£æžæŒ‰è¡¨å¤´å `buildHeaderMap` å–值,814 æ¡ 0 å¤±è´¥ï¼Œæ±‡æ€»å››é¡¹ä¸Žæºæ–‡ä»¶ä¸€è‡´ï¼ˆè§ç”¨ä¾‹ 4) | é€šè¿‡ |
## å››ã€å‘现的问题与处置
1. **老格式文件其实也带这两列**(`统一社会信用代码`、`填报单位`),此前代码未读取 â†’ æœ¬æœŸä¸€å¹¶å¼€å§‹å…¥åº“。这也意味着 2026-01 ~ 2026-08 çš„存量数据这两列为空,**需要重导对应文件才能回填**(已列入待办,等用户确认)。
2. **表结构变更必须同步三处**:本次首次只改了库与实体,漏了 `docs/init.sql` / `docs/database.md`,已补齐。
3. **替换锚点不唯一导致改错文档**:`docs/database.md` ä¸­ `| enterprise_name | varchar(200) | ä¼ä¸šåç§° |` å‡ºçް 4 æ¬¡ï¼Œé¦–次批量替换误改了 H203-2 ç­‰ 3 å¼ è¡¨ï¼Œå·² `git checkout` å›žé€€å¹¶æ”¹ä¸ºã€Œå…ˆæˆªå– h2031 ç« èŠ‚å†æ›¿æ¢ã€ã€‚
## äº”、结论
- æ–°æ¨¡æ¿ä¸Žè€æ ¼å¼**双向兼容**,导入 0 å¤±è´¥ï¼ŒæŠ½æŸ¥åˆ—逐项对齐;旧字段未受列右移影响。
- æ•°æ®åº“、建表脚本、数据字典、实体、导入解析、前端列配置**六处一致**。
- é—留:存量月份(2026-01 ~ 2026-08)的两列待回填,等用户确认后重导。
docs/¹¦ÄܲâÊÔ±¨¸æ/¹¦ÄܲâÊÔ±¨¸æ_¾ÖÓòÍøIP·ÃÎʵǼCORSÐÞ¸´_2026-09-16.md
New file
@@ -0,0 +1,53 @@
# åŠŸèƒ½æµ‹è¯•æŠ¥å‘Š_局域网IP访问登录CORS修复_2026-09-16
> æ¨¡å—:系统安全(跨域白名单)+ ç™»å½• 测试人:Codex 日期:2026-09-16
## ä¸€ã€åŠŸèƒ½è¯´æ˜Ž
**问题现象**:用 `http://192.168.177.26:8080/` æ‰“开页面,登录页能正常显示,但点「登录」提示「网络错误,登录失败」;同一套服务用 `http://localhost:8080/` ç™»å½•正常。
**根因**:浏览器对 POST/PUT/DELETE **必带 `Origin` å¤´**(GET ä¸å¸¦ï¼‰ã€‚9-14 å®‰å…¨æ•´æ”¹æŠŠ CORS ä»Ž `allowedOriginPattern("*") + allowCredentials(true)` æ”¶ç´§ä¸ºåªåˆ—具体来源(`http://localhost:8080,http://127.0.0.1:8080`)。经 dev-server ä»£ç†æ—¶ `Origin` åŽŸæ ·è½¬å‘ç»™åŽç«¯ï¼ŒäºŽæ˜¯ `Origin: http://192.168.177.26:8080` å‘½ä¸­ä¸äº†ç™½åå•,`CorsFilter` ç›´æŽ¥è¿”回 403 `Invalid CORS request`(实测报文见用例 C2)。
这解释了"页面正常、一登录就网络错误":页面 HTML/JS ä¸Ž `GET /api/auth/captcha-config` éƒ½ä¸å¸¦ `Origin` å› è€Œä¸å—影响(登录页能显示"测试模式"提示即证明该 GET æˆåŠŸï¼‰ã€‚
**连带风险(本次一并解决)**:打包部署是前端内嵌、与接口同源在 8090,浏览器 POST åŒæ ·ä¼šå¸¦ `Origin: http://<部署机IP>:8090`,用 IP è®¿é—®æ—¶ä¼šåŒæ ·è¢« 403 æŒ¡ä½ç™»å½•。
**改动**(2 ä¸ªæ–‡ä»¶ï¼Œ`CorsConfig.java` / `application.yml`):
- `config.setAllowedOrigins(...)` â†’ `config.setAllowedOriginPatterns(...)`,默认来源放宽为本机 + å†…网网段:`http://localhost:*`、`http://127.0.0.1:*`、`http://192.168.*:*`、`http://10.*:*`、`http://172.*:*`。
- ç™½åå•机制不变(仍是显式来源校验,非通配全放开),`allowCredentials` ä»ä¸º `false`;如改用域名访问,需把域名(含端口)追加到 `app.cors.allowed-origins`(已写入 yml æ³¨é‡Šï¼‰ã€‚
## äºŒã€æµ‹è¯•环境
- åŽç«¯ï¼š8090,改后按 PID ç²¾ç¡®é‡å¯ï¼ˆ`cmd→java(maven)→java(app)`),`Started TrafficAuditApplication` / `Tomcat started on port(s): 8090 (http)`。
- å‰ç«¯ï¼š8080,dev-server æœªé‡å¯ï¼Œé¡µé¢ä¸Žä»£ç†æ²¿ç”¨æœ¬æ¬¡å¯åŠ¨å®žä¾‹ã€‚
- æµè§ˆå™¨ï¼šCodex åº”用内浏览器,`http://192.168.177.26:8080/#/login`(真实浏览器路径,非模拟)。
- å‘½ä»¤è¡Œå¯¹ç…§ï¼š`curl.exe` ç›´å‘同一 URL,用于区分"服务端拒绝"与"浏览器侧失败"。
- è´¦å·ï¼š`admin`(本机库密码 `123456`)。
## ä¸‰ã€ç”¨ä¾‹ä¸Žç»“æžœ
| ç¼–号 | ç”¨ä¾‹ | è¾“å…¥ | é¢„期 | å®žé™… | ç»“论 |
| --- | --- | --- | --- | --- | --- |
| C1 | å¤çŽ°ï¼ˆä¿®å¤å‰ï¼Œæµè§ˆå™¨ï¼‰ | `192.168.177.26:8080/#/login` è¾“å…¥ admin/123456 ç‚¹ç™»å½• | å¤çް"网络错误,登录失败" | é¡µé¢æç¤ºã€Œç½‘络错误,登录失败」,URL åœåœ¨ `#/login` | å¤çŽ°æˆåŠŸ |
| C2 | å¤çŽ°ï¼ˆä¿®å¤å‰ï¼Œå‘½ä»¤è¡Œï¼‰ | POST `/api/auth/login`,带 `Origin: http://192.168.177.26:8080` | èƒ½å®šä½åˆ°æœåŠ¡ç«¯æ‹’ç» | `HTTP/1.1 403 Forbidden` + `Invalid CORS request` | å¤çŽ°æˆåŠŸï¼ˆå®šä½æ ¹å› ï¼‰ |
| C3 | å¯¹ç…§ï¼ˆä¿®å¤å‰ï¼‰ | åŒ C2 ä½†ä¸å¸¦ `Origin` | æ­£å¸¸ | 200 ä¸”返回 token | é€šè¿‡ï¼ˆè¯æ˜Žå·®å¼‚来自 Origin) |
| C4 | ä¿®å¤åŽ LAN æ¥æº | POST `/api/auth/login`,带 `Origin: http://192.168.177.26:8080` | 200 | 200 + token(`管理员`/5 æ¨¡å—) | é€šè¿‡ï¼ˆæ­£å‘) |
| C5 | ä¿®å¤åŽæµè§ˆå™¨å®žç™» | `http://192.168.177.26:8080/#/login` è¾“å…¥ admin/123456 | ç™»å½•成功进工作台 | æç¤ºã€Œç™»å½•成功」,跳转 `#/dashboard`,顶部显示 admin | é€šè¿‡ï¼ˆæ­£å‘,端到端) |
| C6 | æœ¬æœºæ¥æºå›žå½’ | `Origin: http://localhost:8080` | 200 | 200 | é€šè¿‡ï¼ˆæ— å›žå½’) |
| C7 | åŒæºéƒ¨ç½²åœºæ™¯ | ç›´è¿ž 8090,带 `Origin: http://192.168.177.26:8090` | 200 | 200 | é€šè¿‡ï¼ˆæ­£å‘) |
| C8 | å†…网网段来源 | å¸¦ `Origin: http://10.1.2.3:8080` | 200 | 200 | é€šè¿‡ï¼ˆæ­£å‘) |
| C9 | é¢„检请求 | `OPTIONS /api/auth/login` + `Origin: http://192.168.177.26:8080` | 200 ä¸”回显放行来源 | 200,`Access-Control-Allow-Origin: http://192.168.177.26:8080`,方法 `GET,POST,PUT,DELETE,OPTIONS` | é€šè¿‡ |
| C10 | æ—  Origin å¤´ | POST `/api/auth/login`(curl ç›´è¿ž 8090) | ä¸å—影响 | 200 | é€šè¿‡ |
| C11 | éžæ³•来源 | `Origin: http://evil.example.com` | æ‹’绝 | 403 `Invalid CORS request` | é€šè¿‡ï¼ˆè´Ÿå‘,白名单仍生效) |
| C12 | å¸¦ä»¤ç‰Œä¸šåŠ¡æŽ¥å£ | LAN æ¥æº + `Bearer` ä»¤ç‰Œ GET `/api/user/list` | 200 | 200 | é€šè¿‡ |
## å››ã€å‘现的问题与处置
1. **CORS ç™½åå•过窄导致局域网 IP/同源 IP è®¿é—®ç™»å½•失败**(本次主问题):已改为按模式放行本机 + å†…网网段,见上;非法外部来源仍 403。
2. å‰ç«¯ dev æ—¥å¿—显示 `Network: unavailable`(vue-cli æœªæŽ¢æµ‹åˆ°ç½‘卡地址),但 8080 å®žé™…监听 `0.0.0.0`、局域网访问正常(C5 å®žæµ‹ï¼‰ï¼Œå±žæ—¥å¿—提示问题,不处理。
3. ã€Œç½‘络错误,登录失败」这一提示把 403/500 ç­‰æœ‰å“åº”的错误也归到"网络错误",排查时容易误导;`Login.vue` æœªæ”¹åŠ¨ï¼Œåˆ—ä¸ºåŽç»­å¯é€‰ä¼˜åŒ–é¡¹ã€‚
## äº”、结论
局域网 IP(`http://192.168.177.26:8080/`)登录失败问题已修复,命令行走查(C4/C6/C7/C8/C9/C10/C12)与真实浏览器端到端登录(C5)全部通过,白名单负向用例(C11)仍然拦截,未引入鉴权/跨域回归。
docs/¹¦ÄܲâÊÔ±¨¸æ/¹¦ÄܲâÊÔ±¨¸æ_»ã×Ü´ó±íÔ¤ÀÀɾ³ýÖпھ¶ºóÃ÷ϸ±í_2026-09-16.md
New file
@@ -0,0 +1,47 @@
# åŠŸèƒ½æµ‹è¯•æŠ¥å‘Šï¼šæŠ¥è¡¨ç”Ÿæˆ-汇总大表预览弹窗删除「中口径」之后的明细表 2026-09-16
## åŠŸèƒ½è¯´æ˜Ž
- ä½ç½®ï¼šæŠ¥è¡¨ç”Ÿæˆé¡µ â†’ æŠ¥è¡¨ç±»åž‹ã€Œæ±‡æ€»å¤§è¡¨ã€â†’ é€‰æœˆä»½ â†’ åˆ—表行「预览」→ å¼¹çª—「预览数据 - æ±‡æ€»å¤§è¡¨ï¼ˆYYYY-MM)」。
- çŽ°è±¡ï¼ˆæ”¹åŠ¨å‰ï¼‰ï¼šå¼¹çª—é‡Œå‡ºçŽ°**两张表**——第一张是「指标 / æ•°æ® / åŒæ¯”」三列的汇总表(含道路货运、城市客运、中口径三段),第二张是中口径之后重复渲染的一张明细表,信息冗余。
- éœ€æ±‚:把汇总大表预览里**中口径后面的表格全部删掉**,只保留上面那张汇总表。
- æ”¹åŠ¨åŽï¼šå¼¹çª—å†…åªå‰©ç¬¬ä¸€å¼ è¡¨ï¼ˆ`class="preview-summary wb-table"`),表格下方是两条同比缺失提示与「关闭」按钮。
## æ¶‰åŠæ”¹åЍ
- å‰ç«¯ `traffic-audit-web/src/views/ReportExport.vue`,**单行改动**(第 133 è¡Œï¼‰ï¼š
  - åŽŸï¼š`<table class="preview-summary" v-else-if="it.summary && it.summary.length">`
  - çŽ°ï¼š`<table class="preview-summary" v-if="it.key !== 'summaryWorkbook' && it.summary && it.summary.length">`
- åŽŸå› è¯´æ˜Žï¼š`previewItems` é‡Œ `summaryWorkbook` è¿™ä¸€é¡¹åŒæ—¶å¸¦æœ‰ `summary` æ•°æ®ï¼Œè€Œä¸Šé¢çš„æ±‡æ€»è¡¨ï¼ˆç¬¬ 115 è¡Œ `v-if="it.key === 'summaryWorkbook' && it.summary && it.summary.length"`)已经是 `v-if`;原来的第二种表用的是 `v-else-if`,会跟在前一个 `v-if` ä¹‹åŽï¼ŒäºŽæ˜¯å¯¹ `summaryWorkbook` ä¹Ÿç…§æ ·æ¸²æŸ“出第二张表。改成带 `it.key !== 'summaryWorkbook'` æ¡ä»¶çš„独立 `v-if` åŽï¼Œæ±‡æ€»å¤§è¡¨ä¸å†æ¸²æŸ“第二张表,而其它报表类型(如有 `summary` çš„)行为保持不变。
- ç¬¬ 115–132 è¡Œçš„æ±‡æ€»è¡¨ï¼ˆå«ã€Œéƒ¨åˆ†æŒ‡æ ‡ç¼ºå°‘上年同期…」提示)**未改动**。
- æœªæ”¹åŽç«¯ã€æœªæ”¹æŽ¥å£ã€æœªæ”¹å¯¼å‡ºã€‚
## æµ‹è¯•环境
- å‰ç«¯ï¼štraffic-audit-web 8080 dev(改动后 `Compiled successfully`)。
- åŽç«¯ï¼štraffic-audit-server 8090(本次不涉及后端)。
- æµè§ˆå™¨ï¼šCodex åº”用内浏览器,`admin` ç™»å½•,地址 `http://localhost:8080/#/report`。
- è¢«æµ‹æ•°æ®ï¼šæŠ¥è¡¨ç±»åž‹ã€Œæ±‡æ€»å¤§è¡¨ã€ã€æœˆä»½ `2026å¹´8月`(源数据已由本次多年度导入保证)。
## æµ‹è¯•方法(重要说明)
- **上一轮的截图不能作为证据**:早期截图 `_qa_out/preview_summaryWorkbook_2026-08_after_fix.png` æ˜¯åœ¨å¼¹çª—尚未渲染/取景不当时拍的,画面里没有弹窗内容,属于无效证据;同时依赖可访问性树(AX)读取也不可靠(本机 `getAXState()` è¿”回缓存,会读到过期内容)。
- æœ¬è½®æ”¹ç”¨**直接读 DOM**作为唯一判据:`tab.playwright.evaluate(() => {...})` ç»Ÿè®¡å¼¹çª—内 `table` å…ƒç´ çš„æ•°é‡ã€ç±»åä¸Žè¡Œæ•°ã€‚
- å…³é”®æ“ä½œå‘(已避开):`el-select` ä¸‹æ‹‰é¡¹ `isVisible()` æ’为 false,无法用文本点击选月份,改用键盘 `ArrowDown`/`Enter`;行内「预览」按钮必须用 `locator('.el-table__row button').nth(1)`(`has-text` ä¼šå‘½ä¸­ç¦ç”¨çš„「批量预览」);页面上常驻 3 ä¸ª `.el-dialog__wrapper`,需按 `getComputedStyle(w).display !== 'none'` æ‰¾å½“前打开的那个;改 `.vue` åŽå¿…é¡» `tab.reload()` æ‰èƒ½æ‹¿åˆ°æœ€æ–°é¡µé¢ã€‚
- æœ‰æ•ˆæˆªå›¾ï¼š`_qa_out/preview_summaryWorkbook_2026-08_verified_20260916.png`(54006 å­—节)与 `_qa_out/preview_summaryWorkbook_2026-08_verified2_20260916.png`(54006 å­—节,本轮复核时重拍)。
## ç”¨ä¾‹è¡¨
| # | ç”¨ä¾‹ | è¾“å…¥ | é¢„期 | å®žé™… | ç»“论 |
|---|---|---|---|---|---|
| 1 | æ­£å‘-弹窗可打开 | æ±‡æ€»å¤§è¡¨ / 2026å¹´8月 / ç‚¹è¡Œå†…「预览」 | å¼¹å‡ºã€Œé¢„览数据 - æ±‡æ€»å¤§è¡¨ï¼ˆ2026-08)」 | å¼¹çª—正常打开,标题与预期一致 | é€šè¿‡ |
| 2 | æ­£å‘-表格数量 | DOM ç»Ÿè®¡å½“前可见弹窗内 `table` æ•°é‡ | åªå‰© 1 å¼ ï¼ˆä¸­å£å¾„之后的表已删除) | `visible` å¼¹çª—ä»… 1 ä¸ªï¼Œå…¶ä¸­ `body.querySelectorAll('table').length === 1` | é€šè¿‡ |
| 3 | æ­£å‘-表格标识 | è¯»å–该表 class ä¸Žè¡Œæ•° | ä¸ºæ±‡æ€»è¡¨ï¼ˆ`preview-summary wb-table`),12 è¡ŒæŒ‡æ ‡ | `cls="preview-summary wb-table"`,`tbody tr` è®¡ 12 è¡Œ | é€šè¿‡ |
| 4 | æ­£å‘-内容完整 | è¯»å– 12 è¡Œæ–‡æœ¬ | é“路货运/城市客运/中口径各 4 é¡¹ï¼Œæ•°å€¼ä¸ŽåŒæ¯”齐全 | é“路货运:当月货运量 16888.76、当月货物周转量 2270010.6(同比 4.8%)、累计货运量 130311.89、累计货物周转量 17492129.05(同比 0%);城市客运:29575.09 / 212391.4 / 254440.17 / 1806719.08;中口径:1628.65 / 115847.35 / 12691.45 / 900177.92 | é€šè¿‡ |
| 5 | æ­£å‘-表格下方内容 | è¯»å–表格之后的节点 | åªå‰©æç¤ºä¸Žå…³é—­æŒ‰é’®ï¼Œæ— ç¬¬äºŒå¼ è¡¨ | ä¾æ¬¡ä¸ºã€ŒÂ· 2025-08 åŒæœŸåŸŽå¸‚客运数据未导入库,城市客运同比暂不显示…」「· 2025-08 åŒæœŸå…¬è·¯æ—…客数据未导入库,中口径同比暂不显示…」与「关闭」按钮 | é€šè¿‡ |
| 6 | å›žå½’-其它条件不回归 | æ£€æŸ¥ç¬¬ 115–132 è¡Œæ±‡æ€»è¡¨ä¸Ž `wbMissing` æç¤º | æœªè¢«æ”¹åЍ | ä¸Žæ”¹åŠ¨å‰ä¸€è‡´ï¼ˆ`git diff` ä»…第 133 è¡Œ 1 è¡Œå˜æ›´ï¼‰ | é€šè¿‡ |
| 7 | å›žå½’-其它报表类型 | æ£€æŸ¥ `v-if` æ¡ä»¶å¯¹éž `summaryWorkbook` é¡¹ | è¡Œä¸ºä¸å˜ï¼ˆä»æŒ‰ `summary` æ¸²æŸ“) | æ¡ä»¶ä¸º `it.key !== 'summaryWorkbook' && it.summary && it.summary.length`,非汇总大表项行为不变 | é€šè¿‡ |
## å‘现的问题与处置
1. **上一轮取证无效(已修正)**:早期截图未拍到弹窗、AX æ ‘为缓存,已在本报告中作废;本轮以 DOM å®žæµ‹ + æœ‰æ•ˆæˆªå›¾é‡æ–°å–证。
2. **弹窗内「共 0 è¡Œã€ä¸Žä¸Šæ–¹ã€Œæœˆåº¦è¦†ç›–:1~8月均有数据」口径不同**:`rowCount` è¡¨ç¤ºçš„æ˜¯æ˜Žç»†è¡Œæ•°ï¼ˆæ±‡æ€»å¤§è¡¨ä¸å«æ˜Žç»†è¡Œï¼Œæ•…为 0),这是既有展示口径,非本次改动引入,本次未改;如用户觉得易误解,可另行调整文案。
3. ä¸¤æ¡åŒæ¯”缺失提示(2025-08 åŸŽå¸‚客运 / å…¬è·¯æ—…客同期数据未入库)为数据侧现状,非本次改动引起,待 2025 å¹´å®šç¨¿æ•°æ®å¯¼å…¥åŽè‡ªåŠ¨æ¶ˆå¤±ã€‚
## ç»“论
- é€šè¿‡ã€‚汇总大表预览弹窗中「中口径」之后的那张表已彻底移除,DOM å®žæµ‹å¼¹çª—内有且仅有 1 å¼ è¡¨ï¼ˆ`preview-summary wb-table`,12 è¡Œæ±‡æ€»æŒ‡æ ‡ï¼‰ï¼Œè¡¨æ ¼å†…容与改动前一致、无信息丢失;其它报表类型的预览行为不受影响。
- å¾…用户在自己的浏览器上打开「报表生成 â†’ æ±‡æ€»å¤§è¡¨ â†’ 2026å¹´8月 â†’ é¢„览」做一次目视验收。
docs/¹¦ÄܲâÊÔ±¨¸æ/¹¦ÄܲâÊÔ±¨¸æ_µÇ¼ÑéÖ¤ÂëÈÝ´íÓ뱨±íÔ¤ÀÀÕû¸Ä_2026-09-16.md
New file
@@ -0,0 +1,62 @@
# åŠŸèƒ½æµ‹è¯•æŠ¥å‘Šï¼šç™»å½•éªŒè¯ç å®¹é”™ + æŠ¥è¡¨é¢„览整改(指标错位 / å¼¹çª—拖动圆角 / å¤±è´¥æç¤ºï¼‰
- æ—¥æœŸï¼š2026-09-16
- æ¨¡å—:登录页、报表生成-汇总大表预览
- ç»“论:**通过**(4 ä¸ªé—®é¢˜å…¨éƒ¨ä¿®å¤ï¼Œæµè§ˆå™¨å®žæµ‹å–证)
## ä¸€ã€åŠŸèƒ½è¯´æ˜Ž
用户反馈 3 ä¸ªé—®é¢˜ï¼š
| # | ç”¨æˆ·æè¿° | æ ¹å›  | ä¿®å¤ |
|---|----------|------|------|
| 1 | æ¢ WiFi åŽç™»å½•页出现验证码白色方框、提示「验证码加载失败,请检查网络」 | åŽç«¯ `app.captcha.required=false` å·²ç¦ç”¨éªŒè¯ç ï¼Œä½†å‰ç«¯ `Login.vue` çš„ `captchaRequired` é»˜è®¤å€¼æ˜¯ `true`,且 `/api/auth/captcha-config` è¯·æ±‚失败时 `.catch(() => {})` **静默忽略**,页面残留一个加载不出来的验证码框 | é»˜è®¤å€¼æ”¹ `false`;改为 fail-safe:仅当后端明确返回 `code===200 && data.required===true` æ‰æ˜¾ç¤ºéªŒè¯ç ï¼Œè¯·æ±‚异常一律按「不需要验证码」处理 |
| 2 | æŠ¥è¡¨ç”Ÿæˆ-汇总大表预览:点击后弹「导出失败,请确认导入数据,或查看后端日志」 | å‰ç«¯ `failWith(err, action)` æŠŠ**所有**异常(含网络/代理层失败)都渲染成同一句笼统文案,默认 action è¿˜æ˜¯ã€Œå¯¼å‡ºã€ï¼Œè¯¯å¯¼è¯»æˆæ•°æ®é—®é¢˜ | é‡å†™ `failWith` + æ–°å¢ž `errReason(raw)`:区分「连不上服务器」与「后端真实原因」;预览调用传 `action='预览'`;Blob é”™è¯¯å“åº”å…ˆ `text()` å†è§£æž |
| 3 | é¢„览弹窗指标错位(指标压在「当月货运量」上);弹窗不可拖动、无圆角 | è¡¨å¤´æ˜¯ 3 åˆ—(指标/数据/同比),与 4 åˆ—数据行(分类/指标/数据/同比)不匹配;Element UI 2.15.14 **没有** `draggable` å±žæ€§ï¼ˆé‚£æ˜¯ Element Plus) | è¡¨å¤´è¡¥ä¸º 4 åˆ— `分类/指标/数据/同比`;新增 `v-dialog-drag` æŒ‡ä»¤å®žçŽ°æ‹–åŠ¨ï¼ˆåªæ”¹ `.el-dialog` çš„ `transform`,关闭时复位),加 `border-radius:10px` |
改动文件:`traffic-audit-web/src/views/Login.vue`、`traffic-audit-web/src/views/ReportExport.vue`、新增 `traffic-audit-web/src/directives/dialogDrag.js`、`traffic-audit-web/src/main.js`(注册指令)。
## äºŒã€æµ‹è¯•环境
- å‰ç«¯ï¼š`http://localhost:8080`(vue-cli-service serve,dev æž„建)
- åŽç«¯ï¼š8090(`Started TrafficAuditApplication`,重启后新编译)
- æµè§ˆå™¨ï¼šCodex å†…嵌浏览器(视口约 319×790),取证方式 `tab.playwright.evaluate()` ç›´è¯» DOM + æˆªå›¾
## ä¸‰ã€ç”¨ä¾‹è¡¨
| # | åœºæ™¯ | è¾“å…¥/操作 | é¢„期 | å®žé™… | ç»“论 |
|---|------|-----------|------|------|------|
| 1 | éªŒè¯ç -后端已关闭 | æ–°å¼€æ ‡ç­¾è®¿é—® `#/login`(后端不可用时同样验证) | ä¸å‡ºçŽ°éªŒè¯ç æ–¹æ¡†ï¼Œä¸å‡ºçŽ°ã€ŒéªŒè¯ç åŠ è½½å¤±è´¥ã€ | é¡µé¢æ—  `.captcha-box`,提示「测试模式:行为验证码已跳过」 | é€šè¿‡ |
| 2 | éªŒè¯ç -接口正常 | `GET /api/auth/captcha-config` | `required=false` | `{"code":200,"message":"success","data":{"required":false}}` | é€šè¿‡ |
| 3 | é¢„览-表头列数 | æ‰“开预览弹窗读 `thead th` | 4 åˆ—且顺序为 åˆ†ç±»/指标/数据/同比 | `['分类','指标','数据','同比']` | é€šè¿‡ |
| 4 | é¢„览-指标对齐 | è¯»é¦–行各单元格 x åæ ‡ | åˆ†ç±»å¯¹é½ã€Œé“路货运」、指标对齐「当月货运量(万吨)」、数据对齐 16888.76、同比在数据右侧 | åˆ†ç±» x=35、指标 x=118、数据 x=394、同比 x=587(`16888.76` åœ¨ x=394) | é€šè¿‡ |
| 5 | é¢„览-弹窗圆角 | è¯» `.el-dialog` è®¡ç®—样式 | æœ‰åœ†è§’ | `borderRadius=10px`、`overflow=hidden` | é€šè¿‡ |
| 6 | é¢„览-弹窗拖动 | `tab.drag([150,60],[270,220])` æ‹–标题栏 | å¼¹çª—跟随移动 | ç”± `(0,40)` â†’ `(120,200)`,`transform=matrix(1,0,0,1,120,160)`,位移量等于拖拽增量 | é€šè¿‡ |
| 7 | é¢„览-关闭复位 | å…³é—­å¼¹çª—后读 transform | å¤ä½ä¸º none | `transform=none`、`visible=false` | é€šè¿‡ |
| 8 | é¢„览-中口径之后无表格 | è¯»å¼¹çª—内 `table` æ•°é‡ä¸Žå†…容 | æœ‰ä¸”仅有 1 å¼ æŒ‡æ ‡è¡¨ | å¼¹çª—内 1 å¼ è¡¨ï¼ˆ12 è¡ŒæŒ‡æ ‡ï¼Œå«ä¸­å£å¾„ 4 è¡Œï¼‰ï¼Œè¡¨ä¸‹ä»…两条同比缺失提示与「关闭」按钮 | é€šè¿‡ |
| 9 | å¤±è´¥æç¤º-网络异常 | åŽç«¯åœæŽ‰æ—¶ç‚¹é¢„览 | æ˜Žç¡®æç¤ºç½‘络/服务未启动,而非「导出失败,请确认导入数据」 | `预览失败:无法连接服务器,请检查网络连接,或确认后端服务是否已启动` | é€šè¿‡ |
| 10 | å¯¼å‡º-正常路径 | ç‚¹ã€Œå¯¼å‡ºã€ | ä¸‹è½½æˆåŠŸæç¤º | `报表导出成功` | é€šè¿‡ |
## å››ã€å‘现的问题与处置
1. **「导出失败,请确认导入数据,或查看后端日志」不是数据问题**:用 API é€æœˆç›´è¿ž `/api/report/preview` ä¸Ž `/api/report/export/summaryWorkbook` å…¨éƒ¨è¿”回 200(2026-08 å¯¼å‡º 950747 å­—节)。该文案只在**网络/代理层失败**时出现(换 WiFi åŽè¯·æ±‚打不到后端),属于提示误导。现已改为区分具体原因。
2. **Element UI 2.15.14 ä¸æ”¯æŒ `draggable`**:弹窗拖动只能自己实现,已用 `v-dialog-drag` æŒ‡ä»¤ï¼›`<style>` å¿…é¡»**非 scoped**(el-dialog é»˜è®¤ append-to-body)。
3. **浏览器自动化取证的坑**:`tab.click(index)` çš„索引在页面刷新后会失效,曾误点到「投资报表」Tab;Playwright locator ç‚¹ Element UI è¡¨æ ¼å†…按钮会超时;`tab.drag` åæ ‡å¿…须在视口内。以上均已记入《问题与注意事项汇总》。
4. é¢„览弹窗标题在未打开时显示为「预览数据 - ï¼ˆï¼‰ã€ï¼Œå±žæœªèµ‹å€¼çŠ¶æ€ï¼Œä¸å½±å“ä½¿ç”¨ã€‚
## äº”、结论
- 4 ä¸ªé—®é¢˜å…¨éƒ¨ä¿®å¤å¹¶æœ‰æµè§ˆå™¨å®žæµ‹è¯æ®ï¼ˆè¡¨å¤´ 4 åˆ—且 x åæ ‡å¯¹é½ã€åœ†è§’ 10px、拖动位移 120/160、关闭复位、无第二张表、失败提示已细分)。
- ã€Œä¸­å£å¾„之后不再渲染表格」的专项验证见《功能测试报告_汇总大表预览删除中口径后明细表_2026-09-16.md》。
- é—留:预览弹窗内「共 0 è¡Œã€ä¸Žã€Œæœˆåº¦è¦†ç›–:1~8月均有数据」两个口径文案不同,易误解,等用户确认后调整。
## å…­ã€ç”¨æˆ·ç¡®è®¤åŽçš„追加修改(2026-09-16 å‚æ™šï¼‰
用户确认「预览弹窗的行数文案可以改」,已实施:
- **改动**:`ReportExport.vue` ä¸­ `共 {{ it.rowCount || 0 }} è¡Œ` æ”¹ä¸ºæŒ‰æŠ¥è¡¨ç±»åž‹åŒºåˆ†â€”—
  - æ±‡æ€»å¤§è¡¨ï¼ˆ`summaryWorkbook`,指标型):显示 `指标 {{ (it.summary || []).length }} é¡¹`;
  - å…¶å®ƒæ˜Žç»†æŠ¥è¡¨ï¼šæ˜¾ç¤º `共 {{ it.rowCount || 0 }} è¡Œæ˜Žç»†`。
- **原因**:汇总大表没有明细行,`rowCount` æ’为 0,与下方「月度覆盖:1~8月均有数据」自相矛盾,容易误判为没数据。
- **验证**(浏览器实测,2026-08 æ±‡æ€»å¤§è¡¨ï¼‰ï¼šå¼¹çª—头部由「共 0 è¡Œã€å˜ä¸º **「道路运输量汇总表(整本) æŒ‡æ ‡ 20 é¡¹ã€**,下方仍为「月度覆盖:1~8月均有数据」;表头仍为 `分类/指标/数据/同比`,弹窗内仍只有 1 å¼ è¡¨ï¼ˆ12 è¡Œï¼‰ã€‚截图:`_shot_preview_after_wording_20260916.png`。
- **结论**:通过。
docs/¹¦ÄܲâÊÔ±¨¸æ/¹¦ÄܲâÊÔ±¨¸æ_»õÔËÁ¿ÖÜתÁ¿2023ÄêÊý¾Ý²¹Â¼_2026-09-16.md
New file
@@ -0,0 +1,49 @@
# åŠŸèƒ½æµ‹è¯•æŠ¥å‘Šï¼šè´§è¿é‡/周转量 2023 å¹´æ•°æ®è¡¥å½•入库
- æ—¥æœŸï¼š2026-09-16
- æ¨¡å—:数据导入 / è´§è¿é‡å‘¨è½¬é‡
- ç»“论:**通过**(正向 1 æ¡ã€å…¥åº“抽查 216 é¡¹å…¨å¯¹é½ã€ä¸Šå¹´åŒæœŸ 1 æ¡ã€å¹‚ç­‰/回归 2 æ¡ï¼‰
## ä¸€ã€åŠŸèƒ½è¯´æ˜Ž
用户反馈「2023 å¹´æœ‰ 12 æœˆçš„æ•°æ®ã€ï¼Œè€Œä¸Šè½®å…¥åº“使用的 8 æœˆæºæ–‡ä»¶**缺 2023 å¹´ Sheet**(只有 `2026å¹´/2025å¹´/2024å¹´/2022å¹´/2021å¹´`),因此库里没有 `2023-12`。
排查后在 7 æœˆæºæ–‡ä»¶ä¸­æ‰¾åˆ° 2023 å¹´æ•°æ®ï¼Œå°†å…¶è¡¥å½•入库:
| é¡¹ | å†…容 |
|----|------|
| æ•°æ®æ¥æº | `D:\05_数据分类\货运\7月\定稿-湖北省各市州运输量数据(2026å¹´1-7月).xlsx` çš„ `2023` Sheet |
| è¡¥å½•方式 | å¦å­˜ä¸´æ—¶å·¥ä½œç°¿ `_2023_import_tmp.xlsx`(仅保留 `2023` + `2022å¹´` ä¸¤ä¸ª Sheet,满足多年度工作簿「至少 2 ä¸ª Sheet」规则),走 `POST /api/import/freightTurnover?period=2023-12` |
| ç»“æžœ | `货运量周转量导入成功, å…± 36 æ¡è®°å½•`(18 åœ°å¸‚ Ã— 2 ä¸ªæŠ¥è¡¨æœŸï¼š2022-12 é‡å†™ + 2023-12 æ–°å¢žï¼‰ |
**为什么带上 2022 å¹´ Sheet**:`2023` çš„上年同期取自「上一年度 Sheet」,只放 2023 ä¼šå¯¼è‡´ 2023 çš„ `last_*` ä¸ºç©ºï¼›åŒæ—¶é¿å…æ•´æœ¬å¯¼å…¥ 7 æœˆæ–‡ä»¶è€Œå¤šå‡ºæ— ç”¨çš„ `2026-07` æŠ¥è¡¨æœŸã€‚
## äºŒã€æµ‹è¯•环境
- åŽç«¯ï¼šé‡å¯åŽæ–°ç¼–译,`Tomcat started on port(s): 8090`,PID 31384
- æ•°æ®åº“:`traffic_audit.freight_turnover_import`
- æºæ–‡ä»¶ï¼š7 æœˆæ–‡ä»¶ `2023` Sheet(A1:N48:`货运量(万吨)` å— + `周转量(万吨公里)` å—,1–12 æœˆ + ç´¯è®¡åˆ—)
## ä¸‰ã€ç”¨ä¾‹è¡¨
| # | åœºæ™¯ | è¾“å…¥ | é¢„期 | å®žé™… | ç»“论 |
|---|------|------|------|------|------|
| 1 | æ­£å‘-2023 å…¥åº“ | `_2023_import_tmp.xlsx` â†’ freightTurnover | ç”Ÿæˆ `2023-12`,18 è¡Œ | `共 36 æ¡è®°å½•`;`SELECT report_period,COUNT(*)` å‡ºçް `2023-12 = 18` | é€šè¿‡ |
| 2 | å…¥åº“抽查-逐格比对 | 2023 Sheet è´§è¿é‡å— + å‘¨è½¬é‡å—(18 åœ°å¸‚ Ã— 12 æœˆ Ã— 2 æŒ‡æ ‡ = 432 é¡¹ï¼‰ | ä¸Žåº“中 `freight_m01..m12` / `turnover_m01..m12` å®Œå…¨ä¸€è‡´ | **mismatches = 0**(18 ä¸ªåœ°åŒºå…¨éƒ¨åŒ¹é…ï¼‰ | é€šè¿‡ |
| 3 | ä¸Šå¹´åŒæœŸ | æŸ¥ 2023-12 çš„ `last_freight_*` / `last_turnover_*` | ç­‰äºŽ 2022 å¹´åŒæœˆå€¼ | æ­¦æ±‰ `last_freight_m01=3527.89407360113`、`last_freight_m12=4334.42636773157`、`last_turnover_m12=608823.495390257`,与 `2022-12` è¡Œé€å€¼ç›¸åŒ | é€šè¿‡ |
| 4 | æŠ¥è¡¨æœŸæ¸…单回归 | æŸ¥å…¨éƒ¨æŠ¥è¡¨æœŸ | æ— é‡å¤ã€æ—  2099 æ®‹ç•™ | 2021-12 / 2022-12 / **2023-12** / 2024-12 / 2025-12 / 2026-01…2026-08,每期 18 è¡Œ | é€šè¿‡ |
| 5 | åŽ†å²æœŸæœªè¢«æ±¡æŸ“ | 2022-12 é‡å†™åŽä¸ŽåŽŸå€¼æ¯”è¾ƒ | å®Œå…¨ä¸€è‡´ | ä¸Žæ”¹åŠ¨å‰ 2022-12 é€å€¼ç›¸åŒ | é€šè¿‡ |
## å››ã€å‘现的问题与处置
| # | é—®é¢˜ | å¤„ç½® |
|---|------|------|
| 1 | 8 æœˆæºæ–‡ä»¶æ—  2023 å¹´ Sheet,导致库里长期缺 `2023-12`、且 `2024-12` æ— ä¸Šå¹´åŒæœŸ | ä»Ž 7 æœˆæºæ–‡ä»¶è¡¥å½• `2023-12`;`2024-12` çš„上年同期本次**未重算**(需重导 2024 æ‰ä¼šç”Ÿæ•ˆï¼‰ï¼Œå¦‚需可另行补导 |
| 2 | 7 æœˆæ–‡ä»¶ä¸Ž 8 æœˆæ–‡ä»¶çš„ 2021/2022/2024 ä¸‰å¹´æ•°æ®æ˜¯å¦ä¸€è‡´æ— æ³•确定 | é€æ ¼æ¯”对:`onlyJuly/onlyAug/differ` å…¨éƒ¨ä¸ºç©ºï¼Œ**三年 0 å¤„差异**,因此补导 2022 ä¸ä¼šå¼•入偏差 |
| 3 | è‹¥æ•´æœ¬å¯¼å…¥ 7 æœˆæ–‡ä»¶ä¼šå¤šå‡º `2026-07` æŠ¥è¡¨æœŸ | æ”¹ä¸ºåªä¿ç•™ `2023 + 2022å¹´` ä¸¤ä¸ª Sheet çš„临时工作簿,避免产生无用期次 |
| 4 | å• Sheet æ–‡ä»¶ä¸ä¼šè¢«è¯†åˆ«ä¸ºå¤šå¹´åº¦å·¥ä½œç°¿ | å·²åœ¨æœ¬æŠ¥å‘Šä¸Žã€Šé—®é¢˜ä¸Žæ³¨æ„äº‹é¡¹æ±‡æ€»ã€‹ä¸­è®°å½•该规则,供后续补数参考 |
## äº”、结论
- 2023 å¹´è´§è¿é‡/周转量已完整入库(18 åœ°å¸‚ Ã— 12 æœˆï¼‰ï¼Œ**432 é¡¹é€æ ¼æ¯”对零差异**,上年同期正确取自 2022 å¹´ã€‚
- æŠ¥è¡¨æœŸæ¸…单连贯:2021-12 â†’ 2026-08 å…± 13 æœŸï¼Œæ¯æœŸ 18 è¡Œã€‚
- é—留:`2024-12` çš„上年同期(2023 å¹´å€¼ï¼‰æœªå›žå¡«ï¼Œå¦‚需要可重导 2024 å¹´æ•°æ®ã€‚
docs/¹¦ÄܲâÊÔ±¨¸æ/¹¦ÄܲâÊÔ±¨¸æ_»õÔËÁ¿ÖÜתÁ¿¶àÄê¶Èµ¼Èë_2026-09-16.md
New file
@@ -0,0 +1,50 @@
# åŠŸèƒ½æµ‹è¯•æŠ¥å‘Šï¼šè´§è¿é‡å‘¨è½¬é‡è¡¨å¤šå¹´åº¦å·¥ä½œç°¿ï¼ˆ2021–2026)一次性入库 2026-09-16
## åŠŸèƒ½è¯´æ˜Ž
- éœ€æ±‚:8 æœˆå¯¼å…¥çš„「定稿-湖北省各市州运输量数据(2026å¹´1-8月).xlsx」一个工作簿内含 21–26 å¹´ï¼ˆæºæ–‡ä»¶ç¼º 2023 å¹´ï¼‰å…¨éƒ¨å¹´åº¦æ•°æ®ï¼Œè¦æ±‚把这些数据全部读入数据库。
- æ—§è¡Œä¸ºï¼š`importFreightTurnover` åªè¯»ç¬¬ 1 ä¸ª Sheet,并按「模板_货运量周转量.xlsx」的左右两半(左半今年 1–N æœˆã€å³åŠå޻年 1–12 æœˆï¼‰è§£æžï¼Œå¯¼è‡´å…¶ä½™å¹´åº¦ Sheet çš„æ•°æ®è¢«ç›´æŽ¥ä¸¢å¼ƒã€‚
- æ–°è¡Œä¸ºï¼šå¯¼å…¥æ—¶å…ˆåˆ¤æ–­æ˜¯å¦ä¸ºã€Œå¤šå¹´åº¦å·¥ä½œç°¿ã€ï¼ˆSheet æ•° â‰¥ 2、每个 Sheet åå½¢å¦‚ `2021å¹´`、且首行 A åˆ—含「货运量」、B åˆ—含「月」)。
  - å‘½ä¸­ï¼šé€ Sheet è§£æžæ•´å¹´ 1–12 æœˆçš„货运量块与周转量块,**每个年度落一个报表期**(报表期 = è¯¥å¹´æœ€åŽä¸€ä¸ªæœ‰è´§è¿é‡æ•°æ®çš„æœˆä»½ï¼Œæœ¬æ¬¡ä¸º `YYYY-12`),上年同期取上一年度 Sheet。
  - æœªå‘½ä¸­ï¼šå®Œå…¨å›žé€€åŽŸæœ‰æœˆåº¦è§£æžè·¯å¾„ï¼Œè¡Œä¸ºä¸Žæ”¹åŠ¨å‰ä¸€è‡´ã€‚
- å¹‚等:仍按报表期「先删后插」;每个年度各写一条 `import_batch` è®°å½•。
## æ¶‰åŠæ”¹åЍ
- åŽç«¯ `traffic-audit-server/src/main/java/com/trafficaudit/dataimport/service/DataImportService.java`(+153 / âˆ’19):
  - `importFreightTurnover` æ”¹ä¸ºåˆ†æµå…¥å£ï¼›åŽŸé€»è¾‘æ•´ä½“æŠ½ä¸º `importFreightTurnoverByMonth`(逻辑与改动前逐行一致)。
  - æ–°å¢ž `detectYearSheets`(多年度识别)、`importFreightTurnoverByYear`(按年解析 + ä¸Šå¹´åŒæœŸï¼‰ã€`parseWholeYearSheet`(整年 Sheet è§£æžï¼‰ã€`persistFreightTurnover`(按报表期先删后插 + è®°æ‰¹æ¬¡ï¼‰ã€‚
  - é¡¶éƒ¨æ–°å¢ž `import java.util.TreeMap;`。
- æœªæ”¹æ•°æ®åº“结构、未改前端、未改导入接口签名(仍为 `POST /api/import/freightTurnover?period=yyyy-MM`)。
## æµ‹è¯•环境
- åŽç«¯ï¼štraffic-audit-server 8090(含本次改动,`start-dev.ps1` å¯åŠ¨æˆåŠŸï¼Œbackend.log å‡ºçް `Tomcat started on port(s): 8090` / `Started TrafficAuditApplication`)。
- å‰ç«¯ï¼štraffic-audit-web 8080(本次不涉及前端)。
- æ•°æ®åº“:本机 MySQL `127.0.0.1:3308/traffic_audit`,用 mysql CLI ç›´æŸ¥æ ¸å¯¹ã€‚
- æºæ–‡ä»¶ï¼š`D:\05_数据分类\高速\定稿-湖北省各市州运输量数据(2026å¹´1-8月).xlsx`,Sheet ä¸º `['2026å¹´','2025å¹´','2024å¹´','2022å¹´','2021å¹´']`(2026/2025 å„ 38 è¡ŒÃ—15 åˆ—,2024 48 è¡ŒÃ—13 åˆ—,2022 40 è¡ŒÃ—15 åˆ—,2021 41 è¡ŒÃ—14 åˆ—)。
- è´Ÿå‘/边界用例一律在一次性测试期 `2099-01` ~ `2099-04` å†…进行,全程不触碰真实月份;测试后已逐个清空。
## ç”¨ä¾‹è¡¨
| # | ç”¨ä¾‹ | è¾“å…¥ | é¢„期 | å®žé™… | ç»“论 |
|---|---|---|---|---|---|
| 1 | æ­£å‘-多年度导入 | ä¸Šä¼ æºæ–‡ä»¶ï¼Œ`period=2026-08` | 21/22/24/25/26 äº”个年度全部入库 | è¿”回「共 90 æ¡è®°å½•」(5 ä¸ªæŠ¥è¡¨æœŸ Ã— 18 è¡Œï¼‰ï¼›åº“内新增/覆盖 `2021-12`、`2022-12`、`2024-12`、`2025-12`、`2026-08` | é€šè¿‡ |
| 2 | æ­£å‘-入库抽查(逐项对齐) | æºæ–‡ä»¶é€å¹´é€å¸‚州逐月与库内逐项比对(今年货运量/今年周转量/上年货运量/上年周转量) | å®Œå…¨ä¸€è‡´ | æ¯”对 **1080 ä¸ªå•元格,差异 0**(脚本 `_verify_ft_multi.py`) | é€šè¿‡ |
| 3 | æ­£å‘-报表期语义 | æŸ¥çœ‹å„期 `report_period` | æ¯å¹´åº¦ä¸€ä¸ªæŠ¥è¡¨æœŸ | `2021-12 / 2022-12 / 2024-12 / 2025-12 / 2026-08`;源文件无 2023 å¹´ï¼Œæ•…未生成 `2023-12` | é€šè¿‡ |
| 4 | æ­£å‘-上年同期 | å„期 `last_*` æ˜¯å¦å–上一年度 Sheet | æœ‰ä¸Šä¸€å¹´åº¦çš„æœ‰å€¼ã€æ— çš„为空 | `2022-12`、`2025-12`、`2026-08` å„ 18 è¡Œ `last_*` å…¨éƒ¨æœ‰å€¼ï¼›`2021-12`(无上年)、`2024-12`(缺 2023)为空 | é€šè¿‡ |
| 5 | æ­£å‘-导入批次 | æŸ¥è¯¢ `import_batch` | æ¯ä¸ªæŠ¥è¡¨æœŸä¸€æ¡è®°å½• | é¦–次导入写入 id 324–328(2021-12/2022-12/2024-12/2025-12/2026-08),5 æ¡å‡ total=success=18、fail=0,file_name ä¸ºæºæ–‡ä»¶å | é€šè¿‡ |
| 6 | è´Ÿå‘-单 Sheet æœˆåº¦æ¨¡æ¿å›žé€€ | å• Sheet æœˆåº¦æ¨¡æ¿æ–‡ä»¶ + `period=2099-01` | è¯†åˆ«ä¸å‘½ä¸­ï¼Œå›žé€€æœˆåº¦è·¯å¾„ | è¿”回「共 18 æ¡è®°å½•」,与改动前一致 | é€šè¿‡ |
| 7 | è´Ÿå‘-非年度命名多 Sheet å›žé€€ | ä¸¤ä¸ªéžå¹´åº¦å‘½å Sheet(Sheet1/Sheet2)+ `period=2099-02` | è¯†åˆ«ä¸å‘½ä¸­ï¼Œå›žé€€æœˆåº¦è·¯å¾„ | `code=200`,18 æ¡ | é€šè¿‡ |
| 8 | è´Ÿå‘-混合命名回退 | å¹´åº¦å + éžå¹´åº¦åæ··åˆï¼ˆ2021å¹´/2022å¹´/备注说明)+ `period=2099-03` | è¯†åˆ«ä¸å‘½ä¸­ï¼Œå›žé€€æœˆåº¦è·¯å¾„ | `code=200`,18 æ¡ | é€šè¿‡ |
| 9 | è´Ÿå‘-非 Excel æ–‡ä»¶ | æ–‡æœ¬æ–‡ä»¶å½“ xlsx ä¸Šä¼  + `period=2099-04` | æŠ¥é”™ä¸”不落库 | `{"code":500,"message":"导入失败: Can't open workbook - unsupported file type: UNKNOWN"}` | é€šè¿‡ |
| 10 | å¹‚ç­‰-重复导入 | åŒä¸€æºæ–‡ä»¶å†å¯¼ä¸€æ¬¡ | ä¸äº§ç”Ÿé‡å¤è¡Œã€å€¼ä¸å˜ | ä»è¿”回「共 90 æ¡è®°å½•」;导入后再写 id 332–336;**全表 216 è¡Œå‰åŽ md5 ä¸€è‡´**(`a2a733b2c5321a9d5efa9be2e0c5dacb`) | é€šè¿‡ |
| 11 | å›žå½’-测试期清理 | é€ä¸ª `POST /api/import/clear?period=2099-0x` | æµ‹è¯•期数据与批次全部删除 | å„期 dataRows=18、batchRows=1 åˆ é™¤æˆåŠŸï¼›å½“å‰åº“ **0 æ¡ 2099 æ•°æ®ã€0 æ¡ 2099 æ‰¹æ¬¡** | é€šè¿‡ |
| 12 | å›žå½’-真实月份总量 | ç»Ÿè®¡ `freight_turnover_import` | ä¸Žå¯¼å…¥å‰å£å¾„一致 | 12 ä¸ªæŠ¥è¡¨æœŸ Ã— 18 è¡Œ = **216 è¡Œ**(2021-12 / 2022-12 / 2024-12 / 2025-12 / 2026-01…2026-08) | é€šè¿‡ |
## å‘现的问题与处置
1. **源文件缺 2023 å¹´ Sheet**:导致不生成 `2023-12` æŠ¥è¡¨æœŸï¼Œ`2024-12` æ— ä¸Šå¹´åŒæœŸï¼ˆ`last_*` ä¸ºç©ºï¼‰ã€‚属源数据缺口,非代码缺陷;已如实反映在库内。
2. **报表期语义为「整年」**:`2021-12` ç­‰æœŸå®žé™…承载该年 1–12 æœˆçš„全年数据(而非 12 æœˆå•月)。若后续报表/审核按「单月」口径取这些期,需要用户确认口径;本次未做改动。
3. **重复导入会覆盖同报表期**:新逻辑延续「先删后插」的幂等策略,重导 `2026-08` ä¼šè¦†ç›–该期原有值。本次已逐项核对源文件与库内一致(差异 0),无数据损失。
4. **备份不完整(已记录)**:改动前的备份 `_backup_freight_turnover_before_multiyear_20260916.sql` åªæœ‰ 59642 å­—节且仅解析出 `2026-04` ä¸€å¤„ INSERT,不能作为完整回滚依据。**不要把该文件当作完整备份使用。**
5. **2026-01…2026-07 çš„ `last_*` ä¸ºç©º**:经核对备份(`2026-04`)确认这几期在本次改动前 `last_*` å³ä¸ºç©ºï¼Œä¸”本次导入未触碰这些报表期(批次记录只覆盖 5 ä¸ªæœŸï¼‰ï¼Œæ•…非本次改动引入。
## ç»“论
- é€šè¿‡ã€‚多年度工作簿(21–26 å¹´ï¼‰å·²å…¨éƒ¨å…¥åº“,逐年一个报表期、逐年上年同期,1080 ä¸ªå•元格逐项比对零差异;非多年度文件自动回退原有月度路径,负向与边界用例均符合预期;重复导入幂等,测试期已清理干净,真实月份数据与改动前口径一致(216 è¡Œ / 12 æœŸï¼‰ã€‚
- å¾…用户确认:`2021-12` ç­‰ã€Œæ•´å¹´ã€æŠ¥è¡¨æœŸçš„业务口径是否符合后续报表/审核取数要求;如需「逐月报表期」,需要另行改造(本次未做)。
docs/¹¦ÄܲâÊÔ±¨¸æ/¹¦ÄܲâÊÔ±¨¸æ_»õÔËҳǩÀÛ¼ÆÁÐÐÞ¸´ÓëÔàÆÚÇåÀí_2026-09-16.md
New file
@@ -0,0 +1,176 @@
# åŠŸèƒ½æµ‹è¯•æŠ¥å‘Š â€” è´§è¿é¡µç­¾ã€Œç´¯è®¡ã€åˆ—修复 + H2032 è„æœŸæ¸…理
- **功能名**:汇总大表《 è´§è¿ã€‹é¡µç­¾ç´¯è®¡åˆ—修复;`h2032_enterprise_monthly` 2026-09 è„æœŸæ¸…理
- **日期**:2026-09-16
- **结论**:**通过**(6/6 ç´¯è®¡åˆ—与源文件人工核算一致;脏期已清除且留有可还原备份)
## ä¸€ã€åŠŸèƒ½è¯´æ˜Žä¸ŽèƒŒæ™¯
用户反馈:汇总大表《 è´§è¿ã€‹é¡µç­¾çš„「累计」数据,人工核对后**只有前面四个能对上**。
` è´§è¿` é¡µç­¾å…± 6 ä¸ªç´¯è®¡åˆ—(全省行):
| åˆ— | å¹´åº¦ | ä¿®å¤å‰ | æºæ–‡ä»¶æ ¸ç®— | å·®å¼‚ |
|---|---|---|---|---|
| S | 2026(1-8月) | 130311.8927 | 130311.8927 | 0 |
| AT | 2025 | 195433.2232 | 195433.2232 | 0 |
| BV | 2024 | 184938.5780 | 184938.5780 | 0 |
| CW | 2023 | 173045.2932 | 173045.2964 | -0.0033 |
| DZ | 2022 | 144979.2854 | 144979.2825 | +0.0029 |
| EO | 2021 | ç©º | 161309.5316 | æ•´åˆ—缺失 |
周转量行同理(2023 -0.0017、2022 +0.0025、2021 ç©ºï¼‰ã€‚
## äºŒã€æ ¹å› å®šä½
### 2.1 ç»“构与文件职责
母版:`docs/生成汇总大表/2026å¹´8月道路运输量汇总表.xlsx` â†’ ` è´§è¿` é¡µï¼ˆ118x147)。
- `生成_道路运输量汇总表.xlsx` ä»…作**列宽版式参照**(`applySummaryReferenceLayout` åªè¯»åˆ—宽与隐藏标记,不读数值);
- `2026å¹´8月道路运输量汇总表_版式原型.xlsx` è¿è¡Œæ—¶**未被任何代码引用**。
全省块 6 è¡Œï¼šr5 è´§è¿é‡ã€r6 å‘¨è½¬é‡ã€r7 å…¶ä¸­è§„上货运量、r8 å…¶ä¸­è§„上周转量、r9 å…¶ä¸­è§„下货运量、r10 å…¶ä¸­è§„下周转量。
17 ä¸ªå¸‚州块每块 6 è¡Œï¼Œå—首行 11,17,...,107(武汉市...林区)。
关键:全省 r5 = `=<m>7+<m>9`(规上+规下),r7 = 17 å¸‚州规上之和(公式),而 **r9(全省规下)是写死的常量**。
### 2.2 å†³å®šæ€§æµ‹é‡ï¼ˆExcel COM é‡ç®—后逐月比较「全省行」与「17 å¸‚州行之和」)
| å¹´åº¦ | åˆè®¡å·® | è§„上差 | è§„下差 |
|---|---|---|---|
| 2026(1-8) | 2.8e-5 | 1.8e-12 | 2.8e-5 |
| 2025 | 3.3e-11 | 9.1e-13 | 3.5e-11 |
| 2024 | 1.5e-11 | 9.1e-13 | 1.3e-11 |
| 2023 | **4.6e-3** | 4.5e-13 | **4.6e-3** |
| 2022 | **3.1e-3** | 2.3e-13 | **3.1e-3** |
| 2021 | 4.0e-5 | 4.0e-5 | 1.5e-4 |
**结论:规上永远对得上;差异全部来自「全省规下」这一行的写死常量与 17 å¸‚州规下之和不等。**
同时实测「17 å¸‚州行之和」等于源文件湖北省行:2022 ç´¯è®¡ 144979.2825、2023 ç´¯è®¡ 173045.2964,与人工核算**完全一致**。
### 2.3 å…¶ä½™åŽŸå› 
- **DZ(2022 ç´¯è®¡ï¼‰å†™æ­»å¸¸é‡**,不随数据刷新(其值恰好等于自身 12 ä¸ªæœˆä¹‹å’Œï¼Œæ•…改成公式属等值改动);
- **EO(2021 ç´¯è®¡ï¼‰æ•´åˆ—为空**,母版从未填过累计公式(2021 å¹´ `EC:EN` åäºŒä¸ªæœˆéƒ½æœ‰å€¼ï¼‰ï¼›
- **EA(2022 ç´¯è®¡åŒæ¯”)也是写死常量**;
- å¯¼å‡ºä»£ç åªå›žå¡«ã€Œç›®æ ‡å½“月」一列(`SummaryWorkbookFiller.fillFreightSheet`),历史月份一律沿用母版 â†’ æ¯ç‰ˆå¯¹ä¸ä¸Šå°±æ•´ä½“对不上。
## ä¸‰ã€ä¿®æ”¹å†…容
### 3.1 æ¯ç‰ˆã€Š2026å¹´8月道路运输量汇总表.xlsx》→ ` è´§è¿` é¡µ
| # | ä½ç½® | æ”¹å‰ | æ”¹åŽ |
|---|---|---|---|
| 1 | r7 å…¶ä¸­è§„上货运量(2021-2025 å„月) | å¸¸é‡/部分公式 | `=SUM(<17 å¸‚州规上货运量行>)` |
| 2 | r9 å…¶ä¸­è§„下货运量(2021-2025 å„月) | **写死常量** | `=SUM(<17 å¸‚州规下货运量行>)` |
| 3 | r8 å…¶ä¸­è§„上周转量(2021-2025 å„月) | å¸¸é‡/部分公式 | `=SUM(<17 å¸‚州规上周转量行>)` |
| 4 | r10 å…¶ä¸­è§„下周转量(2021-2025 å„月) | **写死常量** | `=SUM(<17 å¸‚州规下周转量行>)` |
| 5 | r5 è´§è¿é‡ï¼ˆ2021-2025 å„月) | å¸¸é‡/公式 | `=<m>7+<m>9` |
| 6 | r6 å‘¨è½¬é‡ï¼ˆ2021-2025 å„月) | å¸¸é‡/公式 | `=<m>8+<m>10` |
| 7 | DZ åˆ—(2022 ç´¯è®¡ï¼Œè¡Œ 5-112) | å†™æ­»å¸¸é‡ | `=SUM(DM<r>:DX<r>)` |
| 8 | EO åˆ—(2021 ç´¯è®¡ï¼Œè¡Œ 5-112) | **空** | `=SUM(EC<r>:EN<r>)` |
| 9 | EA åˆ—(2022 ç´¯è®¡åŒæ¯”,行 5-112) | å†™æ­»å¸¸é‡ | `=IFERROR(DZ<r>/SUM(EC<r>:EN<r>)-1,"")` |
共改写月块单元 360 ä¸ªã€ç´¯è®¡å•å…ƒ 324 ä¸ªã€‚
- 2026 å¹´å—(C..Q)**不动**:当月值由导出代码回填,且其累计已与源文件一致;
- EP(2021 ç´¯è®¡åŒæ¯”)**保持为空**:页内没有 2020 å¹´åº¦å—,无同比基期可引用;
- åªæ”¹æ¯ç‰ˆè¿™ä¸€ä¸ªæ–‡ä»¶ã€‚`生成_道路运输量汇总表.xlsx` æ˜¯åˆ—宽参照件(改它反而有列宽被 Excel é‡å†™å¸¦åçš„风险),`_版式原型.xlsx` è¿è¡Œæ—¶æœªè¢«å¼•用,两者均不动;
- åŒæœŸå¤‡ä»½æ¯ç‰ˆè¿˜åŽŸæœºåˆ¶**不会**冲掉本次改动:`resolveSummaryDonor(2026,8)` è¦æ±‚文件名以 `_备份_` å¼€å¤´ä¸”含「2026å¹´8月」,目录下无匹配文件;导出日志亦确认「未找到同期备份母版」。
改动前备份:`docs/生成汇总大表/_bak_202608母版修改前_20260916/`(3 ä¸ªåŽŸæ–‡ä»¶ï¼‰ã€‚
> å®žçŽ°æ–¹å¼ç”¨ **Excel COM** æ‰“开母版改公式并 `CalculateFullRebuild` åŽä¿å­˜ã€‚**不可用 openpyxl å¦å­˜**:会清空全本公式缓存值(2026-09-16 æ›¾å› æ­¤è®© 2021 å¹´æ¹–北省行变成 0,见工作日结第十八节)。
### 3.2 æ•°æ®åº“
| æ“ä½œ | å¯¹è±¡ | å½±å“è¡Œæ•° |
|---|---|---|
| DELETE | `h2032_enterprise_monthly` WHERE `report_period='2026-09'` | 636 |
| DELETE | `import_batch` WHERE `id=302` | 1 |
依据:batch 302 çš„æ–‡ä»¶åæ˜¯ã€Œé“路货物运输月度生产情况(2026å¹´8月).xls」,却被存成 `2026-09`(2026-09-10 09:03:29 å¯¼å…¥ï¼‰ï¼›2026-09-11 17:48 å·²ç”¨æ­£ç¡®çš„ 8 æœˆæ–‡ä»¶é‡å¯¼ä¸º `2026-08`(batch 320,同为 636 è¡Œ / 90 åŒºåˆ’)。
备份(可还原):`_backup_h2032_2026-09_rows_20260916.sql`(636 ä¸ªå…ƒç»„)、`_backup_h2032_2026-09_batch302_20260916.sql`。
## å››ã€æµ‹è¯•环境
| é¡¹ | å€¼ |
|---|---|
| åŽç«¯ | Spring Boot,`http://127.0.0.1:8090`(运行中) |
| æ•°æ®åº“ | MySQL 8.0,`127.0.0.1:3308`,库 `traffic_audit` |
| å¯¼å‡ºæŽ¥å£ | `GET /api/report/export/summaryWorkbook?period=2026-08&mode=month` |
| é¢„览接口 | `GET /api/report/preview?period=2026-08&mode=month&types=summaryWorkbook` |
| å…¬å¼æ±‚值 | Excel COM(`CalculateFullRebuild`)——导出件公式**无缓存值**,openpyxl è¯»å‡ºæ¥å…¨æ˜¯ None,必须用 Excel é‡ç®— |
| æºæ–‡ä»¶ | `D:\05_数据分类\高速\定稿-湖北省各市州运输量数据(2026å¹´1-8月).xlsx`(2021/2022/2024/2025/2026 é¡µï¼‰+ `D:\05_数据分类\货运\7月\定稿-湖北省各市州运输量数据(2026å¹´1-7月).xlsx`(2023 é¡µï¼‰ |
## äº”、用例表
### 5.1 æ­£å‘用例
| # | è¾“å…¥/操作 | é¢„期 | å®žé™… | ç»“论 |
|---|---|---|---|---|
| P1 | é‡å¯¼å‡º 2026-08 æ±‡æ€»å¤§è¡¨ï¼ŒExcel é‡ç®—后读 ` è´§è¿` å…¨çœè¡Œ 6 ä¸ªç´¯è®¡åˆ— | 2021/2022/2023 ä¸Žæºæ–‡ä»¶ä¸€è‡´ | 2026 å·® -1.8e-6、2025 +4.1e-5、2024 -2.1e-5、2023 +2.9e-5、2022 -2.9e-11、2021 +2.0e-5(周转量同量级) | é€šè¿‡ |
| P2 | åŒä¸Šï¼Œè¯» 2021 ç´¯è®¡åˆ— EO | æœ‰å€¼ä¸”等于 161309.5316 | 161309.5316 | é€šè¿‡ |
| P3 | å¯¼å‡ºä»¶ã€Œå…¨çœè¡Œã€é€æœˆ vs「17 å¸‚州行之和」 | å·®çº¦ç­‰äºŽ 0 | 2021<=5.5e-12、2022<=5.5e-12、2023<=3.6e-12、2025<=5.5e-12(周转量 <=9.3e-10) | é€šè¿‡ |
| P4 | æ¯ç‰ˆé‡ç®—后同上 | å·®çº¦ç­‰äºŽ 0 | 2021-2025 å…¨éƒ¨ <=9.3e-10 | é€šè¿‡ |
| P5 | å¯¼å‡ºä»¶ 2026 å¹´ 8 æœˆå½“月值 | å…¨çœè´§è¿é‡ 16888.76 | Q5=16888.7615,Q11(武汉市)=5173.1802 | é€šè¿‡ |
| P6 | é¢„览接口 `types=summaryWorkbook` | è¿”回汇总指标 | `ready=true`、`rows=159`、20 é¡¹æŒ‡æ ‡ï¼ˆå½“月货运量 16888.76、累计 130311.89) | é€šè¿‡ |
| P7 | 2021 ç´¯è®¡åŒæ¯” EA æŠ½æŸ¥ | åˆ†æ¯ä¸º 0 çš„行不显示错误 | EA5=-0.1012355、EA11=-0.0886607、EA90 ç©ºã€EA111 ç©º | é€šè¿‡ |
### 5.2 è´Ÿå‘用例 / å›žå½’用例
| # | è¾“å…¥/操作 | é¢„期 | å®žé™… | ç»“论 |
|---|---|---|---|---|
| N1 | ç”¨ openpyxl å¦å­˜æ¯ç‰ˆå†å¯¼å‡ºï¼ˆåŽ†å²è¸©å‘å¤çŽ°ï¼‰ | ä¼šä¸¢å…¬å¼ç¼“存值,故**不采用**该实现 | æœªé‡‡ç”¨ï¼›æ”¹ç”¨ Excel COM,缓存值保留 | è§„避 |
| N2 | æ”¹æ¯ç‰ˆæ—¶æŠŠå…¬å¼å†™æˆ `SUM(DM5)` ä¹‹ç±»æ®‹ç¼ºå¼•用(首次脚本 `"$m7"` è¢« PowerShell å½“变量名) | åº”发现并回滚 | å·²å‘现:从 `_bak` å¤‡ä»½è¿˜åŽŸåŽï¼Œæ”¹ç”¨ `${r}`/`${m}` å®šç•Œé‡è·‘ | é€šè¿‡ |
| N3 | 2026-07 æœŸå¯¼å‡ºï¼ˆå›žå½’,母版未改) | ä»èƒ½æ­£å¸¸å¯¼å‡º | `_regress_summary_2026-07.xlsx` 941,969 å­—节,` è´§è¿` é¡µ 118x145 | é€šè¿‡ |
| N4 | å¯¼å‡ºåŽæŸ¥è¯¢ `h2032_enterprise_monthly` æ˜¯å¦è¿˜æœ‰ 2026-09 | æ—  | 2026-01...2026-08 å„ 636 è¡Œï¼Œæ—  2026-09 | é€šè¿‡ |
| N5 | `import_batch` æ˜¯å¦è¿˜æœ‰ id=302 | æ—  | å·²åˆ é™¤ | é€šè¿‡ |
| N6 | å¤‡ä»½ SQL å¯è¿˜åŽŸæ€§ | å…ƒç»„数应为 636 | å®žæµ‹ 636 ä¸ªå…ƒç»„ | é€šè¿‡ |
### 5.3 å…¥åº“抽查
| # | æŠ½æŸ¥é¡¹ | ç»“æžœ |
|---|---|---|
| D1 | `h2032_enterprise_monthly` 2026 å¹´å„期行数 / åŒºåˆ’æ•° | 2026-01 636/91,2026-02...08 å„ 636/90 |
| D2 | åˆ é™¤å‰åŽ rowcount | åˆ  636 è¡Œï¼ˆ`ROW_COUNT()` å®žæµ‹ 636)、删 batch 1 è¡Œ |
| D3 | å¤‡ä»½æ–‡ä»¶å­—节数 | rows 725,989 å­—节 / batch 1,624 å­—节 |
## å…­ã€ä¿®å¤å‰åŽå¯¹æ¯”(导出件实测)
| å¹´åº¦ | åˆ— | ä¿®å¤å‰ | ä¿®å¤åŽ | æºæ–‡ä»¶æ ¸ç®— | ä¿®å¤åŽå·®å¼‚ |
|---|---|---|---|---|---|
| 2026(1-8月) | S | 130311.8927 | 130311.8927 | 130311.8927 | -1.8e-6 |
| 2025 | AT | 195433.2232 | 195433.2232 | 195433.2232 | +4.1e-5 |
| 2024 | BV | 184938.5780 | 184938.5780 | 184938.5780 | -2.1e-5 |
| 2023 | CW | 173045.2932 | **173045.2964** | 173045.2964 | +2.9e-5 |
| 2022 | DZ | 144979.2854 | **144979.2825** | 144979.2825 | -2.9e-11 |
| 2021 | EO | ç©º | **161309.5316** | 161309.5316 | +2.0e-5 |
周转量行:2021 `21961780.4134`、2022 `20587594.6295`、2023 `24243256.5443`、2024 `25071499.8353`、2025 `26403562.8772`、2026 `17492129.0479`,与源文件差异均 <=2.1e-4。
**6/6 ç´¯è®¡åˆ—在 4 ä½å°æ•°æ˜¾ç¤ºå£å¾„下与源文件人工核算完全一致。**
## ä¸ƒã€å‘现的问题与处置
| # | ä¸¥é‡åº¦ | é—®é¢˜ | å¤„ç½® |
|---|---|---|---|
| 1 | é«˜ | `h2032_enterprise_monthly` å¤šå‡º 2026-09 æœŸï¼ˆå®žä¸º 8 æœˆæ–‡ä»¶ï¼‰ | **已删除**(含 batch 302),留可还原备份 |
| 2 | é«˜ | æ¯ç‰ˆã€Œå…¨çœè§„下」行写死常量,导致 2022/2023 ç´¯è®¡å„差约 0.003 | **已改为 17 å¸‚州求和公式** |
| 3 | ä¸­ | æ¯ç‰ˆ 2021 ç´¯è®¡åˆ— EO æ•´åˆ—为空 | **已补 `=SUM(EC:EN)`** |
| 4 | ä¸­ | æ¯ç‰ˆ 2022 ç´¯è®¡åˆ— DZ、累计同比 EA ä¸ºå†™æ­»å¸¸é‡ | **已改为公式** |
| 5 | ä½Ž | æ¯ç‰ˆ Excel é‡å­˜åŽå¯¼å‡ºä»¶ä½“积由 950,186 -> 1,331,599 å­—节(Excel è‡ªèº«æ ¼å¼å¼€é”€ï¼Œ`_版式原型.xlsx` åŒä¸º 1.48MB é‡çº§ï¼‰ | è®°å½•,不影响数据 |
| 6 | ä½Ž | å¯¼å‡ºä»¶ ` è´§è¿` é¡µå­˜åœ¨ <=2.1e-4 çš„æµ®ç‚¹ç´¯åŠ å™ªå£° | è®°å½•,4 ä½å°æ•°æ˜¾ç¤ºä¸€è‡´ |
| 7 | æç¤º | å¦å‘现 2026-09 æœŸè¿˜æœ‰ï¼š`h204_vehicle_quarterly` 1284 è¡Œï¼ˆbatch 142,与 2026-08 çš„ batch 144 åŒæ–‡ä»¶ï¼‰ã€`investment_monthly` 31 è¡Œï¼ˆbatch 107,与 batch 108 åŒæºï¼‰ã€`audit_result` 2061 è¡Œã€`audit_run` 3 è¡Œ | **本次未动**(不在授权范围),待用户确认是否一并清理 |
| 8 | æç¤º | 2026-07 æœŸå¯¼å‡ºä»¶çš„ ` è´§è¿` é¡µä¸º 118x145(比 8 æœˆå°‘ 2 åˆ—),因 7 æœˆæ¯ç‰ˆæ˜¯ã€Œ1-4 æœˆéª¨æž¶ã€ | å•独议题,待 7 æœˆæ¯ç‰ˆå®šç¨¿ |
## å…«ã€ç»“论
1. ç”¨æˆ·é—®é¢˜ã€Œç´¯è®¡åªæœ‰å‰é¢å››ä¸ªå¯¹å¾—上」**已定位并解决**:根因不在累计公式本身,而在母版「全省规下」行是与 17 å¸‚州不符的写死常量;叠加 2021 ç´¯è®¡åˆ—漏填、2022 ç´¯è®¡åˆ—写死常量。
2. ä¿®å¤åŽ 6 ä¸ªç´¯è®¡åˆ—(S/AT/BV/CW/DZ/EO)在 4 ä½å°æ•°å£å¾„下与源文件人工核算**全部一致**。
3. `h2032_enterprise_monthly` 2026-09 è„æœŸå·²æ¸…除,备份可还原。
4. 2026-07 å¯¼å‡ºå›žå½’通过;预览接口正常。
5. é—留:2026-09 åœ¨ `h204_vehicle_quarterly` / `investment_monthly` / `audit_result` / `audit_run` ä¸­ä»æœ‰æ•°æ®ï¼Œå¾…用户确认是否清理。
docs/¹¦ÄܲâÊÔ±¨¸æ/»ã×Ü´ó±íÓ붨¸å±È¶Ô_2026-09-16.md
New file
@@ -0,0 +1,251 @@
# æ±‡æ€»å¤§è¡¨é€è¡¨æ¯”对报告_2026-09-16
## é›¶ã€ç»“论摘要(先看这里)
| # | ç»“论 | è¯´æ˜Ž |
|---|---|---|
| 1 | **导出端写的是公式,定稿是算好的数值** | å¯¼å‡ºæ–‡ä»¶é‡Œ 39,939 ä¸ªå•元格是公式(如 `=C7+C9`、`=C5/V5-1`),用 Excel æ‰“开会自动算出来。所以「导出端大片空白」是假象,不是缺数据。 |
| 2 | **公式按本地求值后,28,567 ä¸ªã€Œåœ°åŒº+指标+列」语义键与定稿一致** | åªæœ‰ 4,742 ä¸ªé”®ä¸ä¸€è‡´ï¼Œå…¶ä¸­å¤§éƒ¨åˆ†é›†ä¸­åœ¨ä¸‹é¢ç¬¬ 3、4 æ¡ã€‚ |
| 3 | **` è´§è¿` è¡¨ï¼šå¯¼å‡ºæ¯”定稿每市州多两行指标** | å¯¼å‡º 6 è¡Œï¼ˆè§„上+规下货运量/规上货运量/规下货运量/规上+规下周转量/规上货物周转量/规下货物周转量),定稿 4 è¡Œï¼ˆæ— ã€Œè§„上+规下货运量」「规下货运量」)。**同指标数值本身一致(0 å¤„数值差异)**。 |
| 4 | **2025 å¹´ã€ŒåŸŽå¸‚客运类」数据没入库,是最大差异来源** | `city_bus_monthly / city_taxi_monthly / wyc_order_monthly / wyc_total_monthly` éƒ½åªæœ‰ **2026-01~08**,没有 2025 å¹´ã€‚导致这些表「与去年同比」列算成 `0` æˆ– `-1`、2025 å¹´ç´¯è®¡åå°ã€‚ |
| 5 | **H203-1(公路旅客)缺 2025-01** | åº“里是 2025-02~2025-12;用户导入的 `.xls` æœ¬èº«æ²¡æœ‰ 1 æœˆã€‚ |
| 6 | **导出端「中口径分析」多一段当月块** | å¯¼å‡ºå¤šå‡ºã€Œ8月中口径客运量及周转量」(第 10~16 è¡Œï¼‰ï¼Œå®šç¨¿åªæœ‰ 1-8 æœˆç´¯è®¡å—;且导出缺 4 è¡Œã€Œå æ¯”」。 |
> ä¸€å¥è¯ï¼š**表格能对上;真正要补的是 2025 å¹´åŸŽå¸‚客运(公交/出租/网约车)数据**,补上以后同比列才有值。
---
## ä¸€ã€æ¯”对对象与方法
- å¯¼å‡ºç«¯ 19 ä¸ª Sheet、定稿端 19 ä¸ª Sheet,页签名称完全一致(无多页签/少页签)。
- å¯¼å‡ºç«¯ç»“构:每市州 6 è¡ŒæŒ‡æ ‡å—(定稿 4 è¡Œï¼‰ã€å¯¼å‡º 118 è¡Œ vs å®šç¨¿ 84 è¡Œç­‰å·®å¼‚,因此**不能按单元格坐标比**,改用语义键。
- æ±‚值:导出端 39,939 ä¸ªå…¬å¼æ ¼æœ¬åœ°æ±‚值 â†’ 61,972 ä¸ªæ•°å€¼æ ¼ã€‚
## äºŒã€æ€»ä½“结果
| Sheet | ä¸€è‡´ | ä¸ä¸€è‡´ | æ¡æ•°/结构不同 | å¯¼å‡ºç¼ºä¸Šå¹´åŒæœŸ | æ•°å€¼ä¸åŒ |
|---|---|---|---|---|---|
|  è´§è¿ | 5430 | 268 | 267 | 1 | 0 |
| 2025年城市客运量 | 28 | 0 | 0 | 0 | 0 |
| ä¸­å£å¾„客运量 | 3758 | 1194 | 0 | 486 | 708 |
| ä¸­å£å¾„明细 | 3217 | 1400 | 94 | 291 | 1015 |
| ä¸­å£å¾„计算过程 | 933 | 0 | 0 | 0 | 0 |
| å…¬äº¤ | 2988 | 365 | 144 | 5 | 216 |
| å…¬è·¯æ€»å®¢è¿ | 828 | 145 | 0 | 1 | 144 |
| å‡ºç§Ÿ | 2304 | 145 | 72 | 1 | 72 |
| åŸŽå¸‚分市州 | 28 | 0 | 0 | 0 | 0 |
| åŸŽå¸‚客运 | 1008 | 217 | 36 | 1 | 180 |
| åŸŽå¸‚汇总 | 7 | 2 | 1 | 0 | 1 |
| ç­çº¿åŒ…车 | 3950 | 740 | 596 | 97 | 47 |
| ç½‘约车 | 3504 | 144 | 0 | 0 | 144 |
| è´§è¿å‘¨è½¬é‡æŽ’名 | 61 | 28 | 0 | 0 | 28 |
| è´§è¿é‡æŽ’名 | 78 | 60 | 0 | 0 | 60 |
| è½¨é“、轮渡 | 436 | 34 | 23 | 1 | 10 |
| é“路运输周转量 | 9 | 0 | 0 | 0 | 0 |
| **合计** | **28567** | **4742** | **1233** | **884** | **2625** |
## ä¸‰ã€å·®å¼‚分类样例
###  è´§è¿
- ã€æ¡æ•°/结构不同】地区=仙桃市 æŒ‡æ ‡=规上+规下周转量(万吨公里) åˆ—=10月与去年同比
    - å¯¼å‡º=[-0.024796658657952775, 0.03874697951695838, 0.15669270257186785]
    - å®šç¨¿=[-0.0247966586579526, 0.0387469795169586]
- ã€æ¡æ•°/结构不同】地区=仙桃市 æŒ‡æ ‡=规上+规下周转量(万吨公里) åˆ—=11月与去年同比
    - å¯¼å‡º=[-0.01622232738005569, -0.019037012371566964, 0.07433934902579198]
    - å®šç¨¿=[-0.0162223273800557, -0.019037012371567]
- ã€æ¡æ•°/结构不同】地区=仙桃市 æŒ‡æ ‡=规上+规下周转量(万吨公里) åˆ—=12月与去年同比
    - å¯¼å‡º=[-0.03222870597621563, 0.04520985447367809, 0.11176470288481033]
    - å®šç¨¿=[-0.0322287059762133, 0.0452098544736756]
- ã€æ¡æ•°/结构不同】地区=仙桃市 æŒ‡æ ‡=规上+规下周转量(万吨公里) åˆ—=1月与去年同比
    - å¯¼å‡º=[0.18714531209236318, -0.10994255805562458, 0.4721261008370825]
    - å®šç¨¿=[0.187145312092363, -0.109942558055625, 0.472126100837083]
### ä¸­å£å¾„客运量
- ã€å¯¼å‡ºç¼ºä¸Šå¹´åŒæœŸ(算成0/-1)】地区=仙桃市 æŒ‡æ ‡=城际城乡公交客运量(万人次) åˆ—=10月与去年同比
    - å¯¼å‡º=[-1.0]
    - å®šç¨¿=[-0.222741433021807]
- ã€å¯¼å‡ºç¼ºä¸Šå¹´åŒæœŸ(算成0/-1)】地区=仙桃市 æŒ‡æ ‡=城际城乡公交客运量(万人次) åˆ—=11月与去年同比
    - å¯¼å‡º=[-1.0]
    - å®šç¨¿=[-0.085603112840467]
- ã€æ•°å€¼ä¸åŒã€‘地区=仙桃市 æŒ‡æ ‡=城际城乡公交客运量(万人次) åˆ—=2025年累计
    - å¯¼å‡º=[53.3]
    - å®šç¨¿=[260.95]
- ã€å¯¼å‡ºç¼ºä¸Šå¹´åŒæœŸ(算成0/-1)】地区=仙桃市 æŒ‡æ ‡=城际城乡公交客运量(万人次) åˆ—=3月与去年同比
    - å¯¼å‡º=[-1.0]
    - å®šç¨¿=[-0.173913043478261]
### ä¸­å£å¾„明细
- ã€æ•°å€¼ä¸åŒã€‘地区=仙桃市 æŒ‡æ ‡=公路班线客运量(万人次) åˆ—=累计
    - å¯¼å‡º=[65.9545, 97.11030000000002]
    - å®šç¨¿=[76.2534, 97.1103]
- ã€æ¡æ•°/结构不同】地区=仙桃市 æŒ‡æ ‡=公路班线旅客周转量(万人公里) åˆ—=None
    - å¯¼å‡º=[2552.6529, 4069.7147000000004]
    - å®šç¨¿=[3033.9412]
- ã€æ•°å€¼ä¸åŒã€‘地区=仙桃市 æŒ‡æ ‡=公路班线旅客周转量(万人公里) åˆ—=累计
    - å¯¼å‡º=[3343.7725, 4474.9138]
    - å®šç¨¿=[3888.4326, 4474.9138]
- ã€å¯¼å‡ºç¼ºä¸Šå¹´åŒæœŸ(算成0/-1)】地区=仙桃市 æŒ‡æ ‡=城际城乡公交客运量(万人次) åˆ—=2025年累计
    - å¯¼å‡º=[0.0]
    - å®šç¨¿=[306.05]
### å…¬äº¤
- ã€æ¡æ•°/结构不同】地区=仙桃市 æŒ‡æ ‡=其中城市内客运量(万人次) åˆ—=6月与去年同比
    - å¯¼å‡º=[-1.0]
    - å®šç¨¿=[-0.451242009524218, -0.267657408571069]
- ã€æ¡æ•°/结构不同】地区=仙桃市 æŒ‡æ ‡=其中城市内客运量(万人次) åˆ—=None
    - å¯¼å‡º=[1109.2]
    - å®šç¨¿=[134.49, 142.61, 115.16]
- ã€æ•°å€¼ä¸åŒã€‘地区=仙桃市 æŒ‡æ ‡=其中城市内客运量(万人次) åˆ—=累计
    - å¯¼å‡º=[1680.22, 3687.98, 1710.0900000000001]
    - å®šç¨¿=[1913.31, 3687.98, 1710.09]
- ã€æ•°å€¼ä¸åŒã€‘地区=仙桃市 æŒ‡æ ‡=其中城市内客运量(万人次) åˆ—=累计与去年同比
    - å¯¼å‡º=[3.532187201528175]
    - å®šç¨¿=[-0.387609454550148]
### å…¬è·¯æ€»å®¢è¿
- ã€æ•°å€¼ä¸åŒã€‘地区=仙桃市 æŒ‡æ ‡=周转量(万人公里) åˆ—=2025å¹´6月
    - å¯¼å‡º=[749.5794793494696]
    - å®šç¨¿=[2758.65947934947]
- ã€æ•°å€¼ä¸åŒã€‘地区=仙桃市 æŒ‡æ ‡=周转量(万人公里) åˆ—=同比
    - å¯¼å‡º=[-0.09741856370872848, -0.23580927957669318, -0.2044540674016434]
    - å®šç¨¿=[-0.0974185637087299, -0.235809279576693, -0.204454067401643]
- ã€æ•°å€¼ä¸åŒã€‘地区=仙桃市 æŒ‡æ ‡=周转量(万人公里) åˆ—=累计
    - å¯¼å‡º=[22177.14801567051, 36108.164028367806]
    - å®šç¨¿=[24186.2280156705, 36108.1640283678]
- ã€æ•°å€¼ä¸åŒã€‘地区=仙桃市 æŒ‡æ ‡=周转量(万人公里) åˆ—=累计同比
    - å¯¼å‡º=[-0.3340605811417364]
    - å®šç¨¿=[-0.273731562879588]
### å‡ºç§Ÿ
- ã€æ¡æ•°/结构不同】地区=仙桃市 æŒ‡æ ‡=其中城市内客运量(万人次) åˆ—=None
    - å¯¼å‡º=[336.0]
    - å®šç¨¿=[64.67, 65.76, 64.39]
- ã€æ•°å€¼ä¸åŒã€‘地区=仙桃市 æŒ‡æ ‡=其中城市内客运量(万人次) åˆ—=累计与去年同比
    - å¯¼å‡º=[7.4782758620689656]
    - å®šç¨¿=[0.0942145082331998]
- ã€æ¡æ•°/结构不同】地区=仙桃市 æŒ‡æ ‡=其中城市内旅客周转量(万人公里) åˆ—=None
    - å¯¼å‡º=[1142.3999999999999]
    - å®šç¨¿=[261.27, 361.68, 347.06]
- ã€æ•°å€¼ä¸åŒã€‘地区=仙桃市 æŒ‡æ ‡=其中城市内旅客周转量(万人公里) åˆ—=累计与去年同比
    - å¯¼å‡º=[12.03843813387424]
    - å®šç¨¿=[0.682753475221865]
### åŸŽå¸‚客运
- ã€æ•°å€¼ä¸åŒã€‘地区=仙桃市 æŒ‡æ ‡=周转量(万人公里) åˆ—=2025å¹´1-7月累计
    - å¯¼å‡º=[8816.138448722153]
    - å®šç¨¿=[10139.2184487222]
- ã€æ•°å€¼ä¸åŒã€‘地区=仙桃市 æŒ‡æ ‡=周转量(万人公里) åˆ—=6月同比
    - å¯¼å‡º=[6.255892181315063, -0.8966228676621759]
    - å®šç¨¿=[-0.00386729718753609, -0.246994577992483]
- ã€æ•°å€¼ä¸åŒã€‘地区=仙桃市 æŒ‡æ ‡=周转量(万人公里) åˆ—=8月同比
    - å¯¼å‡º=[-1.0, -0.6067523598726108]
    - å®šç¨¿=[0.534128007747653, -0.606752359872611]
- ã€æ¡æ•°/结构不同】地区=仙桃市 æŒ‡æ ‡=周转量(万人公里) åˆ—=None
    - å¯¼å‡º=[7768.398509034526]
    - å®šç¨¿=[1501.17761338372, 1549.99252838425, 1646.32707505095]
### åŸŽå¸‚汇总
- ã€æ¡æ•°/结构不同】地区=轮渡 æŒ‡æ ‡=401.49 åˆ—=同比
    - å¯¼å‡º=[-0.004808764841484267, -0.004818943331851048, -0.0778759013031685]
    - å®šç¨¿=[-0.00480876484148429, -0.00481894333185107, -0.0778759013031685]
- ã€æ•°å€¼ä¸åŒã€‘地区=轮渡 æŒ‡æ ‡=401.49 åˆ—=累计客运量(万人次)
    - å¯¼å‡º=[401.49, 557.59, 604.68]
    - å®šç¨¿=[401.49, 557.59, -0.107293274289419]
### ç­çº¿åŒ…车
- ã€å¯¼å‡ºç¼ºä¸Šå¹´åŒæœŸ(算成0/-1)】地区=仙桃市 æŒ‡æ ‡=客运量(万人) åˆ—=10月与去年同期比
    - å¯¼å‡º=[-1.0]
    - å®šç¨¿=[-0.0555555555555556]
- ã€æ¡æ•°/结构不同】地区=仙桃市 æŒ‡æ ‡=客运量(万人) åˆ—=10月与去年同比
    - å¯¼å‡º=[0.19738596294496547, -0.1137869352060421, 0.11167849164068455]
    - å®šç¨¿=[0.197385962944965, -0.113786935206042]
- ã€æ¡æ•°/结构不同】地区=仙桃市 æŒ‡æ ‡=客运量(万人) åˆ—=11月
    - å¯¼å‡º=[143.0, 146.0, 145.0]
    - å®šç¨¿=[143, 146]
- ã€å¯¼å‡ºç¼ºä¸Šå¹´åŒæœŸ(算成0/-1)】地区=仙桃市 æŒ‡æ ‡=客运量(万人) åˆ—=11月与去年同期比
    - å¯¼å‡º=[-1.0]
    - å®šç¨¿=[-0.0629370629370629]
### ç½‘约车
- ã€æ•°å€¼ä¸åŒã€‘地区=仙桃市 æŒ‡æ ‡=其中城市内客运量(万人次) åˆ—=None
    - å¯¼å‡º=[68.3882807969825]
    - å®šç¨¿=[100.83443064512]
- ã€æ•°å€¼ä¸åŒã€‘地区=仙桃市 æŒ‡æ ‡=其中城市内客运量(万人次) åˆ—=累计与去年同比
    - å¯¼å‡º=[75.12915230414589]
    - å®šç¨¿=[4.63647104214023]
- ã€æ•°å€¼ä¸åŒã€‘地区=仙桃市 æŒ‡æ ‡=其中城市内旅客周转量(万人公里) åˆ—=None
    - å¯¼å‡º=[158.2985090345263]
    - å®šç¨¿=[235.879860920795]
- ã€æ•°å€¼ä¸åŒã€‘地区=仙桃市 æŒ‡æ ‡=其中城市内旅客周转量(万人公里) åˆ—=累计与去年同比
    - å¯¼å‡º=[134.88943592662713]
    - å®šç¨¿=[9.10009426490351]
### è´§è¿å‘¨è½¬é‡æŽ’名
- ã€æ•°å€¼ä¸åŒã€‘地区=仙桃 æŒ‡æ ‡=10269.9152 åˆ—=None
    - å¯¼å‡º=[-10259.9]
    - å®šç¨¿=[9.3]
- ã€æ•°å€¼ä¸åŒã€‘地区=仙桃 æŒ‡æ ‡=10269.9152 åˆ—=分市州规上规下占比
    - å¯¼å‡º=[10269.9]
    - å®šç¨¿=[0.7]
- ã€æ•°å€¼ä¸åŒã€‘地区=全省 æŒ‡æ ‡=4927161.7743 åˆ—=None
    - å¯¼å‡º=[-4927151.8]
    - å®šç¨¿=[7.2]
- ã€æ•°å€¼ä¸åŒã€‘地区=全省 æŒ‡æ ‡=4927161.7743 åˆ—=分市州规上规下占比
    - å¯¼å‡º=[4927161.8]
    - å®šç¨¿=[2.8]
### è´§è¿é‡æŽ’名
- ã€æ•°å€¼ä¸åŒã€‘地区=仙桃 æŒ‡æ ‡=156.5243 åˆ—=None
    - å¯¼å‡º=[-146.5]
    - å®šç¨¿=[8.5]
- ã€æ•°å€¼ä¸åŒã€‘地区=仙桃 æŒ‡æ ‡=156.5243 åˆ—=分市州规上规下占比
    - å¯¼å‡º=[156.5]
    - å®šç¨¿=[1.5]
- ã€æ•°å€¼ä¸åŒã€‘地区=仙桃 æŒ‡æ ‡=156.5243 åˆ—=同比
    - å¯¼å‡º=[5.842293233082707, -0.0671, 0.07055908161393112]
    - å®šç¨¿=[5.84229323308271, -0.0670692068904155, 0.0705590816139312]
- ã€æ•°å€¼ä¸åŒã€‘地区=全省 æŒ‡æ ‡=31399.8248 åˆ—=None
    - å¯¼å‡º=[-31389.8]
    - å®šç¨¿=[7.6]
### è½¨é“、轮渡
- ã€æ¡æ•°/结构不同】地区=全省 æŒ‡æ ‡=轨道客运量(万人次) åˆ—=8月与去年同比
    - å¯¼å‡º=[0.017262201006441602, -0.03770383321016857]
    - å®šç¨¿=[-0.0377038332101686]
- ã€æ¡æ•°/结构不同】地区=全省 æŒ‡æ ‡=轨道客运量(万人次) åˆ—=同比
    - å¯¼å‡º=[0.11922334580043414, -0.1488617459638799, -0.02133363151813339]
    - å®šç¨¿=[0.119223345800434, -0.14886174596388, -0.0213336315181334]
- ã€æ•°å€¼ä¸åŒã€‘地区=全省 æŒ‡æ ‡=轨道客运量(万人次) åˆ—=累计同比
    - å¯¼å‡º=[7.79099782980099, -0.016560980913004952]
    - å®šç¨¿=[-0.0025188167282626, -0.016560980913005]
- ã€æ¡æ•°/结构不同】地区=全省 æŒ‡æ ‡=轨道旅客周转量(万人公里) åˆ—=8月与去年同比
    - å¯¼å‡º=[0.030026968528849673, -0.05840192416196366]
    - å®šç¨¿=[-0.0584019241619637]
## å››ã€æ•°æ®å…¥åº“现状(差异根因)
| æ•°æ®è¡¨ | å·²æœ‰æŠ¥è¡¨æœŸ |
|---|---|
| `freight_turnover_import`(货运量周转量) | 2021-12 / 2022-12 / 2023-12 / 2024-12 / 2025-12 / 2026-01~08(共 13 æœŸ Ã— 18 è¡Œï¼‰ |
| `h2031_enterprise_monthly`(公路旅客) | 2025-02~2025-12、2026-01~08(**缺 2025-01**) |
| `passenger_individual_monthly`(个体户) | 2025-01~12、2026-01~08 |
| `city_bus_monthly`(公交) | **只有 2026-01~08** |
| `city_taxi_monthly`(出租) | **只有 2026-01~08** |
| `wyc_order_monthly`(网约车订单) | **只有 2026-01~08** |
| `wyc_total_monthly`(网约车总量) | **只有 2026-01~08** |
结论:**城市客运类(公交/出租/网约车)2025 å¹´æ•´å¹´æ•°æ®æ²¡æœ‰å¯¼å…¥**,这是汇总大表里这几张表与定稿差异的主因。
## äº”、本次同时完成的两件事
1. **`2024-12` ä¸Šå¹´åŒæœŸå›žå¡«**:用 7 æœˆæ–‡ä»¶ï¼ˆå« `2023` Sheet)重导,`2024-12` çš„ `last_*` çŽ°å·²ç­‰äºŽ `2023-12`。
   - ä¸­é€”踩坑:先用 openpyxl å¦å­˜ä¸´æ—¶æ–‡ä»¶ï¼Œ**公式缓存值丢失**,导致 `湖北省`(`=SUM()` è¡Œï¼‰è¢«å†™æˆ 0;改用原始 7 æœˆæ–‡ä»¶é‡å¯¼åŽä¿®å¤ã€‚
   - å¤æ ¸ï¼š7 æœˆ/8 æœˆä¸¤ä¸ªæ–‡ä»¶çš„ 11 ä¸ªå¹´åº¦ Sheet ä¸Žåº“逐格比对,**432 æ ¼ Ã— 11 = 4,752 æ ¼å…¨éƒ¨ 0 ä¸ä¸€è‡´**;上年同期链条 2022→2021、2023→2022、2024→2023、2025→2024、2026-07/08→2025 å…¨éƒ¨ 0 ä¸ä¸€è‡´ã€‚
2. **H203-1 ä¸¤åˆ—**:按要求不重导,2026-01~08 çš„ `统一社会信用代码` / `填报单位` ä¿æŒç©ºã€‚
## å…­ã€å¾…用户确认的处置
1. æ˜¯å¦å¯¼å…¥ **2025 å¹´å…¬äº¤/出租/网约车月报**(1-12 æœˆï¼‰ï¼Ÿå¯¼å…¥åŽè¿™å‡ å¼ è¡¨çš„同比与 2025 å¹´ç´¯è®¡å³å¯ä¸Žå®šç¨¿å¯¹é½ã€‚
2. ` è´§è¿` è¡¨çš„行块结构(导出 6 è¡Œ / å®šç¨¿ 4 è¡Œï¼‰ä»¥å“ªè¾¹ä¸ºå‡†ï¼Ÿ
3. å¯¼å‡ºç«¯ã€Œä¸­å£å¾„分析」的当月块是否保留?
docs/¹¦ÄܲâÊÔ±¨¸æ/»õÔËÀÛ¼ÆÁк˶ÔÓëµ¼ÈëÊý¾ÝÌå¼ì_2026-09-16.md
New file
@@ -0,0 +1,82 @@
# åŠŸèƒ½æµ‹è¯•æŠ¥å‘Š_货运页签累计列核对与 9/16 å¯¼å…¥æ•°æ®ä½“检_2026-09-16
## ä¸€ã€åŠŸèƒ½/任务说明
针对两个业务问题做核对:
1. 9/16 æ–°å¯¼å…¥çš„「道路客运(H2031/个体户)」与「道路货运(H2032/货运量周转量)」数据是否存在错误;
2. æ±‡æ€»å¤§è¡¨ã€Œ è´§è¿ã€é¡µç­¾çš„「累计」列,为什么只有前几个能和人工核算对上。
## äºŒã€æµ‹è¯•环境
- åŽç«¯ï¼šSpring Boot 8090(`/api/report/export/summaryWorkbook`)、MySQL 127.0.0.1:3308/traffic_audit
- å¯¼å‡ºä»¶ï¼š`_fresh_summary_2026-08.xlsx`(period=2026-08&mode=month,SHA å°ºå¯¸ 950,186 å­—节)
- å‚照件:
  - `D:\05_数据分类\高速\定稿-湖北省各市州运输量数据(2026å¹´1-8月).xlsx`(含 2026å¹´/2025å¹´/2024å¹´/2022å¹´/2021å¹´ é¡µï¼Œ**无 2023 é¡µ**)
  - `D:\05_数据分类\货运\7月\定稿-湖北省各市州运输量数据(2026å¹´1-7月).xlsx`(含 2023 é¡µï¼‰
  - `D:\05_数据分类\汇总表\8月汇总定稿\2026å¹´8月客运量、货运量定稿.xlsx`
- æ¯ç‰ˆï¼š`docs/生成汇总大表/生成_道路运输量汇总表.xlsx`(Sheet「 è´§è¿ã€ï¼‰
- æ–¹æ³•:先按语义键(地区+指标+列标题)对齐,再逐格比对;导出端公式用本地求值器 `_hy*.py` è¿˜åŽŸï¼ˆopenpyxl data_only è¯»ä¸åˆ°å…¬å¼ç¼“存)。
## ä¸‰ã€ç»“论一:汇总表「 è´§è¿ã€é¡µç­¾ 6 ä¸ªã€Œç´¯è®¡ã€åˆ—核对
页签中共有 6 ä¸ªç´¯è®¡åˆ—,分别为 S(2026 å¹´ 1-8 æœˆ)、AT(2025 å¹´)、BV(2024 å¹´)、CW(2023 å¹´)、DZ(2022 å¹´)、EO(2021 å¹´)。
以全省行「货运量」为例(单位:万吨):
| å¹´åº¦ | åˆ— | æ±‡æ€»è¡¨æ˜¾ç¤º | æºæ–‡ä»¶æ ¸ç®—值 | å·®å¼‚ | ç»“论 |
|---|---|---|---|---|---|
| 2026(1-8月) | S | 130311.8927 | 130311.8927 | 0.0000 | ä¸€è‡´ |
| 2025 | AT | 195433.2232 | 195433.2232 | 0.0000 | ä¸€è‡´ |
| 2024 | BV | 184938.5780 | 184938.5780 | 0.0000 | ä¸€è‡´ |
| 2023 | CW | 173045.2932 | 173045.2964 | **-0.0033** | ä¸ä¸€è‡´ |
| 2022 | DZ | 144979.2854 | 144979.2825 | **+0.0029** | ä¸ä¸€è‡´ |
| 2021 | EO | **空** | 161309.5316 | **-161309.5316** | **整列缺失** |
「货物周转量」行结论相同:2026/2025/2024 ä¸€è‡´ï¼Œ2023 å·® -0.0017、2022 å·® +0.0025、2021 æ•´åˆ—为空。
市州行(17 å¸‚州)2026/2025/2024/2023/2022 ä¸Žåº“内数据逐格一致,差异只出现在「全省」行与 2021 åˆ—。
### åŽŸå› ï¼ˆå·²å®šä½åˆ°æ¯ç‰ˆï¼‰
1. **2021 å¹´åˆ—(EO)在母版里根本没有值**:`生成_道路运输量汇总表.xlsx` çš„ ` è´§è¿` é¡µ `EO5` = ç©ºã€`EP5`(累计同比)= ç©ºï¼Œè€Œ `EC5:EN5`(2021 å¹´ 1-12 æœˆï¼‰éƒ½æœ‰å€¼ï¼Œåˆè®¡ 161309.5316。即**母版漏填了 2021 å¹´çš„累计公式**。8 æœˆå®šç¨¿åŒæ ·ä¸ºç©ºï¼ˆ`EP` ä¸ºç©ºï¼‰ï¼Œè¯´æ˜Žæ˜¯åŽ†å²é—ç•™ã€éžæœ¬æ¬¡å¯¼å‡ºé€ æˆã€‚
2. **2022 å¹´åˆ—(DZ)在母版里是写死的常量**:`DZ5 = 144979.285376043`(类型是数值,不是公式),`EA5`(累计同比)= -0.101235470414284 ä¹Ÿæ˜¯å¸¸é‡ã€‚它等于母版自身 2022 å¹´å„月值之和,但与现源文件 `2022å¹´` é¡µæ¹–北省行(144979.2825)差 0.0029 â€”— æ¯ç‰ˆ 2022 å¹´å„月是当年手工录入的旧精度数据(如 1 æœˆ 10709.5265 vs æºæ–‡ä»¶ 10709.5234),**不会再随数据刷新**。
3. **2023 å¹´åˆ—(CW)虽是公式,但输入来自母版**:母版 2023 å¹´å…¨çœè¡Œæ˜¯ã€Œè§„上+规下」两行相加,精度与源文件 `2023` é¡µæ¹–北省行不同,合计差 0.0033(全省行)。市州行一致。
4. 2026/2025/2024 ä¸‰å¹´ä¹‹æ‰€ä»¥èƒ½å¯¹ä¸Šï¼Œæ˜¯å› ä¸ºæ¯ç‰ˆè¿™ä¸‰å—的各月值与现源文件完全一致(逐格 0 å·®å¼‚);且代码 `SummaryWorkbookFiller.fillFreightSheet` æ¯æ¬¡å¯¼å‡ºåªå›žå¡«â€œç›®æ ‡å½“月”一列,历史月份一律沿用母版,所以母版对不上就整体对不上。
### ä¿®å¤å»ºè®®ï¼ˆå¾…确认后执行)
- æ¯ç‰ˆ ` è´§è¿` é¡µ EO åˆ—按同构公式补齐:`EO5 = EC5+EE5+EG5+EI5+EK5+EM5+EO5`… å®žé™…应为 12 ä¸ªæœˆåˆ—(EC/ED/…/EN)之和;EP è¡¥ç´¯è®¡åŒæ¯”。
- DZ åˆ—改为公式(DM+DN+…+DX ä¹‹å’Œï¼‰ï¼Œä½¿å…¶éšæ•°æ®åˆ·æ–°ï¼Œé¿å…ç»§ç»­æ²¿ç”¨ 2 ä½æ•°å‰çš„æ—§å€¼ã€‚
- 2023/2022 çš„ 0.003 çº§å·®å¼‚属母版历史录入精度问题,如需与源文件完全对齐,需按源文件重填这两个年度块。
## å››ã€ç»“论二:9/16 æ–°å¯¼å…¥æ•°æ®ä½“检
### 4.1 æœ¬æ¬¡å¯¼å…¥æ¸…单(import_batch)
| ç±»åž‹ | æœŸæ¬¡ | è¡Œæ•° | æ¥æºæ–‡ä»¶ |
|---|---|---|---|
| FREIGHT_TURNOVER | 2021-12 / 2022-12 / 2023-12 / 2024-12 / 2025-12 / 2026-07 / 2026-08 | å„ 18 | å®šç¨¿-湖北省各市州运输量数据(2026å¹´1-8月 / 1-7月).xlsx |
| H2031(公路旅客) | 2025-02 ~ 2025-12(11 æœŸï¼‰ | 814/809/798/795/791/806/800/796/796/798/792 | å…¬è·¯æ—…客运输月度生产情况(2025)*.xls |
| PASSENGER_AUTH | 2025-02 ~ 2025-12 | **0** | åŒä¸Š |
| PASSENGER_INDIVIDUAL | 2025-01 ~ 2025-12 | å„ 7 | æ¹–北省公路旅客运输个体户月度生产情况(2025.*).xlsx |
| H2032(道路货运) | 2025-04 | 664 | é“路货物运输月度生产情况(2025å¹´4月).xls |
### 4.2 å‘现的问题
| # | ä¸¥é‡åº¦ | é—®é¢˜ | è¯æ® | å½±å“ |
|---|---|---|---|---|
| 1 | é«˜ | `h2032_enterprise_monthly` å¤šå‡ºä¸€ä¸ª **2026-09 æœŸ**,其源文件名却是「道路货物运输月度生产情况(2026å¹´8月).xls」(2026-09-10 å¯¼å…¥ï¼Œbatch id 302) | ä¸Ž 2026-08 æœŸé€ä¼ä¸šæ¯”对:同为 636 æ¡ã€90 ä¸ªåŒºåˆ’、**企业集合完全相同**,仅 38 å®¶ä¼ä¸šæ•°å€¼ä¸åŒï¼›å…¨çœåˆè®¡ 08=3665.3638 / 09=3690.5636 | 8 æœˆæŠ¥è¡¨ä¸å—影响(累计只取 1-8 æœˆï¼‰ï¼Œä½†ç”Ÿæˆ 9 æœˆæŠ¥è¡¨æ—¶ä¼šæŠŠè¿™ä»½ã€Œ8 æœˆå‰¯æœ¬ã€å½“成 9 æœˆæ•°æ® |
| 2 | é«˜ | `h2031_enterprise_monthly` **缺 2025-01** | 2025 å¹´åªæœ‰ 2025-02~2025-12 å…± 11 æœŸï¼›`import_batch` æ—  2025-01 çš„ H2031 è®°å½• | å…¬è·¯æ—…客 2025 å¹´ç´¯è®¡å°‘ 1 ä¸ªæœˆï¼›ã€Œä¸ŽåŽ»å¹´åŒæ¯”ã€æ•´ä½“åç§» |
| 3 | ä¸­ | `passenger_individual_monthly` 2026-08 **缺黄冈市**(只有 6 æ¡ï¼Œå…¶ä½™æœˆä»½ 7 æ¡ï¼‰ | 2026-07 æœ‰ é»„冈/黄石/荆门/随州/襄阳/孝感×2;2026-08 æ— é»„冈 | 2026-08 ç­çº¿åŒ…车/公路总客运的「其中个体」少黄冈一家 |
| 4 | ä½Ž | PASSENGER_AUTH æ¯æœŸ 0 è¡Œ | 11 ä¸ªæ‰¹æ¬¡ success_rows å‡ä¸º 0 | æš‚无影响(该台账本期无授权数据),但需确认是否应有数据 |
| 5 | æç¤º | 2025-04 çš„ H2032 æ­¤å‰ç¼ºå¤±ï¼Œæœ¬æ¬¡å·²è¡¥é½ | batch id 382,664 è¡Œå…¨æˆåŠŸ | å·²ä¿®å¤ |
| 6 | æç¤º | h2032 åŒºåˆ’集合年度间有变动 | 2025-12 æœ‰ 87 ä¸ªåŒºåˆ’、2026-08 æœ‰ 90 ä¸ªï¼›2026 æ–°å¢ž 420822/420921/420922/420982,2025 ç‹¬æœ‰ 420161 | å±žä¼ä¸šè¿›é€€è§„的正常变动,仅提示 |
### 4.3 å…¥åº“抽查(与源文件逐项对齐)
- H2032 2025 å…¨å¹´è§„上货运量 = 50117.0940 ä¸‡å¨ã€è§„上周转量 = 7435040.9971 ä¸‡å¨å…¬é‡Œ â†’ ä¸Žæ±‡æ€»è¡¨ 2025 ç´¯è®¡åˆ— **完全一致**。
- H2032 2026 å¹´ 1-8 æœˆè§„上货运量 = 31399.8248 ä¸‡å¨ï¼ˆé€å¸‚州:武汉 10072.9811、黄石 1141.0468、十堰 97.1046、宜昌 5925.3101、襄阳 2528.7835、鄂州 861.4684、荆门 632.9213、孝感 1384.5256、荆州 1278.1560、黄冈 5397.3567、咸宁 730.5726、随州 453.8854、恩施州 46.4794、仙桃 156.5243、潜江 304.9884、天门 347.0714、林区 40.6492)→ ä¸Žå¯¼å‡ºä»¶ã€Œè´§è¿é‡æŽ’名」累计表 **17/17 å…¨éƒ¨ä¸€è‡´**。
- FREIGHT_TURNOVER 2021~2026 å„期合计与源文件各年度页求和一致(除上表 2021/2022/2023 ä¸‰å¤„差异)。
- 2026-09 æœŸæ•°æ®æ¥è‡ªã€Œ2026å¹´8月」文件,判定为**期次错误**,建议核实后删除或改期。
## äº”、遗留问题
1. æ¯ç‰ˆ 2021 ç´¯è®¡åˆ—(EO/EP)缺失、2022 ç´¯è®¡åˆ—为常量,是否授权修改需业务确认。
2. H2031 2025-01 è¡¥é½æ‰€éœ€æºæ–‡ä»¶å¾…用户提供。
3. h2032 çš„ 2026-09 è„æœŸå¤„置方式待确认(删除 or ä¿ç•™æ”¹åï¼‰ã€‚
## å…­ã€ç»“论
- ã€Œç´¯è®¡åªæœ‰å‰å‡ ä¸ªå¯¹å¾—上」的直接原因是**母版里 2021 ç´¯è®¡åˆ—为空、2022 ç´¯è®¡åˆ—为写死常量,2023 ç´¯è®¡åˆ—输入精度与源文件不符**;2026/2025/2024 ä¸‰å¹´ä¸Žæºæ–‡ä»¶å®Œå…¨ä¸€è‡´ã€‚
- æœ¬æ¬¡å¯¼å…¥çš„「道路货运」存在 1 å¤„期次错误(2026-09 å®žä¸º 8 æœˆæ•°æ®å‰¯æœ¬ï¼‰ï¼›ã€Œé“路客运」存在 2025-01 ç¼ºæœˆã€2026-08 ä¸ªä½“户缺黄冈两处缺口。
docs/³ÇÊпÍÔË/ÍøÔ¼³µ²ð·Ö.xlsx
Binary files differ
docs/³ÇÊпÍÔË/ÍøÔ¼³µ²ð·Ö_2026Äê7ÔÂ.xlsx
Binary files differ
docs/ÉóºË½çÃæÔ±¨Ä£°å/Ä£°å_¹«Â·ÂÿÍÔËÊäÔ¶ÈÉú²úÇé¿ö£¨2026£©.xlsx
Binary files differ
docs/ÉóºË½çÃæÔ±¨Ä£°å/Ä£°å_³ÇÊй«¹²½»Í¨Ô¶ÈÔËÓªÇé¿ö£¨2026£©(1).xlsx
Binary files differ
docs/ÉóºË½çÃæÔ±¨Ä£°å/Ä£°å_ÉóºË½á¹û.xlsx
Binary files differ
docs/ÉóºË½çÃæÔ±¨Ä£°å/Ä£°å_ÉóºË½á¹û_.xlsx
Binary files differ
docs/ÉóºË½çÃæÔ±¨Ä£°å/Ä£°å_ѲÓγö×âÆû³µÔËÓª·þÎñÇé¿öÔ±¨£¨2026£©(1).xlsx
Binary files differ
docs/ÉóºË½çÃæÔ±¨Ä£°å/Ä£°å_µÀ·»õÎïÔËÊäÔ¶ÈÉú²úÇé¿ö£¨2026£©(1).xlsx
Binary files differ
docs/¹¤×÷ÈÕ½á/¹¤×÷ÈÕ½á_2026-09-05.md
New file
@@ -0,0 +1,21 @@
# å·¥ä½œæ—¥ç»“_2026-09-05(周六加班)
## ä»Šæ—¥å·¥ä½œï¼ˆå‡ä¸ºæ•°æ®åˆ†æžä¸Žäº¤ä»˜ï¼Œæ— ä»£ç æ”¹åŠ¨ï¼‰
1. 8 æœˆè´§è¿ä¼ä¸šå¹³å‡è¿è·å¼‚常筛选(多轮口径,交付桌面):
   - ä¸¥æ ¼å£å¾„(同比>50% ä¸” çŽ¯æ¯”>50% ä¸”同比/环比增量均>50km)命中 3 å®¶ï¼ˆè°·åŸŽåˆ©é€šã€ç¥žå†œæž¶åŒåˆ©ã€æ¹–北圆涔);
   - å¤‡é€‰å£å¾„A(同比>50% ä¸” åŒæ¯”增长量>50km)70 å®¶ã€å£å¾„B(同比或环比各自增量>50km)74 å®¶ï¼ˆä»…环比新增 4 å®¶ï¼‰ï¼Œå‡ºå¯¹æ¯”文件;
   - â€œè´§ç‰©å‘¨è½¬é‡åŒæ¯”>货运量同比 ä¸” å¹³å‡è¿è·åŒæ¯”>15% ä¸” å¢žé•¿é‡>50km”(不含轨迹差异率)106 å®¶ï¼Œå·²ä¸Ž 38 å®¶ç‰ˆï¼ˆå«å·®å¼‚率>30%)核验:原 38 å®¶å…¨éƒ¨åŒ…含。
2. ä¸Žäººå·¥/同事表(《8月道路货物企业运距问题汇总明细2》,105 å®¶ï¼‰é€å®¶æ ¸å¯¹ï¼š
   - å”¯ä¸€å·®å¼‚:湖北长峡富烨绿电供应链有限公司(106 å®¶ç‰ˆæœ‰ã€æ˜Žç»†2 æ— ï¼‰ã€‚
   - æ ¹å› ï¼šè¯¥ä¼ä¸š 2025-10 ç”±â€œæ¹–北三峡富烨绿电”改名,系统按统一信用代码识别为同期可比(2025-08 è¿è· 183.7→2026-08 238.0km,增量 54.3km è´´çº¿ï¼›è½¨è¿¹æµ‹ç®—差异率 13%<30%),同事表按名称匹配未接上。537 å®¶å¯æ¯”样本中改名企业仅此 1 å®¶ã€‚
3. ç”Ÿæˆã€Šæœ¬å‘¨å·¥ä½œæ±‡æŠ¥æ¸…单_2026-08-31至09-05.xlsx》(桌面),供周一领导汇报;待办与遗留另页。
## æµ‹è¯•结果摘要
- æ— ä»£ç æ”¹åŠ¨ï¼›ç­›é€‰ç»“æžœä¸Žæ•°æ®åº“é€æ¡æ ¸å¯¹ï¼ˆSQL ä¸Žè„šæœ¬åŒå£å¾„ä¸€è‡´ï¼šå¯æ¯” 537 å®¶ã€å‘½ä¸­æ•°æ ¸éªŒé€šè¿‡ï¼‰ã€‚
## é—留问题与待办
- è¿è·å¼‚常名单口径待用户定稿(70/74/106 å®¶ä¸‰é€‰ä¸€æˆ–另定),定稿后出正式领导版并组织企业核实反馈。
- â€œé•¿å³¡/三峡富烨”一家是否纳入名单待业务答复。
## æ˜Žå¤©è®¡åˆ’
- å‘¨ä¸€ï¼šæŒ‰ç”¨æˆ·å®šç¨¿å£å¾„整理运距名单正式版;继续 P1 å¾…办(母版骨架提交、同事版模板兼容、投资 8 æœˆåŸºå‡†é‡è·‘审核)。
docs/¹¤×÷ÈÕ½á/¹¤×÷ÈÕ½á_2026-09-16.md
New file
@@ -0,0 +1,382 @@
# å·¥ä½œæ—¥ç»“_2026-09-16
## ä¸€ã€ä»Šå¤©åšäº†ä»€ä¹ˆ
### 1. çŽ¯å¢ƒå¯åŠ¨
- 11:12 ç”¨ `start-dev.ps1` å¯åŠ¨å‰åŽç«¯ï¼ˆå¯åŠ¨å‰ 8090/8080 å‡ç©ºé—²ï¼‰ã€‚
- å°±ç»ªæ ‡å¿—:后端 `Tomcat started on port(s): 8090` / `Started TrafficAuditApplication`;前端 `Compiled successfully` / `App running at:`。
### 2. ä¿®å¤ã€Œç”¨å±€åŸŸç½‘ IP æ‰“开页面后登录失败」
- **用户反馈**:用 `http://192.168.177.26:8080/` ç™»å½•提示「网络错误,登录失败」,而 `http://localhost:8080/` æ­£å¸¸ã€‚
- **排查路径**:curl ç›´å‘同一 URL çš„ POST `/api/auth/login` æ­£å¸¸è¿”回(说明后端与代理都通)→ ç”¨åº”用内浏览器在 LAN åœ°å€å¤çŽ°ï¼ˆç¡®å®žæç¤ºã€Œç½‘ç»œé”™è¯¯ï¼Œç™»å½•å¤±è´¥ã€ï¼‰â†’ å¯¹æ¯”出差异只在 `Origin` å¤´ â†’ curl è¡¥ `Origin: http://192.168.177.26:8080` å¾—到 `403 Invalid CORS request`,根因落地。
- **根因**:浏览器 POST/PUT/DELETE å¿…带 `Origin`(GET ä¸å¸¦ï¼‰ï¼›9-14 è·¨åŸŸæ”¶ç´§åŽç™½åå•只列了 `localhost:8080 / 127.0.0.1:8080`,经 dev-server ä»£ç†è½¬å‘过来的 `Origin: http://192.168.177.26:8080` å‘½ä¸­ä¸äº†ï¼Œè¢« `CorsFilter` 403 æ‹¦æŽ‰ã€‚页面本身和 `GET /api/auth/captcha-config` ä¸å¸¦ `Origin` æ‰€ä»¥æ­£å¸¸ï¼Œè¡¨çŽ°ä¸º"页面能开、一登录就网络错误"。
- **顺带发现**:打包部署(前端内嵌、用 `http://<部署机IP>:8090` è®¿é—®ï¼‰æ—¶ POST åŒæ ·å¸¦ `Origin: http://<IP>:8090`,也会被 403 æŒ¡ä½ç™»å½•——属于同类隐患,本次一并解决。
- **改动(2 æ–‡ä»¶ï¼‰**:`CorsConfig.java` ç”± `setAllowedOrigins` æ”¹ä¸º `setAllowedOriginPatterns`,默认放行 `http://localhost:*`、`http://127.0.0.1:*`、`http://192.168.*:*`、`http://10.*:*`、`http://172.*:*`;`application.yml` çš„ `app.cors.allowed-origins` åŒæ­¥å¹¶è¡¥æ³¨é‡Šã€‚白名单校验机制与 `allowCredentials=false` å‡æœªæ”¾æ¾ã€‚
- **验证**:按 PID ç²¾ç¡®åœæ—§åŽç«¯é“¾ï¼ˆ`cmd 3608 â†’ java(maven) 23704 â†’ java(app) 12636`)后重启;应用内浏览器在 LAN åœ°å€å®žç™»æˆåŠŸè¿›å…¥ `#/dashboard`;白名单负向用例(`http://evil.example.com`)仍 403。详见《功能测试报告_局域网IP访问登录CORS修复_2026-09-16.md》。
## äºŒã€æµ‹è¯•结果摘要
- CORS ä¿®å¤ 12 æ¡ç”¨ä¾‹å…¨é€šè¿‡ï¼šæ­£å‘(LAN æ¥æºã€åŒæº 8090 æ¥æºã€å†…网网段来源、带令牌业务接口、预检 OPTIONS)、负向(非法来源 403)、回归(localhost æ¥æºã€æ—  Origin å¤´ï¼‰ã€‚
- çœŸå®žæµè§ˆå™¨ç«¯åˆ°ç«¯ï¼š`http://192.168.177.26:8080/#/login` è¾“å…¥ `admin/123456` â†’ æç¤ºã€Œç™»å½•成功」→ è·³è½¬å·¥ä½œå°ï¼Œé¡¶éƒ¨æ˜¾ç¤º admin。
- ä»Šæ—¥æ— å¯¼å…¥/数据库写入操作,未做入库抽查(改动只涉及跨域校验,不触碰数据链路)。
## ä¸‰ã€é—留问题与待办
1. **改用域名访问时需补白名单**:`app.cors.allowed-origins` é»˜è®¤åªè¦†ç›–本机 + å†…网网段,若将来用域名或公网 IP è®¿é—®ï¼Œéœ€æŠŠè¯¥æ¥æºï¼ˆå«ç«¯å£ï¼‰è¿½åŠ è¿›åŽ»ï¼ˆyml æ³¨é‡Šå·²å†™æ˜Žï¼‰ã€‚
2. `Login.vue` æŠŠæ‰€æœ‰å¤±è´¥éƒ½æç¤ºä¸ºã€Œç½‘络错误,登录失败」,403/500 è¿™ç±»æœ‰å“åº”的错误也被归到"网络",排查易误导;建议后续按状态码细分提示(未做,等用户确认)。
3. 9-15 é—留继续挂账:AI å¤–发脱敏补齐(system prompt ä¼ä¸šå/解释原文未脱敏)、保密数据部署路线确认、4 å¼ æ˜Žç»†æŠ¥è¡¨æ¨¡æ¿æ‰©åˆ—、审核比对基准缺失保护、`sys_role` æƒé™è½åœ°ã€3D éªŒè¯ç ç”Ÿäº§å¼€å¯ã€`backend.log` åŽ†å²æ˜Žæ–‡æ¸…ç†ã€‚
4. ä»“库根目录仍有大量未跟踪临时文件(`_*.py`/`_*.sql`/`_*.ps1` ç­‰ï¼‰æœªè¢« `.gitignore` è¦†ç›–,清理前需用户确认。
5. **公司 gitea ä»Šæ—¥æŽ¨ä¸ä¸ŠåŽ»ï¼ˆç½‘ç»œé—®é¢˜ï¼Œéžå‡­æ®ï¼‰**:TCP 3000 å¯è¿žé€šï¼ˆ`Test-NetConnection` è¿”回 True),但 HTTP æ— å“åº”——`curl http://61.183.254.94:3000/r/trafficAudit.git/info/refs?service=git-upload-pack` 20 ç§’超时(`000`),`git fetch gitea` ä¸Ž `git push gitea` å‡æ— é™æŒ‚起(各等待 2~4 åˆ†é’ŸåŽæ‰‹åŠ¨ç»ˆæ­¢ï¼‰ã€‚å¾…ç½‘ç»œæ¢å¤åŽè¡¥æŽ¨ï¼›è¡¥æŽ¨å‰å…ˆ `git fetch gitea` ä¸Žè¿œç«¯ `main` æ¯”对合并(禁强推)。
## å››ã€æ˜Žå¤©è®¡åˆ’
1. ä¸Žç”¨æˆ·ç¡®è®¤åŸŸå/其他访问方式是否需要一并加白名单,并确认 `Login.vue` é”™è¯¯æç¤ºç»†åˆ†æ–¹æ¡ˆæ˜¯å¦å®žæ–½ã€‚
2. æŽ¨è¿› AI å¤–发脱敏补齐(约 20 è¡Œæ”¹åŠ¨ï¼‰ï¼Œå®ŒæˆåŽå†™ã€ŠåŠŸèƒ½æµ‹è¯•æŠ¥å‘Šã€‹ï¼Œæ²¿ç”¨"假 DeepSeek æœåŠ¡æŠ“åŒ…"做报文级验证。
3. ç»§ç»­æŽ¨è¿›æŠ¥è¡¨æ¨¡æ¿æ‰©åˆ— / å®¡æ ¸åŸºå‡†ä¿æŠ¤ç­‰æŒ‚账项。
## äº”、git è®°å½•
- æœ¬æ¬¡æ”¹åŠ¨ï¼ˆ4 æ–‡ä»¶ï¼‰ï¼š`CorsConfig.java`、`application.yml.example`、本报告、本日结。
- è¯´æ˜Žï¼š`application.yml` è¢« `.gitignore` å¿½ç•¥ï¼ˆä»“库内模板是 `application.yml.example`),故模板同步修改后一并提交。
- æµç¨‹ä¸Žç»“果:
  1. å…ˆå†™ã€ŠåŠŸèƒ½æµ‹è¯•æŠ¥å‘Šã€‹ä¸Žæœ¬ã€Šå·¥ä½œæ—¥ç»“ã€‹ï¼Œå† `git fetch origin`(gitee,`master`)——无新提交,本地已包含远端全部提交;
  2. æäº¤ `0d2a5fc`:`fix(cors): æ”¾è¡Œå†…网网段来源,修复局域网 IP è®¿é—®æ—¶ç™»å½• 403`;
  3. æŽ¨ä¸ªäººä»“库 `origin`:`git push origin main:master` æˆåŠŸï¼ˆ`82100d6..0d2a5fc`);
  4. æŽ¨å…¬å¸ `gitea`:`git fetch gitea`、`git push gitea main:main` å‡å›  HTTP æ— å“åº”而挂起,未推送成功(详见遗留问题 5);本次为快进推送,不涉及强推。
---
## å…­ã€ä¸‹åˆè¿½åŠ ï¼ˆä¸¤æ¡ç”¨æˆ·éœ€æ±‚ï¼Œ2026-09-16)
### 1. æŠŠ 8 æœˆå¯¼å…¥çš„「货运量周转量表」中的 21–26 å¹´æ•°æ®å…¨éƒ¨è¯»å…¥æ•°æ®åº“
- **背景**:用户 8 æœˆå¯¼å…¥çš„ `定稿-湖北省各市州运输量数据(2026å¹´1-8月).xlsx` ä¸€ä¸ªå·¥ä½œç°¿å†…含 5 ä¸ªå¹´åº¦ Sheet(`2026å¹´ / 2025å¹´ / 2024å¹´ / 2022å¹´ / 2021å¹´`,源文件无 2023 å¹´ï¼‰ï¼Œè€Œè€é€»è¾‘只读第 1 ä¸ª Sheet å¹¶æŒ‰ã€Œå·¦åŠä»Šå¹´ 1–N æœˆ / å³åŠå޻年 1–12 æœˆã€çš„æœˆåº¦æ¨¡æ¿è§£æžï¼Œå…¶ä½™å¹´åº¦æ•°æ®è¢«ä¸¢å¼ƒã€‚
- **改动(后端 1 æ–‡ä»¶ï¼Œ+153/−19)**:`DataImportService.java` ä¸­ `importFreightTurnover` æ”¹ä¸ºåˆ†æµå…¥å£ï¼›åŽŸé€»è¾‘æŠ½ä¸º `importFreightTurnoverByMonth`(逐行不变);新增 `detectYearSheets`(识别多年度工作簿)、`importFreightTurnoverByYear`(按年入库 + ä¸Šå¹´åŒæœŸå–自上一年度 Sheet)、`parseWholeYearSheet`(整年 Sheet çš„货运量块/周转量块解析)、`persistFreightTurnover`(按报表期先删后插并记批次)。
- **结果**:源文件 5 ä¸ªå¹´åº¦å…¨éƒ¨å…¥åº“,返回「共 90 æ¡è®°å½•」,报表期为 `2021-12 / 2022-12 / 2024-12 / 2025-12 / 2026-08`,每期 18 è¡Œï¼›ä¸Žæºæ–‡ä»¶é€é¡¹æ¯”对 **1080 ä¸ªå•元格零差异**;重复导入幂等(全表 216 è¡Œ md5 å‰åŽä¸€è‡´ï¼‰ï¼›éžå¤šå¹´åº¦æ–‡ä»¶è‡ªåŠ¨å›žé€€åŽŸæœˆåº¦è·¯å¾„ã€‚
- è¯¦è§ã€ŠåŠŸèƒ½æµ‹è¯•æŠ¥å‘Š_货运量周转量多年度导入_2026-09-16.md》。
### 2. æŠ¥è¡¨ç”Ÿæˆ-汇总大表预览:删掉「中口径」之后的表格
- **改动(前端 1 æ–‡ä»¶ï¼Œå•行)**:`ReportExport.vue` ç¬¬ 133 è¡Œç”± `v-else-if="it.summary && it.summary.length"` æ”¹ä¸º `v-if="it.key !== 'summaryWorkbook' && it.summary && it.summary.length"`。根因是上面的汇总表用 `v-if`、第二张表用 `v-else-if`,对 `summaryWorkbook` ä¹Ÿç…§æ ·æ¸²æŸ“。
- **验证(推翻上一轮的无效取证)**:早期截图没拍到弹窗、AX æ ‘读到的是缓存,均为无效证据;本轮改用 `tab.playwright.evaluate` ç›´æŽ¥è¯» DOM â€”— å¼¹çª—内有且仅有 1 å¼ è¡¨ï¼ˆ`preview-summary wb-table`,12 è¡ŒæŒ‡æ ‡ï¼‰ï¼Œè¡¨æ ¼ä¸‹æ–¹åªæœ‰ä¸¤æ¡åŒæ¯”缺失提示与「关闭」按钮,**第二张表已彻底消失**。有效截图:`_qa_out/preview_summaryWorkbook_2026-08_verified_20260916.png`(本轮复核重拍 `..._verified2_20260916.png`,均 54006 å­—节)。
- è¯¦è§ã€ŠåŠŸèƒ½æµ‹è¯•æŠ¥å‘Š_汇总大表预览删除中口径后明细表_2026-09-16.md》。
## ä¸ƒã€æµ‹è¯•结果摘要(下午追加部分)
- å¤šå¹´åº¦å¯¼å…¥ï¼š12 æ¡ç”¨ä¾‹å…¨é€šè¿‡â€”—正向(多年度入库、1080 å•元格逐项抽查零差异、报表期语义、上年同期、批次记录)、负向(单 Sheet æœˆåº¦æ¨¡æ¿å›žé€€ã€éžå¹´åº¦å‘½ååŒ Sheet å›žé€€ã€æ··åˆå‘½åå›žé€€ã€éž Excel æ–‡ä»¶æŠ¥é”™ï¼‰ã€å¹‚等(重复导入全表 md5 ä¸€è‡´ï¼‰ã€å›žå½’(测试期清理干净、真实月份 216 è¡Œ / 12 æœŸå£å¾„不变)。
- é¢„览弹窗:7 æ¡ç”¨ä¾‹å…¨é€šè¿‡â€”—DOM å®žæµ‹å¼¹çª—内 `table` æ•°é‡ä¸º 1、类名与行数正确、12 è¡Œæ•°å€¼ä¸ŽåŒæ¯”完整、表格下方无第二张表、`git diff` ä»… 1 è¡Œæ”¹åŠ¨ä¸å›žå½’ã€‚
- æµ‹è¯•期清理:`2099-01` ~ `2099-04` å…¨éƒ¨ç”¨ `POST /api/import/clear?period=…` æ¸…空(各 dataRows=18、batchRows=1),当前库 **0 æ¡ 2099 æ®‹ç•™**、`freight_turnover_import` 216 è¡Œ / 12 ä¸ªæŠ¥è¡¨æœŸã€‚
## å…«ã€é—留问题与待办(更新)
1. **`2021-12` ç­‰æŠ¥è¡¨æœŸæ˜¯ã€Œæ•´å¹´ã€è¯­ä¹‰**:这些期承载该年 1–12 æœˆå…¨å¹´æ•°æ®ï¼Œè€Œéž 12 æœˆå•月;后续报表/审核若按单月口径取数需用户确认口径,必要时再改造。
2. **源文件缺 2023 å¹´ Sheet**:导致不生成 `2023-12`,`2024-12` æ— ä¸Šå¹´åŒæœŸã€‚属源数据缺口。
3. **`2026-01` ~ `2026-07` çš„ `last_*` ä¸ºç©º**:经比对改动前备份(`2026-04` çš„ INSERT)确认这几期改动前即为空,且本次导入未触碰这些报表期(批次只覆盖 5 ä¸ªæœŸï¼‰ï¼Œ**非本次改动引入**;如需补上年同期需重新导入对应年度数据。
4. **改动前的备份不完整**:`_backup_freight_turnover_before_multiyear_20260916.sql` ä»… 59642 å­—节、只解析出 `2026-04` ä¸€å¤„ INSERT,**不能作为完整回滚依据**。
5. å¼¹çª—内「共 0 è¡Œã€ä¸Žã€Œæœˆåº¦è¦†ç›–:1~8月均有数据」口径不同(前者是明细行数),易误解,可考虑改文案(未做,等用户确认)。
6. ä¸Šåˆé—留继续挂账:域名/公网访问的白名单补充、`Login.vue` é”™è¯¯æç¤ºç»†åˆ†ã€AI å¤–发脱敏补齐、4 å¼ æ˜Žç»†æŠ¥è¡¨æ¨¡æ¿æ‰©åˆ—、审核比对基准缺失保护、`sys_role` æƒé™è½åœ°ã€3D éªŒè¯ç ç”Ÿäº§å¼€å¯ã€`backend.log` åŽ†å²æ˜Žæ–‡æ¸…ç†ã€ä»“åº“æ ¹ç›®å½•ä¸´æ—¶æ–‡ä»¶æ¸…ç†ã€‚
7. **公司 gitea ä»å¾…补推**(网络问题,非凭据),补推前先 `git fetch gitea` ä¸Žè¿œç«¯ `main` å¯¹æ¯”合并,禁强推。
## ä¹ã€æ˜Žå¤©è®¡åˆ’
1. ä¸Žç”¨æˆ·ç¡®è®¤ `2021-12` / `2022-12` ç­‰ã€Œæ•´å¹´æŠ¥è¡¨æœŸã€çš„业务口径,以及是否需要把年度数据拆成逐月报表期。
2. ç¡®è®¤æ˜¯å¦éœ€è¦è¡¥ 2023 å¹´æ•°æ®ã€ä»¥åŠ `2026-01`~`2026-07` çš„上年同期是否需要补齐。
3. è§†ç”¨æˆ·æ„è§å¤„理预览弹窗「共 0 è¡Œã€æ–‡æ¡ˆã€‚
4. ç½‘络恢复后补推公司 gitea。
---
## åã€å‚æ™šè¿½åŠ ï¼ˆç¬¬ 3 è½®ç”¨æˆ·åé¦ˆ 6 æ¡ï¼Œ2026-09-16)
用户本轮提出 6 æ¡åé¦ˆï¼Œé€æ¡å¤„理结果如下:
| # | ç”¨æˆ·åé¦ˆ | å¤„理结果 |
|---|----------|----------|
| 1 | 21–26 å¹´è´§è¿é‡å‘¨è½¬é‡è¡¨æ•°æ®å…¥åº“ | ä¸Šè½®å·²å®Œæˆï¼ˆ`0cfd6e0`),本轮补齐 2023 å¹´ï¼ˆè§ #2) |
| 2 | ç”¨æˆ·æ ¸å®žã€Œ23 å¹´æœ‰ 12 æœˆçš„æ•°æ®ã€ | **属实**。8 æœˆæºæ–‡ä»¶ç¡®å®žæ²¡æœ‰ 2023 å¹´ Sheet,但 7 æœˆæ–‡ä»¶ `D:\05_数据分类\货运\7月\定稿-湖北省各市州运输量数据(2026å¹´1-7月).xlsx` é‡Œæœ‰ä¸€ä¸ªåä¸º `2023` çš„ Sheet。已另存 `_2023_import_tmp.xlsx`(`2023` + `2022å¹´` ä¸¤ä¸ª Sheet)导入,生成 `2023-12`(18 è¡Œï¼‰ï¼Œ**432 é¡¹é€æ ¼æ¯”对零差异** |
| 3 | è¦ä¸€ä»½ã€Œæ‰€æœ‰è¦æ³¨æ„çš„点」的汇总文档 | æ–°å»º `docs/问题汇总/问题与注意事项汇总_2026-09-16.md`(11 ç«  + é€ŸæŸ¥è¡¨ï¼Œå«å¯åЍ/进程、日志验证、数据库、导入路径与期次约定、报表、验证码、文件编码、浏览器取证、git åŒä»“库、遗留问题) |
| 4 | æ¢ WiFi åŽç™»å½•页出现验证码白框 + ã€ŒéªŒè¯ç åŠ è½½å¤±è´¥ã€ | å·²ä¿®å¤ï¼ˆå‰ç«¯é»˜è®¤å€¼ + fail-safe),本轮浏览器复测通过 |
| 5 | é¢„览点一下弹「导出失败,请确认导入数据」 | å·²ä¿®å¤æç¤ºé€»è¾‘(区分网络/后端原因);另外两小项(指标错位、弹窗拖动圆角)本轮浏览器实测通过 |
| 6 | å…¬è·¯æ—…客 H203-1 æ¨¡æ¿è¢«ä¿®æ”¹ | å·²é€‚配并验证:新增 `统一社会信用代码` / `填报单位` ä¸¤åˆ—入库,新老格式双向兼容 |
### 1. 2023 å¹´è´§è¿æ•°æ®è¡¥å½•(用户第 2 æ¡ï¼‰
- **排查过程**:先确认 8 æœˆæºæ–‡ä»¶ 5 ä¸ª Sheet å…¨ä¸ºå¯è§ã€æ—  2023;再全盘搜索 `*运输量*`、`*23å¹´*`、`*货运量*` æ–‡ä»¶åï¼›æœ€åŽæ‰«æ `D:\05_数据分类` ä¸Ž `D:\桌面` ä¸‹æ‰€æœ‰ `.xlsx` çš„ **Sheet å**,命中 7 æœˆæ–‡ä»¶çš„ `2023` Sheet。
- **一致性预检**:7 æœˆä¸Ž 8 æœˆæ–‡ä»¶çš„ `2021å¹´ / 2022å¹´ / 2024å¹´` ä¸‰å¹´æ•°æ®é€æ ¼æ¯”对,`onlyJuly / onlyAug / differ` å…¨ä¸ºç©º â†’ ä¸‰å¹´**零差异**,可安全用 7 æœˆæ–‡ä»¶è¡¥ 2022(作为 2023 çš„上年同期来源)。
- **导入**:`POST /api/import/freightTurnover?period=2023-12`,返回「共 36 æ¡è®°å½•」。
- **验证**:`2023-12` 18 è¡Œï¼›è´§è¿é‡ + å‘¨è½¬é‡å…± 432 é¡¹ä¸Ž Excel é€æ ¼æ¯”对 **mismatches=0**;`last_*` ä¸Ž `2022-12` é€å€¼ç›¸åŒï¼›å…¨éƒ¨æŠ¥è¡¨æœŸ 2021-12 â†’ 2026-08 å…± 13 æœŸã€æ¯æœŸ 18 è¡Œã€‚
- è¯¦è§ã€ŠåŠŸèƒ½æµ‹è¯•æŠ¥å‘Š_货运量周转量2023年数据补录_2026-09-16.md》。
### 2. H203-1 æ¨¡æ¿æ–°å¢žåˆ—适配(用户第 6 æ¡ï¼‰
- **模板 diff ç»“论**:Sheet1 ç”± 773×50 â†’ 816×52;在「企业名称」后插入 `统一社会信用代码`、`填报单位` ä¸¤åˆ—,其余 48 åˆ—整体右移。
- **改动 6 å¤„**:库 DDL、`docs/init.sql`、`docs/database.md`、`PassengerEnterpriseMonthly.java`、`DataImportService.java`、`DataViewController.java`(数据查看页列)。
- **验证**:新模板导入 814 æ¡ 0 å¤±è´¥ï¼Œå››é¡¹æ±‡æ€»ï¼ˆå®¢è¿è½¦è¾† 24584 / æ ¸å®šè½½å®¢ä½ 711018 / å®¢è¿é‡ 16371625 / å‘¨è½¬é‡ 1023386179)与源文件全等;老格式 `.xls` å¯¼å…¥ 767 æ¡ 0 å¤±è´¥ä¸”新列有值(**老文件其实也带这两列**),数值与既有 2026-08 å®Œå…¨ä¸€è‡´ï¼›è´Ÿå‘用例(选错类型)报错清晰。
- **过程中的失误**:`docs/database.md` é‡Œ `| enterprise_name | varchar(200) | ä¼ä¸šåç§° |` å‡ºçް 4 æ¬¡ï¼Œé¦–次批量替换误改 3 å¼ è¡¨ï¼Œå·² `git checkout` å›žé€€åŽæ”¹ä¸ºã€Œæˆªå–章节再替换」。
- è¯¦è§ã€ŠåŠŸèƒ½æµ‹è¯•æŠ¥å‘Š_H2031模板新增列适配_2026-09-16.md》。
### 3. ç™»å½•验证码容错 + æŠ¥è¡¨é¢„览整改(用户第 4、5 æ¡ï¼‰
- **验证码**:`Login.vue` é»˜è®¤ `captchaRequired=false`,改为 fail-safe(仅后端明确返回 `required===true` æ‰æ˜¾ç¤ºï¼‰ï¼›æ¢ WiFi/后端不可达时不再残留验证码白框。
- **失败提示**:`failWith(err, action)` + `errReason(raw)` é‡å†™ï¼ŒåŒºåˆ†ã€Œè¿žä¸ä¸ŠæœåŠ¡å™¨ã€ä¸Žã€ŒåŽç«¯çœŸå®žåŽŸå› ã€ï¼›é¢„è§ˆè°ƒç”¨å¸¦ `action='预览'`;Blob é”™è¯¯å…ˆ `text()` å†è§£æžã€‚
- **指标错位**:预览表头由 3 åˆ—补为 4 åˆ—(分类/指标/数据/同比),实测 x åæ ‡ 35 / 118 / 394 / 587,`16888.76` è½åœ¨ã€Œæ•°æ®ã€åˆ—。
- **弹窗拖动 + åœ†è§’**:新增 `dialogDrag.js` æŒ‡ä»¤ï¼ˆElement UI 2.15.14 æ—  `draggable`),`border-radius:10px`;实测拖动 `(0,40) â†’ (120,200)`,`transform=matrix(1,0,0,1,120,160)`,关闭后复位 `none`。
- ã€Œä¸­å£å¾„之后不再渲染表格」上轮已修,本轮复核弹窗内**有且仅有一张表**。
- è¯¦è§ã€ŠåŠŸèƒ½æµ‹è¯•æŠ¥å‘Š_登录验证码容错与报表预览整改_2026-09-16.md》。
### 4. æ³¨æ„äº‹é¡¹æ±‡æ€»æ–‡æ¡£ï¼ˆç”¨æˆ·ç¬¬ 3 æ¡ï¼‰
新建 `docs/问题汇总/问题与注意事项汇总_2026-09-16.md`,共 11 ç« ï¼š
速查表(10 æ¡ï¼‰ã€å¯åŠ¨ä¸Žè¿›ç¨‹ç®¡ç†ã€æœåŠ¡çŠ¶æ€éªŒè¯ã€æ•°æ®åº“ã€æ•°æ®å¯¼å…¥ï¼ˆè·¯å¾„ + æœŸæ¬¡çº¦å®š + å¤šå¹´åº¦å·¥ä½œç°¿è¯†åˆ«è§„则)、报表生成、登录与验证码、文件写入与文本处理的坑、浏览器自动化取证的坑、Git åŒä»“库工作流、当前已知遗留问题。
## åä¸€ã€æµ‹è¯•结果摘要(傍晚追加部分)
- **2023 è¡¥å½•**(5 æ¡ç”¨ä¾‹ï¼‰ï¼šæ­£å‘入库、432 é¡¹é€æ ¼æ¯”对零差异、上年同期取自 2022、报表期清单无重复/无残留、2022-12 é‡å†™åŽé€å€¼ä¸å˜ â€”— å…¨éƒ¨é€šè¿‡ã€‚
- **H203-1 æ–°å¢žåˆ—**(9 æ¡ç”¨ä¾‹ï¼‰ï¼šæ–°æ¨¡æ¿ 814 æ¡ 0 å¤±è´¥ã€ä¸¤åˆ— 814/814 æœ‰å€¼ã€é¦–行与汇总四项与源文件全等、老格式 767 æ¡ 0 å¤±è´¥ä¸”数值与 2026-08 å…¨ç­‰ã€Excel COM æŠ½æŸ¥é¦–行一致、负向选错类型报错清晰、列右移不影响旧字段 â€”— å…¨éƒ¨é€šè¿‡ã€‚
- **登录验证码 + é¢„览整改**(10 æ¡ç”¨ä¾‹ï¼‰ï¼šæ— éªŒè¯ç ç™½æ¡†ã€æŽ¥å£ `required=false`、表头 4 åˆ—且 x åæ ‡å¯¹é½ã€åœ†è§’ 10px、拖动位移 120/160、关闭复位、弹窗内仅 1 å¼ è¡¨ã€å¤±è´¥æç¤ºå·²ç»†åˆ†ã€å¯¼å‡ºæˆåŠŸ â€”— å…¨éƒ¨é€šè¿‡ã€‚
- **测试数据清理**:H203-1 å¯¼å…¥éªŒè¯äº§ç”Ÿçš„ `2099-06 / 2099-07 / 2099-09` ä¸‰ä¸ªæµ‹è¯•期(共 2395 è¡Œï¼‰åŠå…¶ `import_batch` è®°å½•已删除,`h2031_enterprise_monthly` æ¢å¤ä¸º 2026-01 ~ 2026-08 å…± 8 æœŸï¼›`freight_turnover_import` ä¸º 13 æœŸ Ã— 18 è¡Œã€‚
## åäºŒã€é—留问题与待办(傍晚更新)
| # | é—®é¢˜ | çŠ¶æ€ |
|---|------|------|
| 1 | 8 æœˆæºæ–‡ä»¶ç¼º 2023 å¹´ Sheet | **已解决**(用 7 æœˆæ–‡ä»¶è¡¥å½• `2023-12`) |
| 2 | `2026-01` ~ `2026-07` çš„ `last_*` ä¸ºç©º | å¾…用户确认是否补 |
| 3 | `2026-01` ~ `2026-08` çš„ H203-1 `unified_credit_code` / `report_unit` ä¸ºç©ºï¼ˆæ­¤å‰ä»£ç æœªè¯»è¿™ä¸¤åˆ—) | **待用户确认是否重导历史文件回填** |
| 4 | `2024-12` çš„上年同期未回填(需重导 2024 å¹´æ•°æ®ï¼‰ | å¾…用户确认 |
| 5 | é¢„览弹窗「共 0 è¡Œã€ä¸Žã€Œæœˆåº¦è¦†ç›–:1~8月均有数据」口径文案不同 | å¾…用户确认改文案 |
| 6 | `2021-12` ç­‰ã€Œæ•´å¹´æŠ¥è¡¨æœŸã€çš„业务口径 | å¾…用户确认 |
| 7 | å…¬å¸ gitea æŽ¨é€ï¼ˆç½‘络无响应) | å¾…补推,**禁强推** |
| 8 | ä»“库根目录大量 `_*.*` ä¸´æ—¶æ–‡ä»¶ | ç»ç”¨æˆ·åŒæ„åŽå†æ¸…理 |
## åä¸‰ã€ä¸‹ä¸€æ­¥è®¡åˆ’(傍晚更新)
1. ç­‰ç”¨æˆ·ç¡®è®¤ 3 ä»¶äº‹ï¼šæ˜¯å¦é‡å¯¼ 2026 å¹´åŽ†å² H203-1 æ–‡ä»¶å›žå¡«ä¸¤åˆ—、是否补 `last_*` / `2024-12` ä¸Šå¹´åŒæœŸã€é¢„览弹窗文案是否调整。
2. ç½‘络恢复后补推公司 gitea(先 fetch åˆå¹¶ï¼Œç¦å¼ºæŽ¨ï¼‰ã€‚
3. è§†ç”¨æˆ·æ„è§æ¸…理仓库根目录 `_*.*` ä¸´æ—¶æ–‡ä»¶ã€‚
## åå››ã€git å®žé™…结果(傍晚补记)
1. `git fetch origin`(个人 gitee,`master`):远端与本地一致(`HEAD...origin/master = 0 0`),**无同事/用户新提交**,无需合并。
2. æäº¤ `24b4c28`:`feat(h2031): é€‚配模板新增「统一社会信用代码/填报单位」两列并入库;fix(import): è¡¥å½• 2023 å¹´è´§è¿é‡å‘¨è½¬é‡ï¼›fix(login/report): éªŒè¯ç å®¹é”™ã€é¢„览指标对齐、弹窗可拖动圆角、失败提示细分;docs: æ–°å¢žé—®é¢˜ä¸Žæ³¨æ„äº‹é¡¹æ±‡æ€»`(10 ä¸ªæ”¹åЍ + 4 ä¸ªæ–°å¢žï¼Œå…± 14 ä¸ªæ–‡ä»¶ï¼‰ã€‚
3. æŽ¨ä¸ªäººä»“库 `origin`:`git push origin main:master` æˆåŠŸï¼ˆ`0cfd6e0..24b4c28`)。
4. æŽ¨å…¬å¸ `gitea`:`git fetch gitea` æŠ¥ `Operation too slow. Less than 1000 bytes/sec transferred the last 15 seconds`;`curl --max-time 20 http://61.183.254.94:3000/` è¿”回 `http_code=000 time=20.01`,确认**公司内网不可达**(网络问题,非凭据),本次未推送成功,已列为遗留问题;补推前先 `git fetch gitea` ä¸Žè¿œç«¯ `main` åˆå¹¶ï¼Œ**禁强推**。
## åäº”、用户 4 æ¡ç¡®è®¤çš„落实(2026-09-16 æ”¶å°¾ï¼‰
| ç”¨æˆ·åé¦ˆ | ç»“论与处置 |
|---|---|
| 1-2「我导入的货运量周转量表里有 23 å¹´æ•°æ®ã€ | å·²é€æ ¼å¤æ ¸ï¼š8 æœˆæºæ–‡ä»¶åªæœ‰ `2026å¹´ / 2025å¹´ / 2024å¹´ / 2022å¹´ / 2021å¹´` äº”个 Sheet,内文无任何 2023 æ ‡è¯†ï¼ˆå‘½ä¸­é¡¹å‡ä¸ºæµ®ç‚¹æ•°é‡Œçš„æ•°å­—巧合);`2023` Sheet å‡ºçŽ°åœ¨**7 æœˆ**文件里。已用 7 æœˆæ–‡ä»¶çš„ `2023` Sheet è¡¥å½• `2023-12`,无需再导。 |
| 1「让他空着吧」 | 2026-01~08 çš„ H203-1 `unified_credit_code` / `report_unit` ä¿æŒç©ºï¼Œ**不重导**历史文件。 |
| 2「是不是把 23 å¹´ä¹Ÿå¯¼è¿›åŽ»ã€ | æ˜¯ï¼Œå·²å¯¼å…¥ `2023-12`(18 è¡Œï¼‰ã€‚若要回填 `2024-12` çš„上年同期值,需再重导一次 2024 å¹´æ•°æ®ï¼ˆå¾…用户确认)。 |
| 3「可以」 | é¢„览弹窗文案已按确认修改(汇总大表「指标 N é¡¹ã€ï¼å…¶å®ƒæŠ¥è¡¨ã€Œå…± N è¡Œæ˜Žç»†ã€ï¼‰ï¼Œå¹¶å·²åœ¨æµè§ˆå™¨å®žæµ‹ã€‚ |
| 4「什么时候开始连不上的」 | å…¬å¸ gitea **自 2026-09-15 èµ·ä¸å¯ç”¨**:09-15 ä¸ºå‡­æ®å¼¹çª—未推成功;09-16 èµ·å˜ä¸º TCP 3000 å¯è¿žä½† HTTP æ— å“åº”。今日复测 `Test-NetConnection` ä¸º True、`curl` 25s è¶…æ—¶ `code=000`。 |
## åå…­ã€git å®žé™…结果(收尾补记)
- `git fetch origin`(个人 gitee):`HEAD...origin/master = 0 0`,无新提交,无需合并。
- æäº¤ `e7cddc4`:`fix(report): é¢„览弹窗行数文案按报表类型区分`(4 ä¸ªæ–‡ä»¶ï¼Œ+25/-1)。
- æŽ¨ä¸ªäººä»“库 `origin`:`git push origin main:master` æˆåŠŸï¼ˆ`b0c8b4f..e7cddc4`)。
- æŽ¨å…¬å¸ `gitea`:`git fetch gitea` ä»å¤±è´¥ï¼ŒæŠ¥ `fatal: unable to access ... Recv failure: Connection was reset`(`fetch_exit=128`),本次**未推送成功**,继续列为遗留问题;补推前先 `git fetch gitea` ä¸Žè¿œç«¯ `main` åˆå¹¶ï¼Œ**禁强推**。
## åä¸ƒã€ç”¨æˆ·ç¬¬ 5 æ¡ï¼šæ±‡æ€»å¤§è¡¨ä¸Ž 8 æœˆå®šç¨¿é€è¡¨æ¯”对
**比对对象**:`D:\桌面\生成_道路运输量汇总表.xlsx`(用户 14:39 å¯¼å‡ºï¼‰ vs `D:\05_数据分类\汇总表\8月汇总定稿\2026å¹´8月客运量、货运量定稿.xlsx`。重新导出一次(`GET /api/report/export/summaryWorkbook?period=2026-08&mode=month`)得到的文件与桌面那份**字节数完全一致(950,186)**,排除“文件过期”。
**踩的坑(重要)**:
1. ä¸¤è¾¹**行块高度不同**(导出每市州 6 è¡Œã€å®šç¨¿ 4 è¡Œï¼›å¯¼å‡º 118 è¡Œ vs å®šç¨¿ 84 è¡Œï¼‰ï¼Œç›´æŽ¥æŒ‰å•元格坐标比会得出 4.6 ä¸‡ä¸ªâ€œå·®å¼‚”,全是错位噪声 â†’ æ”¹ç”¨ã€Œåœ°åŒº+指标+列标题」**语义键**对齐。
2. å¯¼å‡ºç«¯æœ‰ **39,939 ä¸ªå…¬å¼æ ¼**(`=C7+C9`、`=C5/V5-1`、`RANK(...)`),`openpyxl(data_only=True)` è¯»å‡ºæ¥å…¨æ˜¯ None â†’ è¯¯åˆ¤æˆâ€œæ•´è¡¨æ²¡æ•°æ®â€ã€‚Excel COM æ‰“不开(用户已开着 Excel,不能乱动),最后**自己写公式求值器**(SUM/RANK/ROUND+四则+跨表引用)算出 61,972 ä¸ªæ•°å€¼æ ¼å†æ¯”。
**结论**:语义键一致 28,567 ä¸ªï¼Œä¸ä¸€è‡´ 4,742 ä¸ªã€‚
* ` è´§è¿` è¡¨ï¼šå¯¼å‡ºæ¯å¸‚州比定稿**多两行**(「规上+规下货运量」「规下货运量」),同指标数值**零差异**;定稿还有「规上+规下周转量」行而导出该行为空。
* **最大差异来源**:`city_bus_monthly / city_taxi_monthly / wyc_order_monthly / wyc_total_monthly` **只有 2026-01~08,没有 2025 å¹´** â†’ å…¬äº¤/出租/网约车/中口径几张表的「与去年同比」被算成 `0`/`-1`、2025 å¹´ç´¯è®¡åå°ã€‚
* `h2031_enterprise_monthly` ç¼º `2025-01`(源文件本身没有 1 æœˆï¼‰ã€‚
* å¯¼å‡ºç«¯ã€Œä¸­å£å¾„分析」多一段当月块、缺 4 è¡Œâ€œå æ¯””。
详见《功能测试报告/汇总大表与定稿比对_2026-09-16.md》。
## åå…«ã€ç”¨æˆ·ç¬¬ 2 æ¡ï¼š2024 å¹´æ•°æ®é‡å¯¼ï¼ˆå›žå¡«ä¸Šå¹´åŒæœŸï¼‰
**背景**:`last_*`(上年同期)只从**同一个工作簿的上一年 Sheet** å–,8 æœˆæ–‡ä»¶æ²¡æœ‰ `2023` Sheet,所以 `2024-12` çš„ `last_*` ä¸€ç›´æ˜¯ NULL。
**过程**:先用 7 æœˆæ–‡ä»¶ï¼ˆå« `2023` Sheet)另存只留 4 ä¸ªå¹´åº¦ Sheet çš„临时文件导入 â†’ `2024-12` çš„ `last_*` å¡«ä¸Šäº†ï¼Œä½† **`2021-12` çš„「湖北省」行 1 æœˆå€¼ä»Ž 14945.34 å˜æˆäº† 0**。排查发现「湖北省」行是 `=SUM()` **公式**,openpyxl å¦å­˜ä¼š**丢掉公式的缓存值**,POI è¯»åˆ°ç©ºå…¬å¼å°±å†™ 0。
**修正**:改用**原始 7 æœˆæ–‡ä»¶**整份重导(`POST /api/import/freightTurnover?period=2026-07`,返回「共 108 æ¡è®°å½•」= 6 æœŸ Ã— 18 è¡Œï¼‰ã€‚
**复核**:7 æœˆ/8 æœˆä¸¤ä¸ªæ–‡ä»¶çš„ 11 ä¸ªå¹´åº¦ Sheet ä¸Žåº“逐格比对 **4,752 æ ¼å…¨éƒ¨ 0 ä¸ä¸€è‡´**;上年同期链条 2022→2021、2023→2022、2024→2023、2025→2024、2026-07/08→2025 **全部 0 ä¸ä¸€è‡´**。
**教训**:以后不能用 openpyxl å¦å­˜ Excel å†å–‚给后端,公式缓存会丢;要么用原始文件,要么用 Excel COM å¦å­˜ã€‚
## åä¹ã€ç”¨æˆ·ç¬¬ 3 è½®æé—®ï¼šè´§è¿é¡µç­¾ã€Œç´¯è®¡ã€ä¸ºä»€ä¹ˆåªæœ‰å‰å››ä¸ªå¯¹å¾—上 + æ–°å¯¼å…¥æ•°æ®ä½“检
### 19.1 å®šä½è¿‡ç¨‹
1. è§£å‰–导出件「 è´§è¿ã€é¡µç­¾ï¼šå…± 6 ä¸ªç´¯è®¡åˆ— â€”— `S`(2026 1-8月)、`AT`(2025)、`BV`(2024)、`CW`(2023)、`DZ`(2022)、`EO`(2021)。
2. è¯»æ¯ç‰ˆ `docs/生成汇总大表/生成_道路运输量汇总表.xlsx` çš„同名页:`S5/AT5/BV5/CW5` æ˜¯ **Σ公式**,`DZ5` æ˜¯ **数值常量 144979.285376043**,`EO5/EP5` **为空**。2021 å¹´ `EC5:EN5` åäºŒä¸ªæœˆéƒ½æœ‰å€¼ï¼ˆåˆè®¡ 161309.5316),只是累计列漏了。
3. ç”¨æºæ–‡ä»¶ï¼ˆ`D:\05_数据分类\高速\定稿-湖北省各市州运输量数据(2026å¹´1-8月).xlsx`,另有 7 æœˆæ–‡ä»¶å« 2023 é¡µï¼‰å¤ç®—全省行:
| å¹´åº¦ | åˆ— | æ±‡æ€»è¡¨ | æºæ–‡ä»¶æ ¸ç®— | å·®å¼‚ |
|---|---|---|---|---|
| 2026(1-8月) | S | 130311.8927 | 130311.8927 | 0 |
| 2025 | AT | 195433.2232 | 195433.2232 | 0 |
| 2024 | BV | 184938.5780 | 184938.5780 | 0 |
| 2023 | CW | 173045.2932 | 173045.2964 | âˆ’0.0033 |
| 2022 | DZ | 144979.2854 | 144979.2825 | +0.0029 |
| 2021 | EO | ç©º | 161309.5316 | æ•´åˆ—缺失 |
周转量行同理(2023 âˆ’0.0017、2022 +0.0025、2021 ç©ºï¼‰ã€‚市州行 2026~2022 é€æ ¼ä¸€è‡´ï¼Œå·®å¼‚只在「全省」行和 2021 åˆ—。
### 19.2 åŽŸå› 
* **2021 ç´¯è®¡åˆ—(EO)在母版里就是空的** â€”— æ¼å¡«ç´¯è®¡å…¬å¼ï¼›8 æœˆå®šç¨¿åŒæ ·ä¸ºç©ºï¼Œå±žåŽ†å²é—ç•™ã€‚
* **2022 ç´¯è®¡åˆ—(DZ)是写死常量**,不会随导入数据刷新;其各月值也是当年手工录入的旧精度(1 æœˆ 10709.5265 vs æºæ–‡ä»¶ 10709.5234)。
* **2023 ç´¯è®¡åˆ—(CW)是公式,但输入来自母版**:母版 2023 å…¨çœè¡Œ = è§„上+规下两行相加,与源文件 `2023` é¡µæ¹–北省行精度不同,差 0.0033。
* ä»£ç æ¯æ¬¡å¯¼å‡ºåªå›žå¡«ã€Œç›®æ ‡å½“月」一列(`SummaryWorkbookFiller.fillFreightSheet`),历史月份全部沿用母版 â†’ æ¯ç‰ˆå¯¹ä¸ä¸Šå°±æ•´ä½“对不上。
### 19.3 æ–°å¯¼å…¥æ•°æ®ä½“检(问题清单)
| # | ä¸¥é‡åº¦ | é—®é¢˜ |
|---|---|---|
| 1 | é«˜ | `h2032_enterprise_monthly` å¤šå‡ºä¸€ä¸ª **2026-09 æœŸ**,源文件名是「道路货物运输月度生产情况(2026å¹´8月).xls」(batch 302)。与 2026-08 æœŸé€ä¼ä¸šæ¯”:636 æ¡ä¼ä¸šå®Œå…¨åŒé›†ã€90 ä¸ªåŒºåˆ’,仅 38 å®¶ä¼ä¸šæ•°å€¼ä¸åŒ â†’ æ˜¯ 8 æœˆæ•°æ®çš„另一版本被存成 9 æœˆ |
| 2 | é«˜ | `h2031_enterprise_monthly` **缺 2025-01**(今天只导了 02~12),2025 å¹´ç´¯è®¡ä¼šå°‘ 1 ä¸ªæœˆ |
| 3 | ä¸­ | `passenger_individual_monthly` 2026-08 **缺黄冈市**(7 æ¡å˜ 6 æ¡ï¼‰ |
| 4 | ä½Ž | PASSENGER_AUTH 11 æœŸå…¨ 0 è¡Œï¼Œéœ€ç¡®è®¤æ˜¯å¦æ­£å¸¸ |
| 5 | æç¤º | 2025-04 çš„ H2032 æ­¤å‰ç¼ºå¤±ï¼Œæœ¬æ¬¡å·²è¡¥é½ï¼ˆbatch 382,664 è¡Œï¼‰ï¼›h2032 åŒºåˆ’æ•° 2025=87 / 2026=90,属企业进退规正常变动 |
入库抽查:H2032 2025 å…¨å¹´è§„上 50117.0940 ä¸‡å¨ / 7435040.9971 ä¸‡å¨å…¬é‡Œã€2026 å¹´ 1-8 æœˆè§„上 31399.8248 ä¸‡å¨ï¼Œé€å¸‚å·ž 17/17 ä¸Žå¯¼å‡ºä»¶ã€Œè´§è¿é‡æŽ’名」累计表一致。
详见《功能测试报告/货运累计列核对与导入数据体检_2026-09-16.md》。
### 19.4 git ç»“果(本轮)
- æäº¤ `27574bc`(功能测试报告 + æœ¬èŠ‚ + .gitignore è¡¥ `_pylibs/`、修正 `~$*` å‰å¯¼ç©ºæ ¼ï¼‰â†’ **已推 origin(gitee master)**:`559e937..27574bc`。
- **公司 gitea ä»ä¸å¯ç”¨**:`Test-NetConnection 61.183.254.94:3000` è¿”回 True(TCP é€šï¼‰ï¼Œä½† `GET /r/trafficAudit.git/info/refs?service=git-upload-pack` 25 ç§’无任何响应(HTTP 000),`git fetch gitea` æŠ¥ `Operation too slow. Less than 1000 bytes/sec`。判断为服务端未正常提供 HTTP å“åº”,待恢复后补推,**禁强推**。
## äºŒåã€ç”¨æˆ·ã€Œå¯ä»¥ã€æŽˆæƒé¡¹è½å®žï¼šè´§è¿é¡µç­¾ç´¯è®¡åˆ—修复 + H2032 è„æœŸæ¸…理
### 20.1 å…³é”®å‘现:根因不是累计公式,而是「全省规下」行
上一节我判定为「2021 ç´¯è®¡åˆ—空 + 2022 å†™æ­»å¸¸é‡ + 2023 ç²¾åº¦å·®ã€ï¼Œæœ¬è½®ç”¨ Excel COM é€æœˆå®žæµ‹åŽ**修正了结论**。对 6 ä¸ªå¹´åº¦å—逐月比较「全省行」与「17 å¸‚州行之和」:
| å¹´åº¦ | åˆè®¡å·® | è§„上差 | è§„下差 |
|---|---|---|---|
| 2026(1-8) | 2.8e-5 | 1.8e-12 | 2.8e-5 |
| 2025 | 3.3e-11 | 9.1e-13 | 3.5e-11 |
| 2024 | 1.5e-11 | 9.1e-13 | 1.3e-11 |
| 2023 | **4.6e-3** | 4.5e-13 | **4.6e-3** |
| 2022 | **3.1e-3** | 2.3e-13 | **3.1e-3** |
| 2021 | 4.0e-5 | 4.0e-5 | 1.5e-4 |
- ã€Œè§„上」全省行永远是 17 å¸‚州之和(公式),**一处不差**;
- å·®å¼‚ 100% æ¥è‡ªã€Œå…¨çœè§„下」行 â€”— å®ƒæ˜¯**写死的常量**,与 17 å¸‚州规下之和不等;
- è€Œã€Œ17 å¸‚州行之和」恰好等于源文件湖北省行(2022 = 144979.2825、2023 = 173045.2964),正是用户人工核算的那个数。
所以只要把「全省 è§„上/规下」两行都改成 17 å¸‚州求和公式,全省行自然等于市州之和,累计列随之自动对上。
### 20.2 æ¯ç‰ˆæ”¹åŠ¨ï¼ˆdocs/生成汇总大表/2026å¹´8月道路运输量汇总表.xlsx çš„「 è´§è¿ã€é¡µï¼‰
| ä½ç½® | æ”¹å‰ | æ”¹åŽ |
|---|---|---|
| r7/r8/r9/r10(全省 è§„上/规下 è´§è¿é‡Â·å‘¨è½¬é‡ï¼Œ2021-2025 å„月) | å†™æ­»å¸¸é‡ | SUM(17 å¸‚州对应行) |
| r5/r6(全省 è´§è¿é‡/周转量,2021-2025 å„月) | å¸¸é‡ | m7+m9 / m8+m10 |
| DZ(2022 ç´¯è®¡ï¼Œè¡Œ 5-112) | å†™æ­»å¸¸é‡ | SUM(DM:DX) |
| EO(2021 ç´¯è®¡ï¼Œè¡Œ 5-112) | ç©º | SUM(EC:EN) |
| EA(2022 ç´¯è®¡åŒæ¯”,行 5-112) | å†™æ­»å¸¸é‡ | IFERROR(DZ/SUM(EC:EN)-1,"") |
共 360 + 324 ä¸ªå•元。2026 å¹´å—不动(当月值由导出代码回填);EP(2021 ç´¯è®¡åŒæ¯”)保持为空(页内没有 2020 å—,无同比基期)。改前备份 docs/生成汇总大表/_bak_202608母版修改前_20260916/。
**只改母版这一个文件**:生成_道路运输量汇总表.xlsx æ˜¯åˆ—宽参照件(代码只读列宽/隐藏标记),_版式原型.xlsx è¿è¡Œæ—¶æ— ä»»ä½•代码引用;同期备份母版 resolveSummaryDonor(2026,8) è¦æ±‚文件名以 _备份_ å¼€å¤´ä¸”含「2026å¹´8月」,目录下无匹配(导出日志确认「未找到同期备份母版」),不会冲掉改动。
### 20.3 æ•°æ®åº“清理
- DELETE FROM h2032_enterprise_monthly WHERE report_period='2026-09' â†’ 636 è¡Œï¼ˆROW_COUNT() å®žæµ‹ï¼‰
- DELETE FROM import_batch WHERE id=302 â†’ 1 è¡Œ
- å¤‡ä»½ï¼š_backup_h2032_2026-09_rows_20260916.sql(636 å…ƒç»„)、_backup_h2032_2026-09_batch302_20260916.sql
### 20.4 ä¿®å¤åŽå®žæµ‹ï¼ˆé‡å¯¼å‡º 2026-08,Excel é‡ç®—)
| å¹´åº¦ | åˆ— | ä¿®å¤å‰ | ä¿®å¤åŽ | æºæ–‡ä»¶æ ¸ç®— |
|---|---|---|---|---|
| 2026(1-8月) | S | 130311.8927 | 130311.8927 | 130311.8927 |
| 2025 | AT | 195433.2232 | 195433.2232 | 195433.2232 |
| 2024 | BV | 184938.5780 | 184938.5780 | 184938.5780 |
| 2023 | CW | 173045.2932 | **173045.2964** | 173045.2964 |
| 2022 | DZ | 144979.2854 | **144979.2825** | 144979.2825 |
| 2021 | EO | ç©º | **161309.5316** | 161309.5316 |
全部 4 ä½å°æ•°ä¸€è‡´ï¼ˆæœ€å¤§æ®‹å·® 4.1e-5,为浮点累加噪声)。导出件「全省行」vs「17 å¸‚州行之和」逐月 å°äºŽç­‰äºŽ 9.3e-10。预览接口 types=summaryWorkbook è¿”回 ready=true、20 é¡¹æŒ‡æ ‡ï¼ˆå½“月货运量 16888.76、累计 130311.89)。2026-07 å¯¼å‡ºå›žå½’通过。
### 20.5 è¸©å‘
1. **PowerShell åŒå¼•号里的 "$m7" ä¼šè¢«å½“成变量 m7**:公式串 "=SUM(DM$r:DX$r)" ä¸­çš„ $r:DX è¢«å½“成「驱动器 r:」而吞掉,公式被写成 =SUM(DM5) â€”— é¦–次脚本已把母版改坏,靠备份还原后改用 ${m}/${r} å®šç•Œé‡è·‘。
2. **嵌套的单引号 here-string ä¼šæå‰ç»ˆæ­¢å¤–层 here-string** â†’ æ”¹ä¸ºã€Œå…ˆ Out-File å†™è¡¥ä¸æ–‡ä»¶ï¼Œå† Get-Content -Raw ä¼ ç»™ codex.exe --codex-run-as-apply-patch」。
3. æ¯ç‰ˆè¢« Excel é‡å­˜åŽä½“积 959,706 â†’ 1,480,392 å­—节,导出件 950,186 â†’ 1,331,599(Excel è‡ªèº«æ ¼å¼å¼€é”€ï¼Œä¸å½±å“æ•°æ®ï¼‰ã€‚
4. 2026å¹´8月道路运输量汇总表_版式原型.xlsx çš„ S åˆ—漏了 8 æœˆï¼ˆ=C+E+G+I+K+M+O,缺 Q5),但它运行时不被引用,本次未改。
### 20.6 é—ç•™
- 2026-09 æœŸåœ¨ h204_vehicle_quarterly(1284 è¡Œï¼Œbatch 142/144 åŒæ–‡ä»¶ï¼‰ã€investment_monthly(31 è¡Œï¼Œbatch 107/108 åŒæºï¼‰ã€audit_result(2061 è¡Œï¼‰ã€audit_run(3 è¡Œï¼‰ä¸­ä»åœ¨ï¼Œæœ¬æ¬¡æœªåŠ¨ï¼Œå¾…ç”¨æˆ·ç¡®è®¤æ˜¯å¦æ¸…ç†ã€‚
- 2026-07 æœŸå¯¼å‡ºä»¶ã€Œ è´§è¿ã€é¡µä¸º 118x145(比 8 æœˆå°‘ 2 åˆ—),因 7 æœˆæ¯ç‰ˆæ˜¯ã€Œ1-4 æœˆéª¨æž¶ã€ã€‚
详见《功能测试报告/功能测试报告_货运页签累计列修复与脏期清理_2026-09-16.md》。
---
## äºŒåä¸€ã€2026-07 æ¯ç‰ˆè¡¥é½ + å¯¼å‡ºä»¶ã€ŒExcel æ‰“不开」根因修复
日期:2026-09-16(第 9 è½®ï¼ŒæŽ¥äºŒåèŠ‚ï¼‰
### 21.1 ä»Šå¤©åšäº†ä»€ä¹ˆ
| # | äº‹é¡¹ | ç»“æžœ |
|---|---|---|
| 1 | æ¸…理 2026-09 æ®‹ç•™æ•°æ®ï¼ˆç”¨æˆ·ç¬¬ 1 æ¡ï¼‰ | **完成**:h204_vehicle_quarterly 1284 / investment_monthly 31 / audit_result 2061 / audit_run 3 / import_batch 5 / h2032 636,全部复核为 0 æ®‹ç•™ï¼›å·²ç•™å¯è¿˜åŽŸ SQL å¤‡ä»½ `_backup_2026-09_residual_all_20260916.sql` |
| 2 | ä¿® 2026-07 å¯¼å‡ºä»¶ã€ŒExcel æ‰“不开」 | **完成**(P0,见 21.2) |
| 3 | è¡¥é½ 2026-07 æ¯ç‰ˆï¼ˆç”¨æˆ·ç¬¬ 3 æ¡ã€Œå¯ä»¥è¡¥é½ã€ï¼‰ | **完成**(见 21.3) |
| 4 | ä¿®å¤‡ä»½æ¯ç‰ˆå›žå¡«æŠŠè¡¥é½ã€Œæ‰“回原形」 | **完成**(见 21.4) |
### 21.2 æ ¹å› ï¼šopenpyxl æ¯ç‰ˆ + å¤‡ä»½å›žå¡« â†’ æ®‹ç•™ <is> éžæ³•æ ¼
- åä»¶é‡Œ 19 ä¸ªæ ¼å­å½¢å¦‚ `<c r="E15" s="111" t="n"><v>67.0</v><is><t>67.00</t></is></c>`:`t="n"` å´å¸¦ `<is>`,模式非法,Excel ç›´æŽ¥æ‹’开(COM æŠ¥ã€Œä¸èƒ½å–å¾—ç±» Workbooks çš„ Open å±žæ€§ã€ï¼Œè¿žä¿®å¤æ¨¡å¼ `CorruptLoad=1` ä¹Ÿæ‰“不开)。
- 7 æœˆæ¯ç‰ˆæ˜¯ **openpyxl å†™å‡º**(文本存 `<is>`),8 æœˆæ¯ç‰ˆæ˜¯ **Excel åŽŸç”Ÿ**(文本走 sharedStrings)→ åŒä»£ç ä¸‹åªæœ‰ 7 æœˆåã€‚
- è§¦å‘者是 `restoreSummaryMonthlyBlocks`:7 æœˆæœ‰ `_备份_2026å¹´7月…清理前…xlsx`,整格回填时往 inlineStr æ ¼é‡Œå†™å€¼ï¼Œç•™ä¸‹æ—§ `<is>`;8 æœˆæ²¡æœ‰ `_备份_*`,不走回填,所以一直是好的。
- å®šä½æ‰‹æ³•(值得记住):坏件/好件**除 worksheets/styles/sharedStrings å¤–全部部件逐字节相同** â†’ zip æ‚交 + Excel é€ä¸€å¼€æ¡£ leave-one-out â†’ é”å®š **sheet9《公交》17 æ ¼ + sheet12《轨道、轮渡》2 æ ¼**。
### 21.3 ä¿®å¤
1. `ReportExportService.exportSummaryWorkbook`:落盘前新增 `normalizeStaleInlineStrings(wb)`,清掉所有「非 inlineStr å´æ®‹ç•™ `<is>`」的格子(幂等 + warn æ—¥å¿—)。
2. `ReportExportService.restoreSummaryMonthlyBlocks`:新增 `skipFreightHistoryBlocks`,《 è´§è¿ã€‹é¡µ **T åˆ—及以后**(2025..2021 äº”个年度块 + å„年累计列)永不从备份母版回填 â€”— ä¸Žæ—¢æœ‰ã€Œä¸­å£å¾„排名左块」保护同一思路,防「生成又复活」。
### 21.4 7 æœˆæ¯ç‰ˆè¡¥é½ï¼ˆExcel COM,360 + 324 æ ¼ï¼‰
按 `_fix_mother.ps1`(8 æœˆæ¯ç‰ˆé‚£ç‰ˆï¼‰**整体左移 2 åˆ—**改写:
- å¹´åº¦å—:2025 `T,V,X,Z,AB,AD,AF,AH,AJ,AL,AN,AP`;2024 `AV..BR` éš”列;2023 `BW..CS` éš”列;2022 `DK..DV` è¿žç»­ï¼›2021 `EA..EL` è¿žç»­ï¼›æ¯åˆ—写 `r7/r9/r8/r10 = SUM(17 å¸‚å·ž)`、`r5=r7+r9`、`r6=r8+r10` â†’ **360 æ ¼**;
- ç´¯è®¡åˆ—:`DX=SUM(DK:DV)`、`EM=SUM(EA:EL)`、`DY=IFERROR(DX/SUM(EA:EL)-1,"")`,行 5..112 â†’ **324 æ ¼**;
- `CalculateFullRebuild` åŽä¿å­˜ã€‚母版 921,559 â†’ 1,440,038 å­—节(转 Excel åŽŸç”Ÿï¼‰ã€‚
### 21.5 æµ‹è¯•结果摘要
| ç”¨ä¾‹ | ç»“æžœ |
|---|---|
| 2026-07 å¯¼å‡ºï¼ˆä¿®å¤å‰ï¼‰ | FAIL(复现) |
| çŽ¯å¢ƒ/路径排除(小件、两本母版、09-08 æ—§å¯¼å‡ºã€æ”¹åå¤åˆ¶ï¼‰ | å…¨éƒ¨ OK,确认非环境问题 |
| ä¿®å¤åŽ 2026-07 å¯¼å‡º | **OK sheets=19**,`DX5=144979.2825`、`DY5=-0.101235487797891`、`EM5=161309.53162`、`CU5=173045.296428512` |
| ä¿®å¤åŽ 2026-08 å¯¼å‡º | **OK sheets=19**,`DZ5=144979.2825`、`EO5=161309.53162`、`CW5=173045.296428512` |
| è·¨æœˆä¸€è‡´æ€§ | 7 æœˆä¸Ž 8 æœˆçš„ 2022/2021/2023 ç´¯è®¡**完全相等** |
| éžæ³•格复扫 | 0 ä¸ª |
| 2026-09 æ®‹ç•™å¤æ ¸ | 5 å¼ è¡¨å…¨ 0 |
> æ³¨ï¼š8 æœˆæ¯ç‰ˆè®¡ç®—后 `DZ5` ç”±æ—§çš„写死常量 `144979.285376043` å˜ä¸º `144979.2825`,差 0.0029 â€”— æ­£æ˜¯ç¬¬åäºŒèŠ‚è®°å½•çš„ã€Œå…¨çœè§„ä¸‹å¸¸é‡ â‰  17 å¸‚州之和」那笔差额,属**修正**而非回退。
### 21.6 è¸©å‘
1. **Excel COM å­¤å„¿è¿›ç¨‹ä¼šè®© `Workbooks.Open` é—´æ­‡æ€§å‡æŠ¥åŒä¸€ä¸ªé”™**:每例测完必须强杀本次新建的 `EXCEL` è¿›ç¨‹ã€‚排查初期就因孤儿进程误判「8 æœˆä»¶ä¹Ÿæ‰“不开」,浪费了一轮。
2. `CTWorksheet` **没有** `isSetSheetData()`(sheetData æ˜¯å¿…填),要用 `getSheetData() != null`。
3. æ¯ç‰ˆè¡¥é½çš„备份文件**不能**用 `_备份_` å‰ç¼€ï¼ˆä¼šè¢« `resolveSummaryDonor` å½“ donor å›žå¡«ï¼‰ï¼Œæœ¬æ¬¡ç”¨ `_bak_2026å¹´7月道路运输量汇总表_补齐前_20260916.xlsx`。
### 21.7 é—ç•™
- 2026-06 / 2026-09 æ— æ¯ç‰ˆ â†’ é¢„览 `ready=False`「未找到模板文件」,需先建母版。
- ç¬¬ 8 æ£’遗留未动:`h2031` ç¼º 2025-01、`passenger_individual_monthly` 2026-08 ç¼ºé»„冈、`PASSENGER_AUTH` 11 æœŸå…¨ 0。
- ä»“库根 `_*.*`(含本次 `_hyb_*` / `_loo_*` / `_v2_*` / `_final_*` / `_fixed_*` / `_t7_*` / `_poijar`)未删,待用户同意。
详见《功能测试报告/功能测试报告_2026-07母版补齐与导出件打不开修复_2026-09-16.md》。
### 21.8 æ”¶å·¥è®°å½•(2026-09-16)
- æœ¬è½®ä»£ç /文档已 commit `80e0879`,并 **push åˆ°ä¸ªäºº gitee `origin/master`**(`e29485b..80e0879`)。
- å…¬å¸ gitea ä»ä¸é€šï¼š`git fetch gitea` æŒ‚起约 5 åˆ†é’Ÿæ— å“åº”,已按约定**不强推**,待网络恢复后补推(本地现 `ahead 16`)。
- æ”¶å·¥æ—¶çŽ¯å¢ƒï¼šåŽç«¯ 8090、前端 8080 å‡åœ¨è·‘ï¼›Excel å­¤å„¿è¿›ç¨‹å·²æ¸…干净(只保留用户自己的 18564/25868)。
- æœªæäº¤å†…容(**有意保留,等用户确认**):`docs/投资/` ä¸‹çš„æ—¢æœ‰å¢žåˆ ï¼ˆ`X月…` æ”¹åç­‰ï¼Œéžæœ¬è½®æ”¹åŠ¨ï¼‰ã€ä»“åº“æ ¹ `_*.*` æŽ’查临时文件。
- æ˜Žå¤©å¯åšï¼šæ–°å»º 2026-09(及 2026-06)母版,让 9 æœˆæºæ•°æ®å¯¼å…¥åŽèƒ½ç›´æŽ¥å‡ºæ±‡æ€»å¤§è¡¨ï¼›å…¬å¸ gitea è¡¥æŽ¨ã€‚
docs/Ͷ×Ê/ÊäÈë7ÔµÄÄÚÈÝÒªÓë¡¶Ä£°å_²éѯ½á¹û(Ͷ×Êϵͳ-¿ÍÔË+ÎïÁ÷ 2026.7)¡·½øÐÐУÑ飬´æÔÚÊý¾Ý²»Ò»Öµĵ¯´°Ìáʾ.txt
docs/±¨±íÉú³É_¹ØÏµÂß¼­ÓëÿÈÕ½ø¶È×ܱí.xlsx
Binary files differ
docs/Éú³É»ã×Ü´ó±í/2026Äê7ÔµÀ·ÔËÊäÁ¿»ã×ܱí.xlsx
Binary files differ
docs/Éú³É»ã×Ü´ó±í/2026Äê8ÔµÀ·ÔËÊäÁ¿»ã×ܱí.xlsx
Binary files differ
docs/Éú³É»ã×Ü´ó±í/2026Äê8ÔµÀ·ÔËÊäÁ¿»ã×ܱí_°æÊ½Ô­ÐÍ.xlsx
Binary files differ
docs/Éú³É»ã×Ü´ó±í/»ã×ܱíÔ¤ÀÀ¸ñʽ.xlsx
Binary files differ
docs/Éú³É»ã×Ü´ó±í/Éú³É_µÀ·ÔËÊäÁ¿»ã×ܱí.xlsx
Binary files differ
docs/Éú³É»ã×Ü´ó±í/Êä³ö/Éú³É_µÀ·ÔËÊäÁ¿»ã×ܱí_2026-07_¸ñʽÑéÖ¤.xlsx
Binary files differ
docs/Éú³É»ã×Ü´ó±í/Êä³ö/Éú³É_µÀ·ÔËÊäÁ¿»ã×ܱí_2026-07_ÑéÖ¤.xlsx
Binary files differ
docs/Éú³É»ã×Ü´ó±í/Êä³ö/Éú³É_µÀ·ÔËÊäÁ¿»ã×ܱí_2026-08_ËÄÒ³Êý¾ÝÇý¶¯_2026-09-13.xlsx
Binary files differ
docs/Éú³É»ã×Ü´ó±í/Êä³ö/Éú³É_µÀ·ÔËÊäÁ¿»ã×ܱí_2026-08_ÅÅÃûË¢ÐÂÓëͬ±È°Ù·ÖÊý_2026-09-11.xlsx
Binary files differ
docs/Éú³É»ã×Ü´ó±í/Êä³ö/Éú³É_µÀ·ÔËÊäÁ¿»ã×ܱí_2026-08_¸ñʽÑéÖ¤.xlsx
Binary files differ
docs/Éú³É»ã×Ü´ó±í/Êä³ö/Éú³É_µÀ·ÔËÊäÁ¿»ã×ܱí_2026-08_ÇåÀíÑéÖ¤.xlsx
Binary files differ
docs/Éú³É»ã×Ü´ó±í/Êä³ö/µÀ·ÔËÊäÁ¿»ã×ܱí_2026-07_ÅÅÃû×ó¿éɾ³ýÑéÖ¤.xlsx
Binary files differ
docs/Éú³É»ã×Ü´ó±í/Êä³ö/µÀ·ÔËÊäÁ¿»ã×ܱí_2026-07_°æÊ½Í³Ò»ÑéÖ¤.xlsx
Binary files differ
docs/Éú³É»ã×Ü´ó±í/Êä³ö/µÀ·ÔËÊäÁ¿»ã×ܱí_2026-08_À©ÁÐÑéÖ¤.xlsx
Binary files differ
docs/Éú³É»ã×Ü´ó±í/Êä³ö/µÀ·ÔËÊäÁ¿»ã×ܱí_2026-08_°æÊ½Í³Ò»ÑéÖ¤.xlsx
Binary files differ
docs/Éú³É»ã×Ü´ó±í/Ô¤ÀÀ½çÃæ.png
docs/»õÔËÆóҵƽ¾ùÔ˾àÔö·ùɸ²éÃûµ¥_2026-08ÓëÀÛ¼Æ_2026-09-05.xlsx
Binary files differ
docs/»õÔËÆóҵƽ¾ùÔ˾àÔö·ùɸ²éÃûµ¥_2026-08ÓëÀÛ¼Æ_8ÔÂÀۼƾù50¿Ú¾¶_2026-09-05.xlsx
Binary files differ
docs/»õÔËÐèµ¼ÈëµÄÊý¾Ý/»õÔË/2025ÄêÔ±¨/µÀ·»õÎïÔËÊäÔ¶ÈÉú²úÇé¿ö£¨2025Äê10Ô£©.xls
Binary files differ
docs/»õÔËÐèµ¼ÈëµÄÊý¾Ý/»õÔË/2025ÄêÔ±¨/µÀ·»õÎïÔËÊäÔ¶ÈÉú²úÇé¿ö£¨2025Äê11Ô£©.xls
Binary files differ
docs/»õÔËÐèµ¼ÈëµÄÊý¾Ý/»õÔË/2025ÄêÔ±¨/µÀ·»õÎïÔËÊäÔ¶ÈÉú²úÇé¿ö£¨2025Äê12Ô£©.xls
Binary files differ
docs/»õÔËÐèµ¼ÈëµÄÊý¾Ý/»õÔË/2025ÄêÔ±¨/µÀ·»õÎïÔËÊäÔ¶ÈÉú²úÇé¿ö£¨2025Äê1Ô£©.xls
Binary files differ
docs/»õÔËÐèµ¼ÈëµÄÊý¾Ý/»õÔË/2025ÄêÔ±¨/µÀ·»õÎïÔËÊäÔ¶ÈÉú²úÇé¿ö£¨2025Äê2Ô£©.xls
Binary files differ
docs/»õÔËÐèµ¼ÈëµÄÊý¾Ý/»õÔË/2025ÄêÔ±¨/µÀ·»õÎïÔËÊäÔ¶ÈÉú²úÇé¿ö£¨2025Äê3Ô£©.xls
Binary files differ
docs/»õÔËÐèµ¼ÈëµÄÊý¾Ý/»õÔË/2025ÄêÔ±¨/µÀ·»õÎïÔËÊäÔ¶ÈÉú²úÇé¿ö£¨2025Äê4Ô£©.xls
Binary files differ
docs/»õÔËÐèµ¼ÈëµÄÊý¾Ý/»õÔË/2025ÄêÔ±¨/µÀ·»õÎïÔËÊäÔ¶ÈÉú²úÇé¿ö£¨2025Äê5Ô£©.xls
Binary files differ
docs/»õÔËÐèµ¼ÈëµÄÊý¾Ý/»õÔË/2025ÄêÔ±¨/µÀ·»õÎïÔËÊäÔ¶ÈÉú²úÇé¿ö£¨2025Äê6Ô£©.xls
Binary files differ
docs/»õÔËÐèµ¼ÈëµÄÊý¾Ý/»õÔË/2025ÄêÔ±¨/µÀ·»õÎïÔËÊäÔ¶ÈÉú²úÇé¿ö£¨2025Äê7Ô£©.xls
Binary files differ
docs/»õÔËÐèµ¼ÈëµÄÊý¾Ý/»õÔË/2025ÄêÔ±¨/µÀ·»õÎïÔËÊäÔ¶ÈÉú²úÇé¿ö£¨2025Äê8Ô£©.xls
Binary files differ
docs/»õÔËÐèµ¼ÈëµÄÊý¾Ý/»õÔË/2025ÄêÔ±¨/µÀ·»õÎïÔËÊäÔ¶ÈÉú²úÇé¿ö£¨2025Äê9Ô£©.xls
Binary files differ
docs/»õÔËÐèµ¼ÈëµÄÊý¾Ý/»õÔË/2026Äê1-7Ô±¨/µÀ·»õÎïÔËÊäÔ¶ÈÉú²úÇé¿ö£¨2026Äê1Ô£©.xls
Binary files differ
docs/»õÔËÐèµ¼ÈëµÄÊý¾Ý/»õÔË/2026Äê1-7Ô±¨/µÀ·»õÎïÔËÊäÔ¶ÈÉú²úÇé¿ö£¨2026Äê2Ô£©.xls
Binary files differ
docs/»õÔËÐèµ¼ÈëµÄÊý¾Ý/»õÔË/2026Äê1-7Ô±¨/µÀ·»õÎïÔËÊäÔ¶ÈÉú²úÇé¿ö£¨2026Äê3Ô£©.xls
Binary files differ
docs/»õÔËÐèµ¼ÈëµÄÊý¾Ý/»õÔË/2026Äê1-7Ô±¨/µÀ·»õÎïÔËÊäÔ¶ÈÉú²úÇé¿ö£¨2026Äê4Ô£©.xls
Binary files differ
docs/»õÔËÐèµ¼ÈëµÄÊý¾Ý/»õÔË/2026Äê1-7Ô±¨/µÀ·»õÎïÔËÊäÔ¶ÈÉú²úÇé¿ö£¨2026Äê5Ô£©.xls
Binary files differ
docs/»õÔËÐèµ¼ÈëµÄÊý¾Ý/»õÔË/2026Äê1-7Ô±¨/µÀ·»õÎïÔËÊäÔ¶ÈÉú²úÇé¿ö£¨2026Äê6Ô£©.xls
Binary files differ
docs/»õÔËÐèµ¼ÈëµÄÊý¾Ý/»õÔË/2026Äê1-7Ô±¨/µÀ·»õÎïÔËÊäÔ¶ÈÉú²úÇé¿ö£¨2026Äê7Ô£©.xls
Binary files differ
docs/ÎÊÌâ»ã×Ü/ÎÊÌâÓë×¢ÒâÊÂÏî»ã×Ü_2026-09-16.md
New file
@@ -0,0 +1,289 @@
# äº¤é€šè´§è¿ç»Ÿè®¡å®¡æ ¸ç³»ç»Ÿ â€” é—®é¢˜ä¸Žæ³¨æ„äº‹é¡¹æ±‡æ€»
> ç”¨é€”:把项目运行、数据导入、报表生成、仓库协作中所有「踩过的坑」集中记录,供后续开发与运维快速查阅。
> ç»´æŠ¤æ–¹å¼ï¼šæ–°å‘现问题请直接在本文件追加,并注明日期。
> æœ€åŽæ›´æ–°ï¼š2026-09-16
---
## ä¸€ã€é€ŸæŸ¥è¡¨ï¼ˆæœ€å¸¸è§çš„ 10 æ¡ï¼‰
| # | äº‹é¡¹ | æ­£ç¡®åšæ³• |
|---|------|----------|
| 1 | å¯åŠ¨å‰åŽç«¯ | é¡¹ç›®æ ¹ç›®å½•执行 `powershell -NoProfile -ExecutionPolicy Bypass -File start-dev.ps1` |
| 2 | ç«¯å£å ç”¨åˆ¤æ–­ | çœ‹ `backend.log` / `traffic-audit-web/frontend.log`,**不要**依赖 `Get-NetTCPConnection` |
| 3 | åŽç«¯å°±ç»ªæ ‡å¿— | æ—¥å¿—出现 `Started TrafficAuditApplication` + `Tomcat started on port(s): 8090` |
| 4 | å‰ç«¯å°±ç»ªæ ‡å¿— | æ—¥å¿—出现 `Compiled successfully` + `App running at:` |
| 5 | è¿žæ•°æ®åº“ | `mysql.exe --host=127.0.0.1 --port=3308 --user=root --default-character-set=utf8mb4 -D traffic_audit` |
| 6 | åœæ—§è¿›ç¨‹ | æŒ‰ PID ç²¾ç¡®åœ `cmd â†’ java(maven) â†’ java(app)` é“¾ï¼›**不要杀 node_repl å’Œç”¨æˆ·è‡ªå·±çš„ cmd çª—口** |
| 7 | è„šæœ¬æŠ¥ã€Œå·²æ·»åŠ äº†å…·æœ‰ç›¸åŒé”®çš„é¡¹ã€ | æœ¬æœºåŒæ—¶å­˜åœ¨ `Path` ä¸Ž `PATH`,改用 `cmd.exe /c ... > log 2>&1`,**严禁用 `Start-Process`** |
| 8 | å†™ä¸­æ–‡æ–‡ä»¶ | ç”¨ UTF-8;`main.js` å¸¦ BOM å¿…须写回 BOM;改文件前先确认原文件是 CRLF è¿˜æ˜¯ LF |
| 9 | æäº¤å‰ | å…ˆæµ‹è¯• + å†™ã€ŠåŠŸèƒ½æµ‹è¯•æŠ¥å‘Šã€‹+ æ›´æ–°ã€Šå·¥ä½œæ—¥ç»“》,再 fetch/合并/推送 |
| 10 | æŽ¨å…¬å¸ gitea | å…ˆ `git fetch gitea` ä¸Žè¿œç«¯ `main` åˆå¹¶ï¼Œ**禁止强推** |
---
## äºŒã€å¯åŠ¨ä¸Žè¿›ç¨‹ç®¡ç†
| é—®é¢˜ | åŽŸå›  | å¤„ç½® |
|------|------|------|
| `Start-Process` æŠ¥ã€Œå·²æ·»åŠ äº†å…·æœ‰ç›¸åŒé”®çš„é¡¹ã€ | çŽ¯å¢ƒå˜é‡åŒæ—¶å­˜åœ¨ `Path` ä¸Ž `PATH`(值相同) | ç»Ÿä¸€ç”¨ `cmd.exe /c ... > log 2>&1` æˆ– `ProcessStartInfo` å¯åЍ |
| å‰ç«¯åœ¨æ²™ç®±å†…起不来(`EPERM: lstat`) | node è®¿é—®ç”¨æˆ·ç›®å½•被沙箱拦截 | `start-dev.ps1` æ•´ä½“在沙箱外执行 |
| åµŒå¥— `powershell.exe -Command` å¼•号被破坏 | å¤–层 shell å…ˆè§£æžä¸€å±‚引号 | ç›´æŽ¥è¿è¡Œ `.ps1` æ–‡ä»¶ï¼Œä¸åšåµŒå¥— |
| é‡å¯æ—¶è¯¯æ€ Codex å†…æ ¸ | æŒ‰åå­—杀 `node.exe` ä¼šå‘½ä¸­ `node_repl` | æŒ‰ PID ç²¾ç¡®åœåŽç«¯é“¾ `cmd â†’ java(maven) â†’ java(app)`、前端链 `cmd â†’ node(npm) â†’ cmd â†’ node(vue-cli-service)` |
| å‰ç«¯æ—¥å¿—找不到 | æ—¥å¿—在子目录 | `traffic-audit-web/frontend.log`;后端 `backend.log` åœ¨ä»“库根目录 |
**重启标准流程**:列出 `java.exe` è¿›ç¨‹ â†’ åœ `app` â†’ `maven` â†’ `cmd` â†’ è¿è¡Œ `start-dev.ps1`(脚本自动跳过已在监听的端口)。
---
## ä¸‰ã€æœåŠ¡çŠ¶æ€éªŒè¯
- æ²™ç®±å†… `Get-NetTCPConnection` ä¼šå› æƒé™ã€Œæ‹’绝访问」而**静默失败**,据此判定端口未监听是错的。
- åˆ¤æ–­æœåŠ¡çŠ¶æ€ä¸€å¾‹ä»¥æ—¥å¿—ä¸ºå‡†ï¼›HTTP æŽ¢æ´»ç”¨ï¼š
  - åŽç«¯ï¼š`GET http://127.0.0.1:8090/api/auth/captcha-config`(返回 `{"code":200,...}` å³é€šï¼‰
  - å‰ç«¯ï¼š`http://localhost:8080/#/login`
- å‰ç«¯æ—¥å¿—出现 `Proxy error: Could not proxy request /api/... (ECONNREFUSED)` è¯´æ˜Ž**后端当时没起来**,不是前端问题。
---
## å››ã€æ•°æ®åº“
- è¿žæŽ¥ï¼ˆæœ¬åœ°å¼€å‘库):
  `& 'C:\Program Files\MySQL\MySQL Server 8.0\bin\mysql.exe' --host=127.0.0.1 --port=3308 --user=root --password=<见 AGENTS.md> --default-character-set=utf8mb4 -D traffic_audit`
- **必须写 `--host=127.0.0.1`**:写成 `-h127.0.0.1` ä¼šè¢«è§£æžæˆ host `127`,连接失败。
- è¾“出过滤 `2>&1 | Select-String -NotMatch 'Warning'` å¯å±è”½å¯†ç è­¦å‘Šã€‚
- å¸¸ç”¨è¡¨ä¸Žå…³é”®åˆ—:
| è¡¨ | è¯´æ˜Ž | å…³é”®åˆ— |
|----|------|--------|
| `freight_turnover_import` | è´§è¿é‡/周转量 | `report_period`、`region_name`、`freight_m01..m12`、`turnover_m01..m12`、`last_*` |
| `h2031_enterprise_monthly` | å…¬è·¯æ—…客 H203-1 æœˆæŠ¥ | `report_period`、`enterprise_code`、`unified_credit_code`、`report_unit` |
| `import_batch` | å¯¼å…¥æ‰¹æ¬¡ | `import_type`、`report_period`、`file_name`、`success_rows` |
| `audit_result` / `audit_run` | å®¡æ ¸ç»“æžœ/运行 | `report_period` |
- æŽ’查「某期数据在不在」:`SELECT report_period, COUNT(*) FROM <表> GROUP BY report_period ORDER BY report_period;`
- æŽ’查「某期导入来自哪个文件」:查 `import_batch` çš„ `file_name`。
- **表结构变更要同步三处**:实际库 DDL、`docs/init.sql`、`docs/database.md`。
- æµ‹è¯•用报表期建议用 `2099-xx`,测完用 `POST /api/import/clear?period=...` æˆ–直接 DELETE æ¸…理,避免污染真实月份下拉项。
---
## äº”、数据导入:文件路径与期次约定
### 5.1 è´§è¿é‡/周转量(`/api/import/freightTurnover`)
| æºæ–‡ä»¶ | è¦†ç›–期次 | å¤‡æ³¨ |
|--------|----------|------|
| `D:\05_数据分类\高速\定稿-湖北省各市州运输量数据(2026å¹´1-8月).xlsx` | 2021-12 / 2022-12 / 2024-12 / 2025-12 / 2026-08 | **无 2023 å¹´ Sheet** |
| `D:\05_数据分类\货运\7月\定稿-湖北省各市州运输量数据(2026å¹´1-7月).xlsx` | å¤šä¸€ä¸ª `2023` Sheet | 2023 å¹´æ•°æ®çš„æ¥æºï¼›2021/2022/2024 ä¸Ž 8 æœˆæ–‡ä»¶é€å€¼ä¸€è‡´ |
- å¤šå¹´åº¦å·¥ä½œç°¿è¯†åˆ«è§„则(`detectYearSheets`):
  1. **至少 2 ä¸ª Sheet**(单 Sheet æ–‡ä»¶ä¸è¯†åˆ«ä¸ºå¤šå¹´åº¦å·¥ä½œç°¿ï¼Œä¼šèµ°è€çš„æœˆåº¦æ¨¡æ¿è·¯å¾„);
  2. æ¯ä¸ª Sheet ååŒ¹é… `^\d{4}\s*å¹´?$`(`2023å¹´`、`2023` éƒ½å¯ä»¥ï¼‰ï¼›
  3. æ¯ä¸ª Sheet é¦–行 A1 å«ã€Œè´§è¿é‡ã€ã€B1 å«ã€Œæœˆã€ã€‚
  ä»»ä¸€æ¡ä»¶ä¸æ»¡è¶³ â†’ æ•´ä½“回退老的月度模板解析。
- æ¯ä¸ªå¹´åº¦ Sheet çš„结构:上方是「货运量(万吨)」块(约 20 è¡Œï¼‰ï¼Œä¸‹æ–¹æ˜¯ã€Œå‘¨è½¬é‡(万吨公里)」块;**同一市州名第二次出现即视为周转量块**。
- æŠ¥è¡¨æœŸè¯­ä¹‰ï¼š**`2021-12` è¿™ç±»æœŸæ”¾çš„æ˜¯è¯¥å¹´ 1–12 æœˆçš„全年数据**(`m01..m12` å…¨éƒ¨æœ‰å€¼ï¼‰ï¼Œä¸æ˜¯ 12 æœˆå•月。该年最后有数据的月份决定期号(2026 å¹´åªæœ‰ 1–8 æœˆ â†’ `2026-08`)。
- ä¸Šå¹´åŒæœŸï¼šå¤šå¹´åº¦æ–‡ä»¶é‡Œè‡ªåŠ¨å–**上一年度 Sheet**;若上一年度不存在(如 2021 æ—  2020 Sheet),`last_*` ä¸ºç©ºã€‚
- åªè¡¥æŸä¸€å¹´æ—¶ï¼Œå¯å¦å­˜ä¸€ä¸ªåªå«è¯¥å¹´ + ä¸Šä¸€å¹´çš„临时工作簿再导入(注意「至少 2 ä¸ª Sheet」规则)。
### 5.2 å…¬è·¯æ—…客 H203-1(`/api/import/passengerMonthly`)
| æºæ–‡ä»¶ | å¤‡æ³¨ |
|--------|------|
| `docs\公路旅客\模板_交企统H203-1表_公路旅客运输月度生产情况.xlsx` | ç”¨æˆ·ä¿®æ”¹åŽçš„æ¨¡æ¿ |
| `D:\桌面\测试数据\公路旅客\八月\公路旅客运输月度生产情况(2026)_2026-09-09 09_18_45.xls` | ç³»ç»Ÿå¯¼å‡ºçš„老格式样例 |
| `D:\需要导入的数据\公路旅客\*.xls` | åŽ†å²å„æœˆå¯¼å‡ºæ–‡ä»¶ |
- è§£æž**按表头名取值**(`buildHeaderMap`),因此模板在中间插列/整体右移**不会**破坏其它字段。
- æ–°æ¨¡æ¿åœ¨ã€Œä¼ä¸šåç§°ã€åŽæ–°å¢ž 2 åˆ—:`统一社会信用代码`、`填报单位`;老格式文件其实也带这两列(此前代码未读取)。
- å¿…需列缺失会直接报错,例如选错类型时提示「表头缺少必需列【企业名称】【客运量_总计】」。
### 5.3 å…¶å®ƒ
- å¯¼å…¥å¤±è´¥å¿…须在页面显示**行号**(用户要求),新增解析逻辑时不要吞掉行号信息。
---
## å…­ã€æŠ¥è¡¨ç”Ÿæˆ
- ã€Œæ±‡æ€»å¤§è¡¨ã€é¢„览弹窗由 `ReportExport.vue` æ¸²æŸ“:
  - å¼¹çª—内**只保留一张指标表**(分类 / æŒ‡æ ‡ / æ•°æ® / åŒæ¯”),「中口径」之后不再渲染任何表格;
  - å¼¹çª—支持拖动(`v-dialog-drag` æŒ‡ä»¤ï¼Œæ‹–标题栏)+ 10px åœ†è§’。
- å¯¼å‡ºä¾èµ–**母版模板文件**:`docs/生成汇总大表/YYYYå¹´M月道路运输量汇总表.xlsx`。缺失时报「母版定位失败:未找到模板文件」,**不是数据问题**。
- æŽ¥å£å±‚面自查(绕过前端,定位是前端还是后端问题):
  - é¢„览:`GET /api/report/preview?period=2026-08&mode=month&types=summaryWorkbook`
  - å¯¼å‡ºï¼š`GET /api/report/export/summaryWorkbook?...`
- å¤±è´¥æç¤ºå·²ç»†åˆ†ï¼šèƒ½åŒºåˆ†ã€Œè¿žä¸ä¸ŠæœåŠ¡å™¨ã€å’Œã€ŒåŽç«¯è¿”å›žçš„å…·ä½“åŽŸå› ã€ï¼›å¯¼å‡ºæŽ¥å£æ˜¯ `responseType:'blob'`,报错时 `data` ä¹Ÿæ˜¯ Blob,必须先 `text()` å†è§£æžã€‚
---
## ä¸ƒã€ç™»å½•与验证码
| é—®é¢˜ | åŽŸå›  | å¤„ç½® |
|------|------|------|
| ç™»å½•页出现空白方框 + ã€ŒéªŒè¯ç åŠ è½½å¤±è´¥ï¼Œè¯·æ£€æŸ¥ç½‘ç»œã€ | å‰ç«¯ `captchaRequired` é»˜è®¤ `true`,读取 `/api/auth/captcha-config` å¤±è´¥æ—¶é™é»˜å¿½ç•¥ï¼Œé¡µé¢æ®‹ç•™åŠ è½½ä¸å‡ºæ¥çš„éªŒè¯ç æ¡† | é»˜è®¤å€¼æ”¹ `false`,改为 fail-safe:只有后端明确返回 `required === true` æ‰æ˜¾ç¤ºï¼›è¯·æ±‚失败按「不需要验证码」处理 |
| å¼€å…³ä½ç½® | åŽç«¯ `application.yml` çš„ `app.captcha.required` | å…³æŽ‰åŽåº”显示「测试模式:行为验证码已跳过」 |
| æ¢ç½‘络/换 IP åŽæŽ¥å£ 403 | è·¨åŸŸç™½åå• | CORS éœ€æ”¾è¡Œå†…网网段(已修复 `0d2a5fc`) |
---
## å…«ã€æ–‡ä»¶å†™å…¥ä¸Žæ–‡æœ¬å¤„理的坑
- æœ¬æœºæ–‡ä»¶**换行符不统一**:`Login.vue`、`main.js` æ˜¯ CRLF;`ReportExport.vue`、`DataImportService.java`、`docs/*.md` æ˜¯ LF。用 `[System.IO.File]::WriteAllText` æ—¶å¿…须匹配原换行符,否则后续 `-replace` / å­—符串匹配会失败。
- `main.js` å¸¦ BOM(`EF BB BF`),改写时要用 `New-Object System.Text.UTF8Encoding($true)`。
- **`git checkout -- <文件>` ä¼šæŠŠ LF è½¬æˆ CRLF**(本仓库 `core.autocrlf=true`),会让后续基于 LF çš„æ›¿æ¢å¤±æ•ˆï¼›æ“ä½œå‰å…ˆç¡®è®¤çœŸå®žæ¢è¡Œç¬¦ã€‚
- PowerShell å¤šè¡Œä¸­æ–‡æ›¿æ¢å»ºè®®å†™ `*.py` è„šæœ¬ç”¨ `python` æ‰§è¡Œï¼ˆ`apply_patch` åœ¨æœ¬æœºä¸å¯ç”¨ï¼‰ã€‚
- å­—符串替换**注意锚点唯一性**:`| enterprise_name | varchar(200) | ä¼ä¸šåç§° |` åœ¨ `docs/database.md` å‡ºçް 4 æ¬¡ï¼Œç›´æŽ¥ replace ä¼šæ”¹é”™è¡¨ï¼›å¿…须先截取目标章节再替换。
- è¯» `.xls`:本机 python æ—  `xlrd`,可用 Excel COM(`New-Object -ComObject Excel.Application` â†’ `Workbooks.Open` â†’ `Cells.Item(r,c).Text`,记得 `Quit()` + `ReleaseComObject`)。
---
## ä¹ã€æµè§ˆå™¨è‡ªåŠ¨åŒ–å–è¯çš„å‘
- `tab.playwright.evaluate()` è¯» DOM æ‰å¯ä¿¡ï¼›AX æ ‘可能读到缓存。
- Playwright locator å¯¹ Element UI è¡¨æ ¼å†…按钮**会超时**(`isVisible()` æ’为 false);改用 AX ç´¢å¼• `tab.click(index)`。
- `tab.drag([x1,y1],[x2,y2])` æ‹–拽时,坐标必须落在**当前视口**内(本机内嵌浏览器视口很小,约 319×790),否则报 `Coordinate is outside the active tab content viewport`。
- `tab.click` çš„ AX ç´¢å¼•**在页面刷新后会失效**,可能命中别的控件;每次操作前重新 `cua.getTab(...)` å–新索引。
- æˆªå›¾ï¼š`const fs = await import('fs'); fs.writeFileSync(path, Buffer.from(await tab.getScreenshot()))`(`require` ä¸å¯ç”¨ï¼‰ã€‚
- æ”¹ `.vue` åŽéœ€è¦ `tab.reload()`。
- ä¸´æ—¶è„šæœ¬/文件(`_*.*`)未经用户同意**不要删**。
---
## åã€Git åŒä»“库工作流
| ä»“库 | remote | åˆ†æ”¯ | åœ°å€ |
|------|--------|------|------|
| ä¸ªäºº | `origin` | `master` | `https://gitee.com/zhizhijie/traffic-audit.git` |
| å…¬å¸ | `gitea` | `main` | `http://61.183.254.94:3000/r/trafficAudit.git`(账号 zyj) |
每次改动的固定顺序:
1. æµ‹è¯• + å†™ã€ŠåŠŸèƒ½æµ‹è¯•æŠ¥å‘Šã€‹ + æ›´æ–°ã€Šå·¥ä½œæ—¥ç»“》;
2. `git fetch origin` â†’ åˆå¹¶ä¸ªäººä»“库新提交(避免覆盖用户改动);
3. `git fetch gitea` â†’ ä¸Žè¿œç«¯ `main` å¯¹æ¯”合并 â†’ **禁止强推**;
4. `git commit` â†’ `git push`。
- å‡­æ®åªèµ°æœ¬æœº git/临时 askpass,**禁止写进仓库任何文件**。
- å…¬å¸ gitea ç½‘络不通时记录为遗留问题,**不要**用强推绕过。
---
## åä¸€ã€å½“前已知遗留问题(截至 2026-09-16)
| # | é—®é¢˜ | å½±å“ | çŠ¶æ€ |
|---|------|------|------|
| 1 | 8 æœˆæºæ–‡ä»¶ç¼º 2023 å¹´ Sheet | å·²ç”¨ 7 æœˆæ–‡ä»¶è¡¥å½• `2023-12` è§£å†³ | å·²è§£å†³ |
| 2 | 2026-01 ~ 2026-07 çš„ `last_*` ä¸ºç©º | è¿™å‡ æœŸæ”¹åŠ¨å‰å³ä¸ºç©ºï¼Œéžæœ¬æ¬¡å¼•å…¥ | å¾…用户确认是否补 |
| 3 | 2026-01 ~ 2026-07 çš„ H203-1 `unified_credit_code` / `report_unit` ä¸ºç©º | æ–°åˆ—本期才读取,历史期未回填 | å¾…用户确认是否重导 |
| 4 | é¢„览弹窗「共 0 è¡Œã€ä¸Žã€Œæœˆåº¦è¦†ç›–:1~8月均有数据」口径不同 | æ˜“误解 | å¾…用户确认改文案 |
| 5 | å…¬å¸ gitea æŽ¨é€ | ç½‘络无响应,未推成功 | å¾…补推 |
| 6 | ä»“库根目录大量 `_*.*` ä¸´æ—¶æ–‡ä»¶ | ä½“积/可读性 | ç»ç”¨æˆ·åŒæ„åŽå†æ¸…理 |
> 2026-09-16 å‚æ™šæ›´æ–°ï¼šé—留问题 4(预览弹窗「共 0 è¡Œã€æ–‡æ¡ˆï¼‰å·²æŒ‰ç”¨æˆ·ç¡®è®¤ä¿®æ”¹å®Œæ¯•——汇总大表改为显示「指标 N é¡¹ã€ï¼Œå…¶å®ƒæŠ¥è¡¨æ˜¾ç¤ºã€Œå…± N è¡Œæ˜Žç»†ã€ã€‚
---
## åäºŒã€2026-09-16 è¡¥å……:货运页签「累计」列修复(重要口径)
### 12.1 æ¯ç‰ˆæ´¾ç”Ÿå£å¾„(必须遵守)
《 è´§è¿ã€‹é¡µè¡Œç»“构:
- å…¨çœå—:r5 è´§è¿é‡ / r6 å‘¨è½¬é‡ / r7 å…¶ä¸­è§„上货运量 / r8 å…¶ä¸­è§„上周转量 / r9 å…¶ä¸­è§„下货运量 / r10 å…¶ä¸­è§„下周转量;
- 17 ä¸ªå¸‚州块每块 6 è¡Œï¼Œé¦–行 11,17,23,...,107(武汉市...林区),块内顺序:合计货运量 / è§„上货运量 / è§„下货运量 / åˆè®¡å‘¨è½¬é‡ / è§„上周转量 / è§„下周转量。
**规则:全省行必须完全由 17 å¸‚州行派生。**
- r7 / r8 / r9 / r10 = SUM(17 å¸‚州对应行);
- r5 = m7+m9,r6 = m8+m10。
历史教训:r9/r10(全省规下)曾是**写死常量**,与 17 å¸‚州规下之和不等 â€”— 2023 å·® 4.6e-3、2022 å·® 3.1e-3、2021 å·® 1.5e-4(2024/2025/2026 æ°å¥½ä¸º 0),导致 6 ä¸ªç´¯è®¡åˆ—里 2022/2023 æ¯”源文件人工核算差 0.003 å·¦å³ã€2021 æ•´åˆ—为空。2026-09-16 å·²å…¨éƒ¨æ”¹ä¸ºå…¬å¼ã€‚
累计列现状(全省行,4 ä½å°æ•°ä¸Žæºæ–‡ä»¶ä¸€è‡´ï¼‰ï¼š
| åˆ— | å¹´åº¦ | å…¬å¼ |
|---|---|---|
| S | 2026(1-8月) | C+E+G+I+K+M+O+Q |
| AT | 2025 | V+X+...+AR |
| BV | 2024 | AX+AZ+...+BT |
| CW | 2023 | BY+CA+...+CU |
| DZ | 2022 | =SUM(DM:DX)(原为写死常量) |
| EO | 2021 | =SUM(EC:EN)(原为**空**) |
| EP | 2021 ç´¯è®¡åŒæ¯” | ä¿æŒä¸ºç©ºï¼ˆé¡µå†…æ—  2020 å—,无基期) |
| EA | 2022 ç´¯è®¡åŒæ¯” | =IFERROR(DZ/SUM(EC:EN)-1, ç©ºä¸²)(原为写死常量) |
### 12.2 æ¯ç‰ˆæ”¹åŠ¨æ–¹å¼ä¸Žæ–‡ä»¶èŒè´£
- **必须用 Excel COM**(改公式 -> CalculateFullRebuild -> Save),**不可用 openpyxl å¦å­˜**:会清空全本公式缓存值(曾导致 2021 å¹´æ¹–北省行变 0)。
- å¯¼å‡ºä»¶é‡Œçš„公式**无缓存值**:openpyxl(data_only=True) è¯»å‡ºæ¥å…¨æ˜¯ None,核对数值必须用 Excel COM é‡ç®—或自写求值器。
- æ–‡ä»¶èŒè´£ï¼š
  - YYYYå¹´M月道路运输量汇总表.xlsx = **母版**(唯一数据来源);
  - ç”Ÿæˆ_道路运输量汇总表.xlsx = **只作列宽参照**(applySummaryReferenceLayout åªè¯»åˆ—宽/隐藏标记,不读数值);
  - 2026å¹´8月道路运输量汇总表_版式原型.xlsx = è¿è¡Œæ—¶**无任何代码引用**。
- åŒæœŸå¤‡ä»½æ¯ç‰ˆè¿˜åŽŸæœºåˆ¶ï¼šresolveSummaryDonor åªè®¤æ–‡ä»¶å**以 `_备份_` å¼€å¤´ä¸”含「{å¹´}月」**的文件,命中即整格回填覆盖母版。=> è‡ªå»ºçš„备份文件/目录**不要**用 `_备份_` å‰ç¼€ï¼Œå¦åˆ™å¯èƒ½è¢«å½“成 donor æŠŠæ¯ç‰ˆæ”¹å›žæ—§å€¼ã€‚
### 12.3 æ–‡æœ¬å¤„理的坑(本机 PowerShell / git)
| é—®é¢˜ | åŽŸå›  | å¤„ç½® |
|---|---|---|
| å…¬å¼è¢«å†™æˆ =SUM(DM5) | "$m7" è¢«è§£æžä¸ºå˜é‡ m7;"$r:DX" é‡Œçš„ $r:DX è¢«å½“成「驱动器 r:」而吞掉 | ä¸€å¾‹ç”¨ ${m} / ${r} å®šç•Œ |
| å‘½ä»¤æ•´ä½“不执行、无输出、退出码 1 | ä¸€ä¸ªå‘½ä»¤é‡Œå‡ºçް**嵌套的单引号 here-string**,外层在第一个结束符处提前结束 | ä¸€ä¸ªå‘½ä»¤åªæ”¾ä¸€ä¸ª here-string;或先 Out-File å†™è¡¥ä¸æ–‡ä»¶ï¼Œå†ç”¨ Get-Content -Raw |
| apply_patch ä¼ å¤šè¡Œå‚数失败 | .bat åŒ…装器破坏了多行参数 | ç›´æŽ¥è°ƒ codex.exe --codex-run-as-apply-patch $patch |
| git commit -m æŠ¥ "outside repository" | PowerShell ç”¨åå¼•号转义,消息里的反斜杠+引号会提前结束字符串 | ç”¨ git commit -F <消息文件> |
| PS5.1 æŠ¥ä¹±ç è·¯å¾„「无法找到 ...」 | PS7 çš„ Out-File -Encoding utf8 å†™çš„æ˜¯**无 BOM** UTF-8,PS5.1 æŒ‰ GBK è¯»è„šæœ¬ | å†™ .ps1 æ—¶ç”¨ -Encoding utf8BOM |
### 12.4 é—留问题增量(截至 2026-09-16 æ™šï¼‰
| # | é—®é¢˜ | å½±å“ | çŠ¶æ€ |
|---|---|---|---|
| 7 | h2032_enterprise_monthly 2026-09 è„æœŸï¼ˆå®žä¸º 8 æœˆæ–‡ä»¶è¯¯å­˜ä¸º 9 æœˆï¼‰ | 636 è¡Œ + import_batch 302 | **已删除**,留可还原 SQL å¤‡ä»½ |
| 8 | ã€Š è´§è¿ã€‹é¡µç´¯è®¡åˆ— 2021/2022/2023 å¯¹ä¸ä¸Šäººå·¥æ ¸ç®— | å·²ä¿®æ¯ç‰ˆæ´¾ç”Ÿå£å¾„,6 åˆ—全部对上 | **已解决** |
| 9 | 2026-09 æœŸè¿˜åœ¨ h204_vehicle_quarterly(1284 è¡Œ) / investment_monthly(31 è¡Œ) / audit_result(2061 è¡Œ) / audit_run(3 è¡Œ) | è‹¥æŒ‰ 2026-09 å‡ºæŠ¥è¡¨ä¼šå–到脏数据 | å¾…用户确认是否清理 |
| 10 | 2026-07 å¯¼å‡ºä»¶ã€Š è´§è¿ã€‹é¡µä¸º 118x145(比 8 æœˆå°‘ 2 åˆ—) | 7 æœˆæ¯ç‰ˆæ˜¯ã€Œ1-4 æœˆéª¨æž¶ã€ï¼Œéžå®Œæ•´æ¯ç‰ˆ | å¾… 7 æœˆæ¯ç‰ˆå®šç¨¿ |
| 11 | 2026å¹´8月道路运输量汇总表_版式原型.xlsx çš„ S åˆ—漏 8 æœˆï¼ˆç¼º Q5) | è¿è¡Œæ—¶æœªè¢«å¼•用,暂无影响 | å¾…确认该文件去留 |
| 12 | æ¯ç‰ˆç» Excel é‡å­˜åŽä½“积 959,706 -> 1,492,121 å­—节(导出件 950,186 -> 1,331,599) | çº¯æ ¼å¼å¼€é”€ï¼Œæ•°æ®æ— å½±å“ | è®°å½• |
详见《功能测试报告/功能测试报告_货运页签累计列修复与脏期清理_2026-09-16.md》。
---
## åä¸‰ã€2026-09-16 è¡¥å……:2026-07 æ¯ç‰ˆè¡¥é½ & å¯¼å‡ºä»¶ã€ŒExcel æ‰“不开」根因(P0)
### 13.1 ç—‡çŠ¶ä¸Žæ ¹å› 
| é¡¹ | å†…容 |
|---|---|
| ç—‡çж | `GET /api/report/export/summaryWorkbook?period=2026-07&mode=month` ç”Ÿæˆçš„ xlsx,**Excel æ‰“不开**(COM æŠ¥ã€Œä¸èƒ½å–å¾—ç±» Workbooks çš„ Open å±žæ€§ã€ï¼›`CorruptLoad=1` ä¿®å¤æ¨¡å¼åŒæ ·æ‰“不开);2026-08 åŒæŽ¥å£æ­£å¸¸ |
| ç›´æŽ¥åŽŸå›  | å¯¼å‡ºä»¶é‡Œæœ‰ **19 ä¸ªæ¨¡å¼éžæ³•æ ¼**:`<c r="E15" s="111" t="n"><v>67.0</v><is><t>67.00</t></is></c>` â€”— `t="n"` ä¸å…è®¸å¸¦ `<is>`(inlineStr ä¸“用) |
| æ·±å±‚原因 | 7 æœˆæ¯ç‰ˆç”± **openpyxl** å†™å‡ºï¼ˆ`docProps/app.xml` = `Microsoft Excel Compatible / Openpyxl 3.1.5`,文本存 `<is>`);8 æœˆæ¯ç‰ˆæ˜¯ **Excel åŽŸç”Ÿ**(文本走 sharedStrings)。POI çš„部分写入路径只改 `t`/`<v>`、不清旧 `<is>` |
| è§¦å‘路径 | 7 æœˆå­˜åœ¨ `_备份_2026å¹´7月道路运输量汇总表_清理前_20260904.xlsx` â†’ `restoreSummaryMonthlyBlocks` æ•´æ ¼å›žå¡« â†’ å¾€ inlineStr æ ¼é‡Œå†™å€¼ç•™ä¸‹æ—§ `<is>`。8 æœˆæ—  `_备份_*`,不走回填,故正常 |
| å‘½ä¸­ä½ç½® | leave-one-out å®šä½åˆ° **sheet9《公交》17 æ ¼ + sheet12《轨道、轮渡》2 æ ¼** |
### 13.2 ä¿®å¤ï¼ˆ`traffic-audit-server`)
1. **`exportSummaryWorkbook` æ–°å¢ž `normalizeStaleInlineStrings(wb)`**:落盘前清掉所有「非 `inlineStr` å´æ®‹ç•™ `<is>`」的格子(幂等),命中即打 warn æ—¥å¿—。
2. **`restoreSummaryMonthlyBlocks` æ–°å¢ž `skipFreightHistoryBlocks`**:《 è´§è¿ã€‹é¡µ **T åˆ—及以后**(2025/2024/2023/2022/2021 å¹´åº¦å— + å„年累计/累计同比列)**永不从备份母版回填** â€”— ä¸Žæ—¢æœ‰ã€Œä¸­å£å¾„排名左块永不回填」同一思路,避免补齐被「生成又复活」。
### 13.3 2026-07 æ¯ç‰ˆè¡¥é½ï¼ˆå£å¾„与 8 æœˆæ¯ç‰ˆå¯¹é½ï¼‰
- å¹´åº¦å—(每列):`r7/r9/r8/r10 = SUM(17 å¸‚州对应行)`、`r5 = r7+r9`、`r6 = r8+r10` â†’ 360 æ ¼ï¼›
- ç´¯è®¡åˆ—:`DX = SUM(DK:DV)`(2022)、`EM = SUM(EA:EL)`(2021,原**整列为空**)、`DY = IFERROR(DX/SUM(EA:EL)-1,"")`(2022 ç´¯è®¡åŒæ¯”,原为**写死常量**)→ 324 æ ¼ï¼›
- 2023 ç´¯è®¡ `CU = BW+BY+…+CS` æœ¬æ¥å°±æ­£ç¡®ï¼Œæœªæ”¹ï¼›`EN`(2021 ç´¯è®¡åŒæ¯”)按口径保持为空。
- ä¸€æ‰‹è¯æ®ï¼šæ¯ç‰ˆ `DX5=144979.2825`(旧常量 `144979.285376043`,差 0.0029 = å…¨çœè§„下常量与 17 å¸‚州之和的差)、`EM5=161309.53162`、`CU5=173045.296428512`,与 8 æœˆæ¯ç‰ˆ `DZ5/EO5/CW5` **完全相等**。
- å¤‡ä»½ï¼š`docs/生成汇总大表/_bak_2026å¹´7月道路运输量汇总表_补齐前_20260916.xlsx`。**切勿改名为 `_备份_` å¼€å¤´**,否则会被 `resolveSummaryDonor` å½“ donor å›žå¡«ã€‚
### 13.4 æœ¬æ¬¡æ–°å¢žçš„æŽ’查坑
| é—®é¢˜ | åŽŸå›  | å¤„ç½® |
|---|---|---|
| Excel COM **间歇性**报同一个错,导致误判「8 æœˆä»¶ä¹Ÿæ‰“不开」 | æ¯æ¬¡ `New-Object -ComObject Excel.Application` ç•™ä¸‹çš„**孤儿 EXCEL è¿›ç¨‹**会污染后续实例 | æ¯ä¾‹æµ‹å®ŒæŠŠã€Œæœ¬æ¬¡æ–°å»ºçš„ EXCEL è¿›ç¨‹ã€å¼ºæ€å†æµ‹ä¸‹ä¸€ä¾‹ï¼›`Quit()`+`ReleaseComObject` å¹¶ä¸å¤Ÿ |
| ç¼–译报「找不到 isSetSheetData()」 | `CTWorksheet.sheetData` æ˜¯ XSD **必填**元素,不生成 `isSetXxx` | æ”¹ç”¨ `ctw.getSheetData() != null` |
| éƒ¨ä»¶çº§ diff å¤ªå¤§è·‘不动 | å¯¹ 519KB çš„ `styles.xml` ç›´æŽ¥ `difflib` æ˜¯ O(n²) | å…ˆæŒ‰éƒ¨ä»¶æ¯”字节尺寸/是否相等,只在必要的小部件上做 diff |
### 13.5 é—留问题增量
| # | é—®é¢˜ | å½±å“ | çŠ¶æ€ |
|---|---|---|---|
| 13 | 2026-06 / 2026-09 æ— æ¯ç‰ˆ | é¢„览 `ready=False`「未找到模板文件」,无法出数 | éœ€å…ˆå»ºæ¯ç‰ˆï¼ˆç”¨æˆ·ç¬¬ 5 é—®çš„延伸) |
| 14 | ä»“库根 `_*.*` ä¸´æ—¶æ–‡ä»¶ç»§ç»­å¢žå¤šï¼ˆ`_hyb_*` / `_loo_*` / `_v2_*` / `_final_*` / `_fixed_*` / `_t7_*` / `_poijar`) | ä½“积/可读性 | ç»ç”¨æˆ·åŒæ„åŽå†æ¸…理 |
> ç¬¬ 10 é¡¹ï¼ˆ2026-07 å¯¼å‡ºä»¶å°‘ 2 åˆ— / 7 æœˆæ¯ç‰ˆæ˜¯ã€Œ1-4 æœˆéª¨æž¶ã€ï¼‰æœ¬èŠ‚å·²å¤„ç†ï¼šå¯¼å‡ºç«¯ä¼š**自动补出 5/6/7 æœˆè¡¨å¤´ä¸Žå…¬å¼**并重算累计公式,母版已补齐 2021/2022/2023 ç´¯è®¡åˆ—,故关闭该项。
traffic-audit-server/src/main/java/com/trafficaudit/common/config/CorsConfig.java
@@ -12,14 +12,16 @@
import java.util.List;
/**
 * è·¨åŸŸé…ç½®ï¼šåªå…è®¸é…ç½®ä¸­åˆ—出的来源访问接口。
 * å‰åŽç«¯åˆ†ç¦»æœ¬åœ°å¼€å‘默认放行 8080;前端经 dev-server ä»£ç†æˆ–与后端同源部署时均不需要额外放行。
 * è·¨åŸŸé…ç½®ï¼šåªå…è®¸é…ç½®ä¸­åˆ—出的来源(支持 * é€šé…ï¼‰è®¿é—®æŽ¥å£ã€‚
 * æµè§ˆå™¨å‘èµ· POST/PUT/DELETE æ—¶ä¼šå¸¦ Origin å¤´ï¼ˆGET ä¸å¸¦ï¼‰ï¼Œå› æ­¤ç”¨å±€åŸŸç½‘ IP æ‰“开页面时,
 * è‹¥è¯¥æ¥æºä¸åœ¨æ”¾è¡Œåˆ—表内会被 CorsFilter åˆ¤ä¸ºéžæ³•并返回 403,表现为登录时提示“网络错误”。
 * é»˜è®¤æ”¾è¡Œæœ¬æœºä¸Žå†…网网段的任意端口(本地开发、局域网访问、IP æ–¹å¼è®¿é—® 8090 åŒæºéƒ¨ç½²éƒ½è¦†ç›–)。
 * æ³¨æ„ï¼šä¸å¼€å¯ allowCredentials(接口用 Bearer ä»¤ç‰Œé‰´æƒï¼Œä¸ä¾èµ– Cookie),避免任意站点携带凭证调用。
 */
@Configuration
public class CorsConfig {
    @Value("${app.cors.allowed-origins:http://localhost:8080,http://127.0.0.1:8080}")
    @Value("${app.cors.allowed-origins:http://localhost:*,http://127.0.0.1:*,http://192.168.*:*,http://10.*:*,http://172.*:*}")
    private String allowedOrigins;
    private List<String> originList() {
@@ -29,7 +31,7 @@
    @Bean
    public CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowedOrigins(originList());
        config.setAllowedOriginPatterns(originList());
        config.setAllowedHeaders(Arrays.asList("Authorization", "Content-Type", "Accept", "X-Requested-With"));
        config.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE", "OPTIONS"));
        config.setAllowCredentials(false);
@@ -43,4 +45,4 @@
    public CorsFilter corsFilter() {
        return new CorsFilter(corsConfigurationSource());
    }
}
}
traffic-audit-server/src/main/java/com/trafficaudit/dataimport/controller/DataViewController.java
@@ -359,6 +359,8 @@
        H2031_COLUMNS.add(col("regionCode", "所属地区", 100));
        H2031_COLUMNS.add(col("enterpriseCode", "企业代码", 130));
        H2031_COLUMNS.add(col("enterpriseName", "企业名称", 220));
        H2031_COLUMNS.add(col("unifiedCreditCode", "统一社会信用代码", 180));
        H2031_COLUMNS.add(col("reportUnit", "填报单位", 160));
        H2031_COLUMNS.add(col("vehicleTotal", "客运车辆合计", 110));
        H2031_COLUMNS.add(col("seatTotal", "核定载客位合计", 130));
        H2031_COLUMNS.add(col("vehicleSchedule", "班线车辆数", 110));
traffic-audit-server/src/main/java/com/trafficaudit/dataimport/entity/PassengerEnterpriseMonthly.java
@@ -22,6 +22,10 @@
    private String enterpriseCode;
    /** ä¼ä¸šåç§° */
    private String enterpriseName;
    /** ç»Ÿä¸€ç¤¾ä¼šä¿¡ç”¨ä»£ç  */
    private String unifiedCreditCode;
    /** å¡«æŠ¥å•位 */
    private String reportUnit;
    /** å®¢è¿è½¦è¾†_总计 */
    private Integer vehicleTotal;
traffic-audit-server/src/main/java/com/trafficaudit/dataimport/service/DataImportService.java
@@ -85,6 +85,7 @@
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.TreeMap;
import java.util.stream.Collectors;
import java.text.SimpleDateFormat;
@@ -318,6 +319,9 @@
                entity.setRegionCode(gs(row, colMap, "所属地区"));
                entity.setEnterpriseCode(gs(row, colMap, "企业代码"));
                entity.setEnterpriseName(name.trim());
                // æ–°ç‰ˆæ¨¡æ¿åœ¨ã€Œä¼ä¸šåç§°ã€åŽæ–°å¢žäº†ä¸¤åˆ—(统一社会信用代码/填报单位),按表头取值,老模板无该列时为 null
                entity.setUnifiedCreditCode(gs(row, colMap, "统一社会信用代码"));
                entity.setReportUnit(gs(row, colMap, "填报单位"));
                entity.setVehicleTotal(gi(row, colMap, "客运车辆_总计"));
                entity.setSeatTotal(gi(row, colMap, "核定载客位_总计"));
                entity.setVehicleSchedule(gi(row, colMap, "车辆数_客运班车(含定线旅游客运客车)"));
@@ -1054,11 +1058,22 @@
    // ========== è´§è¿é‡å‘¨è½¬é‡ï¼ˆæ¨¡æ¿_货运量周转量.xlsx,每月导入) ==========
    public int importFreightTurnover(MultipartFile file, String period) throws Exception {
        try (Workbook wb = WorkbookFactory.create(file.getInputStream())) {
            // å¤šå¹´åº¦å·¥ä½œç°¿ï¼ˆä¸€å¹´ä¸€ä¸ª Sheet:整年 1-12 æœˆï¼Œå¦‚ 21-26 å¹´å®šç¨¿æ–‡ä»¶ï¼‰â†’ å…¨éƒ¨å¹´ä»½å…¥åº“
            List<String> yearSheets = detectYearSheets(wb);
            if (!yearSheets.isEmpty()) {
                return importFreightTurnoverByYear(wb, file, yearSheets);
            }
            return importFreightTurnoverByMonth(wb, file, period);
        }
    }
    /** æ¯æœˆå¯¼å…¥ï¼ˆæ¨¡æ¿_货运量周转量.xlsx):左半今年 1-N æœˆï¼Œå³åŠå޻年 1-12 æœˆ */
    private int importFreightTurnoverByMonth(Workbook wb, MultipartFile file, String period) throws Exception {
        List<FreightTurnoverImport> list = new ArrayList<>();
        int failRows = 0;
        // æŠ¥è¡¨æœŸ N æœˆï¼šå·¦åŠä¸ºä»Šå¹´ 1-N æœˆï¼ˆåˆ—数不固定),右半固定为去年 1-12 æœˆï¼ˆç®—同比用)
        int monthCount = Integer.parseInt(period.split("-")[1]);
        try (Workbook wb = WorkbookFactory.create(file.getInputStream())) {
        {
            Sheet sheet = wb.getSheetAt(0);
            Row header = sheet.getRow(0);
            String h0 = header == null ? null : getString(header, 0);
@@ -1123,27 +1138,149 @@
                }
                list.add(entity);
            }
        } catch (Exception e) {
            throw e;
        }
        Map<String, List<FreightTurnoverImport>> byPeriod = new LinkedHashMap<>();
        byPeriod.put(period, list);
        return persistFreightTurnover(byPeriod, file.getOriginalFilename());
    }
        // å¹‚等:同报表期先删除
        freightTurnoverMapper.delete(new LambdaQueryWrapper<FreightTurnoverImport>()
            .eq(FreightTurnoverImport::getReportPeriod, period));
    /** è¯†åˆ«ã€Œå¤šå¹´åº¦å·¥ä½œç°¿ã€ï¼šæ¯ä¸ª Sheet ä¸€å¹´ï¼ˆSheet å 2021å¹´/2022年…),且表头为「货运量/1月…12月」;否则返回空列表 */
    private List<String> detectYearSheets(Workbook wb) {
        List<String> names = new ArrayList<>();
        if (wb.getNumberOfSheets() < 2) return names;
        for (int i = 0; i < wb.getNumberOfSheets(); i++) {
            Sheet sheet = wb.getSheetAt(i);
            String nm = sheet.getSheetName() == null ? "" : sheet.getSheetName().trim();
            if (!nm.matches("\\d{4}\\s*å¹´?")) { names.clear(); return names; }
            Row header = sheet.getRow(0);
            String h0 = header == null ? null : getString(header, 0);
            String h1 = header == null ? null : getString(header, 1);
            if (h0 == null || !h0.contains("货运量") || h1 == null || !h1.contains("月")) {
                names.clear();
                return names;
            }
            names.add(nm);
        }
        return names;
    }
        int success = 0;
        for (FreightTurnoverImport entity : list) {
            try {
                freightTurnoverMapper.insert(entity);
                success++;
            } catch (Exception e) {
                log.error("freight turnover insert error: {}", entity.getRegionName(), e);
                failRows++;
    /** å¤šå¹´åº¦å·¥ä½œç°¿å¯¼å…¥ï¼šé€å¹´ä¸€æ¡æŠ¥è¡¨æœŸï¼ˆæŠ¥è¡¨æœŸ=该年最后有数据的月份),上年同期取上一年度 Sheet */
    private int importFreightTurnoverByYear(Workbook wb, MultipartFile file, List<String> yearSheets) {
        Map<Integer, String> sheetByYear = new TreeMap<>();
        for (String sheetName : yearSheets) {
            sheetByYear.put(Integer.parseInt(sheetName.replace("å¹´", "").trim()), sheetName);
        }
        Map<Integer, Map<String, FreightTurnoverImport>> byYear = new TreeMap<>();
        Map<Integer, Integer> maxMonthByYear = new HashMap<>();
        for (Map.Entry<Integer, String> entry : sheetByYear.entrySet()) {
            Map<String, FreightTurnoverImport> parsed = new LinkedHashMap<>();
            int maxMonth = parseWholeYearSheet(wb.getSheet(entry.getValue()), parsed);
            if (parsed.isEmpty()) continue;
            byYear.put(entry.getKey(), parsed);
            maxMonthByYear.put(entry.getKey(), Math.max(1, Math.min(12, maxMonth)));
        }
        Map<String, List<FreightTurnoverImport>> byPeriod = new LinkedHashMap<>();
        for (Map.Entry<Integer, Map<String, FreightTurnoverImport>> entry : byYear.entrySet()) {
            int year = entry.getKey();
            String yearPeriod = year + "-" + String.format("%02d", maxMonthByYear.get(year));
            Map<String, FreightTurnoverImport> lastYear = byYear.get(year - 1);
            List<FreightTurnoverImport> rows = new ArrayList<>();
            for (Map.Entry<String, FreightTurnoverImport> regionEntry : entry.getValue().entrySet()) {
                FreightTurnoverImport entity = regionEntry.getValue();
                entity.setReportPeriod(yearPeriod);
                // ä¸Šå¹´åŒæœŸ = ä¸Šä¸€å¹´åº¦ Sheet(多年度文件没有右半「去年1-12月」区块)
                FreightTurnoverImport last = lastYear == null ? null : lastYear.get(regionEntry.getKey());
                if (last != null) {
                    for (int m = 1; m <= 12; m++) {
                        setLastFreight(entity, m, getFreight(last, m));
                        setLastTurnover(entity, m, getTurnover(last, m));
                    }
                }
                rows.add(entity);
            }
            byPeriod.put(yearPeriod, rows);
        }
        return persistFreightTurnover(byPeriod, file.getOriginalFilename());
    }
    /** è§£æžæ•´å¹´ Sheet(1-12 æœˆåˆ—):货运量块 + å‘¨è½¬é‡å—;返回最后一个有货运量数据的月份 */
    private int parseWholeYearSheet(Sheet sheet, Map<String, FreightTurnoverImport> out) {
        Map<String, FreightTurnoverImport> freightMap = new LinkedHashMap<>();
        Map<String, FreightTurnoverImport> turnoverMap = new LinkedHashMap<>();
        Set<String> seen = new HashSet<>();
        int maxMonth = 0;
        for (int r = 1; r <= sheet.getLastRowNum(); r++) {
            Row row = sheet.getRow(r);
            if (row == null) continue;
            String name = getString(row, 0);
            if (name == null || name.trim().isEmpty()) continue;
            String region = RegionUtil.normalizeCityName(name);
            boolean isCity = RegionUtil.cityList().contains(region);
            if (!isCity && !"湖北省".equals(region)) continue; // è¡¨å¤´/说明行
            if (seen.contains(region)) {
                // è¯¥åç§°å·²å‡ºçŽ°è¿‡ -> å‘¨è½¬é‡åŒºå—
                FreightTurnoverImport entity = turnoverMap.get(region);
                if (entity == null) {
                    entity = new FreightTurnoverImport();
                    entity.setRegionName(name.trim());
                    turnoverMap.put(region, entity);
                }
                for (int m = 1; m <= 12; m++) {
                    setTurnover(entity, m, getDecimalOrNull(row, m));
                }
            } else {
                seen.add(region);
                FreightTurnoverImport entity = freightMap.get(region);
                if (entity == null) {
                    entity = new FreightTurnoverImport();
                    entity.setRegionName(name.trim());
                    freightMap.put(region, entity);
                }
                for (int m = 1; m <= 12; m++) {
                    Double v = getDecimalOrNull(row, m);
                    setFreight(entity, m, v);
                    if (v != null && m > maxMonth) maxMonth = m;
                }
            }
        }
        recordBatch(file.getOriginalFilename(), "FREIGHT_TURNOVER", period, list.size(), success, failRows, null);
        log.info("Freight turnover imported: {} rows for {}", success, period);
        return success;
        // åˆå¹¶ï¼šä¸€ä¸ªå¸‚州一行(货运量 + å‘¨è½¬é‡ï¼‰
        for (Map.Entry<String, FreightTurnoverImport> entry : freightMap.entrySet()) {
            FreightTurnoverImport entity = entry.getValue();
            FreightTurnoverImport turnover = turnoverMap.get(entry.getKey());
            if (turnover != null) {
                for (int m = 1; m <= 12; m++) {
                    setTurnover(entity, m, getTurnover(turnover, m));
                }
            }
            out.put(entry.getKey(), entity);
        }
        return maxMonth;
    }
    /** è½åº“:按报表期先删后插(幂等),每个报表期一条导入批次记录,返回成功条数 */
    private int persistFreightTurnover(Map<String, List<FreightTurnoverImport>> byPeriod, String fileName) {
        int total = 0;
        for (Map.Entry<String, List<FreightTurnoverImport>> entry : byPeriod.entrySet()) {
            String p = entry.getKey();
            List<FreightTurnoverImport> rows = entry.getValue();
            freightTurnoverMapper.delete(new LambdaQueryWrapper<FreightTurnoverImport>()
                .eq(FreightTurnoverImport::getReportPeriod, p));
            int failRows = 0;
            int success = 0;
            for (FreightTurnoverImport entity : rows) {
                try {
                    freightTurnoverMapper.insert(entity);
                    success++;
                } catch (Exception e) {
                    log.error("freight turnover insert error: {}", entity.getRegionName(), e);
                    failRows++;
                }
            }
            recordBatch(fileName, "FREIGHT_TURNOVER", p, rows.size(), success, failRows, null);
            log.info("Freight turnover imported: {} rows for {}", success, p);
            total += success;
        }
        return total;
    }
    /** è§£æžè´§è¿é‡åŒºå—行:左半 B èµ· N åˆ—为今年 1-N æœˆï¼Œå³åŠä¸ºå޻年 1-12 æœˆ */
traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java
@@ -3360,12 +3360,41 @@
                    + "按《生成_道路运输量汇总表》对齐列宽列数={},缺数提示={}",
                    dbFilled, yoyFilled, monthFormulaFilled, rankRefreshed, cumulativeRefreshed, widthApplied, dbProblems);
            applyTwoDecimalFormat(wb); // æ•°å€¼æ˜¾ç¤ºä¸¤ä½å°æ•°ï¼ˆä¿ç•™å…¨ç²¾åº¦ï¼‰ï¼›% / æ—¥æœŸç­‰æ—¢æœ‰æ ·å¼ä¸æ”¹å˜
            int inlineFixed = normalizeStaleInlineStrings(wb); // æ¸…掉「非 inlineStr å´æ®‹ç•™ <is>」的非法格,否则 Excel æ‹’绝打开
            if (inlineFixed > 0) log.warn("汇总工作簿清掉残留 inlineStr éžæ³•æ ¼ {} ä¸ªï¼ˆæ¯ç‰ˆç”± openpyxl å†™å‡ºæ—¶çš„典型问题)", inlineFixed);
            if (!wb.getCTWorkbook().isSetCalcPr()) wb.getCTWorkbook().addNewCalcPr();
            wb.getCTWorkbook().getCalcPr().setFullCalcOnLoad(true); // è¿˜åŽŸ/改写公式后打开即重算
            return toBytes(wb);
        } finally {
            ZipSecureFile.setMinInflateRatio(savedZipRatio);
        }
    }
    /**
     * æ¸…掉「非 inlineStr å´æ®‹ç•™ &lt;is&gt;」的非法单元格。
     *
     * æ¯ç‰ˆè‹¥ç”± openpyxl å†™å‡ºï¼Œæ–‡æœ¬å•元格用 &lt;is&gt;(inlineStr)存储;POI çš„ setCellValue åªæ”¹å†™ t ä¸Ž &lt;v&gt;,
     * ä¸ä¼šæ¸…掉旧 &lt;is&gt;,于是产出 &lt;c t="n"&gt;&lt;v&gt;67.0&lt;/v&gt;&lt;is&gt;&lt;t&gt;67.00&lt;/t&gt;&lt;/is&gt;&lt;/c&gt; è¿™ç§éžæ³•格,
     * Excel åˆ¤å®šä¸ºã€Œæ— æ³•读取的内容」而直接拒绝打开(COM è¡¨çŽ°ä¸ºã€Œä¸èƒ½å–å¾—ç±» Workbooks çš„ Open å±žæ€§ã€ï¼‰ã€‚
     * 2026-07 å¯¼å‡ºä»¶å³å› æ­¤æ‰“不开(《公交》17 æ ¼ +《轨道、轮渡》2 æ ¼ï¼‰ã€‚落盘前统一清理,幂等。
     */
    private int normalizeStaleInlineStrings(XSSFWorkbook wb) {
        int fixed = 0;
        for (int i = 0; i < wb.getNumberOfSheets(); i++) {
            org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorksheet ctw = wb.getSheetAt(i).getCTWorksheet();
            if (ctw == null || ctw.getSheetData() == null) continue;
            for (org.openxmlformats.schemas.spreadsheetml.x2006.main.CTRow row : ctw.getSheetData().getRowArray()) {
                for (org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCell c : row.getCArray()) {
                    if (!c.isSetIs()) continue;
                    STCellType.Enum t = c.getT();
                    if (t == null || !STCellType.INLINE_STR.equals(t)) {
                        c.unsetIs();
                        fixed++;
                    }
                }
            }
        }
        return fixed;
    }
    /**
@@ -4454,6 +4483,9 @@
            if (bs == null) continue;
            // ä¸­å£å¾„排名页 A..H é™ˆæ—§å·¦å—已于 2026-09-09 æ‹æ¿æ•´å—删除:该区域永不从备份母版回填,避免“生成又复活”
            boolean skipMidRankLeftBlock = "中口径排名".equals(ds.getSheetName());
            // ã€Š è´§è¿ã€‹é¡µ 2025..2021 å¹´åº¦å—(T åˆ—起,含各年累计/累计同比列)在母版里是「市州派生公式」,
            // å¤‡ä»½æ¯ç‰ˆåŒåŒºä»æ˜¯æ—§çš„写死常量(全省规下等),回填会让 2021/2022/2023 ç´¯è®¡åˆå¯¹ä¸ä¸Šï¼ˆâ€œç”Ÿæˆåˆå¤æ´»â€ï¼‰ï¼Œæ•…该区不回填。
            boolean skipFreightHistoryBlocks = " è´§è¿".equals(ds.getSheetName());
            for (int r = ds.getFirstRowNum(); r <= ds.getLastRowNum(); r++) {
                Row dr = ds.getRow(r);
                if (dr == null) continue;
@@ -4461,6 +4493,7 @@
                for (Cell dc : dr) {
                    if (dc == null) continue;
                    if (skipMidRankLeftBlock && dc.getColumnIndex() < 8) continue;
                    if (skipFreightHistoryBlocks && dc.getColumnIndex() >= 19) continue; // T åˆ—及以后 = 2025..2021 å¹´åº¦å—
                    CellType t = dc.getCellType();
                    if (t == CellType.BLANK) continue;
                    String dtx = summaryCellText(dc);
traffic-audit-server/src/main/resources/application.yml.example
@@ -70,7 +70,9 @@
# Behavior captcha on login. Set to false to skip verification during test phase; enable before production release.
app:
  cors:
    # å…è®¸è·¨åŸŸè®¿é—®æŽ¥å£çš„æ¥æºï¼ˆé€—号分隔)
    allowed-origins: http://localhost:8080,http://127.0.0.1:8080
    # å…è®¸è·¨åŸŸè®¿é—®æŽ¥å£çš„æ¥æºï¼ˆé€—号分隔,支持 * é€šé…ä¸»æœºä¸Žç«¯å£ï¼‰ï¼š
    # æµè§ˆå™¨ POST/PUT/DELETE å¿…带 Origin(GET ä¸å¸¦ï¼‰ï¼Œæ•…用 IP/域名打开页面时该来源必须命中此列表,否则 403。
    # é»˜è®¤æ”¾è¡Œæœ¬æœºä¸Žå†…网网段;若通过域名访问,请把该域名(含端口)追加到此处。
    allowed-origins: http://localhost:*,http://127.0.0.1:*,http://192.168.*:*,http://10.*:*,http://172.*:*
  captcha:
    required: false
traffic-audit-web/src/directives/dialogDrag.js
New file
@@ -0,0 +1,61 @@
/**
 * v-dialog-drag:让 Element UI 2.x çš„ el-dialog èƒ½ç”¨æ ‡é¢˜æ æ‹–动。
 * Element UI 2.x çš„ el-dialog æ²¡æœ‰ draggable å±žæ€§ï¼ˆé‚£æ˜¯ Element Plus çš„功能),
 * æ‰€ä»¥è¿™é‡Œç”¨æŒ‡ä»¤å®žçŽ°ï¼šåªæ”¹ .el-dialog çš„ transform,不改布局;
 * å¼¹çª—关闭(wrapper è¢«ç½®ä¸º display:none)时自动复位,下次打开仍在原位。
 * ç”¨æ³•:<el-dialog v-dialog-drag custom-class="xxx">
 */
export default {
  inserted(el) {
    const dialog = el.querySelector('.el-dialog')
    const header = el.querySelector('.el-dialog__header')
    if (!dialog || !header) return
    let startX = 0
    let startY = 0
    let baseX = 0
    let baseY = 0
    let curX = 0
    let curY = 0
    let dragging = false
    const reset = () => {
      curX = 0
      curY = 0
      dialog.style.transform = ''
    }
    const onMove = (e) => {
      if (!dragging) return
      curX = baseX + (e.clientX - startX)
      curY = baseY + (e.clientY - startY)
      dialog.style.transform = 'translate(' + curX + 'px, ' + curY + 'px)'
      if (e.preventDefault) e.preventDefault()
    }
    const onUp = () => {
      if (!dragging) return
      dragging = false
      document.removeEventListener('mousemove', onMove)
      document.removeEventListener('mouseup', onUp)
    }
    const onDown = (e) => {
      if (e.button !== 0) return
      const t = e.target
      if (t && t.closest && t.closest('.el-dialog__headerbtn')) return
      dragging = true
      startX = e.clientX
      startY = e.clientY
      baseX = curX
      baseY = curY
      document.addEventListener('mousemove', onMove)
      document.addEventListener('mouseup', onUp)
      if (e.preventDefault) e.preventDefault()
    }
    header.addEventListener('mousedown', onDown)
    if (typeof MutationObserver !== 'undefined') {
      const mo = new MutationObserver(() => {
        if (el.style.display === 'none') reset()
      })
      mo.observe(el, { attributes: true, attributeFilter: ['style'] })
    }
  }
}
traffic-audit-web/src/main.js
@@ -3,8 +3,10 @@
import 'element-ui/lib/theme-chalk/index.css'
import App from './App.vue'
import router from './router'
import dialogDrag from './directives/dialogDrag'
Vue.use(ElementUI)
Vue.directive('dialog-drag', dialogDrag)   // è®© el-dialog å¯æ‹–动(Element UI 2.x æ—  draggable å±žæ€§ï¼‰
Vue.config.productionTip = false
// å…¨å±€ç™»å‡ºï¼šæ¸…除登录态并回登录页(各页面侧边栏「退出登录」菜单共用)
traffic-audit-web/src/views/Login.vue
@@ -40,16 +40,20 @@
      captchaId: '',
      clickIds: [],
      loggingIn: false,
      captchaRequired: true
      captchaRequired: false
    }
  },
  created() {
    // éªŒè¯ç æ˜¯å¦å¯ç”¨ä¸€å¾‹ä»¥åŽç«¯ /api/auth/captcha-config ä¸ºå‡†ï¼š
    // é»˜è®¤ä¸æ˜¾ç¤ºï¼Œåªæœ‰åŽç«¯æ˜Žç¡®è¿”回 required=true æ‰æ¸²æŸ“验证码组件。
    // ä¿®å¤ï¼šæ­¤å‰é»˜è®¤ true ä¸”请求失败时静默忽略,切换网络后该配置读不到,
    // ç™»å½•页就会残留一个加载不出来的验证码白框并提示“验证码加载失败,请检查网络”。
    axios.get('/api/auth/captcha-config', { timeout: 10000 })
      .then(res => {
        const d = res.data
        if (d && d.code === 200) this.captchaRequired = d.data.required !== false
        this.captchaRequired = !!(d && d.code === 200 && d.data && d.data.required === true)
      })
      .catch(() => {})
      .catch(() => { this.captchaRequired = false })
  },
  methods: {
    onCaptchaVerified(payload) {
traffic-audit-web/src/views/ReportExport.vue
@@ -99,12 +99,14 @@
            </div>
          </el-alert>
        </div>
        <el-dialog :title="'预览数据 - ' + previewModule + '(' + previewPeriod + ')'" :visible.sync="previewVisible" width="760px">
        <el-dialog :title="'预览数据 - ' + previewModule + '(' + previewPeriod + ')'" :visible.sync="previewVisible" width="760px"
                   top="5vh" custom-class="pv-dialog" v-dialog-drag>
          <div class="preview-body">
            <div v-for="it in previewItems" :key="it.key" class="preview-item">
              <div class="preview-head">
                <span class="preview-name">{{ it.label }}</span>
                <span class="preview-rows">共 {{ it.rowCount || 0 }} è¡Œ</span>
                <span class="preview-rows" v-if="it.key === 'summaryWorkbook'">指标 {{ (it.summary || []).length }} é¡¹</span>
                <span class="preview-rows" v-else>共 {{ it.rowCount || 0 }} è¡Œæ˜Žç»†</span>
              </div>
              <div class="preview-coverage">
                <span class="cov-label">月度覆盖:</span>
@@ -114,7 +116,7 @@
              </div>
              <table class="preview-summary wb-table" v-if="it.key === 'summaryWorkbook' && it.summary && it.summary.length">
                <thead>
                  <tr><th style="width:44%">指标</th><th style="width:30%">数据</th><th>同比</th></tr>
                  <tr><th style="width:12%">分类</th><th style="width:40%">指标</th><th style="width:28%">数据</th><th>同比</th></tr>
                </thead>
                <tbody>
                  <template v-for="(sec, si) in wbRows(it.summary)">
@@ -130,7 +132,7 @@
              <div v-if="it.key === 'summaryWorkbook' && wbMissing(it.summary)" class="wb-note">
                éƒ¨åˆ†æŒ‡æ ‡ç¼ºå°‘上年同期({{ wbPrevYear() }})基期数据,同比暂未计算
              </div>
              <table class="preview-summary" v-else-if="it.summary && it.summary.length">
              <table class="preview-summary" v-if="it.key !== 'summaryWorkbook' && it.summary && it.summary.length">
                <tbody>
                  <tr v-for="(s, i) in it.summary" :key="i">
                    <td>{{ s.label }}</td>
@@ -388,7 +390,7 @@
          this.previewVisible = true
          this.loading = ''
        })
        .catch(err => this.failWith(err))
        .catch(err => this.failWith(err, '预览'))
    },
    fmtVal(v) {
      if (v === null || v === undefined || v === '') return '—'
@@ -505,13 +507,45 @@
        })
        .catch(() => doExport())
    },
    failWith(err) {
    // é¢„览/导出失败统一提示:区分“连不上服务器”与“后端返回的错误原因”。
    // å¯¼å‡ºæŽ¥å£ç”¨ responseType: 'blob',报错时 data ä¹Ÿæ˜¯ Blob,必须先读文本再解析,
    // å¦åˆ™æ‹¿ä¸åˆ°åŽç«¯çœŸå®žåŽŸå› ï¼Œåªä¼šæ˜¾ç¤ºç¬¼ç»Ÿçš„â€œè¯·ç¡®è®¤å·²å¯¼å…¥å¯¹åº”æ•°æ®â€ã€‚
    failWith(err, action) {
      if (err && err._toast) { this.loading = ''; return }
      let msg = ''
      const d = err && err.response && err.response.data
      if (d && typeof d === 'object' && d.message) msg = d.message
      this.$message.error('导出失败:' + (msg || '请确认已导入对应数据,或查看后端日志'))
      this.loading = ''
      const act = action || '导出'
      const finish = (reason) => {
        this.$message.error(act + '失败:' + reason)
        this.loading = ''
      }
      if (!err || !err.response) {
        if (err && err.code === 'ECONNABORTED') { finish('请求超时,请稍后重试'); return }
        finish('无法连接服务器,请检查网络连接,或确认后端服务是否已启动')
        return
      }
      const d = err.response.data
      const fallback = '请确认已导入对应数据,或查看后端日志'
      if (d && typeof d.text === 'function') {
        Promise.resolve(d.text()).then(txt => finish(this.errReason(txt) || fallback)).catch(() => finish(fallback))
        return
      }
      finish(this.errReason(typeof d === 'string' ? d : (d && d.message)) || fallback)
    },
    // åŽç«¯å¼‚常响应可能是 JSON/HTML/纯文本,尽量提取出可读的原因
    errReason(raw) {
      if (!raw) return ''
      let text = String(raw).trim()
      if (text.charAt(0) === '{' || text.charAt(0) === '[') {
        try {
          const j = JSON.parse(text)
          if (j && j.message) return j.message
        } catch (e) { /* éž JSON,按纯文本处理 */ }
      }
      text = text.replace(/<[^>]+>/g, ' ').replace(/\s+/g, ' ').trim()
      // å¼€å‘代理/网络层报错转成人话,避免直接把 ECONNREFUSED ä¹‹ç±»æŠ›ç»™ç”¨æˆ·
      if (/ECONNREFUSED|ECONNRESET|Proxy error|socket hang up|Network Error|Failed to fetch/i.test(text)) {
        return '无法连接服务器,请检查网络连接,或确认后端服务是否已启动'
      }
      return text.length > 200 ? text.slice(0, 200) + '…' : text
    },
    downloadBlob(res, fileName) {
      const isZip = /\.zip$/.test(fileName)
@@ -579,3 +613,11 @@
.wb-yoy.yoy-empty { color:#C0C4CC; }
.wb-note { color:#E6A23C; font-size:12px; margin:2px 0 8px; }
</style>
<style>
/* é¢„览数据弹窗:圆角 + å¯é€šè¿‡æ ‡é¢˜æ æ‹–动(v-dialog-drag æŒ‡ä»¤ï¼‰ã€‚
   ä¸èƒ½å†™è¿› scoped:el-dialog é»˜è®¤ append-to-body,DOM æŒ‚在 body ä¸Šï¼Œscoped é€‰æ‹©å™¨åŒ¹é…ä¸åˆ°ã€‚ */
.pv-dialog { border-radius: 10px; overflow: hidden; }
.pv-dialog .el-dialog__header { cursor: move; user-select: none; -webkit-user-select: none; }
.pv-dialog .el-dialog__headerbtn { cursor: pointer; }
</style>