java后端将非树型结构的机构数据转换为树形结构的机构数据示例

news2025/1/24 14:33:16

文章目录

  • 前言
  • 一、非树型机构信息
    • 1.示例数据
    • 2.机构编码规则
  • 二、转换为树型机构
    • 1.转换逻辑
    • 2.具体实现
      • 2.1.将excel文件读取到程序中
      • 2.2.解析机构编码并获取所有的父级编码候选值
      • 2.3.设置所有节点的ParentCode
      • 2.4.查找机构的根节点
      • 2.5.通过ParentCode构建完整的树型结构
      • 2.6.将树形结构数据写入到JSON文件中
      • 2.7.将树型结构的机构数据展开写入到EXCEL文件中
  • 三、附属的支持类信息
    • 1.样例机构数据原始映射模型
    • 2.树型结构转换模型
    • 3.SHEET表格模型
    • 4.CELL单元格模型
  • 总结


前言

统计平台项目,后端采用一套开源框架,框架内封装了完善的用户、角色、菜单、组织机构、数据字典等基础功能,支持访问授权、按钮权限、数据权限等。新系统的这部分基础数据,完全来源甲方原有老系统。新系统的组织机构设计采用树形结构,而甲方现有系统的机构数据并非树型结构。为了将现有系统的机构数据导入到新系统中,支持统计平台的机构管理,需要写一套转换程序,将非树型结构的机构信息转为树型结构导入到统计平台中。具体过程如下所示。


一、非树型机构信息

1.示例数据

在这里插入图片描述

2.机构编码规则

经过从甲方现有系统中获取的机构数据分析,得到如下规则:

  • 机构编码由数字或者字母组成的定长字符串(长度为12位,不足12位的在末尾自动补0)。
  • 机构编码字符串每两位为一组,实际编码不足偶数位的,自动在末尾用0补齐偶数位。
  • 现有系统的机构信息没有父子级联关系,是以固定的前缀匹配规则进行查询的,因而能够模拟树型结构进行层级展示。

二、转换为树型机构

1.转换逻辑

  • 将给定的样例数据的excel文件读取到程序中。
  • 设置每行数据的父级编码信息。
  • 查找根节点信息。
  • 构建机构树信息。

2.具体实现

2.1.将excel文件读取到程序中

将用户给定的样例数据excel文件解析并读取到程序中,可以采用Apache POI工具包,也可以采用其他的java-office工具包进行操作。本示例采用阿里巴巴的开源组件EasyExcel进行操作,它是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。他能让你在不用考虑性能、内存的等因素的情况下,快速完成Excel的读、写等功能。

  • 依赖
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.2.1</version>
</dependency>
  • 文档地址
    阿里巴巴开源组件easyexcel官方地址地址
  • 读取代码示例
    /**
     * <h3>简单读取excel文件中的记录行, 不剔除末尾0补码</h3>
     *
     * @return
     */
    public static List<TreeModel> excelSimpleRead() {
   
        return EasyExcel.read("E:\\demo-code\\jzdata-demo\\data\\调试机构数据.xlsx").head(TreeModel.class).sheet().doReadSync();
    }

2.2.解析机构编码并获取所有的父级编码候选值

按照数据样例的规则,数据编码长度固定为12位,每两位为一组进行分组解析。

  • 首先需要获取机构的真实编码,及剔除末尾补位的0后,剩余编码如果为基数位则在末尾补0,构造成偶数位,这就是现有系统机构的真实编码。
  • 将真实的偶数位的机构编码,跳过代表机构本身这一级的两位编码,从高位到地位按两位为一组,循环机构编码,遇到两位不都为0时,则获取从字符串开始到当前位的子串,并按照编码规则用0补全12位字符串,作为当前机构的候选的父级编码值。

