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; }