# 功能测试报告:数据导入页“清空数据”增强(按类型清空 + 按钮移出刷新行防误触) 2026-09-10 ## 功能说明 - 数据导入页右侧“导入进度”侧栏在原“刷新”旁去掉“清空”,改为在侧栏标题行下方新增独立危险操作区(浅红底 + 边框),内含 `el-button type="danger" plain` 的“清空数据…”按钮与说明“按报表期清库,用于整月重导”,与“刷新”物理分开,降低误触。 - 新增清空弹窗:显示当前报表期,选择“清空该报表期全部已导入数据”或“只清空指定类型”;选类型时用 `el-select multiple filterable`,按分组列出可选类型并标注“(已导入 N 行/未导入)”;底部红色警示语说明会同步删除审核结果、已审核标记与导入批次(投资项目主档保留)且不可撤销。 - 后端 `POST /api/import/clear` 增加可选参数 `types`(逗号分隔):为空 = 清空该报表期全部类型(原行为不变);非空 = 只清空指定数据类型,并同步清理其关联的 audit_result / audit_run / import_batch。 ## 涉及改动 - 后端 `DataImportService`:`clearPeriod(period, types)` 重载;新增静态映射 `CLEAR_TYPE_TO_OP`(类型→数据表操作键,同表归并去重)、`CLEAR_TYPE_TO_AUDIT`(类型→审核规则类型)、`CLEAR_TYPE_TO_BATCH`(类型→importType);新增 `clearTypeData(op, period)` 分派与 `deleteInvestmentMonthly(period, category)`(投资月度按项目类别过滤,仅删本期明细,投资主档保留)。返回值新增 `scope` 与 `types`,便于前端提示清空范围。 - 后端 `DataImportController`:`clearData` 增加 `types` 参数解析(空串/空项忽略)。 - 前端 `DataImport.vue`:移除 `.side-head-btns` 与旧 `clearPeriodData()`;新增 `.side-danger` 危险操作区、清空弹窗、`openClearDialog()/clearableGroups()/confirmClear()` 与 `clearDialog/clearScope/clearTypes` 状态;确认后再走一次 `$confirm` 二次确认,成功提示带删除行数。 ## 测试环境 - 后端:traffic-audit-server 8090(含本次改动;`start-dev.ps1` 启动,PID 21884,启动时间 2026-09-10 08:54:02,加载 `target/classes` 最新编译产物)。 - 前端:traffic-audit-web 8080 dev,`frontend.log` 最近一次 `Compiled successfully in 347ms`(08:53:29),热更新已生效。 - 数据库:本机 MySQL `localhost:3308/traffic_audit`,mysql CLI 直查核对;登录账号 `admin/123456`。 - 测试数据:一次性测试期 `2099-01 / 2099-02`,使用 `docs/货运需导入的数据/货运/2026年1-7月报/道路货物运输月度生产情况(2026年6月).xls`(636 行)与 2026-07 城市公交样本;真实月份仅做回归对比,不被写入或删除。 ## 用例表 | # | 用例 | 输入 | 预期 | 实际 | 结论 | |---|---|---|---|---|---| | 1 | 编译 | `mvn -o -q compile` | 通过 | 无报错 | 通过 | | 2 | 正向-按类型清空 | `POST /import/clear?period=2099-01&types=h2032` | 只删 h2032 及其 H2032 审核结果/批次 | dataRows=636、auditRows=31、auditRunRows=1、batchRows=1;DB 核对 h2032=0、H2032 规则审核结果=0、audit_run(H2032)=0、批次(H2032)=0 | 通过 | | 3 | 隔离性-其它类型不受影响 | 同上,清 h2032 后查 cityBus | cityBus 数据与审核/批次保留 | cityBus 业务 142 行、CITY_BUS 审核 53 行、audit_run(CITY_BUS)=1、批次(CITY_BUS)=1 均保留 | 通过 | | 4 | 隔离性-其它报表期不受影响 | 同上,查 2099-02 | 2099-02 数据不受影响 | 2099-02 数据完好 | 通过 | | 5 | 负向-非法类型 | `types=notAType` | 拒绝并提示 | HTTP 500,`清空失败: 未指定有效的数据类型` | 通过 | | 6 | 边界-有效+未知混合 | `types=cityBus,notAType` | 忽略未知、按有效类型执行 | 成功,返回 `scope=types, types=[cityBus,notAType]`,删除 0 行(该期无数据) | 通过 | | 7 | 边界-空类型列表 | 不传 `types` | 按全部类型清空(原行为) | 成功,`scope=all` | 通过 | | 8 | 投资按类别 | 插入 2099-01 客运站场/物流园区测试行后分别清空 | 只删对应类别,投资主档保留 | `types=investment` 只删客运站场、`types=investmentLogistics` 只删物流园区,`investment_project` 主档保留 | 通过 | | 9 | UI-按钮位置 | 打开数据导入页,展开“导入进度” | “刷新”旁无清空;清空按钮在独立红色危险区 | 与预期一致(可访问性树可读到“清空数据…”按钮与提示文案) | 通过 | | 10 | UI-弹窗选项 | 点“清空数据…” | 弹窗含报表期、全部/指定类型单选、类型下拉带导入状态 | 选中“道路货物运输月度生产情况(已导入 636 行)”,选项标签与状态一致 | 通过 | | 11 | UI-确认清空 | 选中 h2032 后点“确认清空” | 二次确认 → 成功提示含行数、进度回“未导入” | 提示“已清空 2099-01 数据:业务数据 636 行、审核结果 0 行、导入批次 1 条,可以重新导入”,进度回“未导入” | 通过 | | 12 | 回归-真实月份 | 清空前后对比 | 无变化 | 2099-01 残留=0;2026-09=636、2026-07=636、2025-07=664 未变;真实批次总数 239 未变 | 通过 | ## 发现的问题与处置 - 无功能性缺陷。测试期数据在验证结束后已全部清除,未残留。 - 说明(保留特性):一次清空会删除该报表期“全部类型”的业务数据及审核结果/已审核标记/导入批次,弹窗已用红色文案提示不可撤销;只想清单一类型时使用“只清空指定类型”,未导入的类型仍可勾选但不产生删除。 - 环境备注:本机库 `admin` 密码为 `123456`(`admin123` 在本机不匹配)。 ## 结论 - 通过。“清空数据…”已从“刷新”旁移出并做视觉隔离,弹窗支持按整期或按类型清空,接口按范围精确删除业务数据、审核结果、已审核标记与导入批次,且对其它类型、其它报表期与真实月份零影响。 - 待用户在自己浏览器验收一次按钮位置与弹窗文案。