houzhongjian
2024-10-16 7da8f196dee8e3c526c009a4bc7f5983ece6bb97
提交 | 用户 | 时间
818a01 1 package com.iailab.module.system.convert.app;
H 2
3 import cn.hutool.core.collection.CollUtil;
4 import com.iailab.module.system.api.app.dto.AppMenuRespDTO;
5 import com.iailab.module.system.dal.dataobject.app.AppMenuDO;
6 import com.iailab.module.system.enums.permission.MenuTypeEnum;
7 import org.mapstruct.Mapper;
8 import org.mapstruct.factory.Mappers;
9 import org.slf4j.LoggerFactory;
10
11 import java.util.*;
12
13 import static com.iailab.framework.common.util.collection.CollectionUtils.filterList;
14
15 @Mapper
16 public interface AppConvert {
17
18     AppConvert INSTANCE = Mappers.getMapper(AppConvert.class);
19
20     AppMenuRespDTO convertTreeNode(AppMenuDO menu);
21
22     /**
23      * 将菜单列表,构建成菜单树
24      *
25      * @param menuList 菜单列表
26      * @return 菜单树
27      */
28     default List<AppMenuRespDTO> buildMenuTree(Long id, List<AppMenuDO> menuList) {
29         if (CollUtil.isEmpty(menuList)) {
30             return Collections.emptyList();
31         }
32         // 移除按钮
33         menuList.removeIf(menu -> menu.getType().equals(MenuTypeEnum.BUTTON.getType()));
34         // 排序,保证菜单的有序性
35         menuList.sort(Comparator.comparing(AppMenuDO::getSort));
36
37         // 构建菜单树
38         // 使用 LinkedHashMap 的原因,是为了排序 。实际也可以用 Stream API ,就是太丑了。
39         Map<Long, AppMenuRespDTO> treeNodeMap = new LinkedHashMap<>();
40         menuList.forEach(menu -> treeNodeMap.put(menu.getId(), AppConvert.INSTANCE.convertTreeNode(menu)));
41         // 处理父子关系
42         treeNodeMap.values().stream().filter(node -> !node.getParentId().equals(id)).forEach(childNode -> {
43             // 获得父节点
44             AppMenuRespDTO parentNode = treeNodeMap.get(childNode.getParentId());
45             if (parentNode == null) {
46                 LoggerFactory.getLogger(getClass()).error("[buildRouterTree][resource({}) 找不到父资源({})]",
47                         childNode.getId(), childNode.getParentId());
48                 return;
49             }
50             // 将自己添加到父节点中
51             if (parentNode.getChildren() == null) {
52                 parentNode.setChildren(new ArrayList<>());
53             }
54             parentNode.getChildren().add(childNode);
55         });
56         // 获得到所有的根节点
57         return filterList(treeNodeMap.values(), node -> id.equals(node.getParentId()));
58     }
59
60 }