具体实现如下:

 /**
     * <h3>构建候选的父级编码列表</h3>
     * <ul>
     *     <li>从左到右以每两位为一个基数,判断当前组是否是全0,如果不是则拆分,如果是全0则继续循环,并且从高位开始拆分</li>
     *     <li>从左到右进行编码拆分,比如“410000020100”被拆分为:“410000000000”,“410000020000”,比如“411000010000”被拆分为:“410000000000
     *     ”,“411000000000”</li>
     *     <li>将拆分后子串,自动补全12位编码,不够的位数在末尾补0</li>
     *     <li>返回值示例,“411000010000”的后续父编码为:[411000000000, 410000000000]</li>
     * </ul>
     *
     * @param target
     * @return
     */
    public static List<String> getCandidateParentCode(String target) {
   
        //step1.将目标编码处理成最小的偶数位编码
        String pariCode = target.replaceAll(SUFFIX_ZERO_REGEX, "");
        pariCode = pariCode.length() % 2 == 0 ? pariCode : pariCode + "0";
        //step2.构建候选的父级编码值
        List<String> parentCodes = new ArrayList<>();
        for (int size = pariCode.length() - 2, i = size; i > 1; i -= 2) {
   
            //只有当临近的两位不都为0时才进行拆分
            if (pariCode.charAt(i) != '0' || pariCode.charAt(i - 1) != '0') {
   
                String subStr = pariCode.substring(0, i);
                String formatted = String.format(BLANK_FORMAT, subStr);
                String parentCode = formatted.replaceAll(BLANK_REGEX, "0");
                parentCodes.add(parentCode);
            }
        }
        return parentCodes;
    }

2.3.设置所有节点的ParentCode

通过循环获取每个机构的候选的父级编码集合,并通过嵌套循环判断并设置每个机构的ParentCode的值。具体实现如下:

