甘特图 dhtmlxGantt.js UA实例

news2025/6/4 13:09:11

摘要:本文介绍了一个基于AngularJS的排产资源占用甘特图系统,包含前端界面展示和后端控制逻辑。系统通过HTML模板实现甘特图展示区域、查询条件表单和数据绑定,使用JavaScript控制器处理数据查询、甘特图初始化和交互逻辑。主要功能包括:1)查询工厂、作业岛类型的排产资源占用情况;2)甘特图展示资源占用时间分布;3)数据字典加载和表单验证。系统采用只读模式展示甘特图,禁用编辑功能,确保数据安全性和稳定性。 

1.SchedulingResourceOccupationGanTTScreen-list.html

<link href="Scheduling.SchedulingApp/styles/dhtmlxgantt.css" rel="stylesheet">
<style>
    .MainCommandActionButton {
        margin-top: 20px !important;
    }

    /* 启用复制功能 */
    .ui-grid-disable-selection {
        -webkit-touch-callout: default;
        -webkit-user-select: text;
        -khtml-user-select: text;
        -moz-user-select: text;
        -ms-user-select: text;
        user-select: text;
        cursor: auto;
    }
</style>
<div id="itemlist" class="content-area content-area-relative" style="height: calc(93% - 30px) !important">
    <!--查询条件与功能按钮-->
    <div class="col-md-40" style="margin-left: 15px; margin-top: 10px;">
        <div class="side-panel-property-area-body">

            <sit-property-grid sit-id="add_form" sit-layout="Horizontal" sit-type="Fluid" sit-mode="edit"
                sit-columns="5">
                <sit-property sit-widget="sit-select" sit-value="vm.Status.value" sit-validation="{ required: true }"
                    sit-options="vm.Status.options" sit-to-display="'ItemName'" sit-to-keep="'ItemValue'"
                    style="max-width:200px;">查询类型:</sit-property>
                <sit-property sit-widget="sit-select" sit-value="vm.Factory.value" sit-validation="{ required: true }"
                    sit-options="vm.Factory.options" sit-to-display="'ItemName'" sit-to-keep="'ItemValue'"
                    style="max-width:200px;">工厂:</sit-property>

                <sit-property sit-widget="sit-select" sit-value="vm.OperatingIslandType.value"
                    sit-validation="{ required: false }" sit-options="vm.OperatingIslandType.options"
                    sit-to-display="'ItemName'" sit-to-keep="'ItemValue'" style="max-width:200px;">作业岛类型:</sit-property>

                <sit-property sit-widget="sit-datepicker" sit-value="vm.StartDate" sit-validation="{required: true}"
                    sit-options="vm.dateOptions" sit-format="'yyyy-MM-dd'" sit-read-only="false" style="max-width:150px;">开始日期:</sit-property>

                <sit-property sit-widget="sit-datepicker" sit-value="vm.EndDate" sit-validation="{required: true}"
                    sit-options="vm.dateOptions" sit-format="'yyyy-MM-dd'" sit-read-only="false" style="max-width:150px;">结束日期:</sit-property>
                    
                <sit-command-bar sit-type="action">
                    <sit-command sit-icon="fa-search" sit-type="main" sit-name="com.siemens.customcommand.search"
                        sit-tooltip="" ng-show="false" sit-label="">
                    </sit-command> 
                    <sit-command sit-icon="fa-search" sit-type="main" sit-name="com.siemens.customcommand.search" ng-show="vm.validInputs"
                        sit-tooltip="查询" ng-click="vm.searchButtonHandler" sit-label="查询">
                    </sit-command>
                </sit-command-bar>
            </sit-property-grid>
        </div>
    </div>

    <div style="width:100%;margin-top: 5px;">
        <!-- grid列表 -->
        <div id="listClass" style="width:100%; height: 100%; padding:0px 16px 0 16px; margin-top: 3px;">
            <div id="divGantt" class="gantt-container" style="height:90vh;"></div>
        </div>
    </div>



</div>

2.SchedulingResourceOccupationGanTTScreen-list-ctrl.js

