Commit de9259d8cdb1000f02499b146d59fa1eab0bdee1

Authored by qianbao
1 parent 48dd0522

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

... ... @@ -102,6 +102,12 @@
102 102 <artifactId>pagehelper-spring-boot-starter</artifactId>
103 103 <version>${pagehelper.version}</version>
104 104 </dependency>
  105 + <!-- 方案A:使用 pinyin4j(推荐) -->
  106 + <dependency>
  107 + <groupId>com.belerweb</groupId>
  108 + <artifactId>pinyin4j</artifactId>
  109 + <version>2.5.1</version>
  110 + </dependency>
105 111  
106 112 <!-- 工具类 -->
107 113 <dependency>
... ...
src/main/java/com/xly/service/QuoService.java
... ... @@ -2,6 +2,7 @@ package com.xly.service;
2 2  
3 3 import cn.hutool.core.util.ObjectUtil;
4 4 import cn.hutool.core.util.StrUtil;
  5 +import cn.hutool.extra.pinyin.PinyinUtil;
5 6 import cn.hutool.json.JSONUtil;
6 7 import com.alibaba.fastjson2.JSONObject;
7 8 import com.xly.entity.ParamRule;
... ... @@ -41,7 +42,7 @@ public class QuoService {
41 42 }
42 43 List<ParamRule> dataAll = session.getCurrentTool().getParamRuleListAll();
43 44 //获取产品的参数
44   - List<ParamRule> dataProduct = dataAll.stream().filter(one-> "产品".equals(one.getSGroup()) && !one.getBDynamicParam() ).collect(Collectors.toUnmodifiableList());
  45 + List<ParamRule> dataProduct = dataAll.stream().filter(one-> "产品".equals(one.getSGroup()) && !one.getBDynamicParam()).collect(Collectors.toUnmodifiableList());
