当前位置: 首页 > article >正文

递归快速获取机构树型图

        一般组织架构都会有层级关系,根部门的parentId一般设置为null或者0等特殊字符,而次级部门及以下的parentId则指向他们父节点的id。

        以此为基础,业务上经常会有查询整个组织架构层级关系的需求,返回对象中的children属性用来存储子机构的集合,从而形成树型结构。

        这种情况一般使用递归写法,能快速完成需求。

        1、获取所有根节点,根节点的集合就是最终返回对象的集合的元素数量size

        2、设置根节点的子节点集合。

        3、递归设置子节点的子节点集合。

        

        

public R<List<BankBranchInfo>> getBankBranchInfo() {

        String sql = "select ORG_ID, ORG_NAME, PARENT_ID from auth_org WHERE TENANT_ID <> 100001 ";
        List<OrgEntity> listAll = beanCruder.selectList(OrgEntity.class, sql);

        List<BankBranchInfo> bankBranchInfos = new ArrayList<>();
        listAll.forEach(org -> {
            BankBranchInfo bankBranchInfo = new BankBranchInfo();
            bankBranchInfo.setId(String.valueOf(org.getOrgId()));
            bankBranchInfo.setBankName(org.getOrgName());
            bankBranchInfo.setParentId(org.getParentId() == null ? null : Long.valueOf(org.getParentId()));
            bankBranchInfos.add(bankBranchInfo);
        });
        //一级
        List<BankBranchInfo> rootList = bankBranchInfos.stream().filter(e -> e.getParentId() == null).collect(Collectors.toList());
        //其他级
        List<BankBranchInfo> other = bankBranchInfos.stream().filter(e -> e.getParentId() != null).collect(Collectors.toList());

        setTree(rootList, other);

        return R.ok(rootList, "查询完成");
    }



private void setTree(List<BankBranchInfo> children, List<BankBranchInfo> other) {
        children.forEach(root -> {
            List<BankBranchInfo> childrenList = new ArrayList<>();
            root.setBankBranchInfos(childrenList);
            //该级子级
            List<BankBranchInfo> temp = other.stream().filter(e -> root.getId().equals(e.getParentId().toString())).collect(Collectors.toList());
            childrenList.addAll(temp);
            if (!childrenList.isEmpty()) {
                setTree(childrenList, other);
            }
        });
    }


http://www.kler.cn/a/314524.html

相关文章:

  • 设计模式练习(一) 单例模式
  • Leecode热题100-35.搜索插入位置
  • 除了 Mock.js,前端还有更方便的 Mock 数据工具吗?
  • 前端 JS面向对象 原型 prototype
  • 利用 Screen 保持 VSCode 连接远程任务持续运行
  • idea的mapper.xml文件里写sql语句出现Tag name expected错误提示
  • 【赵渝强老师】基于ZooKeeper实现Hadoop HA
  • DELPHI编译软件时带上当前IDE的版本号
  • 2024/9/21 leetcode 21.合并两个有序链表 2.两数相加
  • Hive企业级调优[5]—— HQL语法优化之数据倾斜
  • [Vue] 从零开始使用 Vite 创建 Vue 项目
  • webrtc gclient sync报错问题解决
  • 独孤思维:图书电商,又精进了
  • SwiftUI里的ForEach使用的注意事项
  • 某建筑市场爬虫数据采集逆向分析
  • Cartographer源码理解
  • ccfcsp-202403(1、2、3、4)
  • Compiler Explorer 开源项目-在线编译器网站
  • 由于安全风险,安全领导者考虑禁止人工智能编码
  • 【C++】—— string模拟实现
  • UWA支持鸿蒙HarmonyOS NEXT
  • 2024年最新Redis内存数据库主从复制、哨兵模式、集群部署等详细教程(更新中)
  • 考研数学精解【5】
  • sizeof与strlen()函数的对比总结
  • 【数据结构与算法 | 每日一题 | 力扣篇】力扣1184
  • 网络安全详解