java获取树形组织结构(使用map的方式)

递归获取树形组织结构,如果数据量过大的话,会严重影响响应速度,使用map 广度遍历获取

表结构

CREATE TABLE `org_institutions` (
  `org_id` bigint(50) NOT NULL COMMENT '组织机构id',
  `org_name` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '组织机构名称',
  `create_user` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '创建人',
  `icon_skin` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '图标样式名',
  `org_number` varchar(50) CHARACTER SET utf8 DEFAULT NULL COMMENT '机构编号',
  `org_director` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '机构主管',
  `status` int(1) DEFAULT NULL COMMENT '状态',
  `executive_level` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '行政级别 :省(自治区、直辖市),市(地、州),县,单位,部门',
  `dept_sort` int(255) DEFAULT NULL COMMENT '单位排序',
  `dept_evel` int(50) DEFAULT NULL COMMENT '单位层级',
  `business_dept_id` varchar(50) CHARACTER SET utf8 DEFAULT NULL COMMENT '上级业务单位(用于对上下级之间进行业务)',
  `dept_type` int(2) DEFAULT NULL COMMENT '管理部门 -1/业务部门 -0',
  `dept_audit` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '数据权限',
  `org_note` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '备注',
  `org_parent` bigint(50) DEFAULT NULL COMMENT '所属机构 机构层级 0为最大父级',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`org_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

实体类

@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("org_institutions")
public class OrgInstitutions implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 组织机构id
     */
    @TableId(value = "org_id")
    private Long orgId;

    /**
     * 组织机构名称
     */
    private String orgName;

    /**
     * 机构编号
     */
    private String orgNumber;

    /**
     * 机构主管
     */
    private String orgDirector;

    /**
     * 备注
     */
    private String orgNote;

    /**
     * 所属机构 机构层级 0为最大父级
     */
    private Long orgParent;

    /**
     * 创建时间
     */
    private String createTime;


}

Vo 返回类

@Data
public class OrgInstitutionsVo implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * id
     */
    private Long orgId;

    /**
     * 组织机构名称
     */
    private String orgName;

    /**
     * 机构编号
     */
    private String orgNumber;

    /**
     * 机构主管
     */
    private String orgDirector;

    /**
     * 备注
     */
    private String orgNote;

    /**
     * 所属机构 机构层级 0为最大父级
     */
    private Long orgParent;

    /**
     * 创建时间
     */
    private String createTime;

    private List<OrgInstitutionsVo> voList;


}

controller

/**
     * 组织机构树
     */
    @GetMapping("/tree")
    public String tree(Long userId){
        return orgInstitutionsService.tree(userId);
    }

impl

    /**
     * 组织结构树
     * @return
     */
   @Override
   public String tree(Long userId) {
       if (userId != null){
           return BaseDTO.ok("查询成功",userTree(userId));
       }
       //所有得 节点
       List<OrgInstitutions> orgInstitutions = orgInstitutionsMapper.selectList(null);
       //转换成vo
       List<OrgInstitutionsVo> allList = new ArrayList<>();
       for (OrgInstitutions orgInstitution : orgInstitutions) {
           allList.add(categoryTOCategoryVo(orgInstitution));
       }
       // 获取一级菜单 , 0 代表一级目录  父级节点
       List<OrgInstitutionsVo> parentList = new ArrayList<>();
       for (OrgInstitutions orgInstitution : parent(orgInstitutions)) {
           parentList.add(categoryTOCategoryVo(orgInstitution));
       }
       // 查找子节点
       List<OrgInstitutionsVo> subCategory = tree(allList, parentList);
       return BaseDTO.ok("查询成功",subCategory);
   }

tree

   /**
     * 新版 获取树结构 map 提高效率
     * @param allList      所有组织
     * @param parentList   父级组织
     * @return
     */
    public List<OrgInstitutionsVo> tree(List<OrgInstitutionsVo> allList, List<OrgInstitutionsVo> parentList){
        Map<Long,List<OrgInstitutionsVo>> map = new HashMap<>();
        for (OrgInstitutionsVo orgInstitutionsVo : allList) {
            final List<OrgInstitutionsVo> list = map.getOrDefault(orgInstitutionsVo.getOrgParent(),new ArrayList<>());
            list.add(orgInstitutionsVo);
            map.put(orgInstitutionsVo.getOrgParent(),list);
        }
        Queue<OrgInstitutionsVo> queue = new LinkedList<>(parentList);
        while (!queue.isEmpty()){
            final OrgInstitutionsVo orgInstitutionsVo = queue.poll();
            List<OrgInstitutionsVo> list = map.get(orgInstitutionsVo.getOrgId());
            if (list == null){
                continue;
            }
            orgInstitutionsVo.setVoList(list);
            queue.addAll(list);
        }
        return parentList;
    }

此项目中,只有一个最大父级,所以遍历使用了父级 和子集

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值