(function () {
    'use strict';
    angular.module('Scheduling.SchedulingApp.SchedulingResourceOccupationGanTT').config(ListScreenRouteConfig);

    ListScreenController.$inject = ['Scheduling.SchedulingApp.SchedulingResourceOccupationGanTT.SchedulingResourceOccupationGanTTScreen.service',
        '$state', '$stateParams',
        '$rootScope', '$scope', 'common.services.authentication', 'common.base', 'common.services.logger.service', 'common.widgets.notificationTile.globalService', 'commonService',
        'common.widgets.busyIndicator.service', 'i18nService'];
    function ListScreenController(dataService, $state, $stateParams, $rootScope, $scope, auth, base, loggerService, notificationService, commonService, busyIndicatorService, i18nService) {
        //国际化 
        i18nService.setCurrentLang('zh-cn');
        var self = this;
        var logger, rootstate, messageservice, backendService, signalManager;

        activate();

        // Initialization function
        function activate() {
            logger = loggerService.getModuleLogger('Scheduling.SchedulingApp.SchedulingResourceOccupationGanTT.SchedulingResourceOccupationGanTTScreen');

            init();
            registerEvents();
        }

        function init() {
            logger.logDebug('Initializing controller.......');

            rootstate = 'home.Scheduling_SchedulingApp_SchedulingResourceOccupationGanTT_SchedulingResourceOccupationGanTTScreen';
            messageservice = base.widgets.messageOverlay.service;
            backendService = base.services.runtime.backendService;
            signalManager = base.services.signal.service;

            //Initialize Model Data
            self.selectedItem = null;
            self.isButtonVisible = false;
            self.validInputs = false;
            self.searchButtonHandler = searchButtonHandler;//查询
            //查询类型
            self.Status = {
                value: { 'ItemValue': '作业岛', 'ItemName': '作业岛' },
                options: [

                    { 'ItemValue': '作业岛', 'ItemName': '作业岛' },
                    { 'ItemValue': '班组', 'ItemName': '班组' }
                ]
            };
            //工厂
            self.Factory = {
                value: { 'ItemValue': '', 'ItemName': '--请选择--' },
                options: [
                    { 'ItemValue': '', 'ItemName': '--请选择--' }
                ]
            };
            //作业岛类型
            self.OperatingIslandType = {
                value: { 'ItemValue': '', 'ItemName': '--请选择--' },
                options: [
                    { 'ItemValue': '', 'ItemName': '--请选择--' }
                ]
            };
            //作业岛编号
            self.OperatingIsland = {
                value: { 'ItemValue': '', 'ItemName': '--请选择--' },
                options: [
                    { 'ItemValue': '', 'ItemName': '--请选择--' }
                ]
            };
            self.searchParams = {};
            //获取数据字典
            GetDectionary();
            GanttInit();
        }
        //查询
        function searchButtonHandler(clickedCommand) {
            initGanttData();
        }

        //甘特图初始化
        function GanttInit() {
            //
            //汉化           
            gantt.i18n.setLocale("cn");
            // 完全禁用任务拖动
            // 1. 初始化配置
            gantt.config.date_format = "%Y/%m/%d";
            gantt.config.select_task = false;
            // 禁用所有交互事件(包括双击编辑)
            gantt.config.interaction = {
                click: false,//禁用单击
                dblclick: false,//禁用双击
                drag: false,// 禁用任务拖动
                resize: false 禁用调整大小
            };
            // 仅允许查看但禁止修改
            gantt.config.readonly = true;

            // 禁用任务点击选中
            gantt.config.subscales = [
                { unit: "day", step: 1, date: "%D" }
            ];
            // 初始化时禁用任务创建按钮
            gantt.config.show_add_button = false;
            gantt.config.toolbar = []; // 清空工具栏
            gantt.config.show_quick_info = false; // 隐藏快速操作栏
            gantt.config.show_grid_header = false; // 隐藏表头操作栏
            gantt.config.columns = [
                { name: "text", label: "任务名称", width: 200, tree: true },
                { name: "start_date", label: "开始时间", width: 110, align: "center" },
                { name: "end_date", label: "结束时间", width: 110, align: "center" },
                { name: "duration", label: "持续时间", width: 80, align: "center" }
              ];
              
              
            // 2. 加载数据
            gantt.init("divGantt");
            gantt.config.work_time = true;  // 必须启用工作时间模式
            gantt.config.split_tasks = true; // 启用任务分割
            gantt.config.show_unscheduled = true; // 可选:允许显示未安排的任务段
            // 或通过事件拦截(更灵活)
            gantt.attachEvent("onBeforeTaskDrag", function () {
                return false; // 取消拖动操作
            });
        }
        //甘特图数据绑定
        function GantData(serverData) {
            console.log("serverData-------------", JSON.stringify(serverData));
            if (serverData.length==0) {
                console.log("serverData-----1111111111111111111--------");
                //清空数据
                gantt.clearAll(); 
            }
            else {
                console.log("serverData-----22222222222222222--------");
                gantt.parse({
                    data: serverData,
                    // links: [
                    //     { id: 1, source: 2, target: 3, type: "0" } // 0表示"完成-开始"依赖关系
                    // ]
                });
            }

            // 刷新视图使配置生效
            gantt.render();
        }
        //甘特图数据查询
        function initGanttData() {
            self.searchParams.FactoryCode = self.Factory.value.ItemName;
            self.searchParams.OperatingIslandTypeCode = self.OperatingIslandType.value.ItemValue;
            self.searchParams.TypeCode = self.Status.value.ItemValue;
            self.searchParams.StartDate = moment(self.StartDate).format('YYYY-MM-DD HH:mm:ss');
            self.searchParams.EndDate = moment(self.EndDate).format('YYYY-MM-DD HH:mm:ss');
            dataService.getSchedulingGanttList(self.searchParams).then(function (data) {
                if ((data) && (data.succeeded)) {
                    //数据绑定 
                    GantData(data.data.ReturnValue);
                } else {

                }
            }, backendService.backendError);

            // let dd=[
            //     //  { id: 1, text: "PM01", start_date: "2025-05-1", end_date: "2025-05-15", progress: 1 },
            //     {
            //         id: 1,
            //         text: "PM01",
            //         start_date: "2025-05-01", end_date: "2025-05-10"
            //     },
            //     { id: 2, text: "APS000001", start_date: "2025-05-01", end_date: "2025-05-4", parent: 1 },
            //     { id: 3, text: "APS000002", start_date: "2025-05-6 23:59:59", end_date: "2025-05-10", parent: 1 },
            //     { id: 4, text: "PM02", start_date: "2025-05-15", duration: 10, parent: 0 },
            //     { id: 5, text: "PM03", start_date: "2025-05-16", end_date: "2025-05-20", parent: 0 }
            // ];
            // GantData(dd);
        }
        //获取数据字典数据
        function GetDectionary() {
            var dicParamObj = {};
            dicParamObj.ItemCodeList = ['FactoryDic', 'OperatingIslandTypeDic', 'OperatingIslandDic', 'StatusDic'];//可以一次查询多个
            dataService.getDectionary(dicParamObj).then(function (data) {
                if ((data) && (data.succeeded)) {
                    var resData = data.data.DictionaryDataList;
                    //工厂
                    var factoryDicArry = resData.filter(t => t.CategoryCode == 'FactoryDic')
                        .map(function (item) {
                            return { 'ItemValue': item.ItemValue, 'ItemName': item.ItemName }
                        }).sort((a, b) => a.ItemValue.localeCompare(b.ItemValue));
                    self.Factory.options.push(...factoryDicArry);
                    //作业岛类型
                    var operatingIslandTypeDicArry = resData.filter(t => t.CategoryCode == 'OperatingIslandTypeDic')
                        .map(function (item) {
                            return { 'ItemValue': item.ItemValue, 'ItemName': item.ItemName }
                        }).sort((a, b) => a.ItemValue.localeCompare(b.ItemValue));
                    self.OperatingIslandType.options.push(...operatingIslandTypeDicArry);
                    // //作业岛编号
                    // var operatingIslandDicArry = resData.filter(t => t.CategoryCode == 'OperatingIslandDic')
                    //     .map(function (item) {
                    //         return { 'ItemValue': item.ItemValue, 'ItemName': item.ItemName }
                    //     }).sort((a, b) => a.ItemValue.localeCompare(b.ItemValue));
                    // self.OperatingIsland.options.push(...operatingIslandDicArry);

                } else {
                    self.Factory.options = [];
                    self.OperatingIslandType.options = [];
                    self.OperatingIsland.options = [];

                }
            }, backendService.backendError);
        }
        function registerEvents() {
            $scope.$on('sit-property-grid.validity-changed', onPropertyGridValidityChange);
        }
        function onPropertyGridValidityChange(event, params) {
            self.validInputs = params.validity;
        }
    }

    ListScreenRouteConfig.$inject = ['$stateProvider'];
    function ListScreenRouteConfig($stateProvider) {
        var moduleStateName = 'home.Scheduling_SchedulingApp_SchedulingResourceOccupationGanTT';
        var moduleStateUrl = 'Scheduling_SchedulingApp_SchedulingResourceOccupationGanTT';
        var moduleFolder = 'Scheduling.SchedulingApp/modules/SchedulingResourceOccupationGanTT';

        var state = {
            name: moduleStateName + '_SchedulingResourceOccupationGanTTScreen',
            url: '/' + moduleStateUrl + '_SchedulingResourceOccupationGanTTScreen',
            views: {
                'Canvas@': {
                    templateUrl: moduleFolder + '/SchedulingResourceOccupationGanTTScreen-list.html',
                    controller: ListScreenController,
                    controllerAs: 'vm'
                }
            },
            data: {
                title: '排产资源暂用甘特图'
            }
        };
        $stateProvider.state(state);
    }
}());

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

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

