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 守卫):
loadViaAiTemplate:355 建 ai_t{id} 动态表+登记 AI 模板(写数成功才 ONLINE,0行/失败删表)need_review_detail,前端日志「AI 无法清洗:表名(原因)」clean_error_log(fileId+sheetId+batchId);每 sheet→ai_clean_job;批次→ai_clean_batchA组 上传与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)、治理任务重建后不丢(验证既有闭环)
mvn test 跑 aiclean 模块 13 类 68 用例,确认全绿public/__test__/,从文件B读表头构造C)AiCleanService.judge 无候选分支改为用文件自身表头构建 AiPlan(AiColumnNames 消毒、全 TEXT、无清洗函数),需结构归一等硬失败仍落4级;loadViaAiTemplate 兼容 draft 为空;补单测+E2E 重验;其余新发现 bug 一并修复重跑