需求:从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;
}