java树结构递归编码(innercode)

news2024/12/22 15:17:25

1、数据表

如下:

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

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

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

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<TbEquipmentType> 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<EquipmentTypeDTO> 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<TbEquipmentType, ITbEquipmentTypeService> {
    @Autowired
    private ITbEquipmentTypeService tbEquipmentTypeService;

/**
     * 获取树结构
     *
     * @param dto
     * @return
     */
    @PostMapping("/tree")
    @ApiOperation(value = "设备分类树")
    public Result<EquipmentTypeDTO> tree(@ApiParam(value = "查询条件")
                                         @RequestBody EquipmentTypeDTO dto) {
        List<EquipmentTypeDTO> 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<TbEquipmentTypeMapper, TbEquipmentType> implements ITbEquipmentTypeService {
    @Resource
    TbEquipmentTypeMapper mapper;
    @Autowired
    private BaseService<TbEquipmentType> baseService;

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

    @Override
    public List<EquipmentTypeDTO> getTree(EquipmentTypeDTO dto) {
        List<EquipmentTypeDTO> returndemo = this.selectTree(dto);
        List<EquipmentTypeDTO> 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<EquipmentTypeDTO> treeAsce = sort(tree);
        return treeAsce;
    }


    private List<EquipmentTypeDTO> sort(List<EquipmentTypeDTO> source) {
        List<EquipmentTypeDTO> 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<EquipmentTypeDTO> lists) {
        lists.parallelStream().forEach(y -> {
            if (typeDTO.getId().equals(y.getParentId())) {
                if (typeDTO.getChildren() == null) {
                    typeDTO.setChildren(new ArrayList<EquipmentTypeDTO>());
                }
                typeDTO.getChildren().add(findChildren(y, lists));
            }
        });
        return typeDTO;
    }

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

        dealInnerCode(treeList, true);
    }

    public void dealInnerCode(List<EquipmentTypeDTO> 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<EquipmentTypeDTO> 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<TbEquipmentType> {

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

}

3.3.2xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.jeecg.modules.equipment.mapper.TbEquipmentTypeMapper">

    <!-- 树结构-查父节点的名字 -->
    <select id="selectTree"
            parameterType="Object"
            resultType="org.jeecg.modules.equipment.dto.EquipmentTypeDTO">
        SELECT t1.type_name AS parent_name,
        t.*
        FROM TB_EQUIPMENT_TYPE t
        LEFT JOIN TB_EQUIPMENT_TYPE t1 ON t.parent_id = t1.id
        WHERE 1 = 1
        <if test="dto.typeName !=null and dto.typeName != ''">
            AND t.type_name like concat(concat('%',#{dto.typeName}),'%')
        </if>
        ORDER BY
        t1.CREATE_TIME,t.CREATE_TIME
    </select>

</mapper>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1000418.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

二维多孔介质图像的粒度分布研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【量化分析】Python 布林线( Bollinger)概念

一、说明 布林线(BOLL)&#xff0c;Bollinger Bands&#xff0c;利用统计原理&#xff0c;求出股价的标准差及其信赖区间&#xff0c;从而确定股价的波动范围及未来走势&#xff0c;利用波带显示股价的安全高低价位&#xff0c;因而也被称为布林带。 二、布林带基本概念 布林线…

固定资产管理数据怎么算?

在企业的运营中&#xff0c;固定资产的管理是一个至关重要的环节。然而&#xff0c;对于许多企业来说&#xff0c;理解和管理这些资产的数据却常常是一团迷雾。那么&#xff0c;固定资产管理数据究竟应该如何计算呢&#xff1f;这是一个需要我们深入探讨的问题。  我们需要明…

OpenCV(三十六):霍夫直线检测

1.检测直线的霍夫变换原理 2.检测直线函数HoughLines() 检测直线流程: Step1:将参数空间的坐标轴离散化。 Step2:将图像中每个非0像素通过映射关系求取在参数空间通过的方格 Step3:统计参数空间内每个方格出现的次数&#xff0c;选取次数大于某一值的方格作为表示直线的方格…

分享一个python+django开发的高校学生成绩可视化分析系统源码、lw、调试

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人七年开发经验&#xff0c;擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等&#xff0c;大家有这一块的问题可以一起交流&#xff01; &#x1f495;&…

机器学习策略二——优化深度学习系统

进行误差分析 (Carrying out error analysis) 如果你希望让学习算法能够胜任人类能做的任务&#xff0c;但你的学习算法还没有达到人类的表现&#xff0c;那么人工检查一下你的算法犯的错误也许可以让你了解接下来应该做什么。这个过程称为错误分析。 假设你正在调试猫分类器…

【GO语言基础】函数

系列文章目录 【Go语言学习】ide安装与配置 【GO语言基础】前言 【GO语言基础】变量常量 【GO语言基础】数据类型 【GO语言基础】控制流 【GO语言基础】函数 文章目录 系列文章目录函数基础函数调用 GoLang API&#xff08;包&#xff09;简单介绍标准库&#xff1a;第三方库&…

【计算思维题】少儿编程 蓝桥杯青少组计算思维 数学逻辑思维真题详细解析第9套

蓝桥杯青少组计算思维 数学逻辑思维真题详细解析第9套 第十四届蓝桥杯省赛真题 1、要把下面4张图片重新排列成蜗牛的画像,该如何排列这些图片 A、 B、 C、 D、 答案:A 考点分析:主要考查小朋友们的观察能力空

轻松部署高颜值社区,在Ubuntu上搭建Cpolar+HYBBS论坛指南

文章目录 前言1. HYBBS网站搭建1.1 HYBBS网站安装1.2 HYBBS网站测试1.3. cpolar的安装和注册 2. 本地网页发布2.1.Cpolar临时数据隧道2.2.Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 3.公网访问测试总结 前言 在国内互…

可靠又稳定些的微信管理系统

微信管理系统 --- 简单点说就是&#xff1a;微信的管理和营销系统。再通俗一些就是&#xff1a;利用微信与管理营销相结合的一种新型的办公方式。 不用下载任何软件&#xff0c;不需要多部手机&#xff0c;对手机型号没有任何要求&#xff0c;不需要刷机等等&#xff0c;并且稳…

腾讯云4核8G云服务器租用价格选轻量还是CVM?性能如何?

腾讯云4核8G云服务器可以选择轻量应用服务器或CVM云服务器标准型S5实例&#xff0c;轻量4核8G12M服务器446元一年&#xff0c;CVM S5云服务器935元一年&#xff0c;相对于云服务器CVM&#xff0c;轻量应用服务器性价比更高&#xff0c;轻量服务器CPU和CVM有区别吗&#xff1f;性…

c高级 day4

实现一个对数组求和的函数&#xff0c;数组通过实参传递给函数 #!/bin/bashread -p "请输入数组:" -a arrfunction sum() {sum0for i in ${arr[*]}do((sumsumi))doneecho "数组和:"$sum }sum写一个函数&#xff0c;输出当前用户的uid和gid&#xff0c;并使…

【Java】过滤器和拦截器区别

文章目录 前言1、过滤器 (Filter)2、拦截器 (Interceptor)3、我们不一样3.1、实现原理不同3.2、使用范围不同3.3、触发时机不同 4、拦截的请求范围不同5、注入Bean情况不同6、控制执行顺序不同总结 前言 准备环境 我们在项目中同时配置 拦截器 和 过滤器。 1、过滤器 (Filter…

Nginx反向代理联动Tomcat实现多实例部署、动静分离、负载均衡

文章目录 1. 配置反向代理1.1 前置准备1.2 代理服务器配置1.3 真实服务器配置1.4 客户机配置 2. Tomcat 多实例部署2.1 部署JDK2.2 设置JDK环境变量2.3 部署Tomcat服务2.4 路径启动 3. Nginx联动Tomcat实现动静分离、负载均衡3.1 基本原理3.2 前置准备3.3 配置nginx1实现四层代…

2023.9.8 基于传输层协议 UDP 和 TCP 编写网络通信程序

目录 UDP 基于 UDP 编写网络通信程序 服务器代码 客户端代码 TCP 基于 TCP 编写网络通信程序 服务器代码 客户端代码 IDEA 打开 支持多客户端模式 UDP 特点&#xff1a; 无连接性&#xff1a;发送端和接收端不需要建立连接也可相互通信&#xff0c;且每个 UDP 数据包都…

sql注入基本概念

死在山野的风里&#xff0c;活在自由的梦里 sql注入基本概念 MYSQL基本语法union合并查询2个特性&#xff1a;order by 排序三个重要的信息 Sql Server MYSQL 基本语法 登录 mysql -h ip -u user -p pass基本操作 show databases; 查看数据库crea…

串行数据发送器

框图 THR&#xff1a;发送保持寄存器 定义了两种状态&#xff1a;空&#xff0c;满数据写入端口地址&#xff1a;00H状态读出端口地址&#xff1a;00H当THR不满时&#xff0c;可以向THR写入数据 TSR&#xff1a;发送移位寄存器 一旦TSR空而THR中有数据时&#xff0c;THR中的数…

Ubuntu服务器安装Nvidia显卡驱动各类失败问题的解决方案集合

前言 给实验室服务器安装显卡驱动&#xff0c;总是遇到各种各样的问题。故而专门开一个文章记录一下遇到的各类问题。 正常安装方法 在这里安装CUDA&#xff0c;选择最新版本后根据系统配置点选即可&#xff0c;会自动生成对应的链接&#xff0c;如下图。这里选runfile&…

Mysql join用法详解

本篇文章旨在详细讲解Mysql 中join的用法&#xff0c;并附上例题。 一. left join 首先附上图 这个查询语句最根本的是要找出A表中所有的行&#xff0c; 所以如图所示&#xff0c;A表整个被涂蓝 A与B交叉的那部分可以视为ON后所跟的条件 重点是&#xff1a; 如果A表中有一条…

C#学习 - 方法的定义、调用、调试

方法 方法&#xff08;Method&#xff09;是由C/C中的函数&#xff08;Function&#xff09;发展而来的 //C语言 #include <stdio.h> int Add(int x, int y) {return x y; }//函数 int main(void) {int a 4;int b 2;int c Add(a, b);printf("%d %d %d\n&quo…