Commit 686f95626c5aa971054773f5e8ad40c7e51cc2e6

Authored by qianbao
1 parent cbcf8d53

添加未清选择 改成动态引导语

src/main/java/com/xly/service/XlyErpService.java
... ... @@ -464,6 +464,9 @@ public class XlyErpService {
464 464 session.setBCleanMemory(false);
465 465 session.setCurrentRowData(null);
466 466 session.setQuoData(null);
  467 + session.setSFunPrompts(StrUtil.EMPTY);
  468 + session.setArgs(new HashMap<>());
  469 + session.setSSystemPrompt(StrUtil.EMPTY);
467 470 ToolMeta toolMeta = session.getCurrentTool();
468 471 if(toolMeta!=null && ObjectUtil.isNotEmpty(toolMeta)){
469 472 List<ParamRule> data = toolMeta.getParamRuleListAll();
... ...
src/main/java/com/xly/tool/DynamicToolProvider.java
... ... @@ -41,8 +41,6 @@ import org.springframework.stereotype.Service;
41 41 import java.util.*;
42 42  
43 43 import java.util.concurrent.ConcurrentHashMap;
44   -import java.util.concurrent.CopyOnWriteArrayList;
45   -import java.util.concurrent.atomic.AtomicReference;
46 44 import java.util.stream.Collectors;
47 45 import java.util.stream.IntStream;
48 46  
... ... @@ -181,6 +179,43 @@ public class DynamicToolProvider implements ToolProvider {
181 179 throw new RuntimeException("参数解析失败,请重新输入");
182 180 }
183 181  
  182 + //合并动态部件
  183 + String sDynamicValue = ObjectUtil.isNotEmpty(argsNew.get("动态部件"))
  184 + ? argsNew.get("动态部件").toString():( ObjectUtil.isNotEmpty(argsNew.get("sDynamicPart"))? argsNew.get("sDynamicPart").toString():StrUtil.EMPTY);
  185 + String sDynamicValueOld =StrUtil.EMPTY;
  186 + if(sDynamicValue.contains("{")){
  187 + sDynamicValue = StrUtil.EMPTY;
  188 + }
  189 + if(ObjectUtil.isNotEmpty(session.getArgs())){
  190 + Map<String,Object> argOld = session.getArgs();
  191 + sDynamicValueOld = ObjectUtil.isNotEmpty(argOld.get("动态部件"))
  192 + ? argOld.get("动态部件").toString():( ObjectUtil.isNotEmpty(argOld.get("sDynamicPart"))? argOld.get("sDynamicPart").toString():StrUtil.EMPTY);
  193 + }
  194 + Set<String> sDynamicData = new HashSet<>();
  195 + if(ObjectUtil.isNotEmpty(sDynamicValueOld)){
  196 + List<String> data = new ArrayList<>();
  197 + if (JSONUtil.isTypeJSONArray(sDynamicValueOld)) {
  198 + data = JSONUtil.toList(sDynamicValueOld, String.class);
  199 + } else {
  200 + data.add(sDynamicValueOld);
  201 + }
  202 + sDynamicData.addAll(data);
  203 + }
  204 + if(ObjectUtil.isNotEmpty(sDynamicValue)){
  205 + List<String> data = new ArrayList<>();
  206 + if (JSONUtil.isTypeJSONArray(sDynamicValue)) {
  207 + data = JSONUtil.toList(sDynamicValue, String.class);
  208 + } else {
  209 + data.add(sDynamicValue);
  210 + }
  211 + sDynamicData.addAll(data);
  212 + }
  213 + if(ObjectUtil.isNotEmpty(sDynamicData)){
  214 + session.getArgs().remove("动态部件");
  215 + session.getArgs().remove("sDynamicPart");
  216 + argsNew.put("动态部件",JSONUtil.toJsonStr(sDynamicData));
  217 + argsNew.put("sDynamicPart",JSONUtil.toJsonStr(sDynamicData));
  218 + }
184 219 //获取之前获取的参数
185 220 Map<String, Object> args = session.getArgs();
186 221 if(ObjectUtil.isEmpty(args)) args = new HashMap<>();
... ... @@ -197,7 +232,7 @@ public class DynamicToolProvider implements ToolProvider {
197 232 finalArgs.remove("sDynamicPartDel");
198 233 finalArgs.remove("删除动态部件");
199 234 }
200   - // 2 【补全动态参数】动态参数补全
  235 + // 2 【补全动态参数】动态参数补全(中->英文)
201 236 try{
202 237 args = applyValues(args, meta.getParamRuleListCheck());
203 238 }catch (Exception e){
... ... @@ -209,6 +244,7 @@ public class DynamicToolProvider implements ToolProvider {
209 244 }
210 245 // 2.1 【自动补全】应用参数的默认值
211 246 List<ParamRule> paramRuleData = meta.getParamRuleListAll();
  247 + //添加默认值
212 248 args = applyDefaultValues(args, paramRuleData);
213 249 //客户选择行号转sSLaveId
214 250 if(ObjectUtil.isNotEmpty(args)
... ... @@ -291,7 +327,7 @@ public class DynamicToolProvider implements ToolProvider {
291 327 && one.getSParamValue().equals(d.getSParamValue())
292 328 );
293 329  
294   - String sValue = searMap.get(one.getSParam()).toString();
  330 + String sValue = ObjectUtil.isNotEmpty(one.getSParam())?searMap.get(one.getSParam()).toString():(ObjectUtil.isNotEmpty(one.getSParamValue())?searMap.get(one.getSParamValue()).toString():StrUtil.EMPTY);
295 331 List<String> addValue = new ArrayList<>();
296 332  
297 333 if (JSONUtil.isTypeJSONArray(sValue)) {
... ... @@ -393,27 +429,19 @@ public class DynamicToolProvider implements ToolProvider {
393 429 String sValue = ObjectUtil.isNotEmpty(args.get(sDynamicPartOne.getSParam()))
394 430 ? args.get(sDynamicPartOne.getSParam()).toString()
395 431 : StrUtil.EMPTY;
396   -
  432 + if(sValue.contains("{")){
  433 + sValue = StrUtil.EMPTY;
  434 + }
397 435 if (ObjectUtil.isNotEmpty(sValue)) {
398   - List<String> addValueAdd = new ArrayList<>();
399 436 List<String> addValueOld = new ArrayList<>();
400   - Object sOldVal = session.getArgs().get(sDynamicPart.get(0).getSParam());
401   - if(ObjectUtil.isNotEmpty(sOldVal)){
  437 + if(ObjectUtil.isNotEmpty(sValue)){
402 438 if (JSONUtil.isTypeJSONArray(sValue)) {
403 439 addValueOld = JSONUtil.toList(sValue, String.class);
404 440 } else {
405 441 addValueOld.add(sValue);
406 442 }
407 443 }
408   -
409   - if (JSONUtil.isTypeJSONArray(sValue)) {
410   - addValueAdd = JSONUtil.toList(sValue, String.class);
411   - } else {
412   - addValueAdd.add(sValue);
413   - }
414   - addValueOld.addAll(addValueAdd);
415 444 addValueOld = new ArrayList<>(new LinkedHashSet<>(addValueOld));
416   -
417 445 //新增部件不在删除部件中的
418 446 List<String> finalSDynamicPartDelValue = sDynamicPartDelValue;
419 447 List<String> addValue = addValueOld.stream().filter(one-> !finalSDynamicPartDelValue.contains(one)).collect(Collectors.toList());
... ... @@ -443,8 +471,6 @@ public class DynamicToolProvider implements ToolProvider {
443 471 String paramName = d.getSParam().split("-").length > 1
444 472 ? d.getSParam().split("-")[1]
445 473 : d.getSParam().split("-")[0];
446   - copy.setSParam(sVal + "-" + paramName);
447   -
448 474 // 拼音转换
449 475 String firstLetters = "";
450 476 try {
... ... @@ -453,6 +479,7 @@ public class DynamicToolProvider implements ToolProvider {
453 479 log.warn("拼音转换失败: {}", sVal);
454 480 firstLetters = sVal.substring(0, 1).toUpperCase();
455 481 }
  482 + copy.setSParam(sVal + "-" + paramName);
456 483 copy.setSParamValue(firstLetters + d.getSParamValue());
457 484 copy.setIOrder(d.getIOrder() + 100000);
458 485 copy.setBDynamicParam(true);
... ... @@ -640,6 +667,7 @@ public class DynamicToolProvider implements ToolProvider {
640 667 try {
641 668 List<ParamRule> paramRuleData = meta.getParamRuleList();
642 669 for (ParamRule paramRule : paramRuleData) {
  670 + String paramName = paramRule.getSParamValue();
643 671 String paramDesc = paramRule.getSParam();
644 672 String paramType = paramRule.getSType();
645 673 Boolean bEmpty = paramRule.getBEmpty();
... ... @@ -676,6 +704,10 @@ public class DynamicToolProvider implements ToolProvider {
676 704 case "enum":
677 705 String constStr = getArrrayBySql(paramRule);
678 706 // String constStr = getConstMeg(paramRule);
  707 + //屏蔽纸质配置 用逗号了
  708 + if(constStr.contains(",") && !constStr.contains("/")){
  709 + constStr = constStr.replace(",","/");
  710 + }
679 711 List<String> constList = StrUtil.isNotBlank(constStr) ? Arrays.asList(constStr.split("/")) : new ArrayList<>();
680 712 if (constList.isEmpty()) {
681 713 schemaBuilder.addStringProperty(paramDesc, paramDesc);
... ... @@ -746,6 +778,9 @@ public class DynamicToolProvider implements ToolProvider {
746 778 Boolean bCheckArray = !(RuleCode.SQL.getCode().equals(paramRule.getSRule()));
747 779 Boolean bCheckArray2= !("array".equals(paramRule.getSType()) || "enum".equals(paramRule.getSType()));
748 780 Boolean bCheckArray3= ObjectUtil.isEmpty(paramRule.getSParamConfig());
  781 + if(ObjectUtil.isNotEmpty(paramRule.getSRuleTs())){
  782 + return paramRule.getSRuleTs();
  783 + }
749 784 if(bCheckArray || bCheckArray2 || bCheckArray3){
750 785 return getConstMeg(paramRule);
751 786 }
... ... @@ -972,85 +1007,73 @@ public class DynamicToolProvider implements ToolProvider {
972 1007 result = transformationArgs( result, paramDefsCheck);
973 1008 List<ParamRule> paramDefs = new ArrayList<>(paramDefsCheck);
974 1009 paramDefs.sort(Comparator.comparing(ParamRule::getIOrder));
975   - for (ParamRule pd : paramDefs) {
976   - String name = pd.getSParam();
977   - String sValue = pd.getSParamValue();
978   - String sRule = pd.getSRule();
979   - String sType = pd.getSType();
980   -
981   - Boolean bCheck = result.containsKey(name);
982   - bCheck = bCheck && ObjectUtil.isNotEmpty(result.get(name));
983   - bCheck = bCheck && RuleCode.SQL.getCode().equals(sRule);
984   - bCheck = bCheck && ObjectUtil.isNotEmpty(pd.getSParamConfig());
985   -
986   - Boolean bCheck2 = result.containsKey(sValue);
987   - bCheck2 = bCheck2 && ObjectUtil.isNotEmpty(result.get(sValue));
988   - bCheck2 = bCheck2 && RuleCode.SQL.getCode().equals(sRule);
989   - bCheck2 = bCheck2 && ObjectUtil.isNotEmpty(pd.getSParamConfig());
990   -
991   - if ((bCheck || bCheck2) &&("enum".equals(sType) || "string".equals(sType))){
992   - String sSql = pd.getSParamConfig();
993   - String sKey = bCheck?name:sValue;
994   - String nameValue = result.get(sKey).toString();
995   - List<Map<String,Object>> dataList = dynamicExeDbService.findSql(result,sSql);
996   - if(ObjectUtil.isEmpty(dataList)){
997   - throw new BusinessException(ErrorCode.PARAM_REQUIRED,String.format("%s 您描述的%s 不存在,请重新告诉我",name,nameValue));
998   - }
999   - if(ObjectUtil.isNotEmpty(args.get(name)) || ObjectUtil.isNotEmpty(args.get(sValue))){
1000   - if(("enum".equals(sType) ||"string".equals(sType)) && (args.get(name) instanceof List || args.get(sValue) instanceof List)){
1001   - if(args.get(name) instanceof List){
1002   - args.put(name,((List<?>) args.get(name)).get(0));
1003   - }
1004   - if(args.get(sValue) instanceof List){
1005   - args.put(sValue,((List<?>) args.get(sValue)).get(0));
1006   - }
1007   - }
1008   - List<Map<String,Object>> 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());
1009   - if("enum".equals(sType) && ObjectUtil.isEmpty(dataListNew)){
1010   - args.remove(name);
1011   - args.remove(sValue);
1012   - result.remove(name);
1013   - result.remove(sValue);
1014   - continue;
1015   - }
1016   - if(ObjectUtil.isNotEmpty(dataListNew)){
1017   - dataList = new ArrayList<>();
1018   - dataList.add(dataListNew.get(0));
1019   - }
1020   - }
1021   - if(ObjectUtil.isNotEmpty(dataList) && dataList.size()==1){
1022   - String sCopyTo = pd.getSCopyTo();
1023   - if(ObjectUtil.isEmpty(sCopyTo)){
1024   - result.put(sValue, dataList.get(0).get(sValue));
1025   - result.put(name, dataList.get(0).get(sValue));
1026   - }else{
1027   - String[] sCopyToA = sCopyTo.split(",");
1028   - for(String sCopyToOne:sCopyToA){
1029   - String[] sCopyToOneA = sCopyToOne.split(":");
1030   - result.put(sCopyToOneA[0], dataList.get(0).get(sCopyToOneA[1]));
1031   - result.put(name, dataList.get(0).get(sValue));
1032   - }
1033   - }
1034   - }
1035   - StringBuffer sData=new StringBuffer();
1036   - if(dataList.size()>1){
1037   - List<Map<String, Object>> finalDataList = dataList;
1038   - IntStream.range(0, dataList.size())
1039   - .forEach(iRowNum ->{
1040   - sData.append((iRowNum + 1)).append(".").append(finalDataList.get(iRowNum).get(pd.getSParamValue()))
1041   - .append("\n\n");
1042   -
1043   - });
1044   - String sParamMissMemo = StrUtil.EMPTY;
1045   - if(ObjectUtil.isEmpty(pd.getSParamMissMemo())){
1046   - sParamMissMemo = pd.getSParam()+"存在多个,请选择:<br/>"+sData;
1047   - }else{
1048   - sParamMissMemo = StrUtil.format(pd.getSParamMissMemo(),sData.toString());
1049   - }
1050   - throw new BusinessException(ErrorCode.PARAM_REQUIRED,sParamMissMemo);
1051   - }
1052   - }
1053   - }
  1010 +// for (ParamRule pd : paramDefs) {
  1011 +// String name = pd.getSParam();
  1012 +// String sValue = pd.getSParamValue();
  1013 +// String sRule = pd.getSRule();
  1014 +// String sType = pd.getSType();
  1015 +//
  1016 +// Boolean bCheck = result.containsKey(name);
  1017 +// bCheck = bCheck && ObjectUtil.isNotEmpty(result.get(name));
  1018 +// bCheck = bCheck && RuleCode.SQL.getCode().equals(sRule);
  1019 +// bCheck = bCheck && ObjectUtil.isNotEmpty(pd.getSParamConfig());
  1020 +//
  1021 +// Boolean bCheck2 = result.containsKey(sValue);
  1022 +// bCheck2 = bCheck2 && ObjectUtil.isNotEmpty(result.get(sValue));
  1023 +// bCheck2 = bCheck2 && RuleCode.SQL.getCode().equals(sRule);
  1024 +// bCheck2 = bCheck2 && ObjectUtil.isNotEmpty(pd.getSParamConfig());
  1025 +//
  1026 +// if ((bCheck || bCheck2) &&("enum".equals(sType) || "string".equals(sType))){
  1027 +// String sSql = pd.getSParamConfig();
  1028 +// String sKey = bCheck?name:sValue;
  1029 +// String nameValue = result.get(sKey).toString();
  1030 +// List<Map<String,Object>> dataList = dynamicExeDbService.findSql(result,sSql);
  1031 +// if(ObjectUtil.isEmpty(dataList)){
  1032 +// throw new BusinessException(ErrorCode.PARAM_REQUIRED,String.format("%s 您描述的%s 不存在,请重新告诉我",name,nameValue));
  1033 +// }
  1034 +// if(ObjectUtil.isNotEmpty(args.get(name)) || ObjectUtil.isNotEmpty(args.get(sValue))){
  1035 +// if(("enum".equals(sType) ||"string".equals(sType)) && (args.get(name) instanceof List || args.get(sValue) instanceof List)){
  1036 +// if(args.get(name) instanceof List){
  1037 +// args.put(name,((List<?>) args.get(name)).get(0));
  1038 +// }
  1039 +// if(args.get(sValue) instanceof List){
  1040 +// args.put(sValue,((List<?>) args.get(sValue)).get(0));
  1041 +// }
  1042 +// }
  1043 +// List<Map<String,Object>> dataListNew = dataList.stream().filter(one->
  1044 +// ObjectUtil.isNotEmpty(one.get(sValue))
  1045 +// &&(one.get(sValue).equals(args.get(name))
  1046 +// || one.get(sValue).equals(args.get(sValue)))).collect(Collectors.toUnmodifiableList());
  1047 +//// if("enum".equals(sType) && ObjectUtil.isEmpty(dataListNew)){
  1048 +//// args.remove(name);
  1049 +//// args.remove(sValue);
  1050 +//// result.remove(name);
  1051 +//// result.remove(sValue);
  1052 +//// continue;
  1053 +//// }
  1054 +// if(ObjectUtil.isNotEmpty(dataListNew)){
  1055 +// dataList = new ArrayList<>();
  1056 +// dataList.add(dataListNew.get(0));
  1057 +// }
  1058 +// }
  1059 +// if(ObjectUtil.isNotEmpty(dataList)){
  1060 +// String sCopyTo = pd.getSCopyTo();
  1061 +// if(ObjectUtil.isEmpty(sCopyTo)){
  1062 +// result.put(sValue, dataList.get(0).get(sValue));
  1063 +// result.put(name, dataList.get(0).get(sValue));
  1064 +// }else{
  1065 +// String[] sCopyToA = sCopyTo.split(",");
  1066 +// for(String sCopyToOne:sCopyToA){
  1067 +// String[] sCopyToOneA = sCopyToOne.split(":");
  1068 +// result.put(sCopyToOneA[0], dataList.get(0).get(sCopyToOneA[1]));
  1069 +// result.put(name, dataList.get(0).get(sValue));
  1070 +// }
  1071 +// }
  1072 +// }
  1073 +// }
  1074 +//
  1075 +//
  1076 +// }
1054 1077 return result;
1055 1078 }
1056 1079  
... ...
src/main/resources/application.yml
... ... @@ -136,7 +136,7 @@ langchain4j:
136 136 # 聊天模型配置(用于一般对话)
137 137 base-url: http://112.82.245.194:41434
138 138 # chat-model-name: qwen2.5:7b-instruct
139   -# chat-model-name: qwen3.6-27b-iq2:latest
  139 +# chat-model-name: qwen3.6-27b-iq2xxs:latest
140 140 chat-model-name: qwen2.5:14b
141 141 # chat-model-name: qwen3:14b
142 142 # chat-model-name: qwen3.5:9b
... ...