package com.xly.service; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 表单 / 字段解析(KgSearch 内核)—— 把「实体类型 / 字段中文名」解析到具体的 * 主表 / formId / moduleId / 技术列名,供 Read 与 Write 共用,集中一处避免各工具各猜一套。 * *

数据全部来自已物化的知识图谱视图:{@code viw_ai_useful_forms} / {@code viw_kg_form} * / {@code viw_kg_field_dict}。 */ @Service public class FormResolverService { private final JdbcTemplate jdbc; public FormResolverService(JdbcTemplate jdbc) { this.jdbc = jdbc; } /** * 定位某实体的**可改主表**:该实体名下、table 类型、排除报表视图(viw_*)、按 AI工具/连接度/名称长度 * 取最常用的一张。返回含 sFormId / sModuleId / sDataSource 的行,找不到返回 null。 */ public Map resolveMasterForm(String entityKeyword) { if (isBlank(entityKeyword)) { return null; } try { List> r = jdbc.queryForList( "SELECT af.sFormId, af.sModuleId, af.sDataSource, af.sFormTitle FROM viw_ai_useful_forms af " + "LEFT JOIN viw_kg_form f ON f.sFormId = af.sFormId " + "WHERE af.sFormTitle LIKE ? AND af.sExecType='table' AND af.sDataSource NOT LIKE 'viw%' " + "ORDER BY COALESCE(f.bAiTool,0) DESC, " + "(COALESCE(f.iUpstream,0)+COALESCE(f.iDownstream,0)) DESC, CHAR_LENGTH(af.sFormTitle) ASC LIMIT 1", "%" + entityKeyword.trim() + "%"); return r.isEmpty() ? null : r.get(0); } catch (Exception e) { return null; } } /** 表单数据源表 -> 字段中文名(字段字典),用于把技术列名渲染为中文表头。 */ public Map fieldLabels(String formId) { Map m = new HashMap<>(); try { List> rows = jdbc.queryForList( "SELECT fd.sField AS f, MIN(fd.sChinese) AS zh FROM viw_ai_useful_forms af " + "JOIN viw_kg_field_dict fd ON fd.sTable = af.sDataSource " + "WHERE af.sFormId = ? GROUP BY fd.sField", formId); for (Map r : rows) { Object f = r.get("f"); Object zh = r.get("zh"); if (f != null && zh != null) { m.put(f.toString(), zh.toString()); } } } catch (Exception ignore) { } return m; } /** 猜该表单/表的"名称"字段(以 Name 结尾、使用最广),用于按关键词过滤 / 展示记录名。 */ public String resolveNameField(String table) { return queryOne( "SELECT sField FROM viw_kg_field_dict WHERE sTable=? AND sField LIKE '%Name' AND sField NOT LIKE '%NameId' " + "ORDER BY iFormUses DESC LIMIT 1", table); } /** 字段中文名 -> 技术列名(先精确、再模糊)。 */ public String resolveField(String table, String fieldChinese) { String f = queryOne( "SELECT sField FROM viw_kg_field_dict WHERE sTable=? AND sChinese=? ORDER BY iFormUses DESC LIMIT 1", table, fieldChinese.trim()); if (f == null) { f = queryOne( "SELECT sField FROM viw_kg_field_dict WHERE sTable=? AND sChinese LIKE ? ORDER BY iFormUses DESC LIMIT 1", table, "%" + fieldChinese.trim() + "%"); } return f; } private String queryOne(String sql, Object... args) { try { List> r = jdbc.queryForList(sql, args); if (!r.isEmpty()) { Object v = r.get(0).values().iterator().next(); return v == null ? null : v.toString(); } } catch (Exception ignore) { } return null; } private static boolean isBlank(String s) { return s == null || s.isBlank(); } }