package com.gkhy.safePlatform.account.utils; import com.gkhy.safePlatform.account.enums.ProjectStatusEnum; import com.gkhy.safePlatform.account.model.dto.resp.MenuMetaRespDTO; import com.gkhy.safePlatform.account.model.dto.resp.MenuRespDTO; import com.gkhy.safePlatform.account.entity.user.MenuInfoDO; import com.gkhy.safePlatform.account.entity.user.RoleInfoDO; import com.gkhy.safePlatform.account.model.dto.resp.ProjectRespDTO; import org.springframework.beans.BeanUtils; import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; public class MenuUtil { private static List getChildren(MenuRespDTO parentMenu, List allChildren) { List children = new ArrayList<>(); List menuSuperior; if (allChildren.size() > 0) { for (MenuRespDTO nav : allChildren) { assert nav.getParentId() != null; if (parentMenu.getId().equals(nav.getParentId())) { List parentMenuSuperior = parentMenu.getMenuSuperior(); menuSuperior = new ArrayList<>(parentMenuSuperior); menuSuperior.add(parentMenu.getId()); nav.setMenuSuperior(menuSuperior); children.add(nav); } } } if (children.size() > 0) { // 排序 children.sort(Comparator.comparingInt(MenuRespDTO::getPriority)); for (MenuRespDTO nav : children) { List subMenu = getChildren(nav, allChildren); nav.setChildren(subMenu); } } return children; } /** * @Description: 生成菜单树 */ public static List generateMenuTree(List menuList, Long projectId) { // 区分父子节点 List rootMenu = new ArrayList<>(); List publicMenu = new ArrayList<>(); List childMenu = new ArrayList<>(); for (MenuInfoDO menuDo : menuList) { // 先转换成dto返回对象 MenuRespDTO menu = convertMenuDO2DTO(menuDo); // 公共菜单 直接放入根菜单 if (menu.getPublic()) { menu.setMenuSuperior(new ArrayList<>()); publicMenu.add(menu); } // 没有父菜单 else if (menu.getParentId() == null && menu.getProject() != null && menu.getProject().getProjectId().equals(projectId)) { //前端需要的一个数据结构 menu.setMenuSuperior(new ArrayList<>()); rootMenu.add(menu); } else { childMenu.add(menu); } } if (projectId == null) { // 只返回公共目录和他的子目录 rootMenu = publicMenu; }else{ // 所有目录 rootMenu.addAll(publicMenu); } // 遍历父节点 if (rootMenu.size() > 0) { rootMenu.sort(Comparator.comparingInt(MenuRespDTO::getPriority)); for (MenuRespDTO menu : rootMenu) { // 当前父节点的子节点 List children = getChildren(menu, childMenu); menu.setChildren(children); } } return rootMenu; } public static List getUserMenuFromAllMenu(List allMenu , String roleCode) { List userMenu = new ArrayList<>(); for (MenuInfoDO menu : allMenu) { //当前菜单的所有编码 List roleCodes = menu.getRoles().stream().map(RoleInfoDO::getCode).collect(Collectors.toList()); // 公共页面 || 有角色页面 if (menu.getPublicEnable() || roleCodes.contains(roleCode)) { userMenu.add(menu); } } return userMenu; } // public static List generatePublicTree(List allMenu){ // List publicMenu = new ArrayList<>(); // List children = new ArrayList<>(); // for (MenuInfoDO menuDo : allMenu) { // MenuRespDTO menu = convertMenuDO2DTO(menuDo); // if (menu.getPublic()) { // menu.setMenuSuperior(new ArrayList<>()); // publicMenu.add(menu); // }else{ // children.add(menu); // } // } // publicMenu.sort(Comparator.comparingInt(MenuRespDTO::getPriority)); // if (publicMenu.size() > 0) { // // 排序 // publicMenu.sort(Comparator.comparingInt(MenuRespDTO::getPriority)); // for (MenuRespDTO nav : publicMenu) { // List subMenu = getChildren(nav, children); // nav.setChildren(subMenu); // } // } // // return null; // } public static MenuRespDTO convertMenuDO2DTO(MenuInfoDO menuInfoDO) { MenuRespDTO menuRespDTO = new MenuRespDTO(); menuRespDTO.setId(menuInfoDO.getId()); menuRespDTO.setName(menuInfoDO.getName()); menuRespDTO.setPath(menuInfoDO.getPath()); menuRespDTO.setPriority((menuInfoDO.getPriority())); menuRespDTO.setDescription(menuInfoDO.getDescription()); menuRespDTO.setStatus(menuInfoDO.getStatus()); menuRespDTO.setParentId(menuInfoDO.getParentId()); menuRespDTO.setRedirect(menuInfoDO.getRedirect()); menuRespDTO.setComponent(menuInfoDO.getComponent()); menuRespDTO.setPublic(menuInfoDO.getPublicEnable()); if (menuInfoDO.getProject() != null) { ProjectRespDTO projectRespDTO = new ProjectRespDTO(); projectRespDTO.setProjectId(menuInfoDO.getProject().getId()); projectRespDTO.setProjectCode(menuInfoDO.getProject().getCode()); projectRespDTO.setProjectName(menuInfoDO.getProject().getName()); projectRespDTO.setStatus(menuInfoDO.getProject().getStatus()); ProjectStatusEnum statusEnum = ProjectStatusEnum.parse(menuInfoDO.getProject().getStatus()); assert statusEnum != null; projectRespDTO.setStatusDesc(statusEnum.getValue()); menuRespDTO.setProject(projectRespDTO); } //projectId if (menuInfoDO.getProject() != null) { menuRespDTO.setProjectId(menuInfoDO.getProject().getId()); } // meta MenuMetaRespDTO menuMetaRespDTO = new MenuMetaRespDTO(); menuMetaRespDTO.setTitle(menuInfoDO.getTitle()); menuMetaRespDTO.setIsLink(menuInfoDO.getLinkEnable()); menuMetaRespDTO.setIsHide(menuInfoDO.getHideEnable()); menuMetaRespDTO.setIsKeepAlive(menuInfoDO.getKeepAliveEnable()); menuMetaRespDTO.setIsAffix(menuInfoDO.getAffixEnable()); menuMetaRespDTO.setIsIframe(menuInfoDO.getIframeEnable()); menuMetaRespDTO.setIcon(menuInfoDO.getIcon()); menuMetaRespDTO.setRoles(menuInfoDO.getRoles().stream().map(RoleInfoDO::getCode).collect(Collectors.toList())); menuRespDTO.setMeta(menuMetaRespDTO); return menuRespDTO; } }