java8 获取部门树形结构

需求:从mysql数据库中查出所有的部门组织,按照父子关系,组成树形结构返回给前端

数据库设计:
DROP TABLE IF EXISTS `management_info`;
CREATE TABLE `management_info` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id',
    `management_name` varchar(200) DEFAULT NULL COMMENT '部门名称',
    `parent_id` bigint(20) DEFAULT NULL COMMENT '上级部门id',
    `root_id` bigint(20) DEFAULT NULL COMMENT '根部门id',
    `is_deleted` int(11) DEFAULT '0' COMMENT '记录状态(0:未删除,1:已删除)',
    `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=33 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='部门层级信息表'

根节点的字段,非常重要,不仅是作为后期维护不同的组织部门,而且在java代码中,通过根节点来向下拼接,因为我们组织部门是有一个总部门控制,在总部门下再依次增加子部门

实体类VO设计
@Data
public class ManagementInfoVO extends ManagementInfo{

    @ApiModelProperty(value = "子部门集合")
    private List<ManagementInfoVO> childList;
}

实体类用递归嵌套的形式设计

实现类代码
@Override
    public List<ManagementInfoVO> getManagementInfoList(Long rootDeptId) {
        // 查询根节点下所有部门信息
        ManagementInfoExample example = new ManagementInfoExample();
        ManagementInfoExample.Criteria criteria = example.createCriteria();
        criteria.andIsDeletedEqualTo(0);
        criteria.andRootIdEqualTo(rootDeptId);
        List<ManagementInfo> managementInfos = managementInfoMapper.selectByExample(example);
        // 组成树形结构
        List<ManagementInfoVO> resultTmp = new ArrayList<>();
        if (CollectionUtils.isNotEmpty(managementInfos)) {
            List<ManagementInfoVO> VOList = new ArrayList<>();
            for (ManagementInfo info:managementInfos) {
                ManagementInfoVO vo = new ManagementInfoVO();
                BeanUtils.copyProperties(info,vo);
                VOList.add(vo);
            }
            resultTmp = VOList.stream()
                    .filter(item -> item.getParentId()==-1)
                    .map(item -> {
                        item.setChildList(recursiveQuery(item, VOList));
                        return item;
                    }).collect(Collectors.toList());
        }
        return resultTmp;
    }
/**
     * 迭代查询权限
     *
     * @params parentId, permissions
     * @return
     * @author zhusanlu
     * @date 2022/1/19
     */
    private List<ManagementInfoVO> recursiveQuery(ManagementInfoVO root, List<ManagementInfoVO> permissions) {
        List<ManagementInfoVO> children = permissions.stream()
                .filter(item -> {return Objects.equals(item.getParentId(), root.getId()); })
                .map(item -> {
                            item.setChildList(recursiveQuery(item, permissions));
                            return item;
                        }
                ).collect(Collectors.toList());
        return children;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值