相关文章

Docker学习笔记:基础知识

本文是自己的学习笔记 1、什么是Docker2、Docker的架构设计2.1、镜像&#xff08;Image&#xff09;2.2、容器&#xff08;Container&#xff09;2.3、仓库&#xff08;Repository)2.4、Docker使用场景案例 1、什么是Docker Docker是基于Go语言实现的云开源项目。它的角色是作…

5.2 初识Spark Streaming

在本节实战中&#xff0c;我们初步探索了Spark Streaming&#xff0c;它是Spark的流式数据处理子框架&#xff0c;具备高吞吐量、可伸缩性和强容错能力。我们了解了Spark Streaming的基本概念和运行原理&#xff0c;并通过两个案例演示了如何利用Spark Streaming实现词频统计。…

Python趣学篇:交互式词云生成器(jieba + Tkinter + WordCloud等)

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、为什么要做词云&#xff1f;让文字"活"起来&#xff01;二、核心…

理解解释器架构:原理、组成与运行机制全解析

目录 前言1. 什么是解释器架构2. 解释器的基本组成2.1 被解释执行的程序2.2 解释器引擎2.3 解释器内部状态2.4 程序执行的当前状态2.5 存储器模型 3. 解释器的工作原理3.1 解析源代码3.2 初始化运行环境3.3 逐条执行语法结构3.4 维护程序状态3.5 内存管理与变量作用域 4. 举例&…

