递归—树状结构数据(真实!可用!)

话不多说直接上干货,不耽误各位宝贵时间,真实可用 !CV请点赞~谢谢

方法1

1.1 数据库设计
在这里插入图片描述
1.2 对象设计

package com.cdaxxt.business.vo;

import com.baomidou.mybatisplus.annotation.TableField;
import com.cdaxxt.business.entity.ContingencyPlanModel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.util.List;

/**
 * @author yyh
 * @date 2022/9/28 15:52
 */
@Data
@ApiModel(value = "ContingencyPlanModelVO", description = "组织树")
public class ContingencyPlanModelVO {

    private Long id;
    /**
     * 名称
     */
    @ApiModelProperty("名称")
    @TableField("name")
    private String name;

    /**
     * 全路径
     */
    @ApiModelProperty("全路径")
    private String path;

    /**
     * 父类ID
     */
    @ApiModelProperty("父类ID")
    private Long parentId;

    /**
     * 预案类型(1:专项应急;2:现场处置;3:应急综合)
     */
    @ApiModelProperty("预案类型(1:专项应急;2:现场处置;3:应急综合)")
    private Integer type;

    @TableField(exist = false)
    private List<ContingencyPlanModelVO> childMenu;


    public ContingencyPlanModelVO() {
    }

    public ContingencyPlanModelVO(Long id, String name, String path, Long parentId, Integer type) {
        this.id = id;
        this.name = name;
        this.path = path;
        this.parentId = parentId;
        this.type = type;
    }
}

1.3 实现类方法1

public ContingencyPlanModelVO getModelTree(Long parentId) {

        //所有组织
        List<ContingencyPlanModelVO> voList = baseMapper.getVolist(parentId);

        //根节点数据
        ContingencyPlanModel entity = baseMapper.selectOne(new LambdaQueryWrapper<ContingencyPlanModel>().eq(ContingencyPlanModel::getPath, parentId));

        ContingencyPlanModelVO vo = new ContingencyPlanModelVO();
        BeanUtils.copyProperties(entity,vo);

        ContingencyPlanModelVO tree = getTree(voList, vo, vo, entity.getId());

        return tree;
    }

    /**
     * 组建树形结构
     *
     * @param modelList 当前组织 及以下所有 组织机构
     * @param rootBase  当前组织信息
     * @param bases     子级 组织对象信息
     * @param parentId  当前组织 id
     * @return
     */
    private ContingencyPlanModelVO getTree(List<ContingencyPlanModelVO> modelList, ContingencyPlanModelVO rootBase,
                                           ContingencyPlanModelVO bases, Long parentId) {
        List<ContingencyPlanModelVO> childBases = new ArrayList<>();
        for (ContingencyPlanModelVO model : modelList) {
            if (model.getParentId() == null) {
                continue;
            }
            // 找到归属父类的组织,下面1级的所有组织机构
            if (model.getParentId().longValue() == parentId.longValue()) {

                //自定义VO对象参数组装
//                String fullName = bases.getPath() != null ? bases.getPath() + Symbol.ACROSS + model.getName() : bases.getName() + Symbol.ACROSS + model.getName();
//                String pathId = bases.getKey() != null ? bases.getKey() + Symbol.ACROSS + model.getId() : bases.getId() + Symbol.ACROSS + model.getId();
                ContingencyPlanModelVO childBase = new ContingencyPlanModelVO(model.getId(), model.getName(), model.getPath(),model.getParentId(), model.getType());
                childBases.add(childBase);
            }
        }
        // 首次放入根节点,之后依次放入父节点
        if (rootBase.getId().longValue() == bases.getId().longValue()) {
            rootBase.setChildMenu(childBases);
        } else {
            bases.setChildMenu(childBases);
        }
        for (int i = 0; i < childBases.size(); i++) {
            ContingencyPlanModelVO b = childBases.get(i);
            getTree(modelList, rootBase, b, b.getId());
        }
        return rootBase;
    }

1.4. 结果
在这里插入图片描述

方法2(优化后)

1. 数据库设计
在这里插入图片描述

2. 对象设计

package com.cdaxxt.business.vo;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.util.List;

/**
 * @author yyh
 * @date 2022/10/24 17:36
 */
@Data
@ApiModel(value = "OgnztTreeVO", description = "VO树对象")
public class OgnztTreeVO {

    @ApiModelProperty(value = "id")
    private Long id;

    @ApiModelProperty(value = "名称")
    private String name;

    @ApiModelProperty(value = "类型(1:园区,2:园区部门,3:园区企业)")
    private Integer type;

    @ApiModelProperty(value = "全路径")
    private String path;

    @ApiModelProperty(value = "父级ID")
    private String parentId;

    /**
     * 子树
     */
    private List<OgnztTreeVO> children;


}

3. 实现类方法2

@Override
    public Object getOgnztTree() {
        //正式环境放开!redis 配置改为control配置
//        Long organization = loginHelper.getCurrentUser().getOrganization();
        Long organization = 10000L;

        //查询当前用户根节点,子节点
        OgnztTreeVO vo = baseMapper.getNode(organization);

        List<OgnztTreeVO> list = baseMapper.getByParentId(vo.getId());
        vo.setChildren(list);

        OgnztTree(vo);
        return vo;
    }


    public OgnztTreeVO OgnztTree(OgnztTreeVO vo){
        List<OgnztTreeVO> list = vo.getChildren();

        for (OgnztTreeVO child : list) {
            List<OgnztTreeVO> voList = baseMapper.getByParentId(child.getId());
            if (CollectionUtils.isEmpty(voList)) {
                return vo;
            }
            child.setChildren(voList);
            //子对象进行递归
            OgnztTree(child);
        }

        return vo;
    }

4. 结果
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
/** * 根据等级查询类目树 * * @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; }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值