菜单目录-行转树

该代码实现了一个根据ProjectDashboardTabChartVO对象列表构建DashMenuTreeNodeVO树结构的方法。首先检查输入列表是否为空,如果为空则返回空列表。然后创建根节点,并遍历输入列表,根据节点类型(如项目、仪表盘、页签、图表)添加到树结构的适当位置。此外, DashMenuTreeNodeVO类包含了节点ID、名称、类型、排序字段、编辑和删除标志以及子节点集合,使用状态模式处理不同类型的节点添加。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

listProjectVOSForFeishu:
    @Override
    public List<DashMenuTreeNodeVO> listProjectVOSForFeishu() {
        List<ProjectDashboardTabChartVO> projectDashboardTabChartVOList = dashboardMapper.listProjectDashboardTabChart(true);
        if (CollectionUtils.isEmpty(projectDashboardTabChartVOList)) {
            return Collections.emptyList();
        }
        DashMenuTreeNodeVO root = new DashMenuTreeNodeVO();
        for (int i = 0; i < projectDashboardTabChartVOList.size(); i++) {
            ProjectDashboardTabChartVO vo = projectDashboardTabChartVOList.get(i);
            root.add(vo);
        }
        return new LinkedList<>(root.getChildren());
    }
DashMenuTreeNodeVO:
package com.soyoung.ztdata.bi.core.vo.report;

import com.soyoung.ztdata.bi.core.enums.DashMenuTypeEnum;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.util.*;

/**
 */
@Slf4j
public class DashMenuTreeNodeVO {
    private String id;
    private String name;
    /**
     * 当前节点类型
     */
    String type;
    /**
     * 排序字段
     */
    private Integer sortNum;
    /**
     * 是否可编辑
     */
    private Boolean edit = false;
    /**
     * 是否可删除
     */
    private Boolean del = false;
    /**
     * 子节点
     */
    private Set<DashMenuTreeNodeVO> children = new TreeSet<>((o1, o2) -> {
        if (null == o1.sortNum || null == o2.sortNum) {
            return -1;
        }
        if (Objects.equals(o1.sortNum, o2.sortNum)) {
            if (Objects.equals(o1.getId(), o2.getId())) {
                return -1;
            }
            return o1.getId().compareTo(o2.getId());
        }
        return o1.sortNum.compareTo(o2.sortNum);
    });

    public DashMenuTreeNodeVO() {
    }

    public DashMenuTreeNodeVO(String type) {
        this.type = type;
    }


    private static final ThreadLocal<Finder> finder = new ThreadLocal<>();


