1
zj
yesterday 5e57de9b12ee136e45ce5754c7fe2e7eb12af05a
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);
   }