查询部门树(递归)

本文介绍如何在Java中通过递归查询部门结构,并利用ConversionUtils.transformList等方法进行数据转换,构建部门树。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 /**
     * 查询部门树
     *
     * @return 部门树
     */
    @Override
    public ResponseMessageDTO<List<LabelValueDTO<String>>> queryDepartmentTree() {
        // 1.查询第一层部门
        List<DepartmentDTO> firstDepartmentList = queryDepartmentList(Constants.DEFAULT_LEVEL, null);
        if (CollectionUtils.isEmpty(firstDepartmentList)) {
            return ResponseMessageDTO.success(Collections.emptyList());
        }
        // 2. 查询子集
        return ResponseMessageDTO.success(queryChildren(firstDepartmentList, Constants.DEFAULT_LEVEL));
    }

queryDepartmentList

  /**
     * 查询部门列表
     *
     * @param level      层级
     * @param parentList 父级编码集合
     * @return 部门列表
     */
    private List<DepartmentDTO> queryDepartmentList(Integer level, List<String> parentList) {
        List<DepartmentDO> result = list(new LambdaQueryWrapper<DepartmentDO>()
                .eq(DepartmentDO::getLevel, level)
                .in(CollectionUtils.isNotEmpty(parentList), DepartmentDO::getParentCode, parentList)
                .eq(BaseInfoDO::getDeleted, DeleteEnum.NO_DELETE.getCode()));
        if (CollectionUtils.isEmpty(result)) {
            return Collections.emptyList();
        }
        return ConversionUtils.transformList(result, DepartmentDTO.class);
    }

queryChildren

    /**
     * 查询子集
     *
     * @param departmentList 父级集合
     * @param level          级别
     */
    private List<LabelValueDTO<String>> queryChildren(List<DepartmentDTO> departmentList, Integer level) {
        Integer nextLevel = level + 1;
        List<DepartmentDTO> childrenDepartmentList = queryDepartmentList(nextLevel, departmentList.stream().map(DepartmentDTO::getCode).collect(Collectors.toList()));
        Map<String, List<DepartmentDTO>> departmentMap = childrenDepartmentList.stream().collect(Collectors.groupingBy(DepartmentDTO::getParentCode));
        List<LabelValueDTO<String>> result = new ArrayList<>();
        departmentList.forEach(item -> {
            // 有子集就继续查询子集
            List<LabelValueDTO<String>> childrenResult = Collections.emptyList();
            //containsKey主要用于判断map中是否包含指定的键名
            if (departmentMap.containsKey(item.getCode())) {
                List<DepartmentDTO> childrenList = ConversionUtils.transformList(departmentMap.get(item.getCode()), DepartmentDTO.class);
                childrenResult = queryChildren(childrenList, nextLevel);
            }
            result.add(LabelValueDTO
                    .<String>builder()
                    .children(childrenResult)
                    .label(item.getName())
                    .value(String.valueOf(item.getId()))
                    .ext(item.getCode())
                    .build());
        });
        return result;
    }

transformList

    public static <T, V> List<T> transformList(List<V> sourceList, Class<T> targetClass) {
        List<T> targetList = new ArrayList();
        if (CollectionUtils.isEmpty(sourceList)) {
            return targetList;
        } else {
            try {
                Iterator var3 = sourceList.iterator();

                while(var3.hasNext()) {
                    V item = var3.next();
                    T target = targetClass.newInstance();
                    BeanUtils.copyProperties(item, target);
                    targetList.add(target);
                }
            } catch (Exception var6) {
                log.error("参数转换异常", var6);
            }

            return targetList;
        }
    }

isEmpty

    public static boolean isEmpty(Collection<?> coll) {
        return coll == null || coll.isEmpty();
    }

ConversionUtils.transformList

public class ConversionUtils {
    private static final Logger log = LoggerFactory.getLogger(ConversionUtils.class);

    public ConversionUtils() {
    }

    public static <T, V> List<T> transformList(List<V> sourceList, Class<T> targetClass) {
        List<T> targetList = new ArrayList();
        if (CollectionUtils.isEmpty(sourceList)) {
            return targetList;
        } else {
            try {
                Iterator var3 = sourceList.iterator();

                while(var3.hasNext()) {
                    V item = var3.next();
                    T target = targetClass.newInstance();
                    BeanUtils.copyProperties(item, target);
                    targetList.add(target);
                }
            } catch (Exception var6) {
                log.error("参数转换异常", var6);
            }

            return targetList;
        }
    }

    public static <T, V> T transform(V source, Class<T> targetClass) {
        Object target = null;

        try {
            target = targetClass.newInstance();
            BeanUtils.copyProperties(source, target);
        } catch (InstantiationException var4) {
            log.error("参数转换异常", var4);
        } catch (Exception var5) {
            log.error("未知异常", var5);
        }

        return target;
    }
}

/** * 根据等级查询类目 * * @param level * @return */ @Override public List queryCategoryTree(Integer level) { //查询当前级别下类目 List list = categoryDAO.list(level); //组装好的类目,返回前端 List categoryTree = new ArrayList(); //所有类目 List allDTOList = new ArrayList(); if (CollectionUtils.isEmpty(list)) { return categoryTree; } for (CategoryDO categoryDO : list) { allDTOList.add(new CategoryTreeDTO().convertDOToDTO(categoryDO)); } //当前等级类目 categoryTree = allDTOList.stream().filter(dto -> level.equals(dto.getLevel())).collect(Collectors.toList()); for (CategoryTreeDTO categoryTreeDTO : categoryTree) { //组装类目为结构 assembleTree(categoryTreeDTO, allDTOList,Constants.CATEGORY_MAX_LEVEL - level); } return categoryTree; } /** * 组装 * * @param categoryTreeDTO * @param allList * @param remainRecursionCount 剩余递归次数 * @return */ public CategoryTreeDTO assembleTree(CategoryTreeDTO categoryTreeDTO, List allList, int remainRecursionCount) { remainRecursionCount--; //最大递归次数不超过Constants.CATEGORY_MAX_LEVEL-level次,防止坏数据死循环 if(remainRecursionCount < 0){ return categoryTreeDTO; } String categoryCode = categoryTreeDTO.getCategoryCode(); Integer level = categoryTreeDTO.getLevel(); //到达最后等级返回 if (Constants.CATEGORY_MAX_LEVEL == level) { return categoryTreeDTO; } //子类目 List child = allList.stream().filter(a -> categoryCode.equals(a.getParentCode())).collect(Collectors.toList()); if (null == child) { return categoryTreeDTO; } categoryTreeDTO.setChildren(child); //组装子类目 for (CategoryTreeDTO dto : child) { assembleTree(dto, allList,remainRecursionCount); } return categoryTreeDTO; }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值