# 智能清洗端到端测试用例(smart-clean-test-cases) > 测试方式:浏览器实测(ZCode in-app browser),逐条执行、记录实际结果;发现 bug 即修复并重跑该条 + 相关回归条目。 > 测试账号:admin / admin123;前端 http://localhost:3100;后端 http://localhost:8980(`/js/a`)。 > 每次重启后端后必须:案件管理 → 打开案件(数据测试)→ 再继续。 > > 测试文件: > - **文件 A**:`周海--车辆登记信息.xls`(5.6KB,sheet「机动车信息」模板匹配失败 → AI 判定 → 待人工) > - **文件 B**:`周海--通信18905810269.xls`(92KB,通信记录可匹配模板 → 系统既有清洗) | # | 场景 | 步骤 | 预期 | 结果 | |---|---|---|---|---| | ① | 上传解析 A | 上传页注入文件 A | 解析树出现、sheet「机动车信息」模板匹配失败、「智能」可用 | ✅ / N/A | | ② | 上传解析 B | 上传页注入文件 B | 解析树出现、sheet 匹配模板成功、「智能」可用 | ✅ / N/A | | ③ | 混合上传 | 同批注入 A+B | 树中两文件、状态各自正确 | ✅ / N/A | | ④ | MD5 去重回归 | 再次上传文件 A(不删记录) | 后端跳过解析返回 null(原行为),页面无新树 | ✅ / N/A | | ⑤ | AI 判定推进 | 选 A 点「智能」→ 进度页 | AI 卡判定 0/1→1/1,阶段推进 | ✅ / N/A | | ⑥ | 待人工结论 | 判定完成 | 待人工 1、失败 0、阶段 DONE | ✅ / N/A | | ⑦ | 处理日志 | 查看处理日志 | 「融合清洗已启动」「开始处理:文件 A」两条 | ✅ / N/A | | ⑧ | AI 卡列表布局 | 待人工 ≥4 条时查看 | 卡内 ≤3 条 + 「查看全部 N」抽屉;抽屉含原因说明文案 | ✅ / N/A | | ⑨ | 判定详情 | 抽屉点「详情」 | 弹窗:原因/置信度五维/抽样统计/逐列校验/预览样本/模型草稿 | ✅ / N/A | | ⑩ | AI 重新判定 | 抽屉点「AI 重判」 | 受理成功提示;约几十秒后清单刷新出新结论 | ✅ / N/A | | ⑪ | 既有路径推进 | 选 B 点「智能」 | 无 AI 表 → doClean 推进 → 100% → 完成态 | ✅ / N/A | | ⑫ | 既有入库验证 | 完成后查数据 | 通信记录表有数据 | ✅ / N/A | | ⑬ | 混合批次 | A+B 点「智能」 | B 交既有清洗一次 doClean、A 待人工、批次 DONE | ✅ / N/A | | ⑭ | 混合互不影响 | 验证数据 | B 已入库、A 待人工,互不影响 | ✅ / N/A | | ⑮ | 清洗页有数据(核心 bug) | 进度页点「去人工确认」 | 清洗页树出现、sheet 被选中、预览数据加载 | ✅ / N/A | | ⑯ | 清洗页清单可见 | 看左栏 | 「待人工确认」面板含该表、原因、置信度 | ✅ / N/A | | ⑰ | 清单「处理」定位 | 点「处理」 | 树定位到目标 sheet、选中、预览加载 | ✅ / N/A | | ⑱ | 仅洗当前表 | 配模板规则后「导入数据」 | 头部出现「仅清洗当前表」徽标;提交树只含该 sheet;清洗完成 | ✅ / N/A | | ⑲ | 清单消项不丢 | 清洗后回清洗页 | 该项已消项(SUPERSEDED),其余待人工仍在 | ✅ / N/A | | ⑳ | 清洗页内详情 | 清单点「详情」 | 详情弹窗正常 | ✅ / N/A | | ㉑ | 清洗页内重判 | 清单点「AI 重判」 | 受理成功、清单轮询刷新 | ✅ / N/A | | ㉒ | 上传页行级手动清洗回归 | 上传页行级按钮 | 清洗页正常(原 sessionStorage 路径) | ✅ / N/A | | ㉓ | 上传页整页手动清洗回归 | 上传页「手动清洗」按钮 | 正常跳转清洗页 | ✅ / N/A | | ㉔ | importList 重新清洗回归 | 导入管理「重新清洗」 | reClean=1&fileId 路径正常 | ✅ / N/A | | ㉕ | 超时出口改手动清洗 | 融合页「改为手动清洗」 | 带 batchId → 清洗页按批次重建树 | ✅ / N/A | | ㉖ | Skip 入明细 | 构造 Skip(如删源文件后清洗) | 清单出现 Skip 项、计数与条数一致 | ✅ / N/A | | ㉗ | jobs 案件隔离 | 切换案件调 /aiClean/jobs | 只返回当前案件的 job | ✅ / N/A | | ㉘ | 重跑不重判待人工 | 有待人工时再点「智能」 | 日志显示沿用待人工、无新的模型调用 | ✅ / N/A | | ㉙ | 重判命中既有模板 | 重判后结论变化 | ExistingHit → dispatchExisting 走 doClean | ✅ / N/A | | ㉚ | SSE 断连/刷新恢复 | 进度页刷新 | restoreImportProgress 恢复进度继续 | ✅ / N/A | ## 执行记录 **测试共执行 3 轮混合批次 + 多轮单项验证(浏览器实测)**。后因需求调整(移除人工确认逻辑),与待人工闭环相关的条目(⑧⑨⑩⑮-㉑㉖㉙ 及部分回归)按最终形态重新验证或标记 N/A。 ### 已修复并验证的问题 1. **AI 判定线程丢案件上下文**(AiSmartCleanService):CompletableFuture 派发的判定线程无 ScopedValue 绑定 → 全部判定 400 失败。修复:判定任务包 CaseContextHolder.runWith。✅ 2. **模型调用总时长无上限**(LlmService):Reactor timeout 是片间超时,本地模型慢速流式输出 35 分钟不触发。修复:blockLast 总时长兜底(匹配调用 180s)+ 提示词要求简短推理(判定从 35min+ 降到 ~60s)。✅ 3. **/aiClean/jobs 跨案件越权**:加 caseId 过滤。✅ 4. **Skip 结论计数与明细不符**:Skip 也写入明细。✅ 5. **清洗页树兜底**:sessionStorage 被流程消费后可按 focusKey/batchId 从 /dm/getFiles 重建树(修复「人工确认页无数据」同源问题,超时出口「改为手动清洗」也依赖它)。✅ ### 最终形态(移除人工确认后)验证 - 混合批次(A 车辆登记 + B 通信记录):B 三表走系统清洗成功(272 条),A 判定后进入「无法清洗」;批次 DONE、失败 0。✅ - AI 卡指标更名「无法清洗(表)」、列表纯展示(无任何跳转/操作按钮),展示原因。✅ - 清洗页不再有待人工工作清单面板。✅ - 上传页行级/整页「手动清洗」、importList 重新清洗等旧入口不受影响。✅ - MD5 去重还原后重复上传仍被拦截。✅ ### 待人工确认逻辑(已按需求移除) - 相关代码(清单面板/详情弹窗/重判/resolve 接口/消项钩子/仅清洗当前表模式)已全部移除; git 历史中保留可随时恢复。 - ai_clean_job 仍以 NEED_REVIEW 状态记录「无法清洗」结论(原因可查),仅不再引导人工处理。