diff --git a/src/main/java/com/xly/service/QuoService.java b/src/main/java/com/xly/service/QuoService.java index 843c877..6dab937 100644 --- a/src/main/java/com/xly/service/QuoService.java +++ b/src/main/java/com/xly/service/QuoService.java @@ -1,28 +1,17 @@ package com.xly.service; -import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; import com.alibaba.fastjson2.JSONObject; -import com.xly.agent.SystemPromptGenerator; -import com.xly.constant.ErrorCode; -import com.xly.constant.ProcedureConstant; import com.xly.entity.ParamRule; -import com.xly.entity.ToolMeta; import com.xly.entity.UserSceneSession; -import com.xly.exception.dto.BusinessException; -import com.xly.mapper.DynamicExeDbMapper; -import com.xly.util.DeepCopyUtils; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import java.util.*; import java.util.stream.Collectors; -import java.util.stream.Stream; - /*** * @Author 钱豹 * @Date 0:06 2026/7/7 @@ -43,131 +32,160 @@ public class QuoService { * @return java.util.Map * @Description 报价获取参数组装 **/ - public Map getQuoData(Map argsNew, UserSceneSession session, List dynamicParamRule){ + public Map getQuoData(Map args, UserSceneSession session){ //获取当前方法 Map retData = new HashMap<>(); - ToolMeta meta = session.getCurrentTool(); - //放入方法动态参数中 - meta.setDynamicParamRule(dynamicParamRule); - session.setCurrentTool(meta); - Map argsOld = session.getArgs(); - Map args = DeepCopyUtils.deepCopy(argsNew); - if(ObjectUtil.isEmpty(argsOld)){ - argsOld = new HashMap<>(); - } - argsOld.putAll(args); - session.setArgs(argsOld); - List dataAll = session.getCurrentTool().getParamRuleListAll(); - //获取产品的参数 - List dataProduct = dataAll.stream().filter(one-> "产品".equals(one.getSGroup()) && !one.getBDynamicParam() ).collect(Collectors.toUnmodifiableList()); - List dataPart = dataAll.stream().filter(one-> "部件".equals(one.getSGroup()) && !one.getBDynamicParam()).collect(Collectors.toUnmodifiableList()); - List datasDynamicPart = dataAll.stream().filter(one-> "sDynamicPart".equals(one.getSParamValue()) && !one.getBDynamicParam()).collect(Collectors.toUnmodifiableList()); - List> sAll = new ArrayList<>(); - List> productList = new ArrayList<>(); - Map finalArgsOld = argsOld; - dataProduct.forEach(p->{ - Map product = new HashMap<>(); - String sValue = ObjectUtil.isNotEmpty(finalArgsOld.get(p.getSParam()))? finalArgsOld.get(p.getSParam()).toString():(ObjectUtil.isNotEmpty(finalArgsOld.get(p.getSParam()))? finalArgsOld.get(p.getSParam()).toString():StrUtil.EMPTY); - product.put("sName",p.getSParamValue()); - product.put("showName",p.getSParam()); - product.put("bEmpty",p.getBEmpty()); - product.put("sValue", sValue); - product.put("sParamMissMemo", p.getSParamMissMemo()==null?StrUtil.EMPTY:p.getSParamMissMemo()); - product.put("iOrder", p.getIOrder()); - product.put("sParamConfigValue",p.getSParamConfigValue()==null?StrUtil.EMPTY:p.getSParamConfigValue()); - productList.add(product); - }); - List> partList = new ArrayList<>(); - dataPart.forEach(p->{ - Map part = new HashMap<>(); - String sValue = ObjectUtil.isNotEmpty(finalArgsOld.get(p.getSParam()))?finalArgsOld.get(p.getSParam()).toString():(ObjectUtil.isNotEmpty(finalArgsOld.get(p.getSParam()))? finalArgsOld.get(p.getSParam()).toString():StrUtil.EMPTY); - part.put("sPartName",p.getSParam().split("-")[0]); - part.put("sName",p.getSParamValue()); - part.put("showName",p.getSParam()); - part.put("bEmpty",p.getBEmpty()); - part.put("sValue", sValue); - part.put("iOrder", p.getIOrder()); - part.put("sParamMissMemo", p.getSParamMissMemo()==null?StrUtil.EMPTY:p.getSParamMissMemo()); - part.put("sParamConfigValue",p.getSParamConfigValue()==null?StrUtil.EMPTY:p.getSParamConfigValue()); - //获取动态参数 - if(ObjectUtil.isNotEmpty(sValue)){ - List dataParamDynamic = dataAll.stream().filter(d -> sValue.equals(d.getSDynamicParam()) && p.getSParamValue().equals(d.getSDynamicParamName())&&d.getBDynamicParam()).collect(Collectors.toUnmodifiableList()); - if(ObjectUtil.isNotEmpty(dataParamDynamic)){ - List> dynamicData = new ArrayList<>(); - dataParamDynamic.forEach(dynamic->{ - Map dynamicOne = new HashMap<>(); - String dynamicValue = ObjectUtil.isNotEmpty(finalArgsOld.get(dynamic.getSParam()))?finalArgsOld.get(dynamic.getSParam()).toString():(ObjectUtil.isNotEmpty(finalArgsOld.get(dynamic.getSParam()))? finalArgsOld.get(dynamic.getSParam()).toString():StrUtil.EMPTY); - dynamicOne.put("sName",dynamic.getSParamValue()); - dynamicOne.put("showName",dynamic.getSParam()); - dynamicOne.put("bEmpty",dynamic.getBEmpty()); - dynamicOne.put("sValue", dynamicValue); - dynamicOne.put("iOrder", dynamic.getIOrder()); - dynamicOne.put("sParamMissMemo", dynamic.getSParamMissMemo()==null?StrUtil.EMPTY:dynamic.getSParamMissMemo()); - dynamicOne.put("sParamConfigValue",dynamic.getSParamConfigValue()==null?StrUtil.EMPTY:dynamic.getSParamConfigValue()); - //获取动态参数 - dynamicData.add(dynamicOne); + try{ + if(ObjectUtil.isEmpty(args)){ + args = new HashMap<>(); + } + List dataAll = session.getCurrentTool().getParamRuleListAll(); + //获取产品的参数 + List dataProduct = dataAll.stream().filter(one-> "产品".equals(one.getSGroup()) && !one.getBDynamicParam() ).collect(Collectors.toUnmodifiableList()); + List dataPart = dataAll.stream().filter(one-> "部件".equals(one.getSGroup()) && !one.getBDynamicParam()).collect(Collectors.toUnmodifiableList()); + List datasDynamicPart = dataAll.stream().filter(one-> "sDynamicPart".equals(one.getSParamValue()) && !one.getBDynamicParam()).collect(Collectors.toUnmodifiableList()); + List> sAll = new ArrayList<>(); + List> productList = new ArrayList<>(); + Map finalArgsOld = args; + dataProduct.forEach(p->{ + Map product = new HashMap<>(); + Object sValue = getValue( p,finalArgsOld); + product.put("sName",p.getSParamValue()); + product.put("showName",p.getSParam()); + product.put("bEmpty",p.getBEmpty()); + product.put("sValue", sValue); + product.put("sParamMissMemo", p.getSParamMissMemo()==null?StrUtil.EMPTY:p.getSParamMissMemo()); + product.put("iOrder", p.getIOrder()); + product.put("sParamConfigValue",p.getSParamConfigValue()==null?StrUtil.EMPTY:p.getSParamConfigValue()); + productList.add(product); + }); + List> partList = new ArrayList<>(); + dataPart.forEach(p->{ + Object sVal = getValue( p,finalArgsOld); + List addValue = new ArrayList<>(); + if(JSONUtil.isTypeJSONArray(sVal.toString())){ + addValue = JSONUtil.toList(sVal.toString(),String.class); + }else{ + addValue.add(sVal.toString()); + } + for(String sValue:addValue){ + Map part = new HashMap<>(); + part.put("sPartName",p.getSParam().split("-")[0]); + part.put("sName",p.getSParamValue()); + part.put("showName",p.getSParam()); + part.put("bEmpty",p.getBEmpty()); + part.put("sValue", sValue); + part.put("iOrder", p.getIOrder()); + part.put("sParamMissMemo", p.getSParamMissMemo()==null?StrUtil.EMPTY:p.getSParamMissMemo()); + part.put("sParamConfigValue",p.getSParamConfigValue()==null?StrUtil.EMPTY:p.getSParamConfigValue()); + //获取动态参数 + adddynamicData( sValue, dataAll, p, finalArgsOld, sAll, part); + partList.add(part); + } + }); + //动态部件 + if(ObjectUtil.isNotEmpty(datasDynamicPart)){ + String datasDynamicPartValue = ObjectUtil.isNotEmpty(finalArgsOld.get("sDynamicPart"))? finalArgsOld.get("sDynamicPart").toString(): StrUtil.EMPTY; +// :(ObjectUtil.isNotEmpty(finalArgsOld.get(p.getSParam()))? finalArgsOld.get(p.getSParam()).toString():StrUtil.EMPTY); + if(StrUtil.isNotEmpty(datasDynamicPartValue)){ + List datasDynamicPartArray = new ArrayList<>(); + if(JSONUtil.isTypeJSONArray(datasDynamicPartValue.toString())){ + datasDynamicPartArray = JSONUtil.toList(datasDynamicPartValue.toString(),String.class); + }else{ + datasDynamicPartArray.add(datasDynamicPartValue); + } + datasDynamicPartArray.forEach(one->{ + List dataPartDynamic = dataAll.stream().filter(d -> + one.equals(d.getSDynamicParam()) + && "动态部件".equals(d.getSDynamicParamName() + )&&d.getBDynamicParam() + ).collect(Collectors.toUnmodifiableList()); + if(ObjectUtil.isNotEmpty(dataPartDynamic)){ + dataPartDynamic.forEach(dynamic->{ + Object sVal = getValue( dynamic,finalArgsOld); + List addValue = new ArrayList<>(); + if(JSONUtil.isTypeJSONArray(sVal.toString())){ + addValue = JSONUtil.toList(sVal.toString(),String.class); + }else{ + addValue.add(sVal.toString()); + } + for(String sValue:addValue){ + Map part = new HashMap<>(); + Object dynamicValue = getValue( dynamic,finalArgsOld); + part.put("sPartName",one); + part.put("sName",dynamic.getSParamValue()); + part.put("showName",dynamic.getSParam()); + part.put("bEmpty",dynamic.getBEmpty()); + part.put("sValue", dynamicValue); + part.put("iOrder", dynamic.getIOrder()); + part.put("sParamConfigValue",dynamic.getSParamConfigValue()); + part.put("sParamMissMemo", dynamic.getSParamMissMemo()); + //获取动态参数 + adddynamicData(sValue,dataAll, dynamic, finalArgsOld, sAll, part); + partList.add(part); + } + }); + } }); - sAll.addAll(dynamicData); - part.put("dynamicData",dynamicData); } } + sAll.addAll(productList); + sAll.addAll(partList); + retData.put("sAll",sAll); + retData.put("product",productList); + retData.put("partList",partList); + }catch (Exception e){ - partList.add(part); - }); - //动态部件 - if(ObjectUtil.isNotEmpty(datasDynamicPart)){ - String datasDynamicPartValue = ObjectUtil.isNotEmpty(finalArgsOld.get("sDynamicPart"))? finalArgsOld.get("sDynamicPart").toString(): StrUtil.EMPTY; -// :(ObjectUtil.isNotEmpty(finalArgsOld.get(p.getSParam()))? finalArgsOld.get(p.getSParam()).toString():StrUtil.EMPTY); - if(StrUtil.isNotEmpty(datasDynamicPartValue)){ - List datasDynamicPartArray = Collections.singletonList(JSONObject.parseObject(datasDynamicPartValue, String.class)); - datasDynamicPartArray.forEach(one->{ - List dataPartDynamic = dataAll.stream().filter(d -> one.equals(d.getSDynamicParam()) && "sDynamicPart".equals(d.getSDynamicParamName())&&d.getBDynamicParam()).collect(Collectors.toUnmodifiableList()); - if(ObjectUtil.isNotEmpty(dataPartDynamic)){ - dataPartDynamic.forEach(dynamic->{ - Map part = new HashMap<>(); - String sValue = ObjectUtil.isNotEmpty(finalArgsOld.get(dynamic.getSParam()))?finalArgsOld.get(dynamic.getSParam()).toString():(ObjectUtil.isNotEmpty(finalArgsOld.get(dynamic.getSParam()))? finalArgsOld.get(dynamic.getSParam()).toString():StrUtil.EMPTY); - part.put("sPartName",one); - part.put("sName",dynamic.getSParamValue()); - part.put("showName",dynamic.getSParam()); - part.put("bEmpty",dynamic.getBEmpty()); - part.put("sValue", sValue); - part.put("iOrder", dynamic.getIOrder()); - part.put("sParamConfigValue",dynamic.getSParamConfigValue()); - part.put("sParamMissMemo", dynamic.getSParamMissMemo()); - //获取动态参数 - if(ObjectUtil.isNotEmpty(sValue)){ - List dataParamDynamic = dataAll.stream().filter(d -> sValue.equals(d.getSDynamicParam()) && dynamic.getSParamValue().equals(d.getSDynamicParamName())&&d.getBDynamicParam()).collect(Collectors.toUnmodifiableList()); - if(ObjectUtil.isNotEmpty(dataParamDynamic)){ - List> dynamicData = new ArrayList<>(); - dataParamDynamic.forEach(dynamicD->{ - Map dynamicOne = new HashMap<>(); - String dynamicValue = ObjectUtil.isNotEmpty(finalArgsOld.get(dynamicD.getSParam()))?finalArgsOld.get(dynamicD.getSParam()).toString():(ObjectUtil.isNotEmpty(finalArgsOld.get(dynamicD.getSParam()))? finalArgsOld.get(dynamicD.getSParam()).toString():StrUtil.EMPTY); - dynamicOne.put("sName",dynamicD.getSParamValue()); - dynamicOne.put("showName",dynamicD.getSParam()); - dynamicOne.put("bEmpty",dynamicD.getBEmpty()); - dynamicOne.put("sValue", dynamicValue); - dynamicOne.put("iOrder", dynamicD.getIOrder()); - dynamicOne.put("sParamMissMemo", dynamicD.getSParamMissMemo()==null?StrUtil.EMPTY:dynamicD.getSParamMissMemo()); - dynamicOne.put("sParamConfigValue",dynamicD.getSParamConfigValue()==null?StrUtil.EMPTY:dynamicD.getSParamConfigValue()); - //获取动态参数 - dynamicData.add(dynamicOne); - }); - sAll.addAll(dynamicData); - part.put("dynamicData",dynamicData); - } - } - partList.add(part); - }); - } + } + + return retData; + } + /*** + * @Author 钱豹 + * @Date 23:00 2026/7/7 + * @Param [p, finalArgs] + * @return void + * @Description 添加动态参数值 + **/ + private void adddynamicData(Object sValue,List dataAll,ParamRule p, Map finalArgsOld, List> sAll, Map part){ + if(ObjectUtil.isNotEmpty(sValue)){ + //根据值获取动态部件 + List dataParamDynamic = dataAll.stream().filter(d -> + d.getBDynamicParam() + && sValue.equals(d.getSDynamicParam()) + && p.getSParam().equals(d.getSDynamicParamName()) + ).collect(Collectors.toUnmodifiableList()); + if(ObjectUtil.isNotEmpty(dataParamDynamic)){ + List> dynamicData = new ArrayList<>(); + dataParamDynamic.forEach(dynamic->{ + Map dynamicOne = new HashMap<>(); + Object dynamicValue = getValue( p,finalArgsOld); + dynamicOne.put("sName",dynamic.getSParamValue()); + dynamicOne.put("showName",dynamic.getSParam()); + dynamicOne.put("bEmpty",dynamic.getBEmpty()); + dynamicOne.put("sValue", dynamicValue); + dynamicOne.put("iOrder", dynamic.getIOrder()); + dynamicOne.put("sParamMissMemo", dynamic.getSParamMissMemo()==null?StrUtil.EMPTY:dynamic.getSParamMissMemo()); + dynamicOne.put("sParamConfigValue",dynamic.getSParamConfigValue()==null?StrUtil.EMPTY:dynamic.getSParamConfigValue()); + //获取动态参数 + dynamicData.add(dynamicOne); }); + sAll.addAll(dynamicData); + part.put("dynamicData",dynamicData); } } - sAll.addAll(productList); - sAll.addAll(partList); - retData.put("sAll",sAll); - retData.put("product",productList); - retData.put("partList",partList); - return retData; + } + + private Object getValue(ParamRule p,Map finalArgs){ + Object value = ObjectUtil.isNotEmpty(finalArgs.get(p.getSParam()))? + finalArgs.get(p.getSParam()).toString() + :(ObjectUtil.isNotEmpty(finalArgs.get(p.getSParam()))? + finalArgs.get(p.getSParam()).toString():StrUtil.EMPTY); + if("0".equals(value)){ + return StrUtil.EMPTY; + }else{ + return value; + } } } \ No newline at end of file diff --git a/src/main/java/com/xly/service/XlyErpService.java b/src/main/java/com/xly/service/XlyErpService.java index b26418e..ccf89a9 100644 --- a/src/main/java/com/xly/service/XlyErpService.java +++ b/src/main/java/com/xly/service/XlyErpService.java @@ -460,20 +460,21 @@ public class XlyErpService { session.setBCleanMemory(false); session.setCurrentRowData(null); session.setQuoData(null); - ToolMeta toolMeta = session.getCurrentTool(); - List data = toolMeta.getParamRuleListAll(); - List data2 = toolMeta.getParamRuleList(); - List data3 = toolMeta.getParamRuleListCheck(); - data = data.stream().filter(one-> !one.getBDynamicParam()).collect(Collectors.toUnmodifiableList()); - data2 = data2.stream().filter(one-> !one.getBDynamicParam()).collect(Collectors.toUnmodifiableList()); - data2 = data2.stream().filter(one-> !one.getBDynamicParam()).collect(Collectors.toUnmodifiableList()); - data3 = data3.stream().filter(one-> !one.getBDynamicParam()).collect(Collectors.toUnmodifiableList()); - toolMeta.setDynamicParamRule(null); - toolMeta.setParamRuleListAll(data); - toolMeta.setParamRuleList(data2); - toolMeta.setParamRuleListCheck(data3); - session.setCurrentTool(toolMeta); + if(toolMeta!=null && ObjectUtil.isNotEmpty(toolMeta)){ + List data = toolMeta.getParamRuleListAll(); + List data2 = toolMeta.getParamRuleList(); + List data3 = toolMeta.getParamRuleListCheck(); + data = data.stream().filter(one-> !one.getBDynamicParam()).collect(Collectors.toUnmodifiableList()); + data2 = data2.stream().filter(one-> !one.getBDynamicParam()).collect(Collectors.toUnmodifiableList()); + data2 = data2.stream().filter(one-> !one.getBDynamicParam()).collect(Collectors.toUnmodifiableList()); + data3 = data3.stream().filter(one-> !one.getBDynamicParam()).collect(Collectors.toUnmodifiableList()); + toolMeta.setDynamicParamRule(null); + toolMeta.setParamRuleListAll(data); + toolMeta.setParamRuleList(data2); + toolMeta.setParamRuleListCheck(data3); + session.setCurrentTool(toolMeta); + } session.setCurrentRowData(null); UserSceneSessionService.USER_SCENE_SESSION_CACHE.put(userId, session); // 清空Agent缓存 diff --git a/src/main/java/com/xly/tool/DynamicToolProvider.java b/src/main/java/com/xly/tool/DynamicToolProvider.java index a2645e3..5a1640e 100644 --- a/src/main/java/com/xly/tool/DynamicToolProvider.java +++ b/src/main/java/com/xly/tool/DynamicToolProvider.java @@ -6,7 +6,6 @@ import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.BooleanUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; -import cn.hutool.json.JSONArray; import cn.hutool.json.JSONUtil; import com.alibaba.fastjson2.JSONObject; import com.fasterxml.jackson.core.type.TypeReference; @@ -42,7 +41,6 @@ import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicReference; -import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -186,18 +184,7 @@ public class DynamicToolProvider implements ToolProvider { if(ObjectUtil.isEmpty(args)) args = new HashMap<>(); Map finalArgs = args; argsNew.forEach((k, v)->{ - //需要移除的老的参数 - List data = meta.getParamRuleList().stream().filter( - one-> one.getSParam().equals(k) - && ObjectUtil.isNotEmpty(v) - && !"0".equals(v) - && !"\"\"".equals(v) - ).collect(Collectors.toUnmodifiableList()); - if(ObjectUtil.isNotEmpty(data) && data.size()>0){ - finalArgs.remove(data.get(0).getSParamValue()); - finalArgs.remove(data.get(0).getSParam()); - } - if(ObjectUtil.isNotEmpty(v)){ + if(Validator.isValid(v)){ finalArgs.put(k,v); } }); @@ -214,24 +201,6 @@ public class DynamicToolProvider implements ToolProvider { // 2.1 【自动补全】应用参数的默认值 List paramRuleData = meta.getParamRuleListAll(); args = applyDefaultValues(args, paramRuleData); - //存入已采集参数 - session.setArgs(args); - // 2.1.1 根据当前获取的新参数判断是否存在有值必填例如动态参数、动态部件 - if(meta.getBQuo()){ - List dynamicParamRule = doSetParamgetArgsAfter(args, session); - if(ObjectUtil.isNotEmpty(dynamicParamRule)){ - Map data = quoService.getQuoData( argsNew, session, dynamicParamRule); - data.remove("sAll"); - data.put("bTs",true); - String askMsg = JSONObject.toJSONString(data); - session.setSFunPrompts(askMsg); - String sSystemPrompt = SystemPromptGenerator.buildMissParamPrompt(session,dynamicParamRule); - session.setSSystemPrompt(sSystemPrompt); - // 需要提问用户 → 抛异常停止循环 - return String.valueOf(successResult(toolExecutionRequest, askMsg)); - } - } - //客户选择行号转sSLaveId if(ObjectUtil.isNotEmpty(args) &&( @@ -243,6 +212,16 @@ public class DynamicToolProvider implements ToolProvider { } //存入已采集参数 session.setArgs(args); + // 2.1.1 根据当前获取的新参数判断是否存在有值必填例如动态参数、动态部件 + if(meta.getBQuo()){ + List dynamicParamRule = doSetParamgetArgsAfter(args, session); + if(ObjectUtil.isNotEmpty(dynamicParamRule)){ +// Map data = quoService.getQuoData( args, session); + session.getCurrentTool().setDynamicParamRule(dynamicParamRule); +// String sSystemPrompt = SystemPromptGenerator.buildMissParamPrompt(session,dynamicParamRule); +// session.setSSystemPrompt(sSystemPrompt); + } + } //获取是否缺失参数 String askMsg = getMissParamMsg( meta, session, args); if(ObjectUtil.isNotEmpty(askMsg)){ @@ -251,6 +230,8 @@ public class DynamicToolProvider implements ToolProvider { String resp = StrUtil.EMPTY; if(session.getCurrentTool().getBQuo()){ resp = JSONUtil.toJsonStr(session.getQuoData()); + session.setSFunPrompts(resp); + return resp; }else{ resp = JSONUtil.toJsonStr(args) ; } @@ -275,51 +256,44 @@ public class DynamicToolProvider implements ToolProvider { argsOld = new HashMap<>(); } //根据新录入的参数获取规则 - AtomicReference> paramRuleDataAll = new AtomicReference<>(tool.getParamRuleListAll()); - List paramRuleData = tool.getParamRuleListAll(); - paramRuleData = paramRuleData.stream().filter(one-> - ( ObjectUtil.isNotEmpty(args.get(one.getSParam())) ||ObjectUtil.isNotEmpty(args.get(one.getSParamValue()))) + List paramRuleDataAll = tool.getParamRuleListAll(); + //动态参数 + List paramRuleData = paramRuleDataAll.stream().filter(one-> + ( ObjectUtil.isNotEmpty(args.get(one.getSParam())) || ObjectUtil.isNotEmpty(args.get(one.getSParamValue()))) && ObjectUtil.isNotEmpty(one.getSDynamicParamRuleSql()) ).collect(Collectors.toUnmodifiableList()); + //为空的时候需要重新插入不为空 表示之前已经放过了 + //根据新参数获取需要填写参数 List dynamicParamRule = new ArrayList<>(); - //为空的时候需要重新插入 不为空 表示之前已经放过了 + AtomicReference> paramRuleDataAllNew = new AtomicReference<>(paramRuleDataAll); if(ObjectUtil.isNotEmpty(paramRuleData)){ Map finalArgsOld = argsOld; paramRuleData.forEach(one->{ - //根据新参数获取需要填写参数 Map searMap = new HashMap<>(); searMap.putAll(args); //新参数如果值变了移除掉之前插入的 - List paramRuleDataAllNew = paramRuleDataAll.get().stream().filter(d-> - !one.getSParam().equals(d.getSDynamicParam()) - ||(one.getSParam().equals(d.getSDynamicParam()) && one.getSParamValue().equals(d.getSParamValue())) - ).collect(Collectors.toUnmodifiableList()); - List paramRuleList = tool.getParamRuleList().stream().filter(d-> - !one.getSParam().equals(d.getSDynamicParam()) - ||(one.getSParam().equals(d.getSDynamicParam()) && one.getSParamValue().equals(d.getSParamValue())) - ).collect(Collectors.toUnmodifiableList()); - List paramRuleListCheck = tool.getParamRuleListCheck().stream().filter(d-> - !one.getSParam().equals(d.getSDynamicParam()) - ||(one.getSParam().equals(d.getSDynamicParam()) && one.getSParamValue().equals(d.getSParamValue())) - ).collect(Collectors.toUnmodifiableList()); - paramRuleDataAllNew = deduplicateByParamValue(paramRuleDataAllNew); - paramRuleList = deduplicateByParamValue(paramRuleList); - paramRuleListCheck = deduplicateByParamValue(paramRuleListCheck); - session.getCurrentTool().setParamRuleList(paramRuleList); - session.getCurrentTool().setParamRuleListAll(paramRuleDataAllNew); - session.getCurrentTool().setParamRuleListCheck(paramRuleListCheck); -// paramRuleDataAll.set(paramRuleDataAllNew); - List paramRuleDataD = paramRuleDataAll.get().stream().filter(d-> searMap.get(one.getSParam()).equals(d.getSDynamicParam())).collect(Collectors.toUnmodifiableList()); - //如果不存在的加入方法参数中 - if(ObjectUtil.isEmpty(paramRuleDataD)){ - String sValue = searMap.get(one.getSParam()).toString(); - List addValue = new ArrayList<>(); - if(JSONUtil.isTypeJSONArray(sValue)){ - addValue = JSONUtil.toList(sValue,String.class); - }else{ - addValue.add(sValue); - } - for(String sVaule:addValue){ + paramRuleDataAllNew.set(paramRuleDataAll.stream().filter(d -> + !one.getSParam().equals(d.getSDynamicParam()) + || (one.getSParam().equals(d.getSDynamicParam()) && one.getSParamValue().equals(d.getSParamValue())) + ).collect(Collectors.toUnmodifiableList())); + + String sValue = searMap.get(one.getSParam()).toString(); + List addValue = new ArrayList<>(); + if(JSONUtil.isTypeJSONArray(sValue)){ + addValue = JSONUtil.toList(sValue,String.class); + }else{ + addValue.add(sValue); + } + for(String sVaule:addValue){ + //根据值获取动态部件 + List paramRuleDataD = paramRuleDataAllNew.get().stream().filter(d -> + d.getBDynamicParam() + && sValue.equals(d.getSDynamicParam()) + && one.getSParam().equals(d.getSDynamicParamName()) + ).collect(Collectors.toUnmodifiableList()); + + //如果不存在的加入方法参数中 + if(ObjectUtil.isEmpty(paramRuleDataD)){ searMap.put("sRuleId",one.getSId()); searMap.put("sTooId",one.getSParentId()); searMap.put("sParam",one.getSParam()); @@ -344,77 +318,27 @@ public class DynamicToolProvider implements ToolProvider { //表示过程走自定义参数 } if(ObjectUtil.isNotEmpty(dynamicParamRuleOne)){ - //转换成BEAN - //添加到方法中去 - List paramRuleDataAllAdd = tool.getParamRuleListAll().stream().collect(Collectors.toList()); - List paramRuleListAdd = tool.getParamRuleList().stream().collect(Collectors.toList()); - List paramRuleListCheckAdd = tool.getParamRuleListCheck().stream().collect(Collectors.toList()); - if(ObjectUtil.isEmpty(paramRuleDataAllAdd)){ - paramRuleDataAllAdd = new ArrayList<>(); - } - if(ObjectUtil.isEmpty(paramRuleListAdd)){ - paramRuleListAdd = new ArrayList<>(); - } - if(ObjectUtil.isEmpty(paramRuleListCheckAdd)){ - paramRuleListCheckAdd = new ArrayList<>(); - } - List finalParamRuleDataAllAdd = paramRuleDataAllAdd; - List finalParamRuleListAdd = paramRuleListAdd; - List finalParamRuleListCheckAdd = paramRuleListCheckAdd; dynamicParamRuleOne.forEach(dynamicParamRuleData->{ ParamRule paramRule = BeanUtil.toBean(dynamicParamRuleData,ParamRule.class); dynamicParamRule.add(paramRule); - try{ - finalParamRuleDataAllAdd.add(paramRule); - finalParamRuleListAdd.add(paramRule); - if(paramRule.getBEmpty()){ - finalParamRuleListCheckAdd.add(paramRule); - } - }catch (Exception e){ - e.printStackTrace(); - } }); - if(ObjectUtil.isNotEmpty(paramRuleDataAllAdd)){ - paramRuleDataAllAdd = deduplicateByParamValue(paramRuleDataAllAdd); - session.getCurrentTool().setParamRuleListAll(paramRuleDataAllAdd); - } - if(ObjectUtil.isNotEmpty(paramRuleListAdd)){ - paramRuleListAdd = deduplicateByParamValue(paramRuleListAdd); - session.getCurrentTool().setParamRuleList(paramRuleListAdd); - } - if(ObjectUtil.isNotEmpty(paramRuleListCheckAdd)){ - paramRuleListCheckAdd = deduplicateByParamValue(paramRuleListCheckAdd); - session.getCurrentTool().setParamRuleListCheck(paramRuleListCheckAdd); - } } } } }); } + List dataAll = new ArrayList<>(paramRuleDataAllNew.get()); + dataAll.addAll(dynamicParamRule); + paramRuleDataAllNew.set(dataAll); + List newList = new ArrayList<>(paramRuleDataAllNew.get()); + List dynamicParamRuleAll = Validator.deduplicateByParamValue(newList); + List paramRuleList = dynamicParamRuleAll.stream().filter(one-> one.getBTipModel()).collect(Collectors.toUnmodifiableList()); + List paramRuleListCheck = dynamicParamRuleAll.stream().filter(one->one.getBEmpty()).collect(Collectors.toUnmodifiableList()); + session.getCurrentTool().setParamRuleListAll(dynamicParamRuleAll); + session.getCurrentTool().setParamRuleListCheck(paramRuleListCheck); + session.getCurrentTool().setParamRuleList(paramRuleList); return dynamicParamRule; } - /*** - * @Author 钱豹 - * @Date 0:58 2026/7/2 - * @Param [source, one] - * @return java.util.List - * @Description 去重 - **/ - private List deduplicateByParamValue(List source) { - if (source == null || source.isEmpty()) { - return new ArrayList<>(); - } - return source.stream() - .collect(Collectors.toMap( - ParamRule::getSParamValue, // 根据 sParamValue 去重 - Function.identity(), - (existing, replacement) -> existing // 保留第一个 - )) - .values() - .stream() - .collect(Collectors.toList()); - } - private void doSetSlaveIdToArgs(Map args,UserSceneSession session){ Map> data = session.getCurrentRowData(); @@ -695,18 +619,17 @@ public class DynamicToolProvider implements ToolProvider { if(meta.getBQuo()){ List dataParamDynamic = session.getCurrentTool().getParamRuleListAll().stream().filter(d -> d.getBDynamicParam()).collect(Collectors.toUnmodifiableList()); - Map data = quoService.getQuoData(args, session, dataParamDynamic); + Map data = quoService.getQuoData(args, session); List> sAll = (List>) data.get("sAll"); - List> sEmpty = sAll.stream().filter(one-> BooleanUtil.toBoolean(one.get("bEmpty").toString()) - && (ObjectUtil.isEmpty(one.get("sValue")) || "0".equals(one.get("sValue")))).collect(Collectors.toUnmodifiableList()); + List> sEmptyData = sAll.stream().filter(one-> BooleanUtil.toBoolean(one.get("bEmpty").toString()) + && (!Validator.isValid(one.get("sValue"))) && !"sDynamicPart".equals(one.get("sName"))).collect(Collectors.toUnmodifiableList()); data.remove("sAll"); - if(ObjectUtil.isNotEmpty(sEmpty)){ + if(ObjectUtil.isNotEmpty(sEmptyData)){ data.put("bTs",true); - String askMsg = JSONObject.toJSONString(data); - session.setSFunPrompts(askMsg); String sSystemPrompt = SystemPromptGenerator.buildMissParamPrompt(session,dataParamDynamic); session.setSSystemPrompt(sSystemPrompt); - // 需要提问用户 → 抛异常停止循环 + String askMsg = JSONObject.toJSONString(data); + session.setSFunPrompts(askMsg); return askMsg; } session.setQuoData(data); diff --git a/src/main/java/com/xly/util/Validator.java b/src/main/java/com/xly/util/Validator.java new file mode 100644 index 0000000..591232c --- /dev/null +++ b/src/main/java/com/xly/util/Validator.java @@ -0,0 +1,89 @@ +package com.xly.util; + +import cn.hutool.core.util.ObjectUtil; +import com.xly.entity.ParamRule; + +import java.lang.reflect.Array; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +public class Validator { + + // 判断对象是否有效(非0,非空字符串,非空数组/集合) + public static boolean isValid(Object obj) { + if (obj == null) + return false; + + // 数值 + if (obj instanceof Number) { + return ((Number) obj).doubleValue() != 0; + } + + // 数组 + if (obj.getClass().isArray()) { + return Array.getLength(obj) > 0; + } + + // 集合 + if (obj instanceof Collection) { + return !((Collection) obj).isEmpty(); + } + + // Map + if (obj instanceof Map) { + return !((Map) obj).isEmpty(); + } + return ObjectUtil.isNotEmpty(obj); + } + + /** + * 根据指定 key 对 List> 去重 + * + * @param list 原始列表 + * @param key 去重依据的 key + * @return 去重后的列表(保留首次出现的顺序) + */ + public static List> distinctByKey( + List> list, String key) { + + if (list == null || list.isEmpty()) { + return new ArrayList<>(); + } + + return list.stream() + .filter(item -> item != null && item.get(key) != null) + .collect(Collectors.toMap( + item -> item.get(key), + Function.identity(), + (existing, replacement) -> existing + )) + .values() + .stream() + .collect(Collectors.toList()); + } + /*** + * @Author 钱豹 + * @Date 0:58 2026/7/2 + * @Param [source, one] + * @return java.util.List + * @Description 去重 + **/ + public static List deduplicateByParamValue(List source) { + if (source == null || source.isEmpty()) { + return new ArrayList<>(); + } + return source.stream() + .collect(Collectors.toMap( + ParamRule::getSParamValue, // 根据 sParamValue 去重 + Function.identity(), + (existing, replacement) -> existing // 保留第一个 + )) + .values() + .stream() + .collect(Collectors.toList()); + } +} \ No newline at end of file