/**
     * <h3>设置数据的ParentC

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

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

相关文章

【算法】基础算法002之滑动窗口(一)

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.长度最小的子数组…

微服务学习 | Springboot整合Dubbo+Nacos实现RPC调用

&#x1f3f7;️个人主页&#xff1a;鼠鼠我捏&#xff0c;要死了捏的主页 &#x1f3f7;️系列专栏&#xff1a;Golang全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&…

vue打包优化,webpack的8大配置方案

vue-cli 生成的项目通常集成Webpack &#xff0c;在打包的时候&#xff0c;需要webpack来做一些事情。这里我们希望它可以压缩代码体积&#xff0c;提高运行效率。 文章目录 &#xff08;1&#xff09;代码压缩&#xff1a;&#xff08;2&#xff09;图片压缩&#xff1a;&…

Doris ——SQL原理解析

目录 前言 一、Doris简介 二、SQL解析简介 2.1 词法分析 2.2 语法分析 2.3 逻辑计划 2.4 物理计划 三、Doris SQL解析的总体架构 四、Parse阶段 五、Analyze阶段 六、SinglePlan阶段&#xff08;生成单机逻辑Plan阶段&#xff09; 七、DistributedPlan计划&#xf…

如何将阿里云服务器迁移

&#x1f4d1;前言 本文主要是如何将阿里云服务器迁移实现数据转移的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️** &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x1f304;每日…

MySQL篇之SQL优化

一、表的设计优化 表的设计优化&#xff08;参考阿里开发手册《嵩山版》&#xff09;&#xff1a; 1. 比如设置合适的数值&#xff08;tinyint int bigint&#xff09;&#xff0c;要根据实际情况选择。 2. 比如设置合适的字符串类型&#xff08;char和varchar&#xff09…

Redis背后的神奇力量:为何它如此高效?

Redis的速度快主要有以下几个原因&#xff1a; 1、基于内存操作 Redis的操作都是基于内存的&#xff0c;数据存储在内存中&#xff0c;而内存的读写速度远远快于硬盘&#xff0c;内存的运行速度比硬盘高出几个数量级&#xff0c;就像从翻阅书籍变成即刻在线信息查询&#xff0…

云计算实训室建设方案2024

云计算课程体系 云计算实训课程体系设计依据 一、培养目标 唯众公司提供创新技术教育和服务的目标&#xff0c;旨在提高人才培养质量&#xff0c;扩大就业创业&#xff0c;推动经济转型升级&#xff0c;以及培育新的经济发展动能。唯众公司提供云计算、大数据、人工智能等创…

网络原理(HTTP篇)

网络原理HTTP 前言HTTPHTTP的工作流程抓包工具抓取HTTP报文HTTP报文格式 请求报文具体细节首行URLURL的基本格式URL encode 方法 报头(header)HostContent-Length 和 Content-TypeUser-Agent&#xff08;UA&#xff09;RefererCookie&#xff08;重要&#xff09; 前言 如图&a…

汽车金融市场研究:预计2029年将达到482亿美元

汽车金融公司作为汽车流通产业链的重要一环&#xff0c;认真贯彻落实国家有关政策&#xff0c;采取多种措施助力汽车产业发展&#xff0c;为促进推动汽车消费、助力畅通汽车产业链、支持稳定宏观经济大盘发挥了积极作用。 益于国内疫情得到有效控制&#xff0c;我国经济持续稳定…

TypeScript(一):TypeScript基本理解

TypeScript基本理解 为什么使用TS JavaScript发展至今&#xff0c;没有进行数据类型的验证而我们知道&#xff0c;在编程阶段&#xff0c;错误发现的越早越好而TS就解决了JS的这个问题 认识TypeScript TypeScript是拥有类型的JavaScript超级&#xff0c;它可以编译成普通、…

OpenAI发布Sora模型,可根据文字生成逼真AI视频

早在2022年11月30日&#xff0c;OpenAI第一次发布人工智能聊天机器人ChatGPT&#xff0c;随后在全世界掀起了人工智能狂潮&#xff0c;颠覆了一个又一个行业。在过去的一年多的时间里&#xff0c;chatGPT的强大功能改变了越来越多人的工作和生活方式&#xff0c;成为了世界上用…

达梦数据库——数据迁移sqlserver-dm报错问题整理

报错情况一&#xff1a;Sql server迁移达梦连接报错’驱动程序无法通过使用安全套接字Q层(SSL)加密与SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client preferencesITLS127‘ 原因&#xff1a;历史版本的SOL SERVER服务…

防御保护第五次作业

1,办公区设备可以通过电信链路和移动链路上网(多对多的NAT,并且需要保留一个公网IP不能用来转换) FW5&#xff1a; 2,分公司设备可以通过总公司的移动链路和电信链路访问到DMz区的http服务器 FW5&#xff1a; 注&#xff1a;记得通过安全策略放行 分公司FW3 注意&#xff1a…

用300万支电动牙刷发起DDoS攻击?假的!

近日国外“300万支电动牙刷被用于DDoS攻击”的安全事件引发广泛讨论。国外媒体发文称“300万支电动牙刷被黑客用恶意软件感染&#xff0c;以执行分布式拒绝服务&#xff08;DDoS&#xff09;攻击。”经Fortinet与媒体确认&#xff0c;这是一起虚假的新闻。 上周&#xff0c;瑞士…

【网络编程】ZeroMQ的网络通信

文章目录 1、概述2、通信效果2.1、Request-Reply&#xff08;请求-响应模式&#xff09;2.2、Publish-Subscribe&#xff08;订阅-发布模式&#xff09; 3、方式选择3.1、准备用 Visual Studio-C 方式3.1.1、找到 Builds 文件夹3.1.2、查看 deprecated-msvc 下的 libzmq.sln 文…

图像像素读写image.at、image.ptr、指针

image.at 在OpenCV中&#xff0c;使用Mat对象表示图像数据&#xff0c;在使用at方法时&#xff0c;需要确保使用正确的数据类型&#xff08;如uchar或Vec3b&#xff09;&#xff0c;这取决于图像的通道数和数据深度。 单通道图像 对于单通道图像&#xff08;如灰度图像&…

正信晟锦:借钱后不还算诈骗吗

在探讨“借钱后不还”这一行为是否构成诈骗时&#xff0c;我们应首先明确诈骗的法律定义。根据《中华人民共和国刑法》&#xff0c;诈骗是指以非法占有为目的&#xff0c;采用虚构事实或隐瞒真相的手段&#xff0c;骗取他人财物的行为。关键在于是否存在欺诈行为和非法占有的主…

12.QT文件对话框 文件的弹窗选择-QFileDialog

目录 前言&#xff1a; 技能&#xff1a; 内容&#xff1a; 1. 界面 2.信号槽 3.其他函数 参考&#xff1a; 前言&#xff1a; 通过按钮实现文件弹窗选择以及关联的操作 效果图就和平时用电脑弹出的选文件对话框一样 技能&#xff1a; QString filename QFileDialog::ge…

消毒柜行业分析:市场渗透率不足20%

目前消毒柜仍然属于“小众”品类&#xff0c;疫情前期市场渗透率也不足20%。有业内人士表示&#xff0c;多年来消毒柜零售量规模基本在400万台左右徘徊&#xff0c;这个角度看&#xff0c;消毒柜是具有自身的产品消费人群的&#xff0c;其市场相对稳定&#xff0c;而且消毒柜的…