2025华为OD机试真题+全流程解析+备考攻略+经验分享+Java/python/JavaScript/C++/C/GO六种语言最佳实现

华为OD全流程解析&#xff0c;备考攻略 快捷目录 华为OD全流程解析&#xff0c;备考攻略一、什么是华为OD&#xff1f;二、什么是华为OD机试&#xff1f;三、华为OD面试流程四、华为OD薪资待遇及职级体系五、ABCDE卷类型及特点六、题型与考点七、机试备考策略八、薪资与转正九、…

设计模式——桥接设计模式(结构型)

摘要 桥接设计模式是一种结构型设计模式&#xff0c;用于将抽象与实现解耦&#xff0c;使二者可以独立变化。它通过将一个类拆分为“抽象”和“实现”两部分&#xff0c;并通过桥接关系组合&#xff0c;避免了类继承层次结构过于庞大。桥接模式包含抽象类、扩充抽象类、实现类…

LLaDa——基于 Diffusion 的大语言模型 打平 LLama 3

这里分享一篇文章《Large Language Diffusion Models》&#xff0c;来自人民大学高领人工智能学院&#xff0c;一篇尝试改变传统自回归范&#xff08;预测下一个token&#xff09; LLM 架构&#xff0c;探索扩散模型在 LLM 上的作用&#xff0c;通过随机掩码-预测逆向思维&…

2. 数据结构基本概念 (2)

本文部分ppt、视频截图来自&#xff1a;[青岛大学-王卓老师的个人空间-王卓老师个人主页-哔哩哔哩视频] 1. 数据结构基本概念 1.1 数据类型和抽象数据类型 (1) 数据类型(Data Type) 概念 数据类型是一组性质相同的值的集合以及定义于这个值集合上的一组操作的总称。 在使用…

STM32F407寄存器操作(多通道单ADC+DMA)

1.前言 又是半年没更新了&#xff0c;趁着端午放假有点时间&#xff0c;并且最近项目要用这块知识&#xff0c;我就顺带研究一下ADC吧。 一般来说ADC主要用法包含了1.单通道软件触发&#xff08;这是最简单和最常用的用法&#xff09;2.单通道多次采集&#xff08;需要快速采…

基于React和TypeScript的金融市场模拟器开发与模式分析

基于React和TypeScript的金融市场模拟器开发与模式分析 项目概述 本项目开发了一个基于React和TypeScript的金融市场模拟器&#xff0c;通过模拟订单流和价格发现机制&#xff0c;重现了真实市场的动态特性。该模拟器不仅提供了实时价格图表、订单簿和交易功能&#xff0c;还…

