From c7e7ed6d05cd1586b37396bcabc9f3f7e6ec589f Mon Sep 17 00:00:00 2001
From: tuqin <tuqin@tuqin.cn>
Date: 星期三, 21 十月 2026 16:08:51 +0800
Subject: [PATCH] feat(销售台账/产品维护): 图号必填唯一、合同号唯一、明细产品编码与导入物料编码

---
 src/main/java/com/ruoyi/production/service/impl/ProductionBomStructureServiceImpl.java |   12 ++++++++++--
 1 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductionBomStructureServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionBomStructureServiceImpl.java
index c1e665c..acad3ef 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionBomStructureServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionBomStructureServiceImpl.java
@@ -822,14 +822,22 @@
         if (bomStructure == null) {
             return null;
         }
-        // The root node is the first output node; other rows use their direct parent as the current operation output.
-        if (bomStructure.getParentId() == null) {
+        if (bomStructure.getParentId() == null || hasChildren(bomStructure, structureById)) {
             return bomStructure;
         }
         ProductionBomStructure parent = structureById.get(bomStructure.getParentId());
         return parent != null ? parent : bomStructure;
     }
 
+    private boolean hasChildren(ProductionBomStructure bomStructure,
+                                Map<Long, ProductionBomStructure> structureById) {
+        if (bomStructure == null || bomStructure.getId() == null || structureById == null) {
+            return false;
+        }
+        return structureById.values().stream()
+                .anyMatch(child -> child != null && Objects.equals(child.getParentId(), bomStructure.getId()));
+    }
+
     private Long resolveOutputProductModelId(ProductionBomStructure outputNode,
                                              Long rootProductModelId) {
         if (outputNode == null) {

--
Gitblit v1.9.3