【Java】部门集合树状顺序展示

发布时间 2023-07-06 11:00:40作者: emdzz

一、需求效果:

表单的部门下拉选择时,可以展示部门的层级:

 

按照这个效果展示,但是不是树,还是原来的集合

 

二、实现方案:

用Java代码实现两个部分

1、展示Label效果处理

2、处理集合的树状排序

第一个问题用一个方法加额外字段解决

/**
 * @author onCloud9
 * @date 2023/7/6 10:39
 * @description 层级前缀修饰方法
 * @params [level]
 */
public void levelPrefixDecoration(int level) {
    StringBuilder prefix = new StringBuilder();
    boolean isTopOrNot = 0 == level;
    if (!isTopOrNot) {
        for (int i = 0; i < level; i++) prefix.append("--- ");
        prefix.append(" ");
    }
    deLabel = prefix + sysArDeCode + " | " + deName;
}

 

第二个问题,使用递归实现:

4个参数,排序好的集合,当前层的集合,完整数据源集合,当前层级值

/**
 * @author onCloud9
 * @date 2023/7/6 09:58
 * @description 部门集合树状排序递归
 * @params [sortedList, levels, source] 
 */
private void deptListSortRecursive(List<SysArDecoDTO> sortedList, List<SysArDecoDTO> levels, List<SysArDecoDTO> source, int levelNo) {
    if (CollectionUtils.isEmpty(levels)) return;
    for (SysArDecoDTO level : levels) {
        level.levelPrefixDecoration(levelNo);
        sortedList.add(level);
        List<SysArDecoDTO> collect = source.stream().filter(x -> x.getDeParentId().equals(level.getSysArDeId())).collect(Collectors.toList());
        deptListSortRecursive(sortedList, collect, source, levelNo + 1);
    }
}

递归的开始,需要传递根节点集合,根节点层级值为0

@Override
public List<SysArDecoDTO> getAllocatedDepartmentList(SysArDecoDTO dto) {
    List<SysArDecoDTO> deptList = baseMapper.getAllocatedDepartmentList(
            Wrappers.<SysArDecoDTO>query()
                    .eq("dc.sys_ar_co_id", dto.getSysArCoId())
                    .eq(StringUtils.isNotBlank(dto.getSealupState()), "dt.sealup_state", dto.getSealupState()));
    List<SysArDecoDTO> roots = deptList.stream().filter(x -> x.getDeParentId().equals(0)).collect(Collectors.toList());
    List<SysArDecoDTO> list = new ArrayList<>();
    deptListSortRecursive(list, roots, deptList, 0);
    return list;
}

Dao的SQL语句:

/**
 * 获取该公司分配的部门
 * @param queryStr
 * @return List<SysArDecoDTO>
 * @author onCloud9
 * @date 2022/10/12 15:48
 *
 */
@Select(
    "SELECT " +
    " dt.de_name AS `deName`, " +
    " dt.de_code AS `sysArDeCode`, " +
    " dt.de_parent_id AS `deParentId`, " +
    " dc.* " +
    "FROM sys_ar_deco dc " +
    "JOIN sys_ar_department dt ON dc.sys_ar_de_id = dt.id " +
    "${ew.customSqlSegment} ORDER BY dt.de_code ASC"
)
List<SysArDecoDTO> getAllocatedDepartmentList(@Param(Constants.WRAPPER) QueryWrapper<SysArDecoDTO> queryStr);