3-2 部门层级树接口
创建用于展示的 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); } }
转换部门树算法
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); }