diff --git a/pom.xml b/pom.xml
index 3b22e6d..2ba3470 100644
--- a/pom.xml
+++ b/pom.xml
@@ -74,6 +74,7 @@
org.springframework.boot
spring-boot-starter-webflux
+
org.springframework.boot
spring-boot-starter-thymeleaf
diff --git a/src/main/java/com/xly/agent/DynamicTableNl2SqlAiAgent.java b/src/main/java/com/xly/agent/DynamicTableNl2SqlAiAgent.java
index da4a81c..ec78a8f 100644
--- a/src/main/java/com/xly/agent/DynamicTableNl2SqlAiAgent.java
+++ b/src/main/java/com/xly/agent/DynamicTableNl2SqlAiAgent.java
@@ -23,10 +23,11 @@ public interface DynamicTableNl2SqlAiAgent {
2. 输出格式:仅返回SQL语句本身,无任何解释、换行、```sql/```包裹、备注、多余空格,直接输出可执行SQL;
3. 编写规范:
3.1 多表关联必须使用 表名+字段名(如表名.字段名),严格按下面[涉及表名]中的表次序关联,聚合函数(SUM/COUNT/AVG/MIN/MAX)必须加业务化别名,日期过滤使用标准DATE格式(yyyy-MM-dd);
- 3.2 SQL所有字段均采用 表名.字段名 方式生成,务必确保 字段名 在相应的 表名 描述的字段中存在,如果不存在重试其它方式,直到满足条件
- 3.3 SQL所有字段涉及的所有表名,都要**严格**按下面[涉及表名]中的表次序关联,没有关联不允许使用
- 3.4 SQL所有的查询条件,如果是字符类型的字段,均需要加不为空判断,用示例格式判断,示例:ifnull(customername,'')<>''
- 3.5 SQL所有的显示字段的别名中,不能出现空格,如: tCreateDate as earliest 订单日期,正确的应是 tCreateDate as earliest订单日期
+ 3.2 SQL所有字段均采用 表名.字段名 方式生成,务必确保 字段名 在相应的 表名 描述的字段中存在,如果不存在重试其它方式,直到满足条件;
+ 3.3 SQL所有字段涉及的所有表名,都要**严格**按下面[涉及表名]中的表次序关联,没有关联不允许使用;
+ 3.4 SQL所有的查询条件,如果是字符类型的字段,均需要加不为空判断,用示例格式判断,示例:ifnull(customername,'')<>'';
+ 3.5 SQL所有的查询条件,如果是日期类型的字段,均需要加不为空判断,用示例格式判断,示例:tmakedate is not Null;
+ 3.6 SQL所有的显示字段的别名中,不能出现空格,如: tCreateDate as earliest 订单日期,正确的应是 tCreateDate as earliest订单日期
4. 安全约束:禁止生成任何DDL/DML语句(DROP/ALTER/INSERT/UPDATE/DELETE等),禁止使用子查询、存储过程、自定义函数、临时表;
5. 精准性:
5.1 严格按用户需求+传入的表结构生成,仅使用指定字段/表,无多余字段、无无效表关联、无冗余过滤条件;
diff --git a/src/main/java/com/xly/entity/UserSceneSession.java b/src/main/java/com/xly/entity/UserSceneSession.java
index d08a292..b200072 100644
--- a/src/main/java/com/xly/entity/UserSceneSession.java
+++ b/src/main/java/com/xly/entity/UserSceneSession.java
@@ -41,6 +41,12 @@ public class UserSceneSession {
private SceneDto currentScene;
private ToolMeta currentTool;
+
+ /***
+ * 当前未清返回的数据集
+ **/
+ private Map> currentRowData;
+
/***
* @Author 钱豹
* @Date 10:07 2026/1/31
diff --git a/src/main/java/com/xly/service/XlyErpService.java b/src/main/java/com/xly/service/XlyErpService.java
index 350bff9..b27c2ea 100644
--- a/src/main/java/com/xly/service/XlyErpService.java
+++ b/src/main/java/com/xly/service/XlyErpService.java
@@ -108,6 +108,7 @@ public class XlyErpService {
//5.执行工具方法后,清除记忆
if(session.getBCleanMemory()){
operableChatMemoryProvider.clearSpecifiedMemory(userId);
+ session.setCurrentTool(null);
session.setBCleanMemory(false);
}
// 6.找到方法并且本方法带表结构描述时,需要调用 自然语言转SQL智能体
@@ -318,6 +319,7 @@ public class XlyErpService {
session.setBCleanMemory(false);
session.setCurrentTool(null);
session.setCurrentScene(null);
+ session.setCurrentRowData(null);
UserSceneSessionService.USER_SCENE_SESSION_CACHE.put(userId, session);
// 清空Agent缓存
UserSceneSessionService.ERP_AGENT_CACHE.remove(userId);
diff --git a/src/main/java/com/xly/tool/DynamicToolProvider.java b/src/main/java/com/xly/tool/DynamicToolProvider.java
index 0f8d74e..2c02422 100644
--- a/src/main/java/com/xly/tool/DynamicToolProvider.java
+++ b/src/main/java/com/xly/tool/DynamicToolProvider.java
@@ -20,10 +20,7 @@ import com.xly.mapper.ParamRuleMapper;
import com.xly.mapper.ToolMetaMapper;
import com.xly.service.DynamicExeDbService;
import com.xly.service.UserSceneSessionService;
-import com.xly.util.DeepCopyUtils;
-import com.xly.util.HttpsRequestUtil;
-import com.xly.util.JsonUtils;
-import com.xly.util.OkHttpUtil;
+import com.xly.util.*;
import dev.langchain4j.agent.tool.*;
import dev.langchain4j.data.message.ChatMessage;
@@ -233,7 +230,15 @@ public class DynamicToolProvider implements ToolProvider {
StringBuffer sl = new StringBuffer();
if(ObjectUtil.isNotEmpty(meta.getStoolDesc())){
- stoolDesc.append("MethodNo:").append(meta.getSMethodNo()).append(",核心工作内容:【").append(meta.getSMethodName()).append("】").append(meta.getStoolDesc());
+ stoolDesc.append("MethodNo:").append(meta.getSMethodNo()).append(",核心工作内容:【").append(meta.getSMethodName());
+// if (meta.getIBizType()==4){
+// stoolDesc.append(",").append("并选择数据后执行["+meta.getSControlName()+"]操作");
+// }
+ stoolDesc.append("】").append(meta.getStoolDesc());
+ if (meta.getIBizType()==4){
+ stoolDesc.append(",").append("并选择数据后执行 "+meta.getSControlName()+" 操作");
+// .append("1.全部数据生成多个单据 回复【全部确认】;2.全部数据生成一个单据 回复【合并确认】;3.按自然语义描述生成一个单据 如"1,3行确认"");
+ }
}
if("boxQuote".equals(meta.getSMethodNo())){
log.info(meta.getSParamRules());
@@ -558,6 +563,14 @@ public class DynamicToolProvider implements ToolProvider {
// {"0":"查询","1":"执行"} 查询不需要确认
Boolean isConfirmed = isConfirmed(input) || input.contains("生成") || input.contains("确认");
+ //判断是否生成数据
+ List