    /**
     * 状态模式
     * type == null, // 说明是 根 root 节点, 获取菜单探测器探测结果(DashMenuTreeNodeVO),探测结果作为 子树 root 继续添加节点(node)
     * <p>
     * type == project("文件夹") && level == 0, // 说明是第一级菜单, 不可能出现此状态(type == null时,已经把level = 0 和 level = 1 两级节点关联了)
     * <p>
     * type == project("文件夹") && level == 1, // 说明是第二级菜单, 获取仪表盘探测器探测结果(DashMenuTreeNodeVO),探测结果作为root继续添加节点(node)
     * <p>
     * // type == dashboard("看板"), // 说明是看板节点,从页签探测器中获取页签引用,作为 子树 root 继续添加节点(node)
     * <p>
     * // type == tab("页签"), // 说明是页签节点,从图表探测器中获取图表引用,作为 子树 root 继续添加节点(node)
     * <p>
     * // type == chart("图表"); // 说明是图表节点(叶子节点),将 子树集合 置为 null
     *
     * @param node
     */
    public void add(ProjectDashboardTabChartVO node) {
        if (null == finder.get() || (null == type && this.children.size() == 0)) {
            finder.set(new Finder());
        }
        DashMenuTreeNodeVO root;
        String uniquePId = uniquePId(node);
        String uniqueProjId = uniqueProjId(node);
        String uniqueDashId = uniqueDashId(node);
        String uniqueTabId = uniqueTabId(node);
        String uniqueChartId = uniqueChartId(node);
        if (null == type) { // this == root
            if (Objects.equals("0", uniquePId)) { // node == 一级
                root = finder.get().getProjectFinder().computeIfAbsent(uniqueProjId,
                        key -> {
                            DashMenuTreeNodeVO dashMenuTreeNodeVO = new DashMenuTreeNodeVO(DashMenuTypeEnum.project.name()).setId(node.getProjId()).setName(node.getProjName()).setSortNum(node.getProjectSortNum());
                            this.children.add(dashMenuTreeNodeVO);
                            return dashMenuTreeNodeVO;
                        });
                root.add(node);
            } else { // node == 二级
                // pid
                DashMenuTreeNodeVO rootPid = finder.get().getProjectFinder().computeIfAbsent(uniquePId,
                        key -> {
                            DashMenuTreeNodeVO dashMenuTreeNodeVO = new DashMenuTreeNodeVO(DashMenuTypeEnum.project.name()).setId(node.getPid()).setName(node.getPname()).setSortNum(node.getPSortNum());
                            this.children.add(dashMenuTreeNodeVO);
                            return dashMenuTreeNodeVO;
                        });

                // projId
                root = finder.get().getProjectFinder().computeIfAbsent(uniqueProjId,
                        key -> {
                            final DashMenuTreeNodeVO dashMenuTreeNodeVO = new DashMenuTreeNodeVO(DashMenuTypeEnum.project.name()).setId(node.getProjId()).setName(node.getProjName()).setSortNum(node.getProjectSortNum());
                            rootPid.getChildren().add(dashMenuTreeNodeVO);
                            return dashMenuTreeNodeVO;
                        });
                root.add(node);
            }
        } else if (Objects.equals(DashMenuTypeEnum.project.name(), this.type)) {
            root = finder.get().getDashboardFinder().computeIfAbsent(uniqueDashId,
                    key -> {
                        final DashMenuTreeNodeVO dashMenuTreeNodeVO = new DashMenuTreeNodeVO(DashMenuTypeEnum.dashboard.name()).setId(node.getDashId()).setName(node.getDashName()).setSortNum(node.getDashSortNum());
                        this.children.add(dashMenuTreeNodeVO);
                        return dashMenuTreeNodeVO;
                    });
            root.add(node);
        } else if (Objects.equals(DashMenuTypeEnum.dashboard.name(), this.type)) {
            root = finder.get().getTabFinder().computeIfAbsent(uniqueTabId,
                    key -> {
                        final DashMenuTreeNodeVO dashMenuTreeNodeVO = new DashMenuTreeNodeVO(DashMenuTypeEnum.tab.name()).setId(node.getTabId()).setName(node.getTabName());
                        this.children.add(dashMenuTreeNodeVO);
                        return dashMenuTreeNodeVO;
                    });

            root.add(node);
        } else if (Objects.equals(DashMenuTypeEnum.tab.name(), this.type)) {
            if (StringUtils.isBlank(uniqueChartId)) {
                this.children = null;
                return;
            }
            root = finder.get().getChartFinder().computeIfAbsent(uniqueChartId,
                    key -> {
                        final DashMenuTreeNodeVO dashMenuTreeNodeVO = new DashMenuTreeNodeVO(DashMenuTypeEnum.chart.name()).setId(node.getChartId()).setName(node.getChartName());
                        this.children.add(dashMenuTreeNodeVO);
                        return dashMenuTreeNodeVO;
                    });
            root.add(node);
        } else if (Objects.equals(DashMenuTypeEnum.chart.name(), this.type)) {
            this.children = null;
        }
    }

    private String uniqueChartId(ProjectDashboardTabChartVO node) {
        return node.getChartId();
    }

    private String uniqueTabId(ProjectDashboardTabChartVO node) {
        return uniqueDashId(node) + ":" + node.getTabId();
    }

    private String uniquePId(ProjectDashboardTabChartVO node) {
        return node.getPid();
    }

    private String uniqueDashId(ProjectDashboardTabChartVO node) {
        return node.getDashId();
    }

    private String uniqueProjId(ProjectDashboardTabChartVO node) {
        return node.getProjId();
    }

    public String getId() {
        return id;
    }

    public DashMenuTreeNodeVO setId(String id) {
        this.id = id;
        return this;
    }

    public String getName() {
        return name;
    }

    public DashMenuTreeNodeVO setName(String name) {
        this.name = name;
        return this;
    }

    public String getType() {
        return type;
    }

    public DashMenuTreeNodeVO setType(String type) {
        this.type = type;
        return this;
    }

    public Boolean getEdit() {
        return edit;
    }

    public void setEdit(Boolean edit) {
        this.edit = edit;
    }

    public Boolean getDel() {
        return del;
    }

    public void setDel(Boolean del) {
        this.del = del;
    }

    public Integer getSortNum() {
        return sortNum;
    }

    public DashMenuTreeNodeVO setSortNum(Integer sortNum) {
        this.sortNum = sortNum;
        return this;
    }

    public Set<DashMenuTreeNodeVO> getChildren() {
        return children;
    }

    public void setChildren(Set<DashMenuTreeNodeVO> children) {
        this.children = children;
    }

    private static final class Finder {
        Map<String, DashMenuTreeNodeVO> projectFinder = new HashMap<>();
        Map<String, DashMenuTreeNodeVO> dashboardFinder = new HashMap<>();
        Map<String, DashMenuTreeNodeVO> tabFinder = new HashMap<>();
        Map<String, DashMenuTreeNodeVO> chartFinder = new HashMap<>();

        public Map<String, DashMenuTreeNodeVO> getProjectFinder() {
            return projectFinder;
        }

        public Map<String, DashMenuTreeNodeVO> getDashboardFinder() {
            return dashboardFinder;
        }

        public Map<String, DashMenuTreeNodeVO> getTabFinder() {
            return tabFinder;
        }

        public Map<String, DashMenuTreeNodeVO> getChartFinder() {
            return chartFinder;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值