创建用于展示的 dto 对象
@Getter
@Setter
@ToString
public class DeptLevelDto extends SysDept{
private List<DeptLevelDto> deptList = new ArrayList<>();
// sysDept 转换 DeptLevelDto
public static DeptLevelDto adapt(SysDept sysDept) {
DeptLevelDto deptLevelDto = new DeptLevelDto();
BeanUtils.copyProperties(sysDept, deptLevelDto);
return deptLevelDto;
}
}
SysTreeService
@Service
public class SysTreeService {
@Autowired
private SysDeptMapper sysDeptMapper;
public List<DeptLevelDto> deptTree(){
List<SysDept> deptList = sysDeptMapper.getAllDept();
List<DeptLevelDto> deptLevelDtoList = Lists.newArrayList(); // pom 文件添加 assertj-core依赖
for(SysDept sysDept: deptList) {
DeptLevelDto deptLevelDto = DeptLevelDto.adapt(sysDept);
deptLevelDtoList.add(deptLevelDto);
}
return deptListToTree(deptLevelDtoList);
}
}
mapper
<select id="getAllDept" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from sys_dept
</select>
转换部门树算法
public List<DeptLevelDto> deptListToTree(List<DeptLevelDto> deptLevelDtoList){
// pom 添加 commons-collections依赖
if(CollectionUtils.isEmpty(deptLevelDtoList)) {
return Lists.newArrayList();
}
// level -> [dept1,dept2, ...]
// Multimap<String, DeptLevelDto> 相当于 map<String, List<DeptLevelDto>>
Multimap<String, DeptLevelDto> levelDeptDtoMap = ArrayListMultimap.create(); // pom 添加 guava 依赖
List<DeptLevelDto> rootList = Lists.newArrayList();
// 归类
for(DeptLevelDto deptLevelDto : deptLevelDtoList) {
levelDeptDtoMap.put(deptLevelDto.getLevel(), deptLevelDto);
if(LevelUtil.ROOT.equals(deptLevelDto.getLevel())) {
rootList.add(deptLevelDto);
}
}
// rootList 按照 seq 从小到大进行排序
Collections.sort(rootList, new Comparator<DeptLevelDto>() {
public int compare(DeptLevelDto o1, DeptLevelDto o2) {
// 返回值为int类型,大于0表示正序,小于0表示逆序
return o1.getSeq() - o2.getSeq();
}
});
transformDeptTree(rootList, LevelUtil.ROOT, levelDeptDtoMap);
return rootList;
}
// 对 rootlist 的下级进行递归排序
public void transformDeptTree(List<DeptLevelDto> deptLevelDtoList, String level, Multimap<String, DeptLevelDto> levelDeptDtoMap) {
for (int i = 0; i < deptLevelDtoList.size(); i++) {
// 遍历该层的每个元素 例如:根元素的第一个 deptLevelDto 部门 0.0
DeptLevelDto deptLevelDto = deptLevelDtoList.get(i);
// 处理当前层级的数据 例如:nextLevel = 0.0
String nextLevel = LevelUtil.calculateLevel(level, deptLevelDto.getId());
// 处理下一层
List<DeptLevelDto> tempDeptList = (List<DeptLevelDto>) levelDeptDtoMap.get(nextLevel);
// 如果下一层有数据 例如:0.0 -> [0.0.1, 0.0.2, ...]
if (CollectionUtils.isNotEmpty(tempDeptList)) {
// 排序
Collections.sort(tempDeptList, deptSeqComparator);
// 设置下一层部门
deptLevelDto.setDeptList(tempDeptList);
// 进入到下一层处理
transformDeptTree(tempDeptList, nextLevel, levelDeptDtoMap);
}
}
}
public Comparator<DeptLevelDto> deptSeqComparator = new Comparator<DeptLevelDto>() {
public int compare(DeptLevelDto o1, DeptLevelDto o2) {
return o1.getSeq() - o2.getSeq();
}
};
controller
@RequestMapping("/tree")
@ResponseBody
public JsonData tree() {
List<DeptLevelDto> deptLevelDtoList = sysTreeService.deptTree();
return JsonData.success(deptLevelDtoList);
}