diff --git a/src/main/java/com/xly/entity/ToolMeta.java b/src/main/java/com/xly/entity/ToolMeta.java index b2e4542..46f6601 100644 --- a/src/main/java/com/xly/entity/ToolMeta.java +++ b/src/main/java/com/xly/entity/ToolMeta.java @@ -51,5 +51,6 @@ public class ToolMeta { private String sVectorjson; private String sVectorfiledAll; private String sVectorfiledShow; + private Boolean sQue = false; } diff --git a/src/main/java/com/xly/milvus/service/impl/AiGlobalAgentQuestionSqlEmitterServiceImpl.java b/src/main/java/com/xly/milvus/service/impl/AiGlobalAgentQuestionSqlEmitterServiceImpl.java index 5104e58..de66f1a 100644 --- a/src/main/java/com/xly/milvus/service/impl/AiGlobalAgentQuestionSqlEmitterServiceImpl.java +++ b/src/main/java/com/xly/milvus/service/impl/AiGlobalAgentQuestionSqlEmitterServiceImpl.java @@ -85,7 +85,11 @@ public class AiGlobalAgentQuestionSqlEmitterServiceImpl implements AiGlobalAgent InsertResp insertResp = milvusClient.insert(insertReq); //是否初始化。初始化不需要插入到数据库 if(!isInit){ - //调用数据库插入数据库 + //调用数据库插入数据库] + if(ObjectUtil.isEmpty(data.get("userInput"))){ + Object userInput = ObjectUtil.isNotEmpty(data.get("sUserInput"))?data.get("sUserInput").toString():data.get("userInput"); + data.put("userInput",userInput); + } Map searMap = dynamicExeDbService.getDoProMap(sProName, data); dynamicExeDbService.getCallPro(searMap, sProName); } diff --git a/src/main/java/com/xly/milvus/service/impl/MilvusServiceImpl.java b/src/main/java/com/xly/milvus/service/impl/MilvusServiceImpl.java index 42c4b71..27b0eb4 100644 --- a/src/main/java/com/xly/milvus/service/impl/MilvusServiceImpl.java +++ b/src/main/java/com/xly/milvus/service/impl/MilvusServiceImpl.java @@ -164,7 +164,7 @@ public class MilvusServiceImpl implements MilvusService { if(ObjectUtil.isNotEmpty(sUserInput)){ //根据问题查询向量库 Map serMap = aiGlobalAgentQuestionSqlEmitterService.queryAiGlobalAgentQuestionSqlEmitter(searchText, "ai_global_agent_question_sql"); - if(ObjectUtil.isNotEmpty(serMap)){ + if(ObjectUtil.isEmpty(serMap)){ aiGlobalAgentQuestionSqlEmitterService.addAiGlobalAgentQuestionSqlEmitter(searchText,one,sUserInput,sSqlContent,"MYSQL","ai_global_agent_question_sql",false); }else{ sb.append(sUserInput).append("已经存在").append("\n"); diff --git a/src/main/java/com/xly/service/XlyErpService.java b/src/main/java/com/xly/service/XlyErpService.java index 43f9d65..ded41e6 100644 --- a/src/main/java/com/xly/service/XlyErpService.java +++ b/src/main/java/com/xly/service/XlyErpService.java @@ -515,16 +515,16 @@ public class XlyErpService { // 待条件全查 不带 10条 List> data = milvusService.getDataToCollection(sInputTabelName, milvusFilter,userInput,pageSize,filedsShow, vectorValue,sceneName); //存储到历史问题库(带where条件了就不存)并且没有记录过缓存 - if(!bCach && ObjectUtil.isEmpty(milvusFilter)){ - //执行操作记录表 - try{ - List chatMessage = operableChatMemoryProvider.getCurrentChatMessages(session.getUserId()); - //插入向量库 - doAiUserAgentQuestion(session,userInput,milvusFilter,"MILVUS",chatMessage); - }catch (Exception e){ - log.error("插入向量库异常",e); - } - } +// if(!bCach && ObjectUtil.isEmpty(milvusFilter)){ +// //执行操作记录表 +// try{ +// List chatMessage = operableChatMemoryProvider.getCurrentChatMessages(session.getUserId()); +// //插入向量库 +// doAiUserAgentQuestion(session,userInput,milvusFilter,"MILVUS",chatMessage); +// }catch (Exception e){ +// log.error("插入向量库异常",e); +// } +// } //采用表格形式显示明细、...详情、...记录、...列表、...清单 if( retrunMarkdownType(userInput) ){ resultExplain = buildMarkdownTableWithStream(data, title); @@ -610,7 +610,7 @@ public class XlyErpService { if(attempt==1){ addSessionUserQuestionList(session, userInput); } - return getDynamicTableSqlExec(session, input, userId, userInput,errorSql,errorMessage,iErroCount,historySqlList, aiAgent, cleanSql); + return getDynamicTableSqlExec(session, input, userId, userInput,errorSql,errorMessage,iErroCount,historySqlList, aiAgent, cleanSql,attempt); }catch (SqlValidateException e){ return "本场景没有识别到您的意图
如果切换场景,点[回首页],如果在本场景下,转换意图,点[清除记忆]"; }catch (Exception e){ @@ -680,13 +680,13 @@ public class XlyErpService { * @return java.lang.String * @Description 执行动态sSql **/ - private String getDynamicTableSqlExec(UserSceneSession session,String input,String userId,String userInput,String errorSql,String errorMessage,String iErroCount,String historySqlList,ErpAiAgent aiAgent,String cleanSql){ + private String getDynamicTableSqlExec(UserSceneSession session,String input,String userId,String userInput,String errorSql,String errorMessage,String iErroCount,String historySqlList,ErpAiAgent aiAgent,String cleanSql,Integer attempt){ // 1. 构建自然语言转SQLAgent, - List> sqlResult; + List> sqlResult = null; String rawSql; String tableStruct = session.getCurrentTool().getSStructureMemo(); String sError_mes; - Boolean doAddSql = false; +// Boolean doAddSql = false; List chatMessage = new ArrayList<>(); try{ //如果之前已查询直接返回 @@ -711,7 +711,7 @@ public class XlyErpService { // 2. 清理SQL多余符号 + 生产级强校验(核心安全保障,不可省略) cleanSql = SqlValidateUtil.cleanSqlSymbol(rawSql); SqlValidateUtil.validateMysqlSql(cleanSql); - doAddSql = true; +// doAddSql = true; } // List chatMessage2 = operableChatMemoryProvider.getCurrentChatMessages(session.getUserId()); try{ @@ -730,8 +730,14 @@ public class XlyErpService { sError_mes = e.getMessage(); doAiSqlErrorHistoryThread(session, StrUtil.EMPTY, cleanSql, sError_mes,input); throw e; + }finally { + //插入常用操作 + Boolean bSucess = ObjectUtil.isNotEmpty(sqlResult); + if(attempt==1 || bSucess){ + //执行操作记录表 + doAiUserAgentQuestion(session,input,cleanSql,"MYSQL",chatMessage,bSucess); + } } - //如果查询不到数据走向量库 if(ObjectUtil.isEmpty(sqlResult)){ session.setDbType("X"); @@ -746,11 +752,7 @@ public class XlyErpService { if(Integer.valueOf(iErroCount)>0){ doAiSqlErrorHistoryThread(session, cleanSql, StrUtil.EMPTY, "执行正确去修改对应正确的SQl",input); } - //插入常用操作 不包含where 条件 - if(doAddSql){ - //执行操作记录表 - doAiUserAgentQuestion(session,input,cleanSql,"MYSQL",chatMessage); - } + //采用表格形式显示明细、...详情、...记录、...列表、...清单 String resultExplain = StrUtil.EMPTY; // if(retrunMarkdownType(userInput) ){ @@ -838,11 +840,12 @@ public class XlyErpService { String sQuestion, String sSqlContent, String cachType, - List chatMessage + List chatMessage, + Boolean bSucess ){ MultiThreadPoolServer mts = MultiThreadPoolServer.getInstance(); - AiUserAgentQuestionThread at = new AiUserAgentQuestionThread(session,sQuestion,sSqlContent,cachType,chatMessage); + AiUserAgentQuestionThread at = new AiUserAgentQuestionThread(session,sQuestion,sSqlContent,cachType,chatMessage,bSucess); mts.service(at); } @@ -1065,10 +1068,10 @@ public class XlyErpService { List> data = getAiUserAgentQuestion(session.getUserName(),sSceneId, page,3); Integer iPageCount = pageCount; Integer count = (ObjectUtil.isNotEmpty(toolMetaAll))?toolMetaAll.size():0; - Integer iPageCount2 = (int) Math.ceil(count/5); + Integer iPageCount2 = (int) Math.ceil(Double.valueOf(count) / 5 ); if(page==1){ iPageCount =getAiUserAgentQuestionCount(session.getUserName(),sSceneId); - iPageCount = (int) Math.ceil(iPageCount/5); + iPageCount = (int) Math.ceil(Double.valueOf(iPageCount)/5); if(iPageCount2>iPageCount){ iPageCount = iPageCount2; @@ -1079,16 +1082,19 @@ public class XlyErpService { data.forEach(one->{ ToolMeta tm = new ToolMeta(); tm.setSMethodName(one.get("sUserInput").toString()); + tm.setSQue(true); + showListAll.add(tm); }); } List> toolMetaAllPage = ListUtil.split(toolMetaAll,5); if(page>=iPageCount2){ - showListAll.addAll(toolMetaAllPage.get(page-iPageCount2)); + int pages = page % iPageCount2; + showListAll.addAll(toolMetaAllPage.get(pages)); }else{ showListAll.addAll(toolMetaAllPage.get(page-1)); } showListAll.forEach(one->{ - sb.append("
") .append("") .append(one.getSMethodName()) diff --git a/src/main/java/com/xly/thread/AiUserAgentQuestionThread.java b/src/main/java/com/xly/thread/AiUserAgentQuestionThread.java index 40ea970..91e1239 100644 --- a/src/main/java/com/xly/thread/AiUserAgentQuestionThread.java +++ b/src/main/java/com/xly/thread/AiUserAgentQuestionThread.java @@ -22,15 +22,17 @@ public class AiUserAgentQuestionThread implements Runnable { private String sSqlContent; private String sQuestion; private String cachType; + private Boolean bSucess; List userMessage; public final String sProName="Sp_Ai_AiUserAgentQuestionThread"; - public AiUserAgentQuestionThread(UserSceneSession session,String sQuestion,String sSqlContent,String cachType, List userMessage ) { + public AiUserAgentQuestionThread(UserSceneSession session,String sQuestion,String sSqlContent,String cachType, List userMessage,Boolean bSucess) { this.session = session; this.sSqlContent = sSqlContent; this.sQuestion = sQuestion; this.userMessage = userMessage; this.cachType = cachType; + this.bSucess = bSucess; } @Override @@ -55,11 +57,11 @@ public class AiUserAgentQuestionThread implements Runnable { } String sKey = sSceneId+"_"+sMethodId +"_"+sQuestion; // SqlValidateUtil.getsKey( sSceneId, sMethodId, SqlValidateUtil.getsQuestion(session.getSUserQuestionList())); - //存入向量库 不包含where 条件 - if(!SqlWhereHelper.hasWhereButNoCompareOperators(sSqlContent)){ + //存入向量库 存在SQL语句并且没有where 并且执行成功 + if(!SqlWhereHelper.hasWhereButNoCompareOperators(sSqlContent) && ObjectUtil.isNotEmpty(sSqlContent) && bSucess){ aiGlobalAgentQuestionSqlEmitterService.addAiGlobalAgentQuestionSqlEmitter(sKey,data,sQuestion,sSqlContent,cachType,"ai_global_agent_question_sql",false); } - //调用数据库插入数据库 + //调用数据库插入数据库 Map searMap = dynamicExeDbService.getDoProMap(sProName, data); dynamicExeDbService.getCallPro(searMap, sProName); }