java树结构递归编码(innercode)

1、数据表

如下:

有一个设备类别表,分类具有树结构的层级关系

id为本身id,parent_id为父节点id,type_name 类别名称, type_level 类别层级, type_code 类别编码。

把type_code根据层级编码为innercode的形式,使type_code也具有层级关系

java树结构递归编码(innercode)_第1张图片

2.实体类

2.1entity

package org.jeecg.modules.equipment.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.jeecg.common.system.base.entity.BaseSearchDTO;
import org.jeecgframework.poi.excel.annotation.Excel;
import org.springframework.data.annotation.Transient;
import org.springframework.format.annotation.DateTimeFormat;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @Description: 设备分类
 * @Author: jeecg-boot
 * @Date: 2022-08-21
 * @Version: V1.0
 */
@Data
@TableName("tb_equipment_type")
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = false)
@ApiModel(value = "tb_equipment_type对象", description = "设备分类")
public class TbEquipmentType extends BaseSearchDTO {

    /**
     * 主键
     */
    @TableId(type = IdType.ASSIGN_ID)
    @ApiModelProperty(value = "主键")
    private String id;
    /**
     * 父ID
     */
    @Excel(name = "父ID", width = 15)
    @ApiModelProperty(value = "父ID")
    private String parentId;
    /**
     * 分类名称
     */
    @Excel(name = "分类名称", width = 15)
    @ApiModelProperty(value = "分类名称")
    private String typeName;
    /**
     * 分类层级
     */
    @Excel(name = "分类层级", width = 15)
    @ApiModelProperty(value = "分类层级")
    private String typeLevel;
    /**
     * 分类编码
     */
    @Excel(name = "分类编码", width = 15)
    @ApiModelProperty(value = "分类编码")
    private String typeCode;
    /**
     * 创建人
     */
    @ApiModelProperty(value = "创建人")
    private String createBy;
    /**
     * 创建日期
     */
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "创建日期")
    private Date createTime;
    /**
     * 更新人
     */
    @ApiModelProperty(value = "更新人")
    private String updateBy;
    /**
     * 更新日期
     */
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "更新日期")
    private Date updateTime;

    /**
     * 子集
     */
    @Transient
    @ApiModelProperty(value = "子集")
    @TableField(exist = false)
    private List children = new ArrayList<>();
}

2.2dto

package org.jeecg.modules.equipment.dto;

import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.jeecg.common.system.base.entity.BaseSearchDTO;
import org.jeecg.common.system.base.support.Condition;
import org.jeecg.common.system.base.support.Match;
import org.jeecgframework.poi.excel.annotation.Excel;
import org.springframework.data.annotation.Transient;
import org.springframework.format.annotation.DateTimeFormat;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @Description: 设备分类DTO
 * @Author: jeecg-boot
 * @Date: 2022-08-21
 * @Version: V1.0
 */
@Data
public class EquipmentTypeDTO extends BaseSearchDTO {

    /**
     * 分类id
     */
    @ApiModelProperty(value = "主键")
    private String id;

    /**
     * 分类名称
     */
    @ApiModelProperty(value = "分类名称")
    @Condition(match = Match.LIKE)
    private String typeName;

    /**
     * 创建日期
     */
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "创建日期")
    private Date createTime;

    /**
     * 父ID
     */
    @Excel(name = "父ID", width = 15)
    @ApiModelProperty(value = "父ID")
    private String parentId;
    /**
     * 分类父级名称
     */
    @ApiModelProperty(value = "分类父级名称")
    private String parentName;

    /**
     * 分类层级
     */
    @ApiModelProperty(value = "分类层级")
    private String typeLevel;

    /**
     * 子集
     */
    @Transient
    @ApiModelProperty(value = "子集")
    private List children = new ArrayList<>();

}

3、获取树结构 及 处理编码

3.1controller

package org.jeecg.modules.equipment.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.aspect.annotation.AutoLog;
import org.jeecg.common.system.base.controller.JeecgController;
import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.modules.equipment.dto.EquipmentTypeDTO;
import org.jeecg.modules.equipment.entity.TbEquipmentType;
import org.jeecg.modules.equipment.service.ITbEquipmentTypeService;
import org.jeecg.utils.Constants;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Arrays;
import java.util.List;

/**
 * @Description: 设备分类
 * @Author: jeecg-boot
 * @Date: 2022-08-21
 * @Version: V1.0
 */
@Api(tags = "6.1.0设备分类")
@RestController
@RequestMapping("/equipment/tbEquipmentType")
@Slf4j
public class TbEquipmentTypeController extends JeecgController {
    @Autowired
    private ITbEquipmentTypeService tbEquipmentTypeService;

/**
     * 获取树结构
     *
     * @param dto
     * @return
     */
    @PostMapping("/tree")
    @ApiOperation(value = "设备分类树")
    public Result tree(@ApiParam(value = "查询条件")
                                         @RequestBody EquipmentTypeDTO dto) {
        List tree = tbEquipmentTypeService.getTree(dto);
        return getSuccess(tree);
    }

