递归获取组织架构或分类

第一种,java代码递归获取
  • 分类的实体类
package com.lg.sgg.product.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import lombok.Data;

/**
 * 商品三级分类
 * 
 * @author lg
 * @email lg@gmail.com
 * @date 2020-11-02 20:42:27
 */
@Data
@TableName("pms_category")
public class PmsCategoryEntity implements Serializable {
	private static final long serialVersionUID = 1L;

	/**
	 * 分类id
	 */
	@TableId
	private Long catId;
	/**
	 * 分类名称
	 */
	private String name;
	/**
	 * 父分类id
	 */
	private Long parentCid;
	/**
	 * 层级
	 */
	private Integer catLevel;
	/**
	 * 是否显示[0-不显示,1显示]
	 */
	private Integer showStatus;
	/**
	 * 排序
	 */
	private Integer sort;
	/**
	 * 图标地址
	 */
	private String icon;
	/**
	 * 计量单位
	 */
	private String productUnit;
	/**
	 * 商品数量
	 */
	private Integer productCount;

	@TableField(exist = false)
	List<PmsCategoryEntity> children;

}

  • 分类的建表语句

Create Table

CREATE TABLE `pms_category` (
  `cat_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '分类id',
  `name` char(50) DEFAULT NULL COMMENT '分类名称',
  `parent_cid` bigint(20) DEFAULT NULL COMMENT '父分类id',
  `cat_level` int(11) DEFAULT NULL COMMENT '层级',
  `show_status` tinyint(4) DEFAULT NULL COMMENT '是否显示[0-不显示,1显示]',
  `sort` int(11) DEFAULT NULL COMMENT '排序',
  `icon` char(255) DEFAULT NULL COMMENT '图标地址',
  `product_unit` char(50) DEFAULT NULL COMMENT '计量单位',
  `product_count` int(11) DEFAULT NULL COMMENT '商品数量',
  PRIMARY KEY (`cat_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品三级分类'
  • 直接上代码
package com.lg.sgg.product.service.impl;

import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.lg.common.utils.PageUtils;
import com.lg.common.utils.Query;

import com.lg.sgg.product.dao.PmsCategoryDao;
import com.lg.sgg.product.entity.PmsCategoryEntity;
import com.lg.sgg.product.service.PmsCategoryService;


@Service("pmsCategoryService")
public class PmsCategoryServiceImpl extends ServiceImpl<PmsCategoryDao, PmsCategoryEntity> implements PmsCategoryService {

    /**
     * 分类返回树形结构
     *
     * @return
     */
    @Override
    public List<PmsCategoryEntity> queryCategoryListTree() {

        //第一步找到所有的分类
        List<PmsCategoryEntity> pmsCategoryEntities = this.baseMapper.selectList(new QueryWrapper<>());
        // 第二步 找到所有分类的头  ,这里所哟分类的头默认是  pid是0
        List<PmsCategoryEntity> entities = pmsCategoryEntities.stream().filter((categoryEntity) -> {
            return categoryEntity.getParentCid().equals(0L);
        }).map((categoryEntity) -> {
            // 找到子分类
            categoryEntity.setChildren(getChildren(categoryEntity,pmsCategoryEntities));
            return categoryEntity;
        }).sorted((categoryEntity1, categoryEntity2) -> {
            return categoryEntity1.getSort() - categoryEntity2.getSort();
        }).collect(Collectors.toList());
        return entities;

    }

    /**
     * 递归获取分类的所有子分类
     * @return
     * @param categoryEntity
     * @param pmsCategoryEntities
     */
    private List<PmsCategoryEntity> getChildren(PmsCategoryEntity categoryEntity, List<PmsCategoryEntity> pmsCategoryEntities) {
       return pmsCategoryEntities.stream().filter((cate)->{
           // 子分类的父id就是父的id  这一步要是是子分类的最深一级,返回的就是一个空集合,所以不会进行下面的map类型转化,也就不会在递归了,这就是递归的结束条件
            return cate.getParentCid().equals(categoryEntity.getCatId());
        }).map((cate)->{
            // 递归获取子分类
            cate.setChildren(getChildren(cate,pmsCategoryEntities));
            return cate;
        }).sorted((cate1,cate2)->{
            return cate1.getSort()-cate2.getSort();
       }).collect(Collectors.toList());

    }

}
  • 效果展示
    在这里插入图片描述
第二种,有空在写上去(mybatis递归查询语句)
@ApiModel("分组树形结构")
@Data
public class DevGroupVo {

    /** id */
    @ApiModelProperty("id")
    @NotBlank(groups = {ValidUpdateGroup.class},message = "分组id不能为空")
    private String id;

    /** 名称 */
    @ApiModelProperty("名称")
    @NotBlank(message = "分组名称不能为空")
    private String name;

    /** 父id */
    @ApiModelProperty("父id")
    @NotBlank(message = "父id不能为空",groups = {ValidUpdateGroup.class})
    @Excel(name = "父id")
    private String parentId;

    /** 标识 */
    @ApiModelProperty("标识")
    @NotBlank(message = "标识不能为空")
    @Excel(name = "标识")
    private String identify;

    /** 排序字段 */
    @ApiModelProperty("排序字段")
    @NotNull(message = "排序字段不能为空")
    @Excel(name = "排序字段")
    private Integer orderNum;

    private String delFlag;

    private String remark;

    @ApiModelProperty(value = "子级")
    private List<DevGroupVo> children;
}
 <resultMap type="com.xxx.devmgr.vo.DevGroupVo" id="devGroupTreeResult">
        <result property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="parentId" column="parent_id"/>
        <result property="identify" column="identify"/>
        <result property="orderNum" column="order_num"/>
        <result property="delFlag" column="del_flag"/>
        <result property="remark" column="remark"/>
        <collection property="children" ofType="com.xxx.devmgr.vo.DevGroupVo" column="id"
                    select="getDevGroupByParentId"/>
    </resultMap>

<select id="getTreeById" resultMap="devGroupTreeResult">
        select id,
               name,
               parent_id,
               identify,
               order_num,
               del_flag,
               remark
        from dev_group
        where id = #{id}
          and del_flag = '0'
    </select>

 <select id="getDevGroupByParentId" resultMap="devGroupTreeResult">
        select id,
               name,
               parent_id,
               identify,
               order_num,
               del_flag,
               remark
        from dev_group
        where parent_id = #{id}
          and del_flag = '0'
    </select>
/** * 根据等级查询类目树 * * @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、付费专栏及课程。

余额充值