需求: 通过后台生成的树形结构,返回给前台用于动态生成表格标题,并将对应标题下面的信息对应起来

news2024/9/28 5:30:15

1. 如图所以,完成以下内容对应

在这里插入图片描述

2. 代码示例如下, 动态生成树形结构列名称,并将表格中存在的值与其对应起来

  /**
     * 查询资源计划列表
     *
     * @param resourcePlan 资源计划
     * @return 资源计划
     */
    @Override
    public Map<String, Object> selectResourcePlanList(ResourcePlan resourcePlan) {
        // 1. 获取多级表头数据(树形结构)
        List<ResourceDictTreeResponse> levelTreeByTwo = relationService.getLevelTreeByTwo();

        // 2. 获取资源计划数据
        List<ResourcePlan> resourcePlans = resourcePlanMapper.selectResourcePlanList(resourcePlan);

        // 3. 为树形结构生成 column 列名(column1, column2...)
        Map<String, String> columnMap = new HashMap<>();  // dictLabel -> column 名称映射
        AtomicInteger columnIndex = new AtomicInteger(1);  // 列名计数器
        generateColumnMappings(levelTreeByTwo, columnMap, columnIndex);

        // 4. 构建返回结果
        Map<String, Object> result = new HashMap<>();
        result.put("treeData", levelTreeByTwo);  // 返回处理后的树形结构
        result.put("planList", processPlansToRows(resourcePlans, columnMap));  // 返回计划列表数据

        return result;
    }

    // 为树形结构生成 column1, column2...的列名
    private void generateColumnMappings(List<ResourceDictTreeResponse> treeData, Map<String, String> columnMap, AtomicInteger columnIndex) {
        for (ResourceDictTreeResponse node : treeData) {
            String columnName = "column" + columnIndex.getAndIncrement();
            columnMap.put(node.getDictLabel(), columnName);  // 将 dictLabel 映射为 column 名称
            node.setKey(columnName);  // 设置节点的 key 为 column 名称

            // 递归处理子节点
            if (node.getChild() != null && !node.getChild().isEmpty()) {
                generateColumnMappings(node.getChild(), columnMap, columnIndex);
            }
        }
    }

    // 将资源计划数据映射到动态生成的列
    private List<Map<String, Object>> processPlansToRows(List<ResourcePlan> resourcePlans, Map<String, String> columnMap) {
        List<Map<String, Object>> rows = new ArrayList<>();

        // 遍历所有资源计划
        for (ResourcePlan plan : resourcePlans) {
            Map<String, Object> row = new HashMap<>();

            // 1. 填充计划表中的固定字段
            row.put("id", plan.getId()); // 计划主键id
            row.put("planStartTime", plan.getPlanStartTime());  // 计划开始时间
            row.put("planEndTime", plan.getPlanEndTime());      // 计划结束时间
            row.put("projectId", plan.getProjectId());          // 项目ID
            row.put("projectName", plan.getProjectName());      // 项目名称
            row.put("taskId", plan.getTaskId());                // 任务ID
            row.put("taskName", plan.getTaskName());            // 任务名称
            row.put("workContent", plan.getWorkContent());      // 工作内容

            // 2. 动态填充角色工时到生成的 column 列
            String dictLabel = plan.getDictLabel();
            if (dictLabel != null && columnMap.containsKey(dictLabel)) {
                String column = columnMap.get(dictLabel);  // 获取对应的 column 名称
                row.put(column, plan.getPlanPersonDay());  // 填充工时或其他数据
            }

            // 3. 将该行数据加入到 rows 列表中
            rows.add(row);
        }

        return rows;
    }



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

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

相关文章

程序编译的四个阶段

程序编译的四个阶段 #include <stdio.h>int main(){printf("Hello World~");return 0; } hello.c程序的生命周期从一个高级C语言程序开始&#xff0c;这种形式容易被人读懂。 但这无法直接被计算机读懂。为了在系统上运行hello.c程序&#xff0c;每条C语言都…

科研绘图系列:R语言组合多个图形

