大体流程图如下:
我们首先准备对应的sys_dept表用于测试
mybatis查询所有数据:
<!--查询所有部门-->
<select id="getAllDept" resultMap="BaseResultMap">
select <include refid="Base_Column_List" />
from sys_dept;
</select>
查询接口:
List<SysDept> getAllDept();
编写dto对象,新增List属性用于存储下属部门列表
/**
* @author evan_qb
* @date 2018/8/8 17:28
*/
@Data
public class DeptLevelDto extends SysDept {
private List<DeptLevelDto> deptList = Lists.newArrayList();
/**
* 创建DeptLevel对象并通过Dept对象获取对应属性
* @param dept
* @return
*/
public static DeptLevelDto adapt(SysDept dept){
DeptLevelDto dto = new DeptLevelDto();
BeanUtils.copyProperties(dept,dto);
return dto;
}
}
编写工具类LevelUtil用于拼接并获取下个级别
/**
* @author evan_qb
* @date 2018/8/8 17:08
*/
public class LevelUtil {
public final static String SEPARATOR = ".";
public final static String ROOT = "0";
/**
* 0
* 0.1
* 0.1.2
* 0.1.3
* 0.2
* 用于获取下层级别
* @param parentLevel
* @param parentId
* @return
*/
public static String calculaterLevel(String parentLevel,int parentId){
if (StringUtils.isBlank(parentLevel)){
return ROOT;
}else{
//假如当前level为0,那么下层的level则为0.1
return StringUtils.join(parentLevel,SEPARATOR,parentId);
}
}
}
接下来进行递归遍历树:首先获取所有部门信息,然后在这些信息中获取每个根元素,存入集合,然后遍历这个根集合,继续获取下个层级的集合,以此类推
/**
* @author evan_qb
* @date 2018/8/8 17:31
*/
@Service
public class SysTreeService {
@Autowired
private SysDeptMapper sysDeptMapper;
/**
* 生成dept树
*/
public List<DeptLevelDto> deptTree(){
List<SysDept> deptList = sysDeptMapper.getAllDept();
List<DeptLevelDto> dtoList = Lists.newArrayList();
for(SysDept dept: deptList){
DeptLevelDto dto = DeptLevelDto.adapt(dept);
dtoList.add(dto);
}
return deptListToTree(dtoList);
}
/**
* 将List转换成Tree
* @param deptLevelList 所有部门列表
* @return
*/
public List<DeptLevelDto> deptListToTree(List<DeptLevelDto> deptLevelList){
//判断查询到的数据是否为空
if (CollectionUtils.isEmpty(deptLevelList)){
return Lists.newArrayList();
}
//创建Multimap对象
Multimap<String,DeptLevelDto> levelDeptMap = ArrayListMultimap.create();
//创建第一级目录
List<DeptLevelDto> rootList = Lists.newArrayList();
//遍历每一级目录并将其存入MultiMap中
for (DeptLevelDto dto: deptLevelList){
levelDeptMap.put(dto.getLevel(),dto);
//从中筛选出一级部门,并存入rootList中
if (LevelUtil.ROOT.equals(dto.getLevel())){
rootList.add(dto);
}
}
//对root树进行排序 按照seq从小到大进行排序
Collections.sort(rootList, deptSeqComparator);
//递归生成树
transformDeptTree(rootList,LevelUtil.ROOT,levelDeptMap);
return rootList;
}
/**
* 递归排序
* level:0, 0, all 0->0.1,0.2
* level:0.1
* level:0.2
* @param deptLevelList
* @param level
* @param levelDeptMap
*/
public void transformDeptTree(List<DeptLevelDto> deptLevelList,
String level,
Multimap<String,DeptLevelDto> levelDeptMap){
for (int i = 0;i < deptLevelList.size();i++){
//获取该层的每个元素
DeptLevelDto deptLevelDto = deptLevelList.get(i);
//处理当前层级的数据,得到下一层级的级别
String nextLevel = LevelUtil.calculaterLevel(level, deptLevelDto.getId());
//处理下一层
List<DeptLevelDto> tempDeptList = (List<DeptLevelDto>) levelDeptMap.get(nextLevel);
if (CollectionUtils.isNotEmpty(tempDeptList)){
//排序
Collections.sort(tempDeptList,deptSeqComparator);
//设置下一层部门
deptLevelDto.setDeptList(tempDeptList);
//进入到下一层进行处理
transformDeptTree(tempDeptList,nextLevel,levelDeptMap);
}
}
}
/**
* 重写排序
*/
public Comparator<DeptLevelDto> deptSeqComparator = new Comparator<DeptLevelDto>() {
@Override
public int compare(DeptLevelDto o1, DeptLevelDto o2) {
return o1.getSeq() - o2.getSeq();
}
};
}
在controller层将查询到的部门树展示出来:
@GetMapping("/tree.json")
@ResponseBody
public JsonData deptTree(){
List<DeptLevelDto> dtoList = sysTreeService.deptTree();
return JsonData.success(dtoList);
}
结果如下: