返回树形结构的数据

INode接口

package com.xxxx.mybatisplus.node;

import java.io.Serializable;
import java.util.List;

/**
 * INode接口
 *
 * @author : li.linnan
 * @create : 2023/2/28
 */
public interface INode<T> extends Serializable {
    Long getId();

    Long getParentId();

    List<T> getChildren();

    default Boolean getHasChildren() {
        return false;
    }
}

返回实体类

OrgTreeResultVO 要实现INode接口

package com.xxxx.mybatisplus.pojo;

import com.xxxx.mybatisplus.node.INode;
import lombok.Data;

import java.util.ArrayList;
import java.util.List;

/**
 * 返回实体类
 *
 * @author : li.linnan
 * @create : 2022/11/9
 */
@Data
public class OrgTreeResultVO implements INode<OrgTreeResultVO> {

    private Long id;

    private String orgName;

    private Long parentId;

    private String ancestors;

    private String orgOrder;

    /** 子菜单 */
    private List<OrgTreeResultVO> children = new ArrayList<OrgTreeResultVO>();
}

ForestNodeManager 工具类

package com.xxxx.mybatisplus.node;

import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Maps;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * ForestNodeManager
 *
 * @author : li.linnan
 * @create : 2023/2/28
 */
public class ForestNodeManager<T extends INode<T>> {
    private final ImmutableMap<Long, T> nodeMap;
    private final Map<Long, Object> parentIdMap = Maps.newHashMap();

    public ForestNodeManager(List<T> nodes) {
        this.nodeMap = Maps.uniqueIndex(nodes, INode::getId);
    }

    public INode<T> getTreeNodeAt(Long id) {
        return this.nodeMap.containsKey(id) ? (INode)this.nodeMap.get(id) : null;
    }

    public void addParentId(Long parentId) {
        this.parentIdMap.put(parentId, "");
    }

    public List<T> getRoot() {
        List<T> roots = new ArrayList();
        this.nodeMap.forEach((key, node) -> {
            if (node.getParentId() == 0L || this.parentIdMap.containsKey(node.getId())) {
                roots.add(node);
            }

        });
        return roots;
    }
}

ForestNodeMerger 工具类

package com.xxxx.mybatisplus.node;

import java.util.List;

/**
 * ForestNodeMerger
 *
 * @author : li.linnan
 * @create : 2023/2/28
 */
public class ForestNodeMerger {
    public ForestNodeMerger() {
    }

    public static <T extends INode<T>> List<T> merge(List<T> items) {
        ForestNodeManager<T> forestNodeManager = new ForestNodeManager(items);
        items.forEach((forestNode) -> {
            if (forestNode.getParentId() != 0L) {
                INode<T> node = forestNodeManager.getTreeNodeAt(forestNode.getParentId());
                if (node != null) {
                    node.getChildren().add(forestNode);
                } else {
                    forestNodeManager.addParentId(forestNode.getId());
                }
            }

        });
        return forestNodeManager.getRoot();
    }
}

测试

    @Test
    public  void tree() {

        List<OrgTreeResultVO> resultVOList = partyOrgManageService.tree(null);
        System.out.println(resultVOList);

    }