文章目录 介绍加载R包画图介绍 通过patchworkR包组合多个ggplot数据图形对象。 加载R包 library(ggplot2) library(patchwork)画图 画图theme_set(theme_bw() +theme(

2024年408真题计算机网络篇

1 https://zhuanlan.zhihu.com/p/721169467。最小割可以看作是切断水流的最薄弱环节——通过切断这些关键的“水管”&#xff0c;就可以完全阻止水从源点流到汇点。 在下列二进制数字调制方法中&#xff0c;需要2个不同频率载波 的是 A. ASK B. PSK C. FSK D. DPSK 解答…

Linux终端简介

Linux终端简介 导语基本终端交互终端读写标准/非标准模式重定向处理 终端对话 termios结构模式相关输入模式输出模式控制模式本地模式特殊控制字符终端速度其他函数 终端输出终端类型terminfo 击键动作检测虚拟控制台&伪终端总结参考文献 导语 本章基本是以一个简单的用户…

PlayerPerfs-不同平台的存储位置

一 .PlayerPrefs存储的数据存在哪里 不同平台存储位置不一样 Windows PlayerPrefs 存储在 HKCU\Software\[公司名称]\[产品名称] 项下的注册表中 其中公司和产品名称是 在“Project Settings”中设置的名称。 查看方法&#xff1a; 运行 regedit HKEY…

手游和应用出海资讯:三七新游首月收入突破700万元;领英尝试推出游戏功能以增加用户使用时长

NetMarvel帮助游戏和应用广告主洞察全球市场、获取行业信息&#xff0c;以下为9月第四周资讯&#xff1a; ● 《AFK Journey》收入突破 1.5 亿美元 ● 《黑神话&#xff1a;悟空》IGN年度游戏投票第一掉至第三 ● 三七发布新游首月收入突破700万元 ● 开罗游戏《哆啦A梦的铜锣烧…

Ubuntu22.04安装paddle

查看系统版本信息 使用命令lsb_release -a查看系统版本 rootLAIS01:~# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.5 LTS Release: 22.04 Codename: jammy查看系统支持的cuda版本&#xff0c;使用命令nvidia-smi&#…

Llama 3.2来了,多模态且开源!AR眼镜黄仁勋首批体验,Quest 3S头显价格低到离谱

如果说 OpenAI 的 ChatGPT 拉开了「百模大战」的序幕&#xff0c;那 Meta 的 Ray-Ban Meta 智能眼镜无疑是触发「百镜大战」的导火索。自去年 9 月在 Meta Connect 2023 开发者大会上首次亮相&#xff0c;短短数月&#xff0c;Ray-Ban Meta 就突破百万销量&#xff0c;不仅让马…

HT6872 4.7W防削顶单声道D类音频功率放大器

■ 特点 防削顶失真功能(Anti-Clipping Function,ACF) 优异的全带宽EMI抑制性能 免滤波器数字调制&#xff0c;直接驱动扬声器 输出功率 1.40W(VDD3.6V,RL4Ω,THDN10%) 2.80W(VDD5.0V,RL4Ω,THDN10%) 4.70W(VDD6.5V,RL4Ω,THDN10%) 高信噪比SNR:95dB(VDD6.5V,Av24dB. THDN1%) 低…

监控IDS和IPS增强网络安全性

入侵检测系统&#xff08;IDS&#xff09;和入侵防御系统&#xff08;IPS&#xff09;是当今使用的最复杂的网络安全设备之一&#xff0c;它们检查网络数据包并阻止可疑数据包&#xff0c;并提醒管理员有关攻击企图的信息。 在当今威胁不断变化的网络环境中&#xff0c;防火墙…

学习threejs,添加环境光和点光源

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言二、&#x1f340;绘制任意字体模型…

人工智能之机器学习常见算法

摘要 之前一直对机器学习很感兴趣,一直没时间去研究,今天刚好是周末,有时间去各大技术论坛看看,刚好看到一篇关于机器学习不错的文章,在这里就分享给大家了. 机器学习无疑是当前数据分析领域的一个热点内容。很多人在平时的工作中都或多或少会用到机器学习的算法。这里IT经理网…

【Linux实践】实验六:LINUX系统管理

【Linux实践】实验六&#xff1a;LINUX系统管理 实验目的实验内容实验步骤及结果1. 包管理工具2. VMware Tools3. 修改主机名4. 网络配置① 临时修改② 永久修改 5. 查找文件6. 前后台执行7. 查看进程8. 结束进程 实验目的 4、掌握Linux下软件包管理&#xff0c;包括命令rpm、…

公交IC卡收单管理系统 多处 SQL注入致RCE漏洞复现

0x01 产品简介 公交IC卡收单管理系统是城市公共交通领域中不可或缺的一部分,它通过集成先进的集成电路技术(IC卡)实现了乘客便捷的支付方式,并有效提高了公共交通运营效率。系统集成了发卡、充值、消费、数据采集、查询和注销等多个功能模块,为公交公司和乘客提供了全面、…

领夹麦克风哪个品牌音质最好,主播一般用什么麦克风

在这个信息爆炸的时代&#xff0c;清晰的声音传达显得尤为重要。无论是激情澎湃的演讲&#xff0c;还是温馨动人的访谈&#xff0c;一款优质的无线领夹麦克风都能让声音清晰的传播。但市场上产品繁多&#xff0c;如何挑选出性价比高、性能卓越的无线领夹麦克风呢&#xff1f;本…

c4d.python 旋转一个对象

How to Rotate an Object 第一种方法 import c4ddef main():selected doc.GetActiveObject()if selected:#获取这个物体的矩阵,设置它的偏移再设置回来.mg selected.GetMg()mg c4d.utils.MatrixRotY(c4d.utils.DegToRad(45.))selected.SetMg(mg)main() 第二种方法 import…

图书系统|图书个性化推荐系统|基于springboot的图书个性化推荐系统设计与实现(源码+数据库+文档)

图书个性化推荐系统目录 目录 基于springboot的图书个性化推荐系统设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 1、实体ER图 2、具体的表设计如下所示&#xff1a; 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#x…

Web 自动化实战经验硬核总结

一、元素定位常用方法 1. xpath规则说明 "/" : 表示从根节点选取 "//" : 从匹配选择的当前节点选择 "" : 选取属性 "*" : 匹配任何元素节点 "*" : 匹配任何属性节点 1.1 属性使用说明 placeholder 用法&#xff1a…

游戏录制没有声音怎么办?简单的解决方法分享

在享受游戏乐趣的同时&#xff0c;不少玩家也喜欢通过录制游戏视频来分享自己的精彩瞬间或是攻略心得。然而&#xff0c;有时在满心欢喜地开始录制后&#xff0c;却发现录制的视频竟然没有声音&#xff0c;这无疑是一大遗憾&#xff0c;今天我们就来看看这个问题怎么解决吧~ 游…

vue 中获取数值但是只获取到了 Promise 属性,获取不到其中的值

左边的请求能获取到数据&#xff0c;右边的不行&#xff1f; 改成这样即可