Commit de9259d8cdb1000f02499b146d59fa1eab0bdee1
1 parent
48dd0522
添加未清选择 改成动态引导语
Showing
6 changed files
with
300 additions
and
107 deletions
pom.xml
| ... | ... | @@ -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 | ... | ... |