From f9114ffadfab1c01198dd980c3afb66d0c44a5ea Mon Sep 17 00:00:00 2001
From: zzw <228544128@qq.com>
Date: 星期二, 06 十月 2026 18:22:00 +0800
Subject: [PATCH] fix: limit equipment picker to selected X number

---
 emergency-repair-server/src/main/java/com/emergencyrepair/system/service/SystemService.java |   58 +++++++++++++++++++++++++++++-----------------------------
 1 files changed, 29 insertions(+), 29 deletions(-)

diff --git a/emergency-repair-server/src/main/java/com/emergencyrepair/system/service/SystemService.java b/emergency-repair-server/src/main/java/com/emergencyrepair/system/service/SystemService.java
index 9f0cfd1..1775f6e 100644
--- a/emergency-repair-server/src/main/java/com/emergencyrepair/system/service/SystemService.java
+++ b/emergency-repair-server/src/main/java/com/emergencyrepair/system/service/SystemService.java
@@ -108,11 +108,20 @@
             menu.setMenuType(menu.getId() == null ? 1 : menu.getMenuType());
         }
         boolean isRoot = menu.getPid() == null || menu.getPid() == 0L;
-        if (menu.getMenuType() == 2) {
-            if (isRoot) {
-                throw new BusinessException("鎸夐挳绫诲瀷鍙兘寤哄湪鑿滃崟绫诲瀷涓嬬骇");
+        if (menu.getId() != null && !isRoot && menu.getId().equals(menu.getPid())) {
+            throw new BusinessException("涓婄骇鑿滃崟涓嶈兘閫夋嫨褰撳墠鑿滃崟");
+        }
+        SysMenu parent = null;
+        if (!isRoot) {
+            parent = menuMapper.selectById(menu.getPid());
+            if (parent == null) {
+                throw new BusinessException("涓婄骇鑿滃崟涓嶅瓨鍦�");
             }
-            SysMenu parent = menuMapper.selectById(menu.getPid());
+            if (menu.getId() != null && isMenuDescendant(menu.getPid(), menu.getId())) {
+                throw new BusinessException("涓婄骇鑿滃崟涓嶈兘閫夋嫨褰撳墠鑿滃崟鐨勪笅绾�");
+            }
+        }
+        if (menu.getMenuType() == 2) {
             if (parent == null || parent.getMenuType() == null || parent.getMenuType() != 1) {
                 throw new BusinessException("鎸夐挳绫诲瀷鍙兘寤哄湪鑿滃崟绫诲瀷涓嬬骇");
             }
@@ -121,11 +130,8 @@
             }
             menu.setUrl(null);
             menu.setIcon(null);
-        } else if (!isRoot) {
-            SysMenu parent = menuMapper.selectById(menu.getPid());
-            if (parent != null && parent.getMenuType() != null && parent.getMenuType() == 2) {
-                throw new BusinessException("鎸夐挳绫诲瀷涓嬬骇涓嶈兘鍐嶅缓鑿滃崟");
-            }
+        } else if (parent != null && parent.getMenuType() != null && parent.getMenuType() == 2) {
+            throw new BusinessException("鎸夐挳绫诲瀷涓嬬骇涓嶈兘鍐嶅缓鑿滃崟");
         }
         LocalDateTime now = LocalDateTime.now();
         menu.setUpdateTime(now);
@@ -142,6 +148,19 @@
             menuMapper.updateById(menu);
         }
         return menuMapper.selectById(menu.getId());
+    }
+
+    private boolean isMenuDescendant(Long candidateId, Long ancestorId) {
+        Long cursor = candidateId;
+        int guard = 0;
+        while (cursor != null && cursor != 0L && guard++ < 64) {
+            if (cursor.equals(ancestorId)) {
+                return true;
+            }
+            SysMenu current = menuMapper.selectById(cursor);
+            cursor = current == null ? null : current.getPid();
+        }
+        return false;
     }
 
     @Transactional
@@ -395,30 +414,11 @@
         if (!StringUtils.hasText(xNo)) {
             return productTreeRoots();
         }
-        List<ProductNode> rootNodes = productNodeMapper.selectList(Wrappers.<ProductNode>lambdaQuery()
-                .and(wrapper -> wrapper.isNull(ProductNode::getParentId).or().eq(ProductNode::getParentId, 0L))
-                .orderByAsc(ProductNode::getSortNo).orderByAsc(ProductNode::getId));
         List<ProductNode> sideNodes = productNodeMapper.selectList(Wrappers.<ProductNode>lambdaQuery()
                 .in(ProductNode::getLayer, Arrays.asList("side", "SIDE"))
                 .eq(ProductNode::getName, xNo.trim())
                 .orderByAsc(ProductNode::getSortNo).orderByAsc(ProductNode::getId));
-        Map<Long, ProductNode> roots = uniqueProductNodes(rootNodes);
-        Map<Long, ProductNode> sides = uniqueProductNodes(sideNodes);
-        Set<Long> branchIds = new HashSet<>();
-        branchIds.addAll(roots.keySet());
-        branchIds.addAll(sides.keySet());
-        Map<Long, Map<String, Object>> rootRows = new LinkedHashMap<>();
-        for (ProductNode root : sortProductNodes(roots.values())) {
-            rootRows.put(root.getId(), mapProduct(root, branchIds));
-        }
-        for (ProductNode side : sortProductNodes(sides.values())) {
-            ProductNode root = findProductRoot(side);
-            Map<String, Object> rootRow = root == null ? null : rootRows.get(root.getId());
-            if (rootRow != null) {
-                children(rootRow).add(mapProduct(side, branchIds));
-            }
-        }
-        return new ArrayList<>(rootRows.values());
+        return mapProductTreeNodes(sideNodes, Collections.emptySet());
     }
 
     public List<String> productXNumbers() {

--
Gitblit v1.9.1