From d26740e8f3e085ca76cbf6894ab9de8c780f46ed Mon Sep 17 00:00:00 2001 From: aike <17730485278@139.com> Date: Fri, 24 Oct 2025 15:34:39 +0800 Subject: [PATCH] =?UTF-8?q?demand:=20=20=20=20TMS=E7=B3=BB=E7=BB=9F=20-=20?= =?UTF-8?q?=E8=BF=90=E8=BE=93=E7=AE=A1=E7=90=86=20-=E6=BC=8F=E7=BB=84?= =?UTF-8?q?=E6=89=B9=E6=AC=A1=E5=AE=9E=E6=97=B6=E6=89=AB=E6=8F=8F/?= =?UTF-8?q?=E5=AE=9A=E6=97=B6=E6=89=AB=E6=8F=8F/=E6=A0=B9=E6=8D=AE?= =?UTF-8?q?=E7=BA=BF=E8=B7=AF=E6=89=AB=E6=8F=8F-=E6=80=A7=E8=83=BD?= =?UTF-8?q?=E4=BC=98=E5=8C=96=20committer:=20heyu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../erp/emis/domain/EmisTransPlanRule.java | 2 + .../erp/emis/service/EmisBaseService.java | 46 +++++++++++-------- 2 files changed, 28 insertions(+), 20 deletions(-) diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisTransPlanRule.java b/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisTransPlanRule.java index 45a1af487..7756b72f4 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisTransPlanRule.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisTransPlanRule.java @@ -7,6 +7,7 @@ import com.alibaba.excel.annotation.ExcelIgnore; import com.fasterxml.jackson.annotation.JsonFormat; import com.xdadan.erp.common.core.domain.BaseEntity; import lombok.Data; +import lombok.EqualsAndHashCode; import com.xdadan.erp.common.annotation.Excel; import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.converters.date.DateStringConverter; @@ -19,6 +20,7 @@ import com.alibaba.excel.converters.longconverter.LongNumberConverter; * @date 2024-04-22 */ @Data +@EqualsAndHashCode(exclude = { "children" }) public class EmisTransPlanRule extends BaseEntity { private static final long serialVersionUID = 1L; diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/EmisBaseService.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/EmisBaseService.java index e40f385ce..dd890d1fc 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/service/EmisBaseService.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/EmisBaseService.java @@ -5299,26 +5299,30 @@ public class EmisBaseService { } // 2. 统计每条路径的匹配度 - Map, Integer> pathMatchCountMap = new HashMap<>(); - for (List path : allPaths) { + // 优化:预先构建filterRules的匹配键,避免重复计算 + Set filterRuleKeys = filterRules.stream() + .map(r -> r.getStartSiteCode() + "_" + r.getNextSiteCode() + "_" + r.getSupplierCode()) + .collect(Collectors.toSet()); + + // 优化:使用路径索引而不是List作为key,避免hashCode计算问题 + Map pathMatchCountMap = new HashMap<>(); + for (int i = 0; i < allPaths.size(); i++) { + List path = allPaths.get(i); int pathMatchCount = 0; for (EmisTransPlanRule node : path) { - for (EmisTransPlanRule filterRule : filterRules) { - if (Objects.equals(node.getStartSiteCode(), filterRule.getStartSiteCode()) && - Objects.equals(node.getNextSiteCode(), filterRule.getNextSiteCode()) && - compareSupplierCodes(node.getSupplierCode(), filterRule.getSupplierCode())) { - pathMatchCount++; - } + String nodeKey = node.getStartSiteCode() + "_" + node.getNextSiteCode() + "_" + node.getSupplierCode(); + if (filterRuleKeys.contains(nodeKey)) { + pathMatchCount++; } } - pathMatchCountMap.put(path, pathMatchCount); + pathMatchCountMap.put(i, pathMatchCount); } // 3. 过滤出匹配度最高的path(可多个) int maxMatch = pathMatchCountMap.values().stream().max(Integer::compareTo).orElse(0); List> bestPaths = pathMatchCountMap.entrySet().stream() .filter(e -> e.getValue() == maxMatch) - .map(Map.Entry::getKey) + .map(e -> allPaths.get(e.getKey())) .collect(Collectors.toList()); // 4. 对这些path的节点分组去重并做漏组处理 @@ -5382,11 +5386,12 @@ public class EmisBaseService { boolean isGroupMatch = false; for (List group : groupMap.values()) { - // 判断该组是否有匹配 - boolean matched = group.stream().anyMatch(levelRule -> filterRules.stream().anyMatch( - filterRule -> Objects.equals(filterRule.getStartSiteCode(), levelRule.getStartSiteCode()) && - Objects.equals(filterRule.getNextSiteCode(), levelRule.getNextSiteCode()) && - compareSupplierCodes(filterRule.getSupplierCode(), levelRule.getSupplierCode()))); + // 判断该组是否有匹配 - 优化:使用预构建的匹配键 + boolean matched = group.stream().anyMatch(levelRule -> { + String levelRuleKey = levelRule.getStartSiteCode() + "_" + levelRule.getNextSiteCode() + "_" + + levelRule.getSupplierCode(); + return filterRuleKeys.contains(levelRuleKey); + }); if (matched) { isGroupMatch = true; if (group.get(0).getChildren() == null) { @@ -5400,11 +5405,12 @@ public class EmisBaseService { } for (List group : groupMap.values()) { - // 判断该组是否有匹配 - boolean matched = group.stream().anyMatch(levelRule -> filterRules.stream().anyMatch( - filterRule -> Objects.equals(filterRule.getStartSiteCode(), levelRule.getStartSiteCode()) && - Objects.equals(filterRule.getNextSiteCode(), levelRule.getNextSiteCode()) && - compareSupplierCodes(filterRule.getSupplierCode(), levelRule.getSupplierCode()))); + // 判断该组是否有匹配 - 优化:使用预构建的匹配键 + boolean matched = group.stream().anyMatch(levelRule -> { + String levelRuleKey = levelRule.getStartSiteCode() + "_" + levelRule.getNextSiteCode() + "_" + + levelRule.getSupplierCode(); + return filterRuleKeys.contains(levelRuleKey); + }); if (matched && group.get(0).getChildren() == null) { return; }