    /**
     * 设置innercode码
     *
     */
    @ApiOperation(value = "设置innercode码", notes = "设置innercode码")
    @GetMapping(value = "/initCode")
    public Result initCode() {
        tbEquipmentTypeService.initCode();
        return Result.OK("处理完成");
    }



}

3.2service

package org.jeecg.modules.equipment.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.jeecg.common.system.base.service.BaseService;
import org.jeecg.common.util.StringUtil;
import org.jeecg.modules.equipment.dto.EquipmentTypeDTO;
import org.jeecg.modules.equipment.entity.TbEquipmentType;
import org.jeecg.modules.equipment.mapper.TbEquipmentTypeMapper;
import org.jeecg.modules.equipment.service.ITbEquipmentTypeService;
import org.jeecg.utils.TreeUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @Description: 设备分类
 * @Author: jeecg-boot
 * @Date: 2022-08-21
 * @Version: V1.0
 */
@Service
public class TbEquipmentTypeServiceImpl extends ServiceImpl implements ITbEquipmentTypeService {
    @Resource
    TbEquipmentTypeMapper mapper;
    @Autowired
    private BaseService baseService;

    @Override
    public List selectTree(EquipmentTypeDTO dto) {
        return mapper.selectTree(dto);
    }

    @Override
    public List getTree(EquipmentTypeDTO dto) {
        List returndemo = this.selectTree(dto);
        List tree = Collections.synchronizedList(new ArrayList<>());
        String id = "1";
        if (StringUtil.isNotEmpty(dto.getId())) {
            id = dto.getId();
        }

        if (StringUtil.isNotEmpty(returndemo)) {
            String finalId = id;
            returndemo.parallelStream().forEach(x -> {
                if (finalId.equals(x.getId())) {
                    //现在做全局递归,之后更改
                    tree.add(findChildren(x, returndemo));
                }
            });
        }

        //根据日期进行升序排序
        for (EquipmentTypeDTO e : tree) {
            e.setChildren(sort(e.getChildren()));
        }
        List treeAsce = sort(tree);
        return treeAsce;
    }


    private List sort(List source) {
        List treeAsce
                = source.stream().sorted(Comparator.comparing(EquipmentTypeDTO::getCreateTime))
                .collect(Collectors.toList());

        for (EquipmentTypeDTO e : source) {
            if (e.getChildren().size() > 0) {
                e.setChildren(sort(e.getChildren()));
            }
        }
        return treeAsce;
    }

    /**
     * @param typeDTO .
     * @param lists   .
     * @return .
     */
    private static EquipmentTypeDTO findChildren(EquipmentTypeDTO typeDTO, List lists) {
        lists.parallelStream().forEach(y -> {
            if (typeDTO.getId().equals(y.getParentId())) {
                if (typeDTO.getChildren() == null) {
                    typeDTO.setChildren(new ArrayList());
                }
                typeDTO.getChildren().add(findChildren(y, lists));
            }
        });
        return typeDTO;
    }

    @Override
    public void initCode() {
        EquipmentTypeDTO dto = new EquipmentTypeDTO();
        List treeList = getTree(dto);

        dealInnerCode(treeList, true);
    }

    public void dealInnerCode(List treeList, Boolean isTop) {

        for (int i = 0; i < treeList.size(); i++) {
            String thisId = treeList.get(i).getId();
            String pId = treeList.get(i).getParentId();
            TbEquipmentType tbEquipmentType = this.getById(thisId);
            if (isTop) {
                tbEquipmentType.setTypeCode("0");
            } else {
                tbEquipmentType.setTypeCode(getCodeById(pId) + (i + 1));
            }
            //更新
            this.updateById(tbEquipmentType);
            List childrenList = treeList.get(i).getChildren();
            if (StringUtil.isNotEmpty(childrenList)) {
                dealInnerCode(childrenList, false);
            }
        }

    }

    public String getCodeById(String id) {
        TbEquipmentType tbEquipmentType = this.getById(id);
        return tbEquipmentType.getTypeCode();
    }

}

3.3mapper

3.3.1mapper

package org.jeecg.modules.equipment.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.jeecg.modules.equipment.dto.EquipmentTypeDTO;
import org.jeecg.modules.equipment.entity.TbEquipmentType;

import java.util.List;

/**
 * @Description: 设备分类
 * @Author: jeecg-boot
 * @Date: 2022-08-21
 * @Version: V1.0
 */
public interface TbEquipmentTypeMapper extends BaseMapper {

    List selectTree(@Param("dto") EquipmentTypeDTO dto);

}

3.3.2xml





    
    

你可能感兴趣的:(Java,java,开发语言,树结构,递归,innercode)