Quellcode durchsuchen

fix: 标题行文件被误判「需结构归一」导致清洗成功但数据不进表

文件A(周海--车辆登记信息.xls,单标题行+表头行)智能清洗后完成面板显示成功,
但数据没进表:needsStructure 把 headerRow>1(表头不在首行)当硬失败且先于候选匹配执行,
降级链 1→2→3 未走完即被拦截落 4 级 NEED_REVIEW。

而 BlockDetector 取第一个密集行作表头,标题行场景已被正确定位,数据按探测行号切,
这类文件完全可以清洗——旧条件拦下的恰恰全是可清洗文件。
修复:needsStructure 只保留 primaryMergeCount()>0(仅合并单元格会真正读错位)。

实测:文件A 走完 1级(无直配)→2级(AI判定WEAK)→3级自建表,3 行车辆数据全部入库 ai_t。
cc vor 1 Woche
Ursprung
Commit
650cdbfdf3

+ 8 - 2
ai-server/src/main/java/com/zsjz/ai/module/aiclean/service/AiCleanService.java

@@ -510,15 +510,21 @@ public class AiCleanService {
     }
 
     /**
-     * 主表块内有合并区、或表头上方存在标题/说明行时认为需要结构归一。
+     * 主表块内有合并区时才认为需要结构归一。
      *
      * <p>合并区只看<b>主块自己的</b>({@link SheetEvidence#primaryMergeCount()}):
      * 旧实现用整个 sheet 的合并区数一票否决,远处一个无关合并格就能把整张表打入人工
      * (评审 P2-7);而 Fesod 读数只会被本块范围内的合并区弄脏,块外的不影响主块。
      * STRUCTURING 状态留给 P1 的结构归一出口(A2/A3),本版本仍不执行。
+     *
+     * <p><b>2026-10-13 放宽</b>:不再把 {@code headerRow > 1}(表头前有标题/说明行)当硬失败 ——
+     * {@link com.zsjz.ai.module.aiclean.probe.BlockDetector} 取第一个密集行作表头,
+     * 「机动车信息」这种单标题行 + 表头行的常见文件已被正确定位,数据读取一律按探测行号切,
+     * 完全可以清洗;旧条件拦下的恰恰都是这类可清洗文件(用户实测:智能清洗"成功"但数据没进表)。
+     * 真正会读错位的是合并单元格,仍由此条件拦住。
      */
     private boolean needsStructure(SheetEvidence ev) {
-        return ev.primaryMergeCount() > 0 || ev.primaryBlock().headerRow() > 1;
+        return ev.primaryMergeCount() > 0;
     }
 
     /**