新增“专项统计-重要节假日”模块,覆盖以下能力:
| 项目 | 内容 |
|---|---|
| 工作目录 | D:\Codex\MyProject\trafficAudit |
| 后端 | Spring Boot,http://localhost:8090 |
| 前端 | Vue 2 + Element UI,http://localhost:8080 |
| 数据库 | MySQL 127.0.0.1:3305/traffic_audit |
| 源工作簿 | docs/专项统计/重要节假日/2026年十一数据.xlsx |
| 快报模板 | docs/专项统计/重要节假日/湖北省国庆假期综合运输客流快报模板.docx |
| 编译 | mvn -q -DskipTests compile -f traffic-audit-server/pom.xml 通过 |
| 前端构建 | npm run build 通过,仅有原项目 bundle 体积 warning |
| 编号 | 类型 | 输入/操作 | 预期 | 实际 | 结论 |
|---|---|---|---|---|---|
| T01 | 初始化 | 启动后端 | 自动建/初始化 4 张节假日表 | 表存在,初始化完成 | 通过 |
| T02 | 初始化 | 查询节假日配置 | 2024/2026 年 7 天,2025 年 8 天 | 2024 年 7 天,2025 年 8 天,2026 年 7 天 | 通过 |
| T03 | 初始化 | 查询客流、车流 | 2024/2025 数据从源工作簿读取 | 客流 28/32 行;车流 14/16 行 | 通过 |
| T04 | 初始化 | 查询客运系数 | 2024-2026 年系数来自源工作簿 | 每年 HOLIDAY/NON_HOLIDAY 均 2.4,与源表一致 | 通过 |
| T05 | 入库抽查 | 源工作簿 vs 数据库逐项比对 | 无差异 | 90 个单元格比对,差异 0 | 通过 |
| T06 | 权限 | 未登录访问节假日接口 | 拦截 | HTTP 401,提示未登录 | 通过 |
| T07 | 权限 | 非 admin 保存节假日 | 拒绝 | code=403,提示仅 admin 可管理 | 通过 |
| T08 | 权限 | 非 admin 保存客运系数 | 拒绝 | code=403,提示仅 admin 可管理 | 通过 |
| T09 | 正向 | admin 新增/编辑/删除节假日 2030 测试记录 | 成功且无脏数据 | 新增、编辑成功;重复配置返回 400;删除成功 | 通过 |
| T10 | 正向 | admin 新增/编辑/删除客运系数 2030 测试记录 | 成功且无脏数据 | 新增、编辑成功;非法系数返回 400;删除成功 | 通过 |
| T11 | 正向 | 导入源工作簿 2025 年十一数据 | 覆盖写入 | 客流 32 条、车流 16 条,失败 0 | 通过 |
| T12 | 正向 | 导入临时 2026 测试工作簿(同值验证持平) | 写入并生成快报 | 客流 8 条、车流 4 条,失败 0;测试数据已清理 | 通过 |
| T13 | 负向 | 选择未配置年份导入 | 提示先维护节假日 | code=400,提示“请先在系统配置中维护节假日” | 通过 |
| T14 | 负向 | 导入非 Excel 文件 | 解析失败并提示 | code=400,提示 unsupported file type | 通过 |
| T15 | 负向 | 不传文件导入 | 业务提示,不返回 500 | code=400,提示“请选择要导入的 Excel 文件” | 通过 |
| T16 | 导出 | 导出 2025 年十一 Excel | 带库内数据,公式保留 | 文件可被 openpyxl 打开,2025 客流/车流数据正确 | 通过 |
| T17 | 快报 | 下载 2025-10-01 快报 | 首日正文不输出“环比……”;表格环比列为“—”,正文/表格完整 | 正文为“10月1日(假期第1天)……万人次,比2025年同期增长6.8%。”,无“环比”短语;表格环比列为“—” | 通过 |
| T18 | 快报 | 下载 2025-10-02 快报 | 环比为下降并输出绝对值 | 输出“环比下降11.5%” | 通过 |
| T19 | 快报 | 下载 2025-10-03 快报 | 环比为正并输出绝对值 | 输出“环比增长2.4%” | 通过 |
| T20 | 快报 | 临时构造 2026 第 1/2 日相同数据 | 环比为 0 时输出“持平” | 输出“环比持平” | 通过 |
| T21 | 并发/稳定 | 重启后连续生成快报 | 不串文档 | 两份不同日期快报内容正确 | 通过 |
| T22 | 前端 | admin 打开“专项统计-节假日” | 页面渲染、数据表显示 | 标题、菜单、表格正常 | 通过 |
| T23 | 前端 | admin 打开“系统配置” | 两个 Tab 正常 | 节假日管理、客运系数管理正常 | 通过 |
| T24 | 前端 | 非 admin 访问系统配置 | 菜单隐藏且直访被重定向 | 菜单不可见,直访回工作台 | 通过 |
| T25 | 前端 | 点击“下载模板” | HTTP 200,文件可下载 | 浏览器实际请求返回 200 | 通过 |
| T26 | 控制台 | 页面烟测收集 JS 错误 | 无错误 | 无 pageerror/console error | 通过 |
| T27 | 历史检查 | 已有 2026 第1日数据后,导入第1日被修改且第2日正常的文件(不确认) | 不写库,返回历史变化 | confirmationRequired=true,列出 6 条差异;库内第1日仍为原值 |
通过 |
| T28 | 历史检查 | 同上文件,用户确认允许导入 | 覆盖历史日数据 | 返回成功 12 条;库内第1日由 100/200/300 更新为 110/210/310 | 通过 |
| T29 | 前端确认 | 页面导入含历史变化的文件 | 弹窗显示差异和“允许导入/不允许” | 弹窗出现且包含原值/导入值;点击允许后导入成功 | 通过 |
| T30 | 默认日期 | 打开快报日期选择 | 默认系统日期前一天,可手工修改 | 页面默认取 2026-10-01,日期控件可选择 | 通过 |
| T31 | 菜单顺序 | 查看左侧菜单 | 专项统计位于报表生成之后 | 顺序为 报表生成 -> 专项统计 -> 规则管理 -> 用户管理 -> 系统配置 | 通过 |
| T32 | 精度 | Excel 客运系数 2.4 入库后查询 | 不出现 2.3999999999999995 | 库内 2024/2025/2026 年系数均为 2.4,接口返回 coefficient=2.4 | 通过 |
| T33 | 精度 | 系统配置-客运系数管理列表 | 显示 2.4 | 浏览器实测两行均显示 2.4 | 通过 |
| T34 | 精度 | 节假日统计页客运系数列 | 显示 2.4 | overview 接口与页面均显示 2.4 | 通过 |
| T35 | 精度 | 检查节假日数值列类型 | decimal(30,15) | passenger_count/vehicle_count/coefficient/comparison_base 均为 decimal(30,15) | 通过 |
| T36 | 导入口径 | 导入含 2024/2025 历史列与客运系数列的 2026 工作簿 | 只读 2026 当年列,不写 2024/2025,不读系数 | 写入 12 条(客流 8 + 车流 4),2024/2025 列与系数列未入库 | 通过 |
| T37 | 历史检查回归 | 已有 2026 第1/2 日数据后,导入第1日被改动的文件(不确认) | 不写库并列出差异 | confirmationRequired=true,列出 6 条差异,库内第1日仍为 100/100/100/100/200/300 | 通过 |
| T38 | 历史检查回归 | 同上文件,用户确认允许导入 | 覆盖历史日数据 | 返回成功 12 条,库内第1日更新为 110/110/110/110/210/310,第2日不变 | 通过 |
| T39 | 页面表头 | 节假日数据一览表头加单位 | 列头带单位 | 实测:铁路/民航/道路/水路(万人次),高速车流/国省道车流(万辆次),非营业性人员流动量/总人员流动量(万人次),客运系数无单位 | 通过 |
| T40 | 配置回归 | admin 删除 2026-10-08 后重启后端 | 删除结果保持,不再自动补回 | 重启后库内、接口和页面均为 2026-10-01 至 10-07 共 7 天 | 通过 |
| T41 | 环比基期导入 | 2026 年普通国省道 C 列填 320、D 列填 360 | C 列作为环比基期保存,D 列为当日车流 | 库内 comparison_base=320,vehicle_count=360;接口均返回 | 通过 |
| T42 | 环比基期导出 | 导出已导入基期的 2026 年数据 | 普通国省道 C 列回填基期,D 列回填当日车流 | 导出文件 C4=320、D4=360 | 通过 |
| T43 | 国省道车流环比 | 2026-10-02 国省道当日360、基期320 | 仅国省道直接环比使用基期 | 国省道车流环比为12.50%;快报总人员流动量仍为17.00%,不受基期影响 | 通过 |
| T44 | 映射导出 | 有基期时导出普通国省道 E 列公式 | E 使用当日与环比基期计算 | 导出 E4 公式为 =(D4-C4)/C4 |
通过 |
| T45 | 历史基期变更 | 已有 2026 第1日基期后,导入新的第1日基期值 | 不确认时零写入并列出差异 | confirmationRequired=true,提示原值300/导入值310,库内仍为300 | 通过 |
| T46 | 历史年份隔离 | 导出 2024/2025 年数据 | 历史年份不使用环比基期 | 两份导出文件普通国省道 C3:C10 均为空 | 通过 |
| T47 | 快报首日口径 | 下载 2025-10-01 快报并检查正文 | 第1天不生成“环比增长/下降/持平”短语 | 正文为“10月1日(假期第1天),全省全社会跨区域人员流动量1714.41万人次,比2025年同期增长6.8%。”;第二天仍输出“环比下降11.5%” | 通过 |
| T48 | 快报百分比精度 | 下载 2025-10-01/02 快报检查正文和表格 | 同比/环比百分比保留1位小数,人数/车流保留2位小数 | 6.79%显示为6.8%,11.46%显示为11.5%;人数1714.41、1518.02仍为2位小数 | 通过 |
encodeURIComponent,把 / 编码为 %2F,Tomcat 返回 400。ThreadLocal 保存当前文档,并在请求结束时清理;重启后复测连续生成通过。seedNationalDayCalendar() 改为仅在 holiday_calendar 整表为空时执行首次初始化;非空配置完全由 admin 维护。复测重启后 2026 年十一保持 7 天。import_batch 节假日导入记录已删除。重要节假日专项统计模块的正向流程、权限控制、数据初始化、导入导出、快报生成和前端页面烟测均通过;源工作簿 90 个数据单元格入库抽查无差异。发现的问题已修复并完成回归,当前后端 8090、前端 8080 正常运行。
背景:Excel 内部按 IEEE 754 双精度浮点存储数值(有效 15 位),库内客运系数原为 2.3999999999999995,页面显示异常。参考 docs/Excel浮点数存储.txt 全面整改。
修改内容:
HolidayNumberUtils:Excel 单元格数值统一用 NumberToTextConverter.toText(double) 转文本再入 BigDecimal,计算使用 MathContext(15, HALF_UP),与 Excel 15 位有效数字保持一致。Double 改为 BigDecimal。DECIMAL(30,15):holiday_passenger_flow.passenger_count、holiday_vehicle_flow.vehicle_count、holiday_passenger_coefficient.coefficient;迁移脚本 docs/sql_holiday_decimal_migration.sql。验证结果:
mvn -q -DskipTests compile 通过;npm run build 通过(仅原有 bundle 体积警告)。coefficient=2.4。decimal(30,15)。import_batch 记录已清理;2024/2025 历史数据与 2024-2026 客运系数保留。现象:admin 已在系统配置中删除 2026-10-08,但后端重启后该行再次出现。
根因:HolidayReferenceDataInitializer 在每次应用启动时调用 seedNationalDayCalendar(),原逻辑按固定天数遍历并补齐所有缺失的第 N 日,因此把 admin 已删除的日期重新插入。
修复与验证:
HolidayWorkbookService.seedNationalDayCalendar() 增加非空保护:节假日表只要已有任一配置,就不再进行自动补种。2026-10-01 至 2026-10-07 共 7 天。dayIndex=7、date=2026-10-07。背景:普通国省道 C 列为“环比基期”。当普通国省道流量趋势与高速公路不一致时,以高速为准,手工填写基期,环比按 当日 / 环比基期 - 1;未填写时仍按 当日 / 前一日 - 1。
实现口径:
holiday_vehicle_flow 新增可空字段 comparison_base DECIMAL(30,15),迁移脚本 docs/sql_holiday_comparison_base_migration.sql。comparison_base,D 列导入为 vehicle_count;导出时 C/D 列分别回填。当日 / 基期 - 1,无基期时 当日 / 前一日 - 1。=(D-C)/C。