cc 3 hours ago
parent
commit
f73f930943
1 changed files with 36 additions and 0 deletions
  1. 36 0
      .zcode/plans/plan-sess_fcb234c9-7ddf-4f56-bd52-e9187c480b56.md

+ 36 - 0
.zcode/plans/plan-sess_fcb234c9-7ddf-4f56-bd52-e9187c480b56.md

@@ -0,0 +1,36 @@
+# 文件上传与数据清洗(4级降级)逻辑验证计划
+
+## 0. 两个已拍板的决策
+1. **「完全匹配不到模板」按需求改**:应走3级用文件自身表头新建动态表(TEXT 兜底),4级只保留给结构归一/无绑定/置信不足等硬失败。当前代码落4级属缺陷 → 测试确认后修复。
+2. **AI 新建表不写 `table_info`/`table_field`**(遵循 `AiCleanStore` 既有设计):治理结果分类数据走既有机制——治理树负数 id 节点 → `/aiClean/data/page` 分流(`GovernService:380` 治理后重建 AI 节点、前端 `index.vue:1287` 已分流)。测试验证这条链路能查到数据即可,不改代码。
+
+## 一、逻辑梳理结论(已逐行核实)
+
+**上传(L1判定)**:`upload.vue:475` → `/dm/preFileUpload` → `PreDataListener`:每 sheet 建预览表 `raw_{sheetId}`,默认 `MATCHED_FAIL`;前20行 `matchTemplate:340`(全字段+必填字段包含)→ 命中打 `templateId`,未命中留给 AI 链路。
+
+**智能清洗(4级降级)**:`/aiClean/smartClean` → `AiSmartCleanService.run:148`,只接管 `templateId==null` 的 sheet(:160 守卫):
+- **2级**:AI 三腿匹配(表头指纹→打分≥0.90→LLM top-12 置信≥0.6)命中**既有模板**且 STRONG → ExitA → 与1级合并成**一次** doClean 写业务表
+- **3级**:命中 **AI 模板库**(指纹/打分/LLM)或 **WEAK 弱匹配** → ExitB → `loadViaAiTemplate:355` 建 `ai_t{id}` 动态表+登记 AI 模板(写数成功才 ONLINE,0行/失败删表)
+- **4级**:无候选/需结构归一/无可用绑定/置信度不过放行线 → 直接 NEED_REVIEW 标记,原因进 `need_review_detail`,前端日志「AI 无法清洗:表名(原因)」
+- 日志绑定:行级失败→`clean_error_log(fileId+sheetId+batchId)`;每 sheet→`ai_clean_job`;批次→`ai_clean_batch`
+
+## 二、测试用例矩阵(写入 smart-clean-test-cases.md 新章节「4级降级专项验证」)
+
+**A组 上传与L1判定**(①–④回归):A1 文件B→MATCHED_SUCCESS;A2 文件A→MATCHED_FAIL;A3 混合上传状态正确;A4 非法后缀不落盘;A5 MD5去重
+**B组 1级**:B1 仅文件B→零AI判定、doClean、业务表行数正确;B2 行级失败→clean_error_log 三字段绑定正确
+**C组 2级**(新造文件C=B表头同义改写):C1 →ExitA(job.exitCode=A/refTemplateId 正确,合并一次doClean)
+**D组 3级**(新造文件D/E):D1 同义改写+噪声列→ExitB 建 ai_t{id}、ONLINE、行数正确;D2 同表头二次清洗→header_md5 唯一键是复用还是冲突(**重点观察**);**D3 完全无关表头→修复后应新建表(文件表头+TEXT),修复前确认缺陷**;D4 0行→删表不登记、job失败
+**E组 4级**(新造文件F=合并单元格):E1 →NeedReview("需要结构归一");E2 必填大量空值→置信度不过线(视LLM行为);E3 NEED_REVIEW 落地全链断言(job状态/批次计数/明细/前端日志/不写数据表)
+**F组 守卫与治理结果**:F1 templateId 非空零AI判定;F2 jobs案件隔离;F3 **AI 表在治理结果分类树可见(负数id节点)、点开数据可查(/aiClean/data/page)、治理任务重建后不丢**(验证既有闭环)
+
+## 三、执行步骤
+1. **单测基线**:`mvn test` 跑 aiclean 模块 13 类 68 用例,确认全绿
+2. **补单测**:D3 修复的新路径(无候选→文件表头自建 AiPlan)、needsStructure 门、0行清理;跑绿
+3. **造测试文件 C/D/E/F**(.xlsx 放 `public/__test__/`,从文件B读表头构造C)
+4. **环境**:确认后端8980/前端3100在跑(不在则启动),打开测试案件
+5. **浏览器 E2E**(延续既有方式):按矩阵逐条执行,断言=状态/jobs接口+前端UI+必要查库,结果实时记录
+6. **缺陷修复**:主修 D3——`AiCleanService.judge` 无候选分支改为用文件自身表头构建 AiPlan(AiColumnNames 消毒、全 TEXT、无清洗函数),需结构归一等硬失败仍落4级;`loadViaAiTemplate` 兼容 draft 为空;补单测+E2E 重验;其余新发现 bug 一并修复重跑
+7. **收尾**:更新 smart-clean-test-cases.md(逻辑梳理/用例/执行记录),输出汇总报告
+
+## 风险说明
+- 2/3级判定走真实 LLM(单次几十秒),E2E 判定次数控制在5次左右;新测试文件统一用 .xlsx