reverse_ssh 建立反向 SSH 连接指南 混淆AV [好东西哟]

目录 &#x1f310; 工具简介 ⚙️ 前提条件 攻击主机 (Linux) 目标主机 (Windows) &#x1f4cb; 详细步骤 步骤 1&#xff1a;安装 Go 环境 步骤 2&#xff1a;安装必要依赖 步骤 3&#xff1a;下载并编译 reverse_ssh 步骤 4&#xff1a;配置密钥 步骤 5&#xff…

lvs-keepalived高可用群集

目录 1.Keepalived 概述及安装 1.1 Keepalived 的热备方式 1.2 keepalived的安装与服务控制 &#xff08;1&#xff09;安装keep alived (2)控制 Keepalived 服务DNF 安装 keepalived 后,执行以下命令将keepalived 服务设置为开机启动。 2.使用 Keepalived 实现双机热备 …

高速收发器

一、高速收发器 1.FPGA高速收发器&#xff1a;GTP,GTX,GTH,GTZ 2.每个Quad有4对高速收发器GT(4个TX和4个RX)和一个COmmon 3.走差分&#xff0c;提高抗干扰性 4.CPLL是每个lane私有的&#xff0c;QPLL是整个Quad的所有通道共享的 5.每个MGT的bank有两对差分参考时钟 6.CPLL的时钟…

webpack的安装及其后序部分

npm install原理 这个其实就是npm从registry下载项目到本地&#xff0c;没有什么好说的 值得一提的是npm的缓存机制&#xff0c;如果多个项目都需要同一个版本的axios&#xff0c;每一次重新从registry中拉取的成本过大&#xff0c;所以会有缓存&#xff0c;如果缓存里有这个…

如何利用自动生成文档工具打造出色的技术文档

文章目录 每日一句正能量前言一、自动生成文档工具的优势&#xff08;一&#xff09;提高效率&#xff08;二&#xff09;保持一致性&#xff08;三&#xff09;实时更新 二、常见的自动生成文档工具&#xff08;一&#xff09;Sphinx&#xff08;二&#xff09;Javadoc&#x…

实验设计与分析(第6版,Montgomery)第5章析因设计引导5.7节思考题5.7 R语言解题

本文是实验设计与分析&#xff08;第6版&#xff0c;Montgomery著&#xff0c;傅珏生译) 第5章析因设计引导5.7节思考题5.7 R语言解题。主要涉及方差分析&#xff0c;正态假设检验&#xff0c;残差分析&#xff0c;交互作用图&#xff0c;等值线图。 dataframe <-data.frame…

OpenCv高阶(二十)——dlib脸部轮廓绘制

文章目录 一、人脸面部轮廓绘制代码实现1、定义绘制直线段的函数2、定义绘制凸包轮廓的函数3、读取输入图像4、初始化dlib的人脸检测器5、使用检测器在图像中检测人脸&#xff08;参数0表示不进行图像缩放&#xff09;6、加载dlib的68点人脸关键点预测模型7、遍历检测到的每个人…

pikachu靶场通关笔记08 XSS关卡04-DOM型XSS

目录 一、XSS原理 二、DOM型XSS 三、源码分析 1、进入靶场 2、XSS探测 3、源码分析 四、渗透实战 1、Payload1 2、Payload2 3、Payload3 本系列为通过《pikachu靶场通关笔记》的XSS关卡(共10关&#xff09;渗透集合&#xff0c;通过对XSS关卡源码的代码审计找到XSS风…

Spring AI 系列之使用 Spring AI 开发模型上下文协议(MCP)

1. 概述 现代网页应用越来越多地集成大型语言模型&#xff08;LLMs&#xff09;来构建解决方案&#xff0c;这些解决方案不仅限于基于常识的问答。 为了增强 AI 模型的响应能力&#xff0c;使其更具上下文感知&#xff0c;我们可以将其连接到外部资源&#xff0c;比如搜索引擎…

[Python] Python运维:系统性能信息模块psutil和系统批量运维管理器paramiko

初次学习&#xff0c;如有错误还请指正 目录 系统性能信息模块psutil 获取系统性能信息 CPU信息 内存信息 磁盘信息 网络信息 其他信息 进程信息 实用的IP地址处理模块IPy IP地址、网段的基本处理 多网络计算方法 系统批量运维管理器paramiko paramiko 的安装 Li…