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