【spring】递归遍历层级部门树

大体流程图如下:

我们首先准备对应的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);
}

结果如下:

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值