From c30bfeb3840c69f0ad7eeb0ff713d63da7494b23 Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期五, 09 十月 2026 11:49:21 +0800
Subject: [PATCH] fix: bom结构移除拖动更新
---
src/main/java/com/ruoyi/technology/service/impl/TechnologyRoutingServiceImpl.java | 118 ++++++++++++++++++++++++++++++++++++++++++-----------------
1 files changed, 84 insertions(+), 34 deletions(-)
diff --git a/src/main/java/com/ruoyi/technology/service/impl/TechnologyRoutingServiceImpl.java b/src/main/java/com/ruoyi/technology/service/impl/TechnologyRoutingServiceImpl.java
index 3e2fb0c..3a00f21 100644
--- a/src/main/java/com/ruoyi/technology/service/impl/TechnologyRoutingServiceImpl.java
+++ b/src/main/java/com/ruoyi/technology/service/impl/TechnologyRoutingServiceImpl.java
@@ -20,10 +20,14 @@
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.Comparator;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import java.util.stream.Collectors;
@Service
@@ -123,32 +127,59 @@
if (technologyRouting.getBomId() == null) {
return;
}
+
List<TechnologyBomStructure> bomStructures = technologyBomStructureMapper.selectList(
Wrappers.<TechnologyBomStructure>lambdaQuery()
.eq(TechnologyBomStructure::getBomId, technologyRouting.getBomId())
- .isNotNull(TechnologyBomStructure::getOperationId)
- .orderByDesc(TechnologyBomStructure::getId)
+ .orderByAsc(TechnologyBomStructure::getId)
);
if (bomStructures.isEmpty()) {
throw new ServiceException("bom浜у搧缁撴瀯涓虹┖锛�");
}
- // 鍚屼竴涓� BOM 涓彲鑳介噸澶嶅紩鐢ㄧ浉鍚屽伐搴忥紝鎸夌収涓婁竴灞傜殑鐖惰妭鐐圭殑浜у搧鏄惁鐩稿悓鍜屽伐搴忔槸鍚︾浉鍚�
Map<Long, TechnologyBomStructure> structureById = new HashMap<>();
+ Map<Long, List<TechnologyBomStructure>> childrenByParentId = new LinkedHashMap<>();
+ List<TechnologyBomStructure> rootList = new ArrayList<>();
for (TechnologyBomStructure bomStructure : bomStructures) {
- if (bomStructure != null && bomStructure.getId() != null) {
+ if (bomStructure == null) {
+ continue;
+ }
+ if (bomStructure.getId() != null) {
structureById.put(bomStructure.getId(), bomStructure);
+ }
+ if (bomStructure.getParentId() == null || bomStructure.getParentId() == 0L) {
+ rootList.add(bomStructure);
+ } else {
+ childrenByParentId.computeIfAbsent(bomStructure.getParentId(), key -> new ArrayList<>()).add(bomStructure);
}
}
- Map<String, TechnologyBomStructure> uniqueOperationMap = new LinkedHashMap<>();
- for (TechnologyBomStructure bomStructure : bomStructures) {
- Long outputProductModelId = resolveOutputProductModelId(bomStructure, structureById, technologyRouting.getProductModelId());
- uniqueOperationMap.putIfAbsent(buildBomOperationDedupKey(bomStructure, outputProductModelId), bomStructure);
+ // 鍚庡簭閬嶅巻BOM
+ List<TechnologyBomStructure> orderedOperationNodes = new ArrayList<>();
+ Set<Long> visitingIds = new HashSet<>();
+ for (TechnologyBomStructure rootNode : rootList) {
+ collectOperationNodePostOrder(rootNode, childrenByParentId, orderedOperationNodes, visitingIds);
+ }
+ if (orderedOperationNodes.isEmpty()) {
+ throw new ServiceException("bom浜у搧缁撴瀯鏈厤缃秷鑰楀伐搴忥紒");
}
+ // 鍚屼竴灞傜骇锛堝悓涓�鐖惰妭鐐癸級鍐呯浉鍚屽伐搴忓悎骞朵负涓�閬撳伐搴忥紝渚嬪鍚屽眰鐨勫涓帇鎺ヤ欢鍚堝苟鎴愪竴閬撳帇鎺ワ紱
+ // 鍚堝苟鍚庣殑浣嶇疆鍙栬宸ュ簭鏈�鍚庝竴娆″嚭鐜扮殑浣嶇疆锛岀‘淇濆叾鍏ㄩ儴杈撳叆鐗╂枡鐨勫伐搴忛兘鍦ㄥ畠涔嬪墠
+ Map<String, Integer> lastPositionByKey = new HashMap<>();
+ Map<String, TechnologyBomStructure> operationNodeByKey = new LinkedHashMap<>();
+ for (int i = 0; i < orderedOperationNodes.size(); i++) {
+ TechnologyBomStructure bomStructure = orderedOperationNodes.get(i);
+ String dedupKey = buildBomOperationDedupKey(bomStructure);
+ lastPositionByKey.put(dedupKey, i);
+ operationNodeByKey.putIfAbsent(dedupKey, bomStructure);
+ }
+ List<String> sortedDedupKeys = new ArrayList<>(operationNodeByKey.keySet());
+ sortedDedupKeys.sort(Comparator.comparingInt(lastPositionByKey::get));
+
int dragSort = 1;
- for (TechnologyBomStructure bomStructure : uniqueOperationMap.values()) {
+ for (String dedupKey : sortedDedupKeys) {
+ TechnologyBomStructure bomStructure = operationNodeByKey.get(dedupKey);
TechnologyRoutingOperation routingOperation = new TechnologyRoutingOperation();
routingOperation.setTechnologyRoutingId(technologyRouting.getId());
routingOperation.setProductModelId(resolveOutputProductModelId(bomStructure, structureById, technologyRouting.getProductModelId()));
@@ -163,42 +194,61 @@
}
}
- private String buildBomOperationDedupKey(TechnologyBomStructure bomStructure, Long outputProductModelId) {
- Long operationId = bomStructure == null ? null : bomStructure.getOperationId();
- Long parentId = bomStructure == null ? null : bomStructure.getParentId();
- return operationId + "#"
- + outputProductModelId + "#"
- + parentId;
+ /**
+ * 鍚庡簭閬嶅巻 BOM
+ */
+ private void collectOperationNodePostOrder(TechnologyBomStructure node,
+ Map<Long, List<TechnologyBomStructure>> childrenByParentId,
+ List<TechnologyBomStructure> orderedOperationNodes,
+ Set<Long> visitingIds) {
+ if (node == null || node.getId() == null) {
+ return;
+ }
+ if (!visitingIds.add(node.getId())) {
+ return;
+ }
+ List<TechnologyBomStructure> children = childrenByParentId.get(node.getId());
+ if (children != null && !children.isEmpty()) {
+ for (TechnologyBomStructure child : children) {
+ collectOperationNodePostOrder(child, childrenByParentId, orderedOperationNodes, visitingIds);
+ }
+ }
+ visitingIds.remove(node.getId());
+ if (node.getOperationId() != null) {
+ orderedOperationNodes.add(node);
+ }
}
+ /**
+ * 鍘婚噸閿細鍚屼竴鐖惰妭鐐� + 鐩稿悓宸ュ簭锛堝彧鍦ㄥ悓涓�灞傜骇鍐呭悎骞讹紝涓嶅悓灞傜骇銆佷笉鍚屽垎鏀殑鐩稿悓宸ュ簭涓嶄細鍚堝苟锛夈��
+ */
+ private String buildBomOperationDedupKey(TechnologyBomStructure bomStructure) {
+ Long operationId = bomStructure == null ? null : bomStructure.getOperationId();
+ Long parentId = bomStructure == null ? null : bomStructure.getParentId();
+ return operationId + "#" + (parentId == null ? "root" : String.valueOf(parentId));
+ }
+
+ /**
+ * 宸ュ簭浜у嚭浜у搧 = 鐖惰妭鐐圭殑浜у搧锛堟湰琛岀墿鏂欑敱鐖惰妭鐐瑰眰绾х殑娑堣�楀伐搴忔秷鑰楋紝浜у嚭鐨勬槸涓婁竴灞備骇鍝侊紝
+ * 鑰屼笉鏄湰琛岀墿鏂欒嚜韬級锛涗粎褰撶埗鑺傜偣缂哄け鎴栫埗鑺傜偣娌℃湁浜у搧鏃讹紝鎵嶅洖閫�鍒版湰鑺傜偣鑷韩浜у搧銆佸啀鍥為��鍒板伐鑹鸿矾绾夸骇鍝併��
+ */
private Long resolveOutputProductModelId(TechnologyBomStructure bomStructure,
Map<Long, TechnologyBomStructure> structureById,
Long routingProductModelId) {
if (bomStructure == null) {
return routingProductModelId;
}
- if (hasChildren(bomStructure, structureById)) {
- return bomStructure.getProductModelId() != null
- ? bomStructure.getProductModelId() : routingProductModelId;
- }
Long parentId = bomStructure.getParentId();
- if (parentId == null) {
- return routingProductModelId != null ? routingProductModelId : bomStructure.getProductModelId();
+ if (parentId != null && parentId != 0L && structureById != null) {
+ TechnologyBomStructure parent = structureById.get(parentId);
+ if (parent != null && parent.getProductModelId() != null) {
+ return parent.getProductModelId();
+ }
}
- TechnologyBomStructure parent = structureById.get(parentId);
- if (parent != null && parent.getProductModelId() != null) {
- return parent.getProductModelId();
+ if (bomStructure.getProductModelId() != null) {
+ return bomStructure.getProductModelId();
}
- return routingProductModelId != null ? routingProductModelId : bomStructure.getProductModelId();
- }
-
- private boolean hasChildren(TechnologyBomStructure bomStructure,
- Map<Long, TechnologyBomStructure> structureById) {
- if (bomStructure == null || bomStructure.getId() == null || structureById == null) {
- return false;
- }
- return structureById.values().stream()
- .anyMatch(child -> child != null && java.util.Objects.equals(child.getParentId(), bomStructure.getId()));
+ return routingProductModelId;
}
private void syncRoutingOperationParams(Long technologyRoutingOperationId, Long technologyOperationId) {
--
Gitblit v1.9.3