[OrgTreeResultVO(id=1599714096943558657, orgName=党组织, parentId=0, ancestors=0, orgOrder=null, 
children=[OrgTreeResultVO(id=1599929210460270593, orgName=陕西省党委, parentId=1599714096943558657, ancestors=0,1599714096943558657, orgOrder=1, 
children=[OrgTreeResultVO(id=1599930960063852546, orgName=西安市党委测试修改, parentId=1599929210460270593, ancestors=0,1599714096943558657,1599929210460270593, orgOrder=1, 
children=[]), 

OrgTreeResultVO(id=1600676160660750338, orgName=临潼市党委, parentId=1599929210460270593, ancestors=0,1599714096943558657,1599929210460270593, orgOrder=1, children=[]), 

OrgTreeResultVO(id=1599932517182435330, orgName=渭南市党委, parentId=1599929210460270593, ancestors=0,1599714096943558657,1599929210460270593, orgOrder=3, children=[]), 

OrgTreeResultVO(id=1608372200572837890, orgName=sdf, parentId=1599929210460270593, ancestors=0,1599714096943558657,1599929210460270593, orgOrder=111, children=[]), 

OrgTreeResultVO(id=1608372299298365442, orgName=fdasdgfe, parentId=1599929210460270593, ancestors=0,1599714096943558657,1599929210460270593, orgOrder=111, children=[]), 

OrgTreeResultVO(id=1608373946045030401, orgName=sds, parentId=1599929210460270593, ancestors=0,1599714096943558657,1599929210460270593, orgOrder=111, children=[]), 

OrgTreeResultVO(id=1608374264858271746, orgName=dddd, parentId=1599929210460270593, ancestors=0,1599714096943558657,1599929210460270593, orgOrder=1111, children=[])]), 

OrgTreeResultVO(id=1599929966563258370, orgName=whq测试专用, parentId=1599714096943558657, ancestors=0,1599714096943558657, orgOrder=1, children=[]), 

OrgTreeResultVO(id=1602843910130999298, orgName=嗨嗨嗨, parentId=1599714096943558657, ancestors=0,1599714096943558657, orgOrder=1, children=[]), 

OrgTreeResultVO(id=1602862445706022914, orgName=bug, parentId=1599714096943558657, ancestors=0,1599714096943558657, orgOrder=1, children=[]), 

OrgTreeResultVO(id=1603235547403345921, orgName=asdasd, parentId=1599714096943558657, ancestors=0,1599714096943558657, orgOrder=1, 
children=[OrgTreeResultVO(id=1622851633215983618, orgName=我是一个二十个字的党组织你看看我显示全了, parentId=1603235547403345921, ancestors=0,1599714096943558657,1603235547403345921, orgOrder=5, children=[])]), 

OrgTreeResultVO(id=1603239677385469954, orgName=as4fghdkkasd999, parentId=1599714096943558657, ancestors=0,1599714096943558657, orgOrder=1, children=[]), 

OrgTreeResultVO(id=1603244296035594242, orgName=as4fghfghdkkasd999, parentId=1599714096943558657, ancestors=0,1599714096943558657, orgOrder=1, children=[]), 

OrgTreeResultVO(id=1603637132671422466, orgName=啥地方是地方啥地方是的啥地方是的是的啥地方啥地方啥地方, parentId=1599714096943558657, ancestors=0,1599714096943558657, orgOrder=2, children=[]), 

OrgTreeResultVO(id=1611159961528819713, orgName=朱炜测试, parentId=1599714096943558657, ancestors=0,1599714096943558657, orgOrder=4, children=[]), 

OrgTreeResultVO(id=1625696849434324993, orgName=测试, parentId=1599714096943558657, ancestors=0,1599714096943558657, orgOrder=5, children=[]), 

OrgTreeResultVO(id=1600337596142067713, orgName=四川省党委, parentId=1599714096943558657, ancestors=0,1599714096943558657, orgOrder=41, children=[]), 

OrgTreeResultVO(id=1600680380659060737, orgName=黑龙江党委, parentId=1599714096943558657, ancestors=0,1599714096943558657, orgOrder=45, children=[]), 

OrgTreeResultVO(id=1603234447696519170, orgName=测试20221215, parentId=1599714096943558657, ancestors=0,1599714096943558657, orgOrder=222, children=[]), 

OrgTreeResultVO(id=1603235297452187649, orgName=测试2022121522, parentId=1599714096943558657, ancestors=0,1599714096943558657, orgOrder=222, children=[])])]

项目实战

Controller

    /**
     * 获取树形党组织
     * @return
     */
    @GetMapping("/tree")
    @ApiOperationSupport(order = 4)
    @ApiOperation(value = "查询所有党组织树形结构", notes = "查询所有党组织树形结构")
    @TenantIgnore
    public R<List<OrgTreeResultVO>> tree(Long orgId) {
        List<OrgTreeResultVO> tree = partyOrgManageService.tree(orgId);
        return R.data(tree);
    }

Service

    //查询所有树形党组织
    List<OrgTreeResultVO> tree(Long orgId);
    /**
     * 党组织树
     * @param orgId
     * @return
     */
    @Override
    public List<OrgTreeResultVO> tree(Long orgId) {
        String tenantId = AuthUtil.getTenantId();
        return ForestNodeMerger.merge(baseMapper.tree(orgId,tenantId));
    }

mapper

    /**
     * 党组织树
     * @param orgId
     * @return
     */
    List<OrgTreeResultVO> tree(Long orgId,String tenantId);
    <!--党组织树-->
    <select id="tree" resultType="com.spang.partyManage.party.vo.org.OrgTreeResultVO">
        SELECT
            id,org_name,parent_id,ancestors,org_order
        FROM
            spang_party_org
        where
            is_deleted = 0
        and tenant_id = #{tenantId}
        <if test="orgId != null">
            and id = #{orgId}
            or ancestors like CONCAT((select ancestors from spang_party_org where id = #{orgId}),',',#{orgId},'%')
        </if>
        ORDER BY org_order ASC
    </select>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值