45 46 List<ParamRule> dataPart = dataAll.stream().filter(one-> "部件".equals(one.getSGroup()) && !one.getBDynamicParam()).collect(Collectors.toUnmodifiableList());
46 47 List<ParamRule> datasDynamicPart = dataAll.stream().filter(one-> "sDynamicPart".equals(one.getSParamValue()) && !one.getBDynamicParam()).collect(Collectors.toUnmodifiableList());
47 48 List<Map<String,Object>> sAll = new ArrayList<>();
... ... @@ -67,7 +68,11 @@ public class QuoService {
67 68 product.put("sParamConfigValue",p.getSParamConfigValue()==null?StrUtil.EMPTY:p.getSParamConfigValue());
68 69 //获取动态参数
69 70 adddynamicData( sValue, dataAll, p, finalArgsOld, sAll, product);
70   - productList.add(product);
  71 + if( !"sDynamicPart".equals(p.getSParamValue())
  72 + &&!"sDynamicPartDel".equals(p.getSParamValue())
  73 + ){
  74 + productList.add(product);
  75 + }
71 76 }
72 77 });
73 78 List<Map<String,Object>> partList = new ArrayList<>();
... ... @@ -109,7 +114,7 @@ public class QuoService {
109 114 datasDynamicPartArray.forEach(one->{
110 115 List<ParamRule> dataPartDynamic = dataAll.stream().filter(d ->
111 116 one.equals(d.getSDynamicParam())
112   - && "新增部件".equals(d.getSDynamicParamName()
  117 + && "sDynamicPart".equals(d.getSDynamicParamName()
113 118 )&&d.getBDynamicParam()
114 119 ).collect(Collectors.toUnmodifiableList());
115 120 if(ObjectUtil.isNotEmpty(dataPartDynamic)){
... ...
src/main/java/com/xly/tool/DynamicToolProvider.java
... ... @@ -34,12 +34,14 @@ import lombok.RequiredArgsConstructor;
34 34  
35 35 import lombok.extern.slf4j.Slf4j;
36 36  
  37 +import org.springframework.beans.BeanUtils;
37 38 import org.springframework.beans.factory.annotation.Value;
38 39 import org.springframework.stereotype.Service;
39 40  
40 41 import java.util.*;
41 42  
42 43 import java.util.concurrent.ConcurrentHashMap;
  44 +import java.util.concurrent.CopyOnWriteArrayList;
43 45 import java.util.concurrent.atomic.AtomicReference;
44 46 import java.util.stream.Collectors;
45 47 import java.util.stream.IntStream;
... ... @@ -188,6 +190,13 @@ public class DynamicToolProvider implements ToolProvider {
188 190 finalArgs.put(k,v);
189 191 }
190 192 });
  193 + if(argsNew.containsKey("删除动态部件")){
  194 + argsNew.put("sDynamicPartDel",argsNew.get("删除动态部件"));
  195 + }
  196 + if(!argsNew.containsKey("sDynamicPartDel")){
  197 + finalArgs.remove("sDynamicPartDel");
  198 + finalArgs.remove("删除动态部件");
  199 + }
191 200 // 2 【补全动态参数】动态参数补全
192 201 try{
193 202 args = applyValues(args, meta.getParamRuleListCheck());
... ... @@ -223,6 +232,7 @@ public class DynamicToolProvider implements ToolProvider {
223 232 }
224 233 //判断是否首次进入给提示 如果没有产品名称 产品长 宽
225 234 if(!Validator.isValid(args.get("dProductWidth"))
  235 + && !Validator.isValid(args.get("sCustomerName"))
226 236 && !Validator.isValid(args.get("dProductLength"))
227 237 && !Validator.isValid(args.get("sProductName"))){
228 238 String sTsMemo = session.getCurrentTool().getSTsMemo();
... ... @@ -256,110 +266,246 @@ public class DynamicToolProvider implements ToolProvider {
256 266 * @return void
257 267 * @Description 获取动态参数
258 268 **/
259   - private List<ParamRule> doSetParamgetArgsAfter(Map<String,Object> argsNew,UserSceneSession session){
260   - //获取当前方法
261   - //根据新参数获取需要填写参数
  269 + private List<ParamRule> doSetParamgetArgsAfter(Map<String, Object> argsNew, UserSceneSession session) {
262 270 List<ParamRule> dynamicParamRule = new ArrayList<>();
263   - try{
  271 + try {
264 272 ToolMeta tool = session.getCurrentTool();
265 273 Map<String, Object> argsOld = session.getArgs();
266 274 Map<String, Object> args = DeepCopyUtils.deepCopy(argsNew);
267   - if(ObjectUtil.isEmpty(argsOld)){
  275 +
  276 + if (ObjectUtil.isEmpty(argsOld)) {
268 277 argsOld = new HashMap<>();
269 278 }
270   - //根据新录入的参数获取规则
  279 +
271 280 List<ParamRule> paramRuleDataAll = tool.getParamRuleListAll();
272   - //动态参数
273   - List<ParamRule> paramRuleData = paramRuleDataAll.stream().filter(one->
274   - ( ObjectUtil.isNotEmpty(args.get(one.getSParam())) || ObjectUtil.isNotEmpty(args.get(one.getSParamValue())))
  281 +
  282 + // 1. 获取动态参数规则
  283 + List<ParamRule> paramRuleData = paramRuleDataAll.stream()
  284 + .filter(one -> (ObjectUtil.isNotEmpty(args.get(one.getSParam()))
  285 + || ObjectUtil.isNotEmpty(args.get(one.getSParamValue())))
275 286 && ObjectUtil.isNotEmpty(one.getSDynamicParamRuleSql())
276   - ).collect(Collectors.toUnmodifiableList());
277   - //为空的时候需要重新插入不为空 表示之前已经放过了
278   - AtomicReference<List<ParamRule>> paramRuleDataAllNew = new AtomicReference<>(paramRuleDataAll);
279   - if(ObjectUtil.isNotEmpty(paramRuleData)){
  287 + && !"sDynamicPart".equals(one.getSParamValue())
  288 + && !"sDynamicPartDel".equals(one.getSParamValue())
  289 + )
  290 + .collect(Collectors.toList());
  291 + List<ParamRule> paramRuleDataAllNew = new ArrayList<>(paramRuleDataAll);
  292 + // 2. 处理非动态参数
  293 + if (ObjectUtil.isNotEmpty(paramRuleData)) {
280 294 Map<String, Object> finalArgsOld = argsOld;
281   - paramRuleData.forEach(one->{
282   - Map<String,Object> searMap = new HashMap<>();
283   - searMap.putAll(args);
284   - //新参数如果值变了移除掉之前插入的
285   - paramRuleDataAllNew.set(paramRuleDataAll.stream().filter(d ->
286   - !one.getSParam().equals(d.getSDynamicParam())
287   - || (one.getSParam().equals(d.getSDynamicParam()) && one.getSParamValue().equals(d.getSParamValue()))
288   - ).collect(Collectors.toUnmodifiableList()));
  295 +
  296 + for (ParamRule one : paramRuleData) {
  297 + Map<String, Object> searMap = new HashMap<>(args);
  298 + paramRuleDataAllNew.removeIf(d ->
  299 + one.getSParam().equals(d.getSDynamicParam())
  300 + && one.getSParamValue().equals(d.getSParamValue())
  301 + );
289 302  
290 303 String sValue = searMap.get(one.getSParam()).toString();
291 304 List<String> addValue = new ArrayList<>();
292   - if(JSONUtil.isTypeJSONArray(sValue)){
293   - addValue = JSONUtil.toList(sValue,String.class);
294   - }else{
  305 +
  306 + if (JSONUtil.isTypeJSONArray(sValue)) {
  307 + addValue = JSONUtil.toList(sValue, String.class);
  308 + } else {
295 309 addValue.add(sValue);
296 310 }
297   - for(String sVaule:addValue){
298   - //根据值获取动态部件
299   - List<ParamRule> paramRuleDataD = paramRuleDataAllNew.get().stream().filter(d ->
300   - d.getBDynamicParam()
301   - && sValue.equals(d.getSDynamicParam())
302   - && one.getSParam().equals(d.getSDynamicParamName())
303   - ).collect(Collectors.toUnmodifiableList());
304   -
305   - //如果不存在的加入方法参数中
306   - if(ObjectUtil.isEmpty(paramRuleDataD)){
307   - searMap.put("sRuleId",one.getSId());
308   - searMap.put("sTooId",one.getSParentId());
309   - searMap.put("sParam",one.getSParam());
310   - searMap.put("sParamValue",sVaule);
311   -// searMap.put("sParamValue",one.getSParamValue());
312   - searMap.put("sParamName",one.getSParam());
  311 +
  312 + for (String sVaule : addValue) {
  313 + List<ParamRule> paramRuleDataD = paramRuleDataAllNew.stream()
  314 + .filter(d -> d.getBDynamicParam()
  315 + && sVaule.equals(d.getSDynamicParam())
  316 + && one.getSParam().equals(d.getSDynamicParamName()))
  317 + .collect(Collectors.toList());
  318 +
  319 + // 如果不存在,则添加
  320 + if (ObjectUtil.isEmpty(paramRuleDataD)) {
  321 + searMap.put("sRuleId", one.getSId());
  322 + searMap.put("sTooId", one.getSParentId());
  323 + searMap.put("sParam", one.getSParam());
  324 + searMap.put("sParamValue", sVaule);
  325 + searMap.put("sParamName", one.getSParam());
  326 + searMap.put("argsNew", JSONObject.toJSONString(args));
  327 + searMap.put("argsAll", JSONObject.toJSONString(finalArgsOld));
  328 +
313 329 String sSql = one.getSDynamicParamRuleSql();
314   - searMap.put("argsNew",JSONObject.toJSONString(args));
315   - searMap.put("argsAll",JSONObject.toJSONString(finalArgsOld));
316   - //如果不是SELECT 开头
317   - List<Map<String,Object>> selectData = new ArrayList<>();
318   - List<Map<String,Object>> dynamicParamRuleOne = new ArrayList<>();
319   - if(sSql.replaceAll(" ","").toLowerCase().startsWith("select")
320   - || sSql.replaceAll(" ","").toLowerCase().startsWith("call")){
321   - try{
322   - selectData = this.dynamicExeDbService.findSql(searMap, sSql);
323   - if(ObjectUtil.isNotEmpty(selectData)){
  330 + List<Map<String, Object>> dynamicParamRuleOne = new ArrayList<>();
  331 +
  332 + if (sSql.replaceAll(" ", "").toLowerCase().startsWith("select")
  333 + || sSql.replaceAll(" ", "").toLowerCase().startsWith("call")) {
  334 + try {
  335 + List<Map<String, Object>> selectData =
  336 + this.dynamicExeDbService.findSql(searMap, sSql);
  337 + if (ObjectUtil.isNotEmpty(selectData)) {
324 338 String sData = (ObjectUtil.isNotEmpty(selectData)
325   - && ObjectUtil.isNotEmpty(selectData.get(0).get("sData")))?selectData.get(0).get("sData").toString():StrUtil.EMPTY;
326   - if(ObjectUtil.isNotEmpty(sData)){
327   - dynamicParamRuleOne = JsonUtils.toList(sData,Map.class);
  339 + && ObjectUtil.isNotEmpty(selectData.get(0).get("sData")))
  340 + ? selectData.get(0).get("sData").toString()
  341 + : StrUtil.EMPTY;
  342 + if (ObjectUtil.isNotEmpty(sData)) {
  343 + dynamicParamRuleOne = JsonUtils.toList(sData, Map.class);
328 344 }
329 345 }
330   - }catch (Exception e){}
331   - }else{
332   - //表示过程走自定义参数
  346 + } catch (Exception e) {
  347 + log.error("执行动态参数SQL失败", e);
  348 + }
333 349 }
334   - if(ObjectUtil.isNotEmpty(dynamicParamRuleOne)){
335   - dynamicParamRuleOne.forEach(dynamicParamRuleData->{
336   - ParamRule paramRule = BeanUtil.toBean(dynamicParamRuleData,ParamRule.class);
337   - if(!RuleCode.CONST.getCode().equals(paramRule.getSRule())
  350 +
  351 + if (ObjectUtil.isNotEmpty(dynamicParamRuleOne)) {
  352 + for (Map<String, Object> dynamicParamRuleData : dynamicParamRuleOne) {
  353 + ParamRule paramRule = BeanUtil.toBean(dynamicParamRuleData, ParamRule.class);
  354 + if (!RuleCode.CONST.getCode().equals(paramRule.getSRule())
338 355 && ObjectUtil.isNotEmpty(paramRule.getSParamConfig())
339   - && JSONUtil.isTypeJSON(paramRule.getSParamConfig())
340   - ){
341   - try{getConstMeg(paramRule);}catch (Exception e){ e.printStackTrace();}
  356 + && JSONUtil.isTypeJSON(paramRule.getSParamConfig())) {
  357 + try {
  358 + getConstMeg(paramRule);
  359 + } catch (Exception e) {
  360 + log.error("获取常量配置失败", e);
  361 + }
342 362 }
343 363 dynamicParamRule.add(paramRule);
344   - });
  364 + }
345 365 }
346 366 }
347 367 }
348   - });
  368 + }
  369 + }
  370 +
  371 + // 3. 处理动态部件
  372 + List<ParamRule> sDynamicPart = paramRuleDataAll.stream()
  373 + .filter(one -> "sDynamicPart".equals(one.getSParamValue()))
  374 + .collect(Collectors.toList());
  375 + // 3. 处理动态部件
  376 + List<ParamRule> sDynamicPartDel = paramRuleDataAll.stream()
  377 + .filter(one -> "sDynamicPartDel".equals(one.getSParamValue()))
  378 + .collect(Collectors.toList());
  379 + //移除的动态部件
  380 + List<String> sDynamicPartDelValue = new ArrayList<>();
  381 + if(ObjectUtil.isNotEmpty(sDynamicPartDel)){
  382 + ParamRule sDynamicPartOneDel = sDynamicPartDel.get(0);
  383 + String sValueDel = ObjectUtil.isNotEmpty(args.get(sDynamicPartOneDel.getSParam()))
  384 + ? args.get(sDynamicPartOneDel.getSParam()).toString()
  385 + : StrUtil.EMPTY;
  386 + if (ObjectUtil.isNotEmpty(sValueDel)) {
  387 + if (JSONUtil.isTypeJSONArray(sValueDel)) {
  388 + sDynamicPartDelValue = JSONUtil.toList(sValueDel, String.class);
  389 + } else {
  390 + sDynamicPartDelValue.add(sValueDel);
  391 + }
  392 + }
349 393 }
350   - List<ParamRule> dataAll = new ArrayList<>(paramRuleDataAllNew.get());
  394 + //新增部件
  395 + if (ObjectUtil.isNotEmpty(sDynamicPart)
  396 + && ObjectUtil.isNotEmpty(sDynamicPart.get(0))
  397 + && ObjectUtil.isNotEmpty(sDynamicPart.get(0).getSParam())) {
  398 +
  399 + ParamRule sDynamicPartOne = sDynamicPart.get(0);
  400 + String sValue = ObjectUtil.isNotEmpty(args.get(sDynamicPartOne.getSParam()))
  401 + ? args.get(sDynamicPartOne.getSParam()).toString()
  402 + : StrUtil.EMPTY;
  403 +
  404 + if (ObjectUtil.isNotEmpty(sValue)) {
  405 + List<String> addValueOld = new ArrayList<>();
  406 +
  407 + if (JSONUtil.isTypeJSONArray(sValue)) {
  408 + addValueOld = JSONUtil.toList(sValue, String.class);
  409 + } else {
  410 + addValueOld.add(sValue);
  411 + }
  412 + //新增部件不在删除部件中的
  413 + List<String> finalSDynamicPartDelValue = sDynamicPartDelValue;
  414 + List<String> addValue = addValueOld.stream().filter(one-> !finalSDynamicPartDelValue.contains(one)).collect(Collectors.toList());
  415 + //反写值取SESSION
  416 + session.getArgs().put(sDynamicPart.get(0).getSParam(),JSONUtil.toJsonStr(addValue));
  417 + session.getArgs().put(sDynamicPart.get(0).getSParamValue(),JSONUtil.toJsonStr(addValue));
  418 + //收集当前有效的动态部件值
  419 + List<String> validDynamicPartValues = new ArrayList<>();
  420 + for (String sVal : addValue) {
  421 + if(!finalSDynamicPartDelValue.contains(sVal)){
  422 + validDynamicPartValues.add(sVal);
  423 + }
  424 + boolean exists = paramRuleDataAllNew.stream()
  425 + .anyMatch(d -> sVal.equals(d.getSDynamicParam()));
  426 + if (!exists) {
  427 + // 获取部件标准参数
  428 + List<ParamRule> sDynamicPartCheckAddCopy = paramRuleDataAll.stream()
  429 + .filter(d -> ObjectUtil.isNotEmpty(d.getSGroup())
  430 + && !d.getBDynamicParam()
  431 + && d.getSGroup().equals("部件")
  432 + && d.getBStandardParam())
  433 + .map(d -> {
  434 + ParamRule copy = new ParamRule();
  435 + BeanUtils.copyProperties(d, copy);
  436 +
  437 + // 设置动态参数
  438 + String paramName = d.getSParam().split("-").length > 1
  439 + ? d.getSParam().split("-")[1]
  440 + : d.getSParam().split("-")[0];
  441 + copy.setSParam(sVal + "-" + paramName);
  442 +
  443 + // 拼音转换
  444 + String firstLetters = "";
  445 + try {
  446 + firstLetters = PinyinUtil.convertToPinyin(sVal);
  447 + } catch (Exception e) {
  448 + log.warn("拼音转换失败: {}", sVal);
  449 + firstLetters = sVal.substring(0, 1).toUpperCase();
  450 + }
  451 + copy.setSParamValue(firstLetters + d.getSParamValue());
  452 + copy.setIOrder(d.getIOrder() + 100000);
  453 + copy.setBDynamicParam(true);
  454 + copy.setSDynamicParam(sVal);
  455 + copy.setSDynamicParamName("sDynamicPart");
  456 + return copy;
  457 + })
  458 + .collect(Collectors.toList());
  459 +
  460 + if (ObjectUtil.isNotEmpty(sDynamicPartCheckAddCopy)) {
  461 + paramRuleDataAllNew.addAll(sDynamicPartCheckAddCopy);
  462 + log.info("添加了 {} 个动态部件参数,sVal={}",
  463 + sDynamicPartCheckAddCopy.size(), sVal);
  464 + }
  465 + } else {
  466 + log.info("动态部件已存在,跳过: {}", sVal);
  467 + }
  468 + }
  469 + // 移除不在 addValue 中的动态部件
  470 + paramRuleDataAllNew = paramRuleDataAllNew.stream()
  471 + .filter(p -> {
  472 + // 如果不是动态部件参数,保留
  473 + if (!p.getBDynamicParam() || !"sDynamicPart".equals(p.getSDynamicParamName())) {
  474 + return true;
  475 + }
  476 + // 如果是动态部件参数,检查是否在有效值列表中
  477 + return validDynamicPartValues.contains(p.getSDynamicParam());
  478 + })
  479 + .collect(Collectors.toList());
  480 + log.info("移除无效动态部件后,列表大小: {}", paramRuleDataAllNew.size());
  481 + }else{
  482 + //移除不是动态部件的
  483 + paramRuleDataAllNew = paramRuleDataAllNew.stream()
  484 + .filter(p -> !p.getBDynamicParam() || !"sDynamicPart".equals(p.getSDynamicParamName()))
  485 + .collect(Collectors.toList());
  486 + log.info("sValue为空,移除所有动态部件");
  487 + }
  488 + }
  489 + // 4. 合并所有参数
  490 + List<ParamRule> dataAll = new ArrayList<>(paramRuleDataAllNew);
351 491 dataAll.addAll(dynamicParamRule);
352   - paramRuleDataAllNew.set(dataAll);
353   - List<ParamRule> newList = new ArrayList<>(paramRuleDataAllNew.get());
354   - List<ParamRule> dynamicParamRuleAll = Validator.deduplicateByParamValue(newList);
355   - List<ParamRule> paramRuleList = dynamicParamRuleAll.stream().filter(one-> one.getBTipModel()).collect(Collectors.toUnmodifiableList());
356   - List<ParamRule> paramRuleListCheck = dynamicParamRuleAll.stream().filter(one->one.getBEmpty()).collect(Collectors.toUnmodifiableList());
  492 +
  493 + // 5. 去重并设置
  494 + List<ParamRule> dynamicParamRuleAll = Validator.deduplicateByParamValue(dataAll);
  495 + List<ParamRule> paramRuleList = dynamicParamRuleAll.stream()
  496 + .filter(one -> one.getBTipModel())
  497 + .collect(Collectors.toList());
  498 + List<ParamRule> paramRuleListCheck = dynamicParamRuleAll.stream()
  499 + .filter(one -> one.getBEmpty())
  500 + .collect(Collectors.toList());
  501 +
357 502 session.getCurrentTool().setParamRuleListAll(dynamicParamRuleAll);
358 503 session.getCurrentTool().setParamRuleListCheck(paramRuleListCheck);
359 504 session.getCurrentTool().setParamRuleList(paramRuleList);
360   - }catch (Exception e){
  505 +
  506 + } catch (Exception e) {
361 507 e.printStackTrace();
362   - log.error(e.getMessage());
  508 + log.error("获取动态参数失败: {}", e.getMessage(), e);
363 509 }
364 510  
365 511 return dynamicParamRule;
... ... @@ -645,12 +791,18 @@ public class DynamicToolProvider implements ToolProvider {
645 791 Map<String,Object> data = quoService.getQuoData(args, session);
646 792 List<Map<String,Object>> sAll = (List<Map<String, Object>>) data.get("sAll");
647 793 List<Map<String,Object>> sEmptyData = sAll.stream().filter(one-> BooleanUtil.toBoolean(one.get("bEmpty").toString())
648   - && (!Validator.isValid(one.get("sValue"))) && !"sDynamicPart".equals(one.get("sName"))).collect(Collectors.toUnmodifiableList());
  794 + && (!Validator.isValid(one.get("sValue")))
  795 + && !"sDynamicPart".equals(one.get("sName"))
  796 + && !"sDynamicPartDel".equals(one.get("sName"))
  797 + ).collect(Collectors.toUnmodifiableList());
649 798 data.remove("sAll");
650 799 if(ObjectUtil.isNotEmpty(sEmptyData)){
651 800 List<ParamRule> missData = session.getCurrentTool().getParamRuleListAll().stream().filter(d ->
652 801 d.getBEmpty()
653   - && (!Validator.isValid(args.get(d.getSParam()))) && !"sDynamicPart".equals(d.getSParamValue())).collect(Collectors.toUnmodifiableList());
  802 + && (!Validator.isValid(args.get(d.getSParam())))
  803 + && !"sDynamicPart".equals(d.getSParamValue())
  804 + && !"sDynamicPartDel".equals(d.getSParamValue())
  805 + ).collect(Collectors.toUnmodifiableList());
654 806 data.put("bTs",true);
655 807 String sSystemPrompt = SystemPromptGenerator.buildMissParamPrompt(session,missData);
656 808 session.setSSystemPrompt(sSystemPrompt);
... ... @@ -911,7 +1063,10 @@ public class DynamicToolProvider implements ToolProvider {
911 1063 private List<String> checkRequiredParams(Map<String, Object> args, List<ParamRule> paramDefs) {
912 1064 Map<String,Object> returnMap = transformationArgs( args, paramDefs);
913 1065 List<ParamRule> paramDefsCheck = paramDefs.stream()
914   - .filter(pd -> !"sDynamicPart".equals(pd.getSParamValue())).collect(Collectors.toUnmodifiableList());
  1066 + .filter(pd ->
  1067 + !"sDynamicPart".equals(pd.getSParamValue())
  1068 + && !"sDynamicPartDel".equals(pd.getSParamValue())
  1069 + ).collect(Collectors.toUnmodifiableList());
915 1070 paramDefsCheck = paramDefsCheck.stream()
916 1071 .filter(pd -> Boolean.TRUE.equals(pd.getBEmpty()) && pd.getBTipModel()).collect(Collectors.toUnmodifiableList());
917 1072 paramDefsCheck = paramDefsCheck.stream()
... ...
src/main/java/com/xly/util/DeepCopyUtils.java
... ... @@ -61,10 +61,10 @@ public class DeepCopyUtils {
61 61 }
62 62 }
63 63  
64   - private static <T> T cloneArray(T array) {
  64 + public static <T> T cloneArray(T array) {
65 65 Class<?> componentType = array.getClass().getComponentType();
66 66  
67   - if (componentType.isPrimitive()) {
  67 + if (componentType !=null && componentType.isPrimitive()) {
68 68 // 基本类型数组
69 69 int length = java.lang.reflect.Array.getLength(array);
70 70 Object copy = java.lang.reflect.Array.newInstance(componentType, length);
... ...
src/main/java/com/xly/util/PinyinUtil.java 0 → 100644
  1 +package com.xly.util;
  2 +
  3 +import net.sourceforge.pinyin4j.PinyinHelper;
  4 +import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
  5 +import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
  6 +import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
  7 +import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
  8 +
  9 +public class PinyinUtil {
  10 +
  11 + private static final HanyuPinyinOutputFormat FORMAT = new HanyuPinyinOutputFormat();
  12 +
  13 + static {
  14 + FORMAT.setCaseType(HanyuPinyinCaseType.LOWERCASE); // 小写
  15 + FORMAT.setToneType(HanyuPinyinToneType.WITHOUT_TONE); // 不带声调
  16 + }
  17 +
  18 + public static String convertToPinyin(Object input) {
  19 + if (input == null) {
  20 + return "";
  21 + }
  22 +
  23 + String sVal = input.toString().trim();
  24 + if (sVal.isEmpty()) {
  25 + return "";
  26 + }
  27 +
  28 + try {
  29 + StringBuilder result = new StringBuilder();
  30 + char[] chars = sVal.toCharArray();
  31 +
  32 + for (char ch : chars) {
  33 + // 判断是否为汉字
  34 + if (String.valueOf(ch).matches("[\\u4E00-\\u9FA5]+")) {
  35 + String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(ch, FORMAT);
  36 + if (pinyinArray != null && pinyinArray.length > 0) {
  37 + // 多音字取第一个
  38 + result.append(pinyinArray[0]);
  39 + } else {
  40 + result.append(ch); // 无法转换保留原字符
  41 + }
  42 + } else {
  43 + result.append(ch); // 非汉字直接保留
  44 + }
  45 + }
  46 +
  47 + return result.toString() + "_";
  48 + } catch (BadHanyuPinyinOutputFormatCombination e) {
  49 + System.err.println("拼音转换异常: " + sVal + ", " + e.getMessage());
  50 + return sVal + "_";
  51 + }
  52 + }
  53 +}
0 54 \ No newline at end of file
... ...
src/main/java/com/xly/util/Validator.java
... ... @@ -36,32 +36,6 @@ public class Validator {
36 36 }
37 37 return ObjectUtil.isNotEmpty(obj);
38 38 }
39   -
40   - /**
41   - * 根据指定 key 对 List<Map<String, Object>> 去重
42   - *
43   - * @param list 原始列表
44   - * @param key 去重依据的 key
45   - * @return 去重后的列表(保留首次出现的顺序)
46   - */
47   - public static List<Map<String, Object>> distinctByKey(
48   - List<Map<String, Object>> list, String key) {
49   -
50   - if (list == null || list.isEmpty()) {
51   - return new ArrayList<>();
52   - }
53   -
54   - return list.stream()
55   - .filter(item -> item != null && item.get(key) != null)
56   - .collect(Collectors.toMap(
57   - item -> item.get(key),
58   - Function.identity(),
59   - (existing, replacement) -> existing
60   - ))
61   - .values()
62   - .stream()
63   - .collect(Collectors.toList());
64   - }
65 39 /***
66 40 * @Author 钱豹
67 41 * @Date 0:58 2026/7/2
... ...