修改菜单树的构建

dev
ZhouXY108 2023-09-09 18:41:00 +08:00
parent 8414fcb010
commit 7f8a37803a
1 changed files with 19 additions and 25 deletions

View File

@ -1,7 +1,6 @@
package xyz.zhouxy.plusone.system.application.service;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@ -13,8 +12,8 @@ import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import xyz.zhouxy.plusone.commons.util.MoreCollections;
import xyz.zhouxy.plusone.constant.EntityStatus;
import xyz.zhouxy.plusone.domain.IWithOrderNumber;
import xyz.zhouxy.plusone.exception.DataNotExistException;
import xyz.zhouxy.plusone.system.application.common.exception.UnsupportedMenuTypeException;
import xyz.zhouxy.plusone.system.application.query.result.MenuViewObject;
@ -108,7 +107,7 @@ public class MenuManagementService {
command.getIcon(),
command.getHidden(),
command.getOrderNumber(),
EntityStatus.of(command.getStatus()),
EntityStatus.of(command.getStatus()),
command.getComponent(),
command.getResource(),
command.getCache(),
@ -139,38 +138,33 @@ public class MenuManagementService {
@Transactional(propagation = Propagation.SUPPORTS)
public List<MenuViewObject> buildMenuTree(List<MenuViewObject> menus) {
List<MenuViewObject> rootMenus = menus
.stream()
.filter(menu -> Objects.equals(menu.getParentId(), 0L))
.toList();
Map<Long, MenuViewObject> allMenus = new HashMap<>();
for (var item : menus) {
allMenus.put(item.getId(), item);
}
// 创建并填充 Map
final Map<Long, MenuViewObject> menuMap = MoreCollections.toHashMap(menus, MenuViewObject::getId);
for (MenuViewObject menu : menus) {
long parentId = menu.getParentId();
while (parentId != 0 && !allMenus.containsKey(parentId)) {
MenuViewObject parent = findById(parentId);
if (parent == null) {
break;
if (parentId != 0L) {
while (!menuMap.containsKey(parentId)) {
MenuViewObject parent = findById(parentId);
if (parent == null) {
break;
}
menuMap.put(parent.getId(), parent);
parentId = parent.getParentId();
}
allMenus.put(parent.getId(), parent);
parentId = parent.getParentId();
}
}
for (var menu : allMenus.values()) {
var parent = allMenus.getOrDefault(menu.getParentId(), null);
Collection<MenuViewObject> allMenus = menuMap.values();
for (var menu : allMenus) {
var parent = menuMap.get(menu.getParentId());
if (parent != null) {
parent.addChild(menu);
}
}
return rootMenus
.stream()
.sorted(Comparator.comparing(IWithOrderNumber::getOrderNumber))
return allMenus.stream()
.filter(menu -> (menu != null) && Objects.equals(menu.getParentId(), 0L))
.sorted()
.toList();
}
}