KgQueryTool.java
3.15 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
package com.xly.tool;
import dev.langchain4j.agent.tool.P;
import dev.langchain4j.agent.tool.Tool;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
/**
* 知识图谱查询工具(M1)。
*
* <p>目前只暴露 {@link #findForms} 一个只读能力:按关键词检索 ERP 业务表单目录
* (视图 {@code viw_ai_useful_forms},1748 张有用业务表单)。这是「表单名 → formId/moduleId」
* 定位的过渡实现,也是后续 KgSearch / formId 解析的雏形。
*
* <p>表单目录是**全局元数据**(对所有品牌一致),不涉及行级/租户数据,因此不需要租户过滤。
*/
@Component
public class KgQueryTool {
private final JdbcTemplate jdbc;
public KgQueryTool(JdbcTemplate jdbc) {
this.jdbc = jdbc;
}
@Tool("按关键词检索 ERP 业务表单目录,返回匹配的表单名、底层数据源、所属菜单id(moduleId) 与表单id(formId)。"
+ "当用户提到某类单据或报表、但你不确定具体是哪一张表单时,先用它来定位。最多返回 15 条。")
public String findForms(
@P("表单名或业务关键词,例如:报价 / 客户 / 库存 / 送货 / 应收 / 采购订单") String keyword) {
if (keyword == null || keyword.isBlank()) {
return "请提供一个表单名或业务关键词再检索。";
}
String kw = keyword.trim();
String like = "%" + kw + "%";
List<Map<String, Object>> rows = jdbc.queryForList(
"SELECT af.sFormTitle, af.sDataSource, af.sExecType, af.sModuleId, af.sFormId " +
"FROM viw_ai_useful_forms af " +
"LEFT JOIN viw_kg_form f ON f.sFormId = af.sFormId " +
"WHERE af.sFormTitle LIKE ? " +
"ORDER BY COALESCE(f.bAiTool,0) DESC, (af.sExecType='table') DESC, " +
"(COALESCE(f.iUpstream,0)+COALESCE(f.iDownstream,0)) DESC, CHAR_LENGTH(af.sFormTitle) ASC " +
"LIMIT 12",
like);
if (rows.isEmpty()) {
return "没有找到名称包含「" + kw + "」的业务表单。可以换个更常见的说法,或告诉我更具体的单据名称。";
}
StringBuilder sb = new StringBuilder();
sb.append("找到 ").append(rows.size()).append(" 张与「").append(kw).append("」相关的业务表单:\n\n");
sb.append("| 表单 | 数据源(").append("表/视图/存储过程) | 菜单id | 表单id |\n");
sb.append("|---|---|---|---|\n");
for (Map<String, Object> r : rows) {
sb.append("| ").append(str(r.get("sFormTitle")))
.append(" | ").append(str(r.get("sDataSource"))).append(" · ").append(str(r.get("sExecType")))
.append(" | ").append(str(r.get("sModuleId")))
.append(" | ").append(str(r.get("sFormId")))
.append(" |\n");
}
return sb.toString();
}
private static String str(Object o) {
return o == null ? "" : o.toString();
}
}