递归快速获取机构树型图
一般组织架构都会有层级关系,根部门的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);
}
});
}