FormResolverService.java
4.23 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
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 共用,集中一处避免各工具各猜一套。
*
* <p>数据全部来自已物化的知识图谱视图:{@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<String, Object> resolveMasterForm(String entityKeyword) {
if (isBlank(entityKeyword)) {
return null;
}
try {
List<Map<String, Object>> 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<String, String> fieldLabels(String formId) {
Map<String, String> m = new HashMap<>();
try {
List<Map<String, Object>> 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<String, Object> 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<Map<String, Object>> 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();
}
}