【Java】部门集合树状顺序展示
一、需求效果:
表单的部门下拉选择时,可以展示部门的层级:
按照这个效果展示,但是不是树,还是原来的集合
二、实现方案:
用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);