From 5e57de9b12ee136e45ce5754c7fe2e7eb12af05a Mon Sep 17 00:00:00 2001
From: zj <1772600164@qq.com>
Date: Fri, 12 Jun 2026 18:35:45 +0800
Subject: [PATCH] 1

---
 trading-order-sys/src/main/java/com/yami/trading/sys/service/impl/SysMenuServiceImpl.java |   97 +++++++++++++++++++-----------------------------
 1 files changed, 38 insertions(+), 59 deletions(-)

diff --git a/trading-order-sys/src/main/java/com/yami/trading/sys/service/impl/SysMenuServiceImpl.java b/trading-order-sys/src/main/java/com/yami/trading/sys/service/impl/SysMenuServiceImpl.java
index 8162316..9f7c97a 100644
--- a/trading-order-sys/src/main/java/com/yami/trading/sys/service/impl/SysMenuServiceImpl.java
+++ b/trading-order-sys/src/main/java/com/yami/trading/sys/service/impl/SysMenuServiceImpl.java
@@ -19,7 +19,6 @@
 import com.yami.trading.sys.model.SysMenu;
 import com.yami.trading.sys.service.SysMenuService;
 import lombok.AllArgsConstructor;
-import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Service;
 
 import java.util.*;
@@ -38,15 +37,12 @@
 
 	@Override
 	public List<SysMenu> listMenuByUserId(Long userId,String appType) {
-		// 用户的所有菜单信息
 		List<SysMenu> sysMenus ;
-		//系统管理员,拥有最高权限
 		if(userId == Constant.SUPER_ADMIN_ID||userId == Constant.SUPER_ROOT_ID){
 			sysMenus = sysMenuMapper.listMenu(appType);
 		}else {
 			sysMenus = sysMenuMapper.listMenuByUserId(userId,appType);
 
-			//记录全勾选
 			Map<Long,SysMenu> mapSysMenu = new HashMap<>();
             for (SysMenu sysMenu : sysMenus) {
                 mapSysMenu.put(sysMenu.getMenuId(), sysMenu);
@@ -54,7 +50,6 @@
 
 			List<Long> bigIntArrays = new Vector<>();
 
-			//权限
 			List<SysMenu> sysMenus3 = sysMenuMapper.queryAllPerms2(userId);
 			for (SysMenu sysMenu : sysMenus3) {
 				if (!mapSysMenu.containsKey(sysMenu.getParentId())
@@ -64,88 +59,72 @@
 				}
 			}
 
-			//补充
 			if(!bigIntArrays.isEmpty()){
 				List<SysMenu> sysMenus2 = sysMenuMapper.listMenuByUserId2(bigIntArrays,appType);
 				for (SysMenu sysMenu : sysMenus2) {
 					mapSysMenu.put(sysMenu.getMenuId(), sysMenu);
-					//权限按钮的父节点
-					if (!mapSysMenu.containsKey(sysMenu.getParentId())
-							&& !bigIntArrays.contains(sysMenu.getParentId())
-							&& sysMenu.getParentId() != 0) {
-						bigIntArrays.add(sysMenu.getParentId());
-					}
 				}
 				sysMenus.addAll(sysMenus2);
 			}
-			bigIntArrays.clear();
 
-			//子菜单
-            for (SysMenu sysMenu : sysMenus) {
-                if (!mapSysMenu.containsKey(sysMenu.getParentId())
-                        && !bigIntArrays.contains(sysMenu.getParentId())
-                        && sysMenu.getParentId() != 0) {
-                    bigIntArrays.add(sysMenu.getParentId());
-                }
-            }
-
-			//补充
-			if(!bigIntArrays.isEmpty()){
-				List<SysMenu> sysMenus2 = sysMenuMapper.listMenuByUserId2(bigIntArrays,appType);
-//				for (SysMenu sysMenu : sysMenus2) {
-//					mapSysMenu.put(sysMenu.getMenuId(), sysMenu);
-//					//权限按钮的父节点
-//					if (!mapSysMenu.containsKey(sysMenu.getParentId())
-//							&& !bigIntArrays.contains(sysMenu.getParentId())
-//							&& sysMenu.getParentId() != 0) {
-//						bigIntArrays.add(sysMenu.getParentId());
-//					}
-//				}
-				sysMenus.addAll(sysMenus2);
-			}
-
-
-
-
-
+			appendMissingMenuAncestors(sysMenus, mapSysMenu, appType);
 		}
 
 		Map<Long, List<SysMenu>> sysMenuLevelMap = sysMenus.stream()
 				.sorted(Comparator.comparing(SysMenu::getOrderNum))
 				.collect(Collectors.groupingBy(SysMenu::getParentId));
 
-		//System.out.println("sys = " +sysMenuLevelMap.values());
-
-		// 一级菜单
 		List<SysMenu> rootMenu = sysMenuLevelMap.get(0L);
 		if (CollectionUtil.isEmpty(rootMenu)) {
 			return Collections.emptyList();
 		}
 
-		// 二级菜单
 		for (SysMenu sysMenu : rootMenu) {
-			sysMenu.setList(sysMenuLevelMap.get(sysMenu.getMenuId()));
-		}
-
-		// 三级菜单
-		for (SysMenu sysMenu : rootMenu) {
-			List list = sysMenu.getList();
-			if(list != null){
-				for (Object object : list) {
-					SysMenu sysMenu2 = (SysMenu)object;
-					sysMenu2.setList(sysMenuLevelMap.get(sysMenu2.getMenuId()));
-				}
-			}
+			attachMenuChildren(sysMenu, sysMenuLevelMap);
 		}
 
 		return rootMenu;
 	}
 
+	private void appendMissingMenuAncestors(List<SysMenu> sysMenus, Map<Long, SysMenu> mapSysMenu, String appType) {
+		while (true) {
+			List<Long> missingParents = new ArrayList<>();
+			for (SysMenu sysMenu : sysMenus) {
+				Long parentId = sysMenu.getParentId();
+				if (parentId != null && parentId != 0
+						&& !mapSysMenu.containsKey(parentId)
+						&& !missingParents.contains(parentId)) {
+					missingParents.add(parentId);
+				}
+			}
+			if (missingParents.isEmpty()) {
+				return;
+			}
+			List<SysMenu> parents = sysMenuMapper.listMenuByUserId2(missingParents, appType);
+			if (CollectionUtil.isEmpty(parents)) {
+				return;
+			}
+			for (SysMenu parent : parents) {
+				mapSysMenu.put(parent.getMenuId(), parent);
+			}
+			sysMenus.addAll(parents);
+		}
+	}
+
+	private void attachMenuChildren(SysMenu menu, Map<Long, List<SysMenu>> sysMenuLevelMap) {
+		List<SysMenu> children = sysMenuLevelMap.get(menu.getMenuId());
+		menu.setList(children);
+		if (CollectionUtil.isEmpty(children)) {
+			return;
+		}
+		for (SysMenu child : children) {
+			attachMenuChildren(child, sysMenuLevelMap);
+		}
+	}
+
 	@Override
 	public void deleteMenuAndRoleMenu(Long menuId){
-		//删除菜单
 		this.removeById(menuId);
-		//删除菜单与角色关联
 		sysRoleMenuMapper.deleteByMenuId(menuId);
 	}
 

--
Gitblit v1.9.3