From 686f95626c5aa971054773f5e8ad40c7e51cc2e6 Mon Sep 17 00:00:00 2001 From: qianbao Date: Wed, 29 Jul 2026 01:02:33 +0800 Subject: [PATCH] 添加未清选择 改成动态引导语 --- src/main/java/com/xly/service/XlyErpService.java | 3 +++ src/main/java/com/xly/tool/DynamicToolProvider.java | 217 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------------------------------------------------------------------- src/main/resources/application.yml | 2 +- 3 files changed, 124 insertions(+), 98 deletions(-) diff --git a/src/main/java/com/xly/service/XlyErpService.java b/src/main/java/com/xly/service/XlyErpService.java index 49161a2..c4d89a1 100644 --- a/src/main/java/com/xly/service/XlyErpService.java +++ b/src/main/java/com/xly/service/XlyErpService.java @@ -464,6 +464,9 @@ public class XlyErpService { session.setBCleanMemory(false); session.setCurrentRowData(null); session.setQuoData(null); + session.setSFunPrompts(StrUtil.EMPTY); + session.setArgs(new HashMap<>()); + session.setSSystemPrompt(StrUtil.EMPTY); ToolMeta toolMeta = session.getCurrentTool(); if(toolMeta!=null && ObjectUtil.isNotEmpty(toolMeta)){ List data = toolMeta.getParamRuleListAll(); diff --git a/src/main/java/com/xly/tool/DynamicToolProvider.java b/src/main/java/com/xly/tool/DynamicToolProvider.java index e991826..9a1befd 100644 --- a/src/main/java/com/xly/tool/DynamicToolProvider.java +++ b/src/main/java/com/xly/tool/DynamicToolProvider.java @@ -41,8 +41,6 @@ import org.springframework.stereotype.Service; import java.util.*; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.CopyOnWriteArrayList; -import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -181,6 +179,43 @@ public class DynamicToolProvider implements ToolProvider { throw new RuntimeException("参数解析失败,请重新输入"); } + //合并动态部件 + String sDynamicValue = ObjectUtil.isNotEmpty(argsNew.get("动态部件")) + ? argsNew.get("动态部件").toString():( ObjectUtil.isNotEmpty(argsNew.get("sDynamicPart"))? argsNew.get("sDynamicPart").toString():StrUtil.EMPTY); + String sDynamicValueOld =StrUtil.EMPTY; + if(sDynamicValue.contains("{")){ + sDynamicValue = StrUtil.EMPTY; + } + if(ObjectUtil.isNotEmpty(session.getArgs())){ + Map argOld = session.getArgs(); + sDynamicValueOld = ObjectUtil.isNotEmpty(argOld.get("动态部件")) + ? argOld.get("动态部件").toString():( ObjectUtil.isNotEmpty(argOld.get("sDynamicPart"))? argOld.get("sDynamicPart").toString():StrUtil.EMPTY); + } + Set sDynamicData = new HashSet<>(); + if(ObjectUtil.isNotEmpty(sDynamicValueOld)){ + List data = new ArrayList<>(); + if (JSONUtil.isTypeJSONArray(sDynamicValueOld)) { + data = JSONUtil.toList(sDynamicValueOld, String.class); + } else { + data.add(sDynamicValueOld); + } + sDynamicData.addAll(data); + } + if(ObjectUtil.isNotEmpty(sDynamicValue)){ + List data = new ArrayList<>(); + if (JSONUtil.isTypeJSONArray(sDynamicValue)) { + data = JSONUtil.toList(sDynamicValue, String.class); + } else { + data.add(sDynamicValue); + } + sDynamicData.addAll(data); + } + if(ObjectUtil.isNotEmpty(sDynamicData)){ + session.getArgs().remove("动态部件"); + session.getArgs().remove("sDynamicPart"); + argsNew.put("动态部件",JSONUtil.toJsonStr(sDynamicData)); + argsNew.put("sDynamicPart",JSONUtil.toJsonStr(sDynamicData)); + } //获取之前获取的参数 Map args = session.getArgs(); if(ObjectUtil.isEmpty(args)) args = new HashMap<>(); @@ -197,7 +232,7 @@ public class DynamicToolProvider implements ToolProvider { finalArgs.remove("sDynamicPartDel"); finalArgs.remove("删除动态部件"); } - // 2 【补全动态参数】动态参数补全 + // 2 【补全动态参数】动态参数补全(中->英文) try{ args = applyValues(args, meta.getParamRuleListCheck()); }catch (Exception e){ @@ -209,6 +244,7 @@ public class DynamicToolProvider implements ToolProvider { } // 2.1 【自动补全】应用参数的默认值 List paramRuleData = meta.getParamRuleListAll(); + //添加默认值 args = applyDefaultValues(args, paramRuleData); //客户选择行号转sSLaveId if(ObjectUtil.isNotEmpty(args) @@ -291,7 +327,7 @@ public class DynamicToolProvider implements ToolProvider { && one.getSParamValue().equals(d.getSParamValue()) ); - String sValue = searMap.get(one.getSParam()).toString(); + String sValue = ObjectUtil.isNotEmpty(one.getSParam())?searMap.get(one.getSParam()).toString():(ObjectUtil.isNotEmpty(one.getSParamValue())?searMap.get(one.getSParamValue()).toString():StrUtil.EMPTY); List addValue = new ArrayList<>(); if (JSONUtil.isTypeJSONArray(sValue)) { @@ -393,27 +429,19 @@ public class DynamicToolProvider implements ToolProvider { String sValue = ObjectUtil.isNotEmpty(args.get(sDynamicPartOne.getSParam())) ? args.get(sDynamicPartOne.getSParam()).toString() : StrUtil.EMPTY; - + if(sValue.contains("{")){ + sValue = StrUtil.EMPTY; + } if (ObjectUtil.isNotEmpty(sValue)) { - List addValueAdd = new ArrayList<>(); List addValueOld = new ArrayList<>(); - Object sOldVal = session.getArgs().get(sDynamicPart.get(0).getSParam()); - if(ObjectUtil.isNotEmpty(sOldVal)){ + if(ObjectUtil.isNotEmpty(sValue)){ if (JSONUtil.isTypeJSONArray(sValue)) { addValueOld = JSONUtil.toList(sValue, String.class); } else { addValueOld.add(sValue); } } - - if (JSONUtil.isTypeJSONArray(sValue)) { - addValueAdd = JSONUtil.toList(sValue, String.class); - } else { - addValueAdd.add(sValue); - } - addValueOld.addAll(addValueAdd); addValueOld = new ArrayList<>(new LinkedHashSet<>(addValueOld)); - //新增部件不在删除部件中的 List finalSDynamicPartDelValue = sDynamicPartDelValue; List addValue = addValueOld.stream().filter(one-> !finalSDynamicPartDelValue.contains(one)).collect(Collectors.toList()); @@ -443,8 +471,6 @@ public class DynamicToolProvider implements ToolProvider { String paramName = d.getSParam().split("-").length > 1 ? d.getSParam().split("-")[1] : d.getSParam().split("-")[0]; - copy.setSParam(sVal + "-" + paramName); - // 拼音转换 String firstLetters = ""; try { @@ -453,6 +479,7 @@ public class DynamicToolProvider implements ToolProvider { log.warn("拼音转换失败: {}", sVal); firstLetters = sVal.substring(0, 1).toUpperCase(); } + copy.setSParam(sVal + "-" + paramName); copy.setSParamValue(firstLetters + d.getSParamValue()); copy.setIOrder(d.getIOrder() + 100000); copy.setBDynamicParam(true); @@ -640,6 +667,7 @@ public class DynamicToolProvider implements ToolProvider { try { List paramRuleData = meta.getParamRuleList(); for (ParamRule paramRule : paramRuleData) { + String paramName = paramRule.getSParamValue(); String paramDesc = paramRule.getSParam(); String paramType = paramRule.getSType(); Boolean bEmpty = paramRule.getBEmpty(); @@ -676,6 +704,10 @@ public class DynamicToolProvider implements ToolProvider { case "enum": String constStr = getArrrayBySql(paramRule); // String constStr = getConstMeg(paramRule); + //屏蔽纸质配置 用逗号了 + if(constStr.contains(",") && !constStr.contains("/")){ + constStr = constStr.replace(",","/"); + } List constList = StrUtil.isNotBlank(constStr) ? Arrays.asList(constStr.split("/")) : new ArrayList<>(); if (constList.isEmpty()) { schemaBuilder.addStringProperty(paramDesc, paramDesc); @@ -746,6 +778,9 @@ public class DynamicToolProvider implements ToolProvider { Boolean bCheckArray = !(RuleCode.SQL.getCode().equals(paramRule.getSRule())); Boolean bCheckArray2= !("array".equals(paramRule.getSType()) || "enum".equals(paramRule.getSType())); Boolean bCheckArray3= ObjectUtil.isEmpty(paramRule.getSParamConfig()); + if(ObjectUtil.isNotEmpty(paramRule.getSRuleTs())){ + return paramRule.getSRuleTs(); + } if(bCheckArray || bCheckArray2 || bCheckArray3){ return getConstMeg(paramRule); } @@ -972,85 +1007,73 @@ public class DynamicToolProvider implements ToolProvider { result = transformationArgs( result, paramDefsCheck); List paramDefs = new ArrayList<>(paramDefsCheck); paramDefs.sort(Comparator.comparing(ParamRule::getIOrder)); - for (ParamRule pd : paramDefs) { - String name = pd.getSParam(); - String sValue = pd.getSParamValue(); - String sRule = pd.getSRule(); - String sType = pd.getSType(); - - Boolean bCheck = result.containsKey(name); - bCheck = bCheck && ObjectUtil.isNotEmpty(result.get(name)); - bCheck = bCheck && RuleCode.SQL.getCode().equals(sRule); - bCheck = bCheck && ObjectUtil.isNotEmpty(pd.getSParamConfig()); - - Boolean bCheck2 = result.containsKey(sValue); - bCheck2 = bCheck2 && ObjectUtil.isNotEmpty(result.get(sValue)); - bCheck2 = bCheck2 && RuleCode.SQL.getCode().equals(sRule); - bCheck2 = bCheck2 && ObjectUtil.isNotEmpty(pd.getSParamConfig()); - - if ((bCheck || bCheck2) &&("enum".equals(sType) || "string".equals(sType))){ - String sSql = pd.getSParamConfig(); - String sKey = bCheck?name:sValue; - String nameValue = result.get(sKey).toString(); - List> dataList = dynamicExeDbService.findSql(result,sSql); - if(ObjectUtil.isEmpty(dataList)){ - throw new BusinessException(ErrorCode.PARAM_REQUIRED,String.format("%s 您描述的%s 不存在,请重新告诉我",name,nameValue)); - } - if(ObjectUtil.isNotEmpty(args.get(name)) || ObjectUtil.isNotEmpty(args.get(sValue))){ - if(("enum".equals(sType) ||"string".equals(sType)) && (args.get(name) instanceof List || args.get(sValue) instanceof List)){ - if(args.get(name) instanceof List){ - args.put(name,((List) args.get(name)).get(0)); - } - if(args.get(sValue) instanceof List){ - args.put(sValue,((List) args.get(sValue)).get(0)); - } - } - List> dataListNew = dataList.stream().filter(one-> ObjectUtil.isNotEmpty(one.get(sValue)) &&(one.get(sValue).equals(args.get(name)) || one.get(sValue).equals(args.get(sValue)))).collect(Collectors.toUnmodifiableList()); - if("enum".equals(sType) && ObjectUtil.isEmpty(dataListNew)){ - args.remove(name); - args.remove(sValue); - result.remove(name); - result.remove(sValue); - continue; - } - if(ObjectUtil.isNotEmpty(dataListNew)){ - dataList = new ArrayList<>(); - dataList.add(dataListNew.get(0)); - } - } - if(ObjectUtil.isNotEmpty(dataList) && dataList.size()==1){ - String sCopyTo = pd.getSCopyTo(); - if(ObjectUtil.isEmpty(sCopyTo)){ - result.put(sValue, dataList.get(0).get(sValue)); - result.put(name, dataList.get(0).get(sValue)); - }else{ - String[] sCopyToA = sCopyTo.split(","); - for(String sCopyToOne:sCopyToA){ - String[] sCopyToOneA = sCopyToOne.split(":"); - result.put(sCopyToOneA[0], dataList.get(0).get(sCopyToOneA[1])); - result.put(name, dataList.get(0).get(sValue)); - } - } - } - StringBuffer sData=new StringBuffer(); - if(dataList.size()>1){ - List> finalDataList = dataList; - IntStream.range(0, dataList.size()) - .forEach(iRowNum ->{ - sData.append((iRowNum + 1)).append(".").append(finalDataList.get(iRowNum).get(pd.getSParamValue())) - .append("\n\n"); - - }); - String sParamMissMemo = StrUtil.EMPTY; - if(ObjectUtil.isEmpty(pd.getSParamMissMemo())){ - sParamMissMemo = pd.getSParam()+"存在多个,请选择:
"+sData; - }else{ - sParamMissMemo = StrUtil.format(pd.getSParamMissMemo(),sData.toString()); - } - throw new BusinessException(ErrorCode.PARAM_REQUIRED,sParamMissMemo); - } - } - } +// for (ParamRule pd : paramDefs) { +// String name = pd.getSParam(); +// String sValue = pd.getSParamValue(); +// String sRule = pd.getSRule(); +// String sType = pd.getSType(); +// +// Boolean bCheck = result.containsKey(name); +// bCheck = bCheck && ObjectUtil.isNotEmpty(result.get(name)); +// bCheck = bCheck && RuleCode.SQL.getCode().equals(sRule); +// bCheck = bCheck && ObjectUtil.isNotEmpty(pd.getSParamConfig()); +// +// Boolean bCheck2 = result.containsKey(sValue); +// bCheck2 = bCheck2 && ObjectUtil.isNotEmpty(result.get(sValue)); +// bCheck2 = bCheck2 && RuleCode.SQL.getCode().equals(sRule); +// bCheck2 = bCheck2 && ObjectUtil.isNotEmpty(pd.getSParamConfig()); +// +// if ((bCheck || bCheck2) &&("enum".equals(sType) || "string".equals(sType))){ +// String sSql = pd.getSParamConfig(); +// String sKey = bCheck?name:sValue; +// String nameValue = result.get(sKey).toString(); +// List> dataList = dynamicExeDbService.findSql(result,sSql); +// if(ObjectUtil.isEmpty(dataList)){ +// throw new BusinessException(ErrorCode.PARAM_REQUIRED,String.format("%s 您描述的%s 不存在,请重新告诉我",name,nameValue)); +// } +// if(ObjectUtil.isNotEmpty(args.get(name)) || ObjectUtil.isNotEmpty(args.get(sValue))){ +// if(("enum".equals(sType) ||"string".equals(sType)) && (args.get(name) instanceof List || args.get(sValue) instanceof List)){ +// if(args.get(name) instanceof List){ +// args.put(name,((List) args.get(name)).get(0)); +// } +// if(args.get(sValue) instanceof List){ +// args.put(sValue,((List) args.get(sValue)).get(0)); +// } +// } +// List> dataListNew = dataList.stream().filter(one-> +// ObjectUtil.isNotEmpty(one.get(sValue)) +// &&(one.get(sValue).equals(args.get(name)) +// || one.get(sValue).equals(args.get(sValue)))).collect(Collectors.toUnmodifiableList()); +//// if("enum".equals(sType) && ObjectUtil.isEmpty(dataListNew)){ +//// args.remove(name); +//// args.remove(sValue); +//// result.remove(name); +//// result.remove(sValue); +//// continue; +//// } +// if(ObjectUtil.isNotEmpty(dataListNew)){ +// dataList = new ArrayList<>(); +// dataList.add(dataListNew.get(0)); +// } +// } +// if(ObjectUtil.isNotEmpty(dataList)){ +// String sCopyTo = pd.getSCopyTo(); +// if(ObjectUtil.isEmpty(sCopyTo)){ +// result.put(sValue, dataList.get(0).get(sValue)); +// result.put(name, dataList.get(0).get(sValue)); +// }else{ +// String[] sCopyToA = sCopyTo.split(","); +// for(String sCopyToOne:sCopyToA){ +// String[] sCopyToOneA = sCopyToOne.split(":"); +// result.put(sCopyToOneA[0], dataList.get(0).get(sCopyToOneA[1])); +// result.put(name, dataList.get(0).get(sValue)); +// } +// } +// } +// } +// +// +// } return result; } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 88a8d26..5effd7a 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -136,7 +136,7 @@ langchain4j: # 聊天模型配置(用于一般对话) base-url: http://112.82.245.194:41434 # chat-model-name: qwen2.5:7b-instruct -# chat-model-name: qwen3.6-27b-iq2:latest +# chat-model-name: qwen3.6-27b-iq2xxs:latest chat-model-name: qwen2.5:14b # chat-model-name: qwen3:14b # chat-model-name: qwen3.5:9b -- libgit2 0.22.2