| | |
| | | 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.*; |
| | |
| | | |
| | | @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); |
| | |
| | | |
| | | List<Long> bigIntArrays = new Vector<>(); |
| | | |
| | | //权限 |
| | | List<SysMenu> sysMenus3 = sysMenuMapper.queryAllPerms2(userId); |
| | | for (SysMenu sysMenu : sysMenus3) { |
| | | if (!mapSysMenu.containsKey(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); |
| | | } |
| | | 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); |
| | | } |
| | | |