递归获取树形组织结构,如果数据量过大的话,会严重影响响应速度,使用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;
}
此项目中,只有一个最大父级,所以遍历使用了父级 和子集