Commit de9259d8cdb1000f02499b146d59fa1eab0bdee1

Authored by qianbao
1 parent 48dd0522

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

@@ -102,6 +102,12 @@ @@ -102,6 +102,12 @@
102 <artifactId>pagehelper-spring-boot-starter</artifactId> 102 <artifactId>pagehelper-spring-boot-starter</artifactId>
103 <version>${pagehelper.version}</version> 103 <version>${pagehelper.version}</version>
104 </dependency> 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 <dependency> 113 <dependency>
src/main/java/com/xly/service/QuoService.java
@@ -2,6 +2,7 @@ package com.xly.service; @@ -2,6 +2,7 @@ package com.xly.service;
2 2
3 import cn.hutool.core.util.ObjectUtil; 3 import cn.hutool.core.util.ObjectUtil;
4 import cn.hutool.core.util.StrUtil; 4 import cn.hutool.core.util.StrUtil;
  5 +import cn.hutool.extra.pinyin.PinyinUtil;
5 import cn.hutool.json.JSONUtil; 6 import cn.hutool.json.JSONUtil;
6 import com.alibaba.fastjson2.JSONObject; 7 import com.alibaba.fastjson2.JSONObject;
7 import com.xly.entity.ParamRule; 8 import com.xly.entity.ParamRule;
@@ -41,7 +42,7 @@ public class QuoService { @@ -41,7 +42,7 @@ public class QuoService {
41 } 42 }
42 List<ParamRule> dataAll = session.getCurrentTool().getParamRuleListAll(); 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 List<ParamRule> dataPart = dataAll.stream().filter(one-> "部件".equals(one.getSGroup()) && !one.getBDynamicParam()).collect(Collectors.toUnmodifiableList()); 46 List<ParamRule> dataPart = dataAll.stream().filter(one-> "部件".equals(one.getSGroup()) && !one.getBDynamicParam()).collect(Collectors.toUnmodifiableList());
46 List<ParamRule> datasDynamicPart = dataAll.stream().filter(one-> "sDynamicPart".equals(one.getSParamValue()) && !one.getBDynamicParam()).collect(Collectors.toUnmodifiableList()); 47 List<ParamRule> datasDynamicPart = dataAll.stream().filter(one-> "sDynamicPart".equals(one.getSParamValue()) && !one.getBDynamicParam()).collect(Collectors.toUnmodifiableList());
47 List<Map<String,Object>> sAll = new ArrayList<>(); 48 List<Map<String,Object>> sAll = new ArrayList<>();
@@ -67,7 +68,11 @@ public class QuoService { @@ -67,7 +68,11 @@ public class QuoService {
67 product.put("sParamConfigValue",p.getSParamConfigValue()==null?StrUtil.EMPTY:p.getSParamConfigValue()); 68 product.put("sParamConfigValue",p.getSParamConfigValue()==null?StrUtil.EMPTY:p.getSParamConfigValue());
68 //获取动态参数 69 //获取动态参数
69 adddynamicData( sValue, dataAll, p, finalArgsOld, sAll, product); 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 List<Map<String,Object>> partList = new ArrayList<>(); 78 List<Map<String,Object>> partList = new ArrayList<>();
@@ -109,7 +114,7 @@ public class QuoService { @@ -109,7 +114,7 @@ public class QuoService {
109 datasDynamicPartArray.forEach(one->{ 114 datasDynamicPartArray.forEach(one->{
110 List<ParamRule> dataPartDynamic = dataAll.stream().filter(d -> 115 List<ParamRule> dataPartDynamic = dataAll.stream().filter(d ->
111 one.equals(d.getSDynamicParam()) 116 one.equals(d.getSDynamicParam())
112 - && "新增部件".equals(d.getSDynamicParamName() 117 + && "sDynamicPart".equals(d.getSDynamicParamName()
113 )&&d.getBDynamicParam() 118 )&&d.getBDynamicParam()
114 ).collect(Collectors.toUnmodifiableList()); 119 ).collect(Collectors.toUnmodifiableList());
115 if(ObjectUtil.isNotEmpty(dataPartDynamic)){ 120 if(ObjectUtil.isNotEmpty(dataPartDynamic)){
src/main/java/com/xly/tool/DynamicToolProvider.java
@@ -34,12 +34,14 @@ import lombok.RequiredArgsConstructor; @@ -34,12 +34,14 @@ import lombok.RequiredArgsConstructor;
34 34
35 import lombok.extern.slf4j.Slf4j; 35 import lombok.extern.slf4j.Slf4j;
36 36
  37 +import org.springframework.beans.BeanUtils;
37 import org.springframework.beans.factory.annotation.Value; 38 import org.springframework.beans.factory.annotation.Value;
38 import org.springframework.stereotype.Service; 39 import org.springframework.stereotype.Service;
39 40
40 import java.util.*; 41 import java.util.*;
41 42
42 import java.util.concurrent.ConcurrentHashMap; 43 import java.util.concurrent.ConcurrentHashMap;
  44 +import java.util.concurrent.CopyOnWriteArrayList;
43 import java.util.concurrent.atomic.AtomicReference; 45 import java.util.concurrent.atomic.AtomicReference;
44 import java.util.stream.Collectors; 46 import java.util.stream.Collectors;
45 import java.util.stream.IntStream; 47 import java.util.stream.IntStream;
@@ -188,6 +190,13 @@ public class DynamicToolProvider implements ToolProvider { @@ -188,6 +190,13 @@ public class DynamicToolProvider implements ToolProvider {
188 finalArgs.put(k,v); 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 // 2 【补全动态参数】动态参数补全 200 // 2 【补全动态参数】动态参数补全
192 try{ 201 try{
193 args = applyValues(args, meta.getParamRuleListCheck()); 202 args = applyValues(args, meta.getParamRuleListCheck());
@@ -223,6 +232,7 @@ public class DynamicToolProvider implements ToolProvider { @@ -223,6 +232,7 @@ public class DynamicToolProvider implements ToolProvider {
223 } 232 }
224 //判断是否首次进入给提示 如果没有产品名称 产品长 宽 233 //判断是否首次进入给提示 如果没有产品名称 产品长 宽
225 if(!Validator.isValid(args.get("dProductWidth")) 234 if(!Validator.isValid(args.get("dProductWidth"))
  235 + && !Validator.isValid(args.get("sCustomerName"))
226 && !Validator.isValid(args.get("dProductLength")) 236 && !Validator.isValid(args.get("dProductLength"))
227 && !Validator.isValid(args.get("sProductName"))){ 237 && !Validator.isValid(args.get("sProductName"))){
228 String sTsMemo = session.getCurrentTool().getSTsMemo(); 238 String sTsMemo = session.getCurrentTool().getSTsMemo();
@@ -256,110 +266,246 @@ public class DynamicToolProvider implements ToolProvider { @@ -256,110 +266,246 @@ public class DynamicToolProvider implements ToolProvider {
256 * @return void 266 * @return void
257 * @Description 获取动态参数 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 List<ParamRule> dynamicParamRule = new ArrayList<>(); 270 List<ParamRule> dynamicParamRule = new ArrayList<>();
263 - try{ 271 + try {
264 ToolMeta tool = session.getCurrentTool(); 272 ToolMeta tool = session.getCurrentTool();
265 Map<String, Object> argsOld = session.getArgs(); 273 Map<String, Object> argsOld = session.getArgs();
266 Map<String, Object> args = DeepCopyUtils.deepCopy(argsNew); 274 Map<String, Object> args = DeepCopyUtils.deepCopy(argsNew);
267 - if(ObjectUtil.isEmpty(argsOld)){ 275 +
  276 + if (ObjectUtil.isEmpty(argsOld)) {
268 argsOld = new HashMap<>(); 277 argsOld = new HashMap<>();
269 } 278 }
270 - //根据新录入的参数获取规则 279 +
271 List<ParamRule> paramRuleDataAll = tool.getParamRuleListAll(); 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 && ObjectUtil.isNotEmpty(one.getSDynamicParamRuleSql()) 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 Map<String, Object> finalArgsOld = argsOld; 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 String sValue = searMap.get(one.getSParam()).toString(); 303 String sValue = searMap.get(one.getSParam()).toString();
291 List<String> addValue = new ArrayList<>(); 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 addValue.add(sValue); 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 String sSql = one.getSDynamicParamRuleSql(); 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 String sData = (ObjectUtil.isNotEmpty(selectData) 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 && ObjectUtil.isNotEmpty(paramRule.getSParamConfig()) 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 dynamicParamRule.add(paramRule); 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 dataAll.addAll(dynamicParamRule); 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 session.getCurrentTool().setParamRuleListAll(dynamicParamRuleAll); 502 session.getCurrentTool().setParamRuleListAll(dynamicParamRuleAll);
358 session.getCurrentTool().setParamRuleListCheck(paramRuleListCheck); 503 session.getCurrentTool().setParamRuleListCheck(paramRuleListCheck);
359 session.getCurrentTool().setParamRuleList(paramRuleList); 504 session.getCurrentTool().setParamRuleList(paramRuleList);
360 - }catch (Exception e){ 505 +
  506 + } catch (Exception e) {
361 e.printStackTrace(); 507 e.printStackTrace();
362 - log.error(e.getMessage()); 508 + log.error("获取动态参数失败: {}", e.getMessage(), e);
363 } 509 }
364 510
365 return dynamicParamRule; 511 return dynamicParamRule;
@@ -645,12 +791,18 @@ public class DynamicToolProvider implements ToolProvider { @@ -645,12 +791,18 @@ public class DynamicToolProvider implements ToolProvider {
645 Map<String,Object> data = quoService.getQuoData(args, session); 791 Map<String,Object> data = quoService.getQuoData(args, session);
646 List<Map<String,Object>> sAll = (List<Map<String, Object>>) data.get("sAll"); 792 List<Map<String,Object>> sAll = (List<Map<String, Object>>) data.get("sAll");
647 List<Map<String,Object>> sEmptyData = sAll.stream().filter(one-> BooleanUtil.toBoolean(one.get("bEmpty").toString()) 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 data.remove("sAll"); 798 data.remove("sAll");
650 if(ObjectUtil.isNotEmpty(sEmptyData)){ 799 if(ObjectUtil.isNotEmpty(sEmptyData)){
651 List<ParamRule> missData = session.getCurrentTool().getParamRuleListAll().stream().filter(d -> 800 List<ParamRule> missData = session.getCurrentTool().getParamRuleListAll().stream().filter(d ->
652 d.getBEmpty() 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 data.put("bTs",true); 806 data.put("bTs",true);
655 String sSystemPrompt = SystemPromptGenerator.buildMissParamPrompt(session,missData); 807 String sSystemPrompt = SystemPromptGenerator.buildMissParamPrompt(session,missData);
656 session.setSSystemPrompt(sSystemPrompt); 808 session.setSSystemPrompt(sSystemPrompt);
@@ -911,7 +1063,10 @@ public class DynamicToolProvider implements ToolProvider { @@ -911,7 +1063,10 @@ public class DynamicToolProvider implements ToolProvider {
911 private List<String> checkRequiredParams(Map<String, Object> args, List<ParamRule> paramDefs) { 1063 private List<String> checkRequiredParams(Map<String, Object> args, List<ParamRule> paramDefs) {
912 Map<String,Object> returnMap = transformationArgs( args, paramDefs); 1064 Map<String,Object> returnMap = transformationArgs( args, paramDefs);
913 List<ParamRule> paramDefsCheck = paramDefs.stream() 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 paramDefsCheck = paramDefsCheck.stream() 1070 paramDefsCheck = paramDefsCheck.stream()
916 .filter(pd -> Boolean.TRUE.equals(pd.getBEmpty()) && pd.getBTipModel()).collect(Collectors.toUnmodifiableList()); 1071 .filter(pd -> Boolean.TRUE.equals(pd.getBEmpty()) && pd.getBTipModel()).collect(Collectors.toUnmodifiableList());
917 paramDefsCheck = paramDefsCheck.stream() 1072 paramDefsCheck = paramDefsCheck.stream()
src/main/java/com/xly/util/DeepCopyUtils.java
@@ -61,10 +61,10 @@ public class DeepCopyUtils { @@ -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 Class<?> componentType = array.getClass().getComponentType(); 65 Class<?> componentType = array.getClass().getComponentType();
66 66
67 - if (componentType.isPrimitive()) { 67 + if (componentType !=null && componentType.isPrimitive()) {
68 // 基本类型数组 68 // 基本类型数组
69 int length = java.lang.reflect.Array.getLength(array); 69 int length = java.lang.reflect.Array.getLength(array);
70 Object copy = java.lang.reflect.Array.newInstance(componentType, length); 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 \ No newline at end of file 54 \ No newline at end of file
src/main/java/com/xly/util/Validator.java
@@ -36,32 +36,6 @@ public class Validator { @@ -36,32 +36,6 @@ public class Validator {
36 } 36 }
37 return ObjectUtil.isNotEmpty(obj); 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 * @Author 钱豹 40 * @Author 钱豹
67 * @Date 0:58 2026/7/2 41 * @Date 0:58 2026/7/2