直接上代码,无需多言;主要还是递归;
实体类:
@Data
@ApiModel
@NoArgsConstructor
public class TreeDept implements Serializable {
//type=0 表示是部门;type=1 表示是人员
@ApiModelProperty(value = "type=DEPT 表示是部门;type=USER 表示是人员")
private String type;
@ApiModelProperty(value = "部门id")
private Long value;
@ApiModelProperty(value = "部门名称")
private String label;//部门名称
@ApiModelProperty(value = "部门下人员")
private List<TreeDept> childrenList;
public TreeDept(String label,Long value,String type){
this.label = label;
this.value = value;
this.type = type;
}
}
server
@Override
public List<TreeDept> deptUserTree() {
//查询部门
List<SysDept> sysDepts = deptMapper.selectDeptList(new SysDept());
//构建部门树
List<SysDept> sysDeptTrees = this.buildDeptTree(sysDepts);
List<SysUser> sysUsers = userService.selectUserList(new SysUser());
Map<Long, List<SysUser>> deptUserMap = sysUsers.stream().collect(Collectors.groupingBy(SysUser::getDeptId));
List<TreeDept> treeDeptList = sysDeptTrees.stream().map(e -> {
TreeDept treeDept = new TreeDept();
treeDept.setValue(e.getDeptId());
treeDept.setLabel(e.getDeptName());
treeDept.setType("DEPT");
if (ObjectUtil.isNotEmpty(e.getChildren())) {
treeDept.setChildrenList(getChildUserList(e.getChildren(), deptUserMap));
}
return treeDept;
}).collect(Collectors.toList());
return treeDeptList;
}
private List<TreeDept> getChildUserList(List<SysDept> children, Map<Long, List<SysUser>> deptUserMap) {
List<TreeDept> treeDeptList = children.stream().map(e -> {
TreeDept treeDept = new TreeDept(e.getDeptName(), e.getDeptId(), "DEPT");
if (ObjectUtil.isNotEmpty(e.getChildren())) {
treeDept.setChildrenList(getChildUserList(e.getChildren(), deptUserMap));
} else {
List<SysUser> sysUsersByDept = deptUserMap.get(e.getDeptId());
if (ObjectUtil.isNotEmpty(sysUsersByDept)) {
List<TreeDept> userTrees = sysUsersByDept.stream().map(sysUser -> {
TreeDept userTree = new TreeDept(sysUser.getNickName(), sysUser.getUserId(), "USER");
return userTree;
}).collect(Collectors.toList());
treeDept.setChildrenList(userTrees);
}
}
return treeDept;
}).collect(Collectors.toList());
return treeDeptList;
}
@Override
public List<SysDept> buildDeptTree(List<SysDept> depts) {
List<SysDept> returnList = new ArrayList<SysDept>();
List<Long> tempList = new ArrayList<Long>();
for (SysDept dept : depts) {
tempList.add(dept.getDeptId());
}
for (SysDept dept : depts) {
// 如果是顶级节点, 遍历该父节点的所有子节点
if (!tempList.contains(dept.getParentId())) {
recursionFn(depts, dept);
returnList.add(dept);
}
}
if (returnList.isEmpty()) {
returnList = depts;
}
return returnList;
}
/**
* 递归列表
*/
private void recursionFn(List<SysDept> list, SysDept t) {
// 得到子节点列表
List<SysDept> childList = getChildList(list, t);
t.setChildren(childList);
for (SysDept tChild : childList) {
if (hasChild(list, tChild)) {
recursionFn(list, tChild);
}
}
}