start-dev.ps1 启动前后端(启动前 8090/8080 均空闲)。Tomcat started on port(s): 8090 / Started TrafficAuditApplication;前端 Compiled successfully / App running at:。http://192.168.177.26:8080/ 登录提示「网络错误,登录失败」,而 http://localhost:8080/ 正常。/api/auth/login 正常返回(说明后端与代理都通)→ 用应用内浏览器在 LAN 地址复现(确实提示「网络错误,登录失败」)→ 对比出差异只在 Origin 头 → curl 补 Origin: http://192.168.177.26:8080 得到 403 Invalid CORS request,根因落地。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 挡住登录——属于同类隐患,本次一并解决。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 均未放松。cmd 3608 → java(maven) 23704 → java(app) 12636)后重启;应用内浏览器在 LAN 地址实登成功进入 #/dashboard;白名单负向用例(http://evil.example.com)仍 403。详见《功能测试报告_局域网IP访问登录CORS修复_2026-09-16.md》。http://192.168.177.26:8080/#/login 输入 admin/123456 → 提示「登录成功」→ 跳转工作台,顶部显示 admin。app.cors.allowed-origins 默认只覆盖本机 + 内网网段,若将来用域名或公网 IP 访问,需把该来源(含端口)追加进去(yml 注释已写明)。Login.vue 把所有失败都提示为「网络错误,登录失败」,403/500 这类有响应的错误也被归到"网络",排查易误导;建议后续按状态码细分提示(未做,等用户确认)。sys_role 权限落地、3D 验证码生产开启、backend.log 历史明文清理。_*.py/_*.sql/_*.ps1 等)未被 .gitignore 覆盖,清理前需用户确认。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 比对合并(禁强推)。Login.vue 错误提示细分方案是否实施。CorsConfig.java、application.yml.example、本报告、本日结。application.yml 被 .gitignore 忽略(仓库内模板是 application.yml.example),故模板同步修改后一并提交。git fetch origin(gitee,master)——无新提交,本地已包含远端全部提交;0d2a5fc:fix(cors): 放行内网网段来源,修复局域网 IP 访问时登录 403;origin:git push origin main:master 成功(82100d6..0d2a5fc);gitea:git fetch gitea、git push gitea main:main 均因 HTTP 无响应而挂起,未推送成功(详见遗留问题 5);本次为快进推送,不涉及强推。定稿-湖北省各市州运输量数据(2026年1-8月).xlsx 一个工作簿内含 5 个年度 Sheet(2026年 / 2025年 / 2024年 / 2022年 / 2021年,源文件无 2023 年),而老逻辑只读第 1 个 Sheet 并按「左半今年 1–N 月 / 右半去年 1–12 月」的月度模板解析,其余年度数据被丢弃。DataImportService.java 中 importFreightTurnover 改为分流入口;原逻辑抽为 importFreightTurnoverByMonth(逐行不变);新增 detectYearSheets(识别多年度工作簿)、importFreightTurnoverByYear(按年入库 + 上年同期取自上一年度 Sheet)、parseWholeYearSheet(整年 Sheet 的货运量块/周转量块解析)、persistFreightTurnover(按报表期先删后插并记批次)。2021-12 / 2022-12 / 2024-12 / 2025-12 / 2026-08,每期 18 行;与源文件逐项比对 1080 个单元格零差异;重复导入幂等(全表 216 行 md5 前后一致);非多年度文件自动回退原月度路径。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 也照样渲染。tab.playwright.evaluate 直接读 DOM —— 弹窗内有且仅有 1 张表(preview-summary wb-table,12 行指标),表格下方只有两条同比缺失提示与「关闭」按钮,**第二张表已彻底消失**。有效截图:_qa_out/preview_summaryWorkbook_2026-08_verified_20260916.png(本轮复核重拍 ..._verified2_20260916.png,均 54006 字节)。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 个报表期。2021-12 等报表期是「整年」语义:这些期承载该年 1–12 月全年数据,而非 12 月单月;后续报表/审核若按单月口径取数需用户确认口径,必要时再改造。2023-12,2024-12 无上年同期。属源数据缺口。2026-01 ~ 2026-07 的 last_* 为空:经比对改动前备份(2026-04 的 INSERT)确认这几期改动前即为空,且本次导入未触碰这些报表期(批次只覆盖 5 个期),**非本次改动引入**;如需补上年同期需重新导入对应年度数据。_backup_freight_turnover_before_multiyear_20260916.sql 仅 59642 字节、只解析出 2026-04 一处 INSERT,**不能作为完整回滚依据**。Login.vue 错误提示细分、AI 外发脱敏补齐、4 张明细报表模板扩列、审核比对基准缺失保护、sys_role 权限落地、3D 验证码生产开启、backend.log 历史明文清理、仓库根目录临时文件清理。git fetch gitea 与远端 main 对比合并,禁强推。2021-12 / 2022-12 等「整年报表期」的业务口径,以及是否需要把年度数据拆成逐月报表期。2026-01~2026-07 的上年同期是否需要补齐。用户本轮提出 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 模板被修改 | 已适配并验证:新增 统一社会信用代码 / 填报单位 两列入库,新老格式双向兼容 |
*运输量*、*23年*、*货运量* 文件名;最后扫描 D:\05_数据分类 与 D:\桌面 下所有 .xlsx 的 Sheet 名,命中 7 月文件的 2023 Sheet。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 行。统一社会信用代码、填报单位 两列,其余 48 列整体右移。docs/init.sql、docs/database.md、PassengerEnterpriseMonthly.java、DataImportService.java、DataViewController.java(数据查看页列)。.xls 导入 767 条 0 失败且新列有值(**老文件其实也带这两列**),数值与既有 2026-08 完全一致;负向用例(选错类型)报错清晰。docs/database.md 里 | enterprise_name | varchar(200) | 企业名称 | 出现 4 次,首次批量替换误改 3 张表,已 git checkout 回退后改为「截取章节再替换」。Login.vue 默认 captchaRequired=false,改为 fail-safe(仅后端明确返回 required===true 才显示);换 WiFi/后端不可达时不再残留验证码白框。failWith(err, action) + errReason(raw) 重写,区分「连不上服务器」与「后端真实原因」;预览调用带 action='预览';Blob 错误先 text() 再解析。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。新建 docs/问题汇总/问题与注意事项汇总_2026-09-16.md,共 11 章:
速查表(10 条)、启动与进程管理、服务状态验证、数据库、数据导入(路径 + 期次约定 + 多年度工作簿识别规则)、报表生成、登录与验证码、文件写入与文本处理的坑、浏览器自动化取证的坑、Git 双仓库工作流、当前已知遗留问题。
required=false、表头 4 列且 x 坐标对齐、圆角 10px、拖动位移 120/160、关闭复位、弹窗内仅 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 | 仓库根目录大量 _*.* 临时文件 |
经用户同意后再清理 |
last_* / 2024-12 上年同期、预览弹窗文案是否调整。_*.* 临时文件。git fetch origin(个人 gitee,master):远端与本地一致(HEAD...origin/master = 0 0),**无同事/用户新提交**,无需合并。24b4c28:feat(h2031): 适配模板新增「统一社会信用代码/填报单位」两列并入库;fix(import): 补录 2023 年货运量周转量;fix(login/report): 验证码容错、预览指标对齐、弹窗可拖动圆角、失败提示细分;docs: 新增问题与注意事项汇总(10 个改动 + 4 个新增,共 14 个文件)。origin:git push origin main:master 成功(0cfd6e0..24b4c28)。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 合并,**禁强推**。| 用户反馈 | 结论与处置 |
|---|---|
| 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 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 合并,**禁强推**。比对对象: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》。
背景: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 另存。
S(2026 1-8月)、AT(2025)、BV(2024)、CW(2023)、DZ(2022)、EO(2021)。docs/生成汇总大表/生成_道路运输量汇总表.xlsx 的同名页:S5/AT5/BV5/CW5 是 Σ公式,DZ5 是 数值常量 144979.285376043,EO5/EP5 为空。2021 年 EC5:EN5 十二个月都有值(合计 161309.5316),只是累计列漏了。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 列。
2023 页湖北省行精度不同,差 0.0033。SummaryWorkbookFiller.fillFreightSheet),历史月份全部沿用母版 → 母版对不上就整体对不上。| # | 严重度 | 问题 |
|---|---|---|
| 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》。
27574bc(功能测试报告 + 本节 + .gitignore 补 _pylibs/、修正 ~$* 前导空格)→ 已推 origin(gitee master):559e937..27574bc。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 响应,待恢复后补推,**禁强推**。上一节我判定为「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 市州求和公式,全省行自然等于市州之和,累计列随之自动对上。
| 位置 | 改前 | 改后 |
|---|---|---|
| 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月」,目录下无匹配(导出日志确认「未找到同期备份母版」),不会冲掉改动。
| 年度 | 列 | 修复前 | 修复后 | 源文件核算 |
|---|---|---|---|---|
| 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 导出回归通过。
详见《功能测试报告/功能测试报告_货运页签累计列修复与脏期清理_2026-09-16.md》。