Vue 和 dhtmlx-gantt 实现图表构建动态多级甘特图效果 ,横坐标为动态刻度不是日期

news/2025/2/8 11:32:49 标签: 甘特图

注意事项:1、横坐标根据日期转换成时间刻度在( gantt.config.scales);2、获取时间刻度的最大值(findMaxRepairTime);3、甘特图多级列表需注意二级三级每个父子id需要唯一(convertData

  1. 安装依赖

    npm install dhtmlx-gantt --save

  2. 在当前页引入和配置 dhtmlx-gantt

    import gantt from "dhtmlx-gantt"; // 引入模块
    // import 'dhtmlx-gantt/codebase/dhtmlxgantt.css'
    import "dhtmlx-gantt/codebase/skins/dhtmlxgantt_terrace.css"; //皮肤
    import "dhtmlx-gantt/codebase/locale/locale_cn"; // 本地化
    // import "dhtmlx-gantt/codebase/ext/dhtmlxgantt_tooltip.js"; //任务条悬浮提示
    

     

  3. 创建甘特图容器

    <div ref="gantt" class="left-container" />
    
        
        initMount() {
          let convertedData = this.convertData(this.aircraftData);
          this.tasks.data = convertedData;
          let maxNum = this.findMaxRepairTime(this.aircraftData);
          gantt.config.start_date = new Date(2025, 0, 16, 0, 0, 0);
          gantt.config.end_date = new Date(
            2025,
            0,
            16,
            Math.floor(maxNum / 60),
            maxNum % 60,
            0
          );
    
          gantt.config.autosize = true;
          gantt.config.readonly = true;
          gantt.config.show_grid = true;
          gantt.config.columns = [
            { name: "text", label: "名称", tree: true, width: "260" },
          ];
          gantt.config.show_task_cells = true;
    
          // 设置时间刻度
          gantt.config.scales = [
            {
              unit: "minute",
              step: 10,
              format: function (date) {
                // 提取小时和分钟
                var hours = date.getHours();
                var minutes = date.getMinutes();
    
                // 将小时转换为分钟,并加上额外的分钟数
                var totalMinutes = hours * 60 + minutes + 10;
    
                return totalMinutes;
              },
            },
          ];
    
          // 设置任务条上展示的内容,参数task会返回当前任务的数据
          gantt.templates.task_text = function (start, end, task) {
              return '<div class="gantt-task-content">' + task.text + "-" + task.time + "分钟" + '</div>';
            };
          // gantt.config.xml_date = '%Y-%m-%d %H:%i:%s';
    
          this.initData();
          // 初始化甘特图
          gantt.init(this.$refs.gantt);
          gantt.clearAll();
          //销毁
          // gantt.destructor()
          gantt.parse(this.tasks);
        },
       //初始化甘特图
        initData: function () {
          this.tasks.data.map(function (current, ind, arry) {
            var newObj = {};
            if (current.type) {
              if (current.type == 1) {
                newObj = Object.assign({}, current, { color: "#67c23a" });
              }
              //   } else if (current.type == 2) {
              //     newObj = Object.assign({}, current, { color: "#fec0dc" });
              //   } else if (current.type == 3) {
              //     newObj = Object.assign({}, current, { color: "#62ddd4" });
              //   } else if (current.type == 4) {
              //     newObj = Object.assign({}, current, { color: "#d1a6ff" });
              //   }
            } else {
              newObj = Object.assign({}, current, { color: "#f9d484" });
            }
    
            return newObj;
          });
        },
    
    

  4. 处理后端返回的数据

    
        //处理数组
        convertData(aircraftData) {
          let result = [];
          let nextUniqueId = 0; // 用于生成唯一的ID
          aircraftData.forEach((aircraft) => {
            let aircraftInfo = {
              id: aircraft.taskId,
              text: aircraft.planeNum,
              start_date: new Date(2025, 0, 16, 0, 0),
              end_date: new Date(
                2025,
                0,
                16,
                Math.floor(aircraft.repairTime / 60),
                aircraft.repairTime % 60,
                0
              ),
              duration: aircraft.repairTime,
              open: true,
              time: aircraft.repairTime,
            };
            result.push(aircraftInfo);
    
            aircraft.lruList.forEach((sparePart) => {
              let sparePartId = `sparepart-${nextUniqueId++}`; // 生成唯一的ID
              let sparePartInfo = {
                text: sparePart.lruName,
                start_date: new Date(2025, 0, 16, 0, 0),
                end_date: new Date(
                  2025,
                  0,
                  16,
                  Math.floor(sparePart.repairTime / 60),
                  sparePart.repairTime % 60,
                  0
                ),
                id: sparePartId, // sparePart.lruId,  //随机数这个id与下面的sparePart.lruWorkList的parent一致
                duration: sparePart.repairTime,
                parent: sparePart.taskId,
                type: 1,
                open: true,
                time: sparePart.repairTime,
              };
              result.push(sparePartInfo);
    
              sparePart.lruWorkList.forEach((procedure) => {
                let procedureId = `procedure-${nextUniqueId++}`; // 生成唯一的ID
                let procedureInfo = {
                  text: procedure.taskName,
                  start_date: new Date(2025, 0, 16, 0, 0),
                  end_date: new Date(
                    2025,
                    0,
                    16,
                    Math.floor(procedure.workTime / 60),
                    procedure.workTime % 60,
                    0
                  ),
                  id: procedureId, //procedure.lruWorkId, //这个 id要唯一
                  duration: procedure.workTime,
                  parent: sparePartId, // procedure.lruIdThree, //aircraft.lruList这个id和parent一致
                  type: procedure.isCompleted,
                  time: procedure.workTime,
                };
                result.push(procedureInfo);
              });
            });
          });
    
          return result;
        },
        //取最大的修理时间
        findMaxRepairTime(data) {
          let maxRepairTime = 0;
          data.forEach((aircraft) => {
            if (aircraft.repairTime > maxRepairTime) {
              maxRepairTime = aircraft.repairTime;
            }
          });
          return maxRepairTime;
        },
    

  5. 子组件监听调用

    watch: {
        newData: {
          handler(newVal) {
            if (newVal !== undefined && newVal !== null)

http://www.niftyadmin.cn/n/5844811.html

相关文章

python基础-推荐8个常用的Python GUI图形界面开发框架

在Python中&#xff0c;GUI&#xff08;图形用户界面&#xff09;开发框架为开发者提供了创建交互式应用程序的工具。以下是八款常用的Python GUI图形界面开发框架及其简要代码讲解&#xff1a; CSDN大礼包&#xff1a;《2024年最新全套学习资料包》免费分享 1. Tkinter 简介…

机器学习-关于线性回归的表示方式和矩阵的基本运算规则

最近在学习机器学习的过程中&#xff0c;发现关于线性回归的表示和矩阵的运算容易费解&#xff0c;而且随着学习的深入容易搞混&#xff0c;因此特意做了一些研究&#xff0c;并且记录下来和大家分享。 一、线性模型有哪些表示方式&#xff1f; 器学习中&#xff0c;线性模型…

已验证正常,Java输入字符串生成PDF文件

Java输入字符串生成PDF文件过程&#xff1a; 在Java开发中&#xff0c;如何将字符串转换为 PDF 是一个常见的需求。网上找了很多例子都无法生成&#xff0c;经过多次尝试&#xff0c;终于实现了&#xff0c;特此记录一下。 1、引入pom.xml 添加所需的依赖 <dependency>&…

Nginx 中启用 Gzip 压缩以优化网页加载速度

&#x1f3e1;作者主页&#xff1a;点击&#xff01; Nginx-从零开始的服务器之旅专栏&#xff1a;点击&#xff01; &#x1f427;Linux高级管理防护和群集专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2025年2月7日17点14分 目录 1. 配置网页压缩 目的 …

android skia渲染介绍

Android AOSP 的渲染系统主要使用 Skia 图形库。Skia 是一个开源的 2D 图形库&#xff0c;它被广泛应用于 Android 的图形渲染中&#xff0c;负责绘制 UI 元素、文本、图像以及其他 2D 图形内容。 以下是 Android AOSP 中 Skia 的作用和它在渲染系统中的位置&#xff1a; 1. 什…

【R】Dijkstra算法求最短路径

使用R语言实现Dijkstra算法求最短路径 求点2、3、4、5、6、7到点1的最短距离和路径 1.设置data&#xff0c;存放有向图信息 data中每个点所在的行序号为起始点序号&#xff0c;列为终点序号。 比如&#xff1a;值4的坐标为(1,2)即点1到点2距离为4&#xff1b;值8的坐标为(6,7)…

Day56_20250204_图论part1_图论理论基础|深搜理论基础|98.所有可达路径|广搜理论基础

Day56_20250204_图论part1_图论理论基础|深搜理论基础|98.所有可达路径|广搜理论基础 深搜理论基础 基础知识 深搜与广搜并查集最小生成树拓扑排序最短路算法 图论理论基础 图的基本概念 多个点连线 连通性 表示节点的连通情况 无向图 连通图非连通图连通分量&#xff1a;极…

Godot开发框架探索#2

前言 距离上次发文又又又隔了很长一段时间。主要原因还是因为思绪在徘徊&#xff0c;最近纠结的点有以下几个&#xff1a;1.渴求一个稳定的Godot开发框架&#xff1b;2.要不要使用更轻量的开发框架&#xff0c;或者直接写引擎&#xff1b; 3.对自己想做的游戏品类拿不定主意。…