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;
/**
* 知识图谱查询工具(架构 §5 #3 KgSearch / §11)。两个只读能力:
*
* - {@link #findForms} —— 按关键词检索 ERP 业务表单目录(视图 {@code viw_ai_useful_forms},
* 1748 张有用业务表单),即「表单名 → formId/moduleId」定位;
* - {@link #kgSearch} —— L2 单据流转/相邻单据({@code viw_kg_form_neighbors})与
* L3 字段→表/列({@code viw_kg_field_dict}),按词查询、结果截断,绝不整表 dump。
*
*
* 表单目录是**全局元数据**(对所有品牌一致),不涉及行级/租户数据,因此不需要租户过滤。
*/
@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