当前位置: 首页 > news >正文

vue甘特图vxe-gantt如何实现拖拽任务条时如有已关联依赖线,同时更新依赖任务的日期的方式

vue甘特图vxe-gantt如何实现拖拽任务条时如有已关联依赖线,同时更新依赖任务的日期的方式

当任务关联前置任务或后置任务依赖线时,拖拽该任务时同步更新对应的起始日期和结束日期,可以通过 task-bar-drag-config.moveSetMethod 来自定义业务逻辑

extend_gantt_chart_gantt_dependency_move_update

基础代码

简单实现同步移动任务

<template><div><vxe-gantt v-bind="ganttOptions"></vxe-gantt></div>
</template><script setup>
import { reactive } from 'vue'
import { VxeGanttDependencyType } from 'vxe-gantt'
import XEUtils from 'xe-utils'const ganttOptions = reactive({border: true,height: 600,rowConfig: {keyField: 'id' // 行主键},taskBarConfig: {showProgress: true, // 是否显示进度条showContent: true, // 是否在任务条显示内容moveable: true, // 是否允许拖拽任务移动日期resizable: true, // 是否允许拖拽任务调整日期linkCreatable: true, // 是否允许自定义创建依赖线barStyle: {round: true, // 圆角bgColor: '#fca60b', // 任务条的背景颜色completedBgColor: '#65c16f' // 已完成部分任务条的背景颜色}},taskLinkConfig: {isHover: true, // 当鼠标移到依赖线时,是否要高亮当前依赖线isCurrent: true, // 当鼠标点击依赖线时,是否要高亮当前依赖线isDblclickToRemove: true // 是否允许双击依赖线删除},taskViewConfig: {tableStyle: {width: 480 // 表格宽度}},taskBarMoveConfig: {// 自定义拖拽结束时任务日期被赋值的方法async moveSetMethod ({ row, startValue, endValue, offsetSize, linkInfo }) {const { toRows, fromRows } = linkInforow.start = startValuerow.end = endValue// 实现拖拽任务后,关联任务自动同步更新日期fromRows.forEach(row => {row.start = XEUtils.toDateString(XEUtils.getWhatDay(row.start, offsetSize), 'yyyy-MM-dd')row.end = XEUtils.toDateString(XEUtils.getWhatDay(row.end, offsetSize), 'yyyy-MM-dd')})toRows.forEach(row => {row.start = XEUtils.toDateString(XEUtils.getWhatDay(row.start, offsetSize), 'yyyy-MM-dd')row.end = XEUtils.toDateString(XEUtils.getWhatDay(row.end, offsetSize), 'yyyy-MM-dd')})}},links: [{ from: 10001, to: 10002, type: VxeGanttDependencyType.FinishToFinish },{ from: 10004, to: 10005, type: VxeGanttDependencyType.StartToStart },{ from: 10005, to: 10006, type: VxeGanttDependencyType.FinishToStart },{ from: 10013, to: 10012, type: VxeGanttDependencyType.StartToFinish }],columns: [{ type: 'seq', width: 70 },{ field: 'title', title: '任务名称' },{ field: 'start', title: '开始时间', width: 100 },{ field: 'end', title: '结束时间', width: 100 },{ field: 'progress', title: '进度(%)', width: 80 }],data: [{ id: 10001, title: '任务1', start: '2024-03-01', end: '2024-03-04', progress: 3 },{ id: 10002, title: '任务2', start: '2024-03-03', end: '2024-03-08', progress: 10 },{ id: 10003, title: '任务3', start: '2024-03-03', end: '2024-03-11', progress: 90 },{ id: 10004, title: '任务4', start: '2024-03-05', end: '2024-03-11', progress: 15 },{ id: 10005, title: '任务5', start: '2024-03-08', end: '2024-03-15', progress: 100 },{ id: 10006, title: '任务6', start: '2024-03-10', end: '2024-03-21', progress: 5 },{ id: 10007, title: '任务7', start: '2024-03-15', end: '2024-03-24', progress: 70 },{ id: 10008, title: '任务8', start: '2024-03-05', end: '2024-03-15', progress: 50 },{ id: 10009, title: '任务9', start: '2024-03-19', end: '2024-03-20', progress: 5 },{ id: 10010, title: '任务10', start: '2024-03-12', end: '2024-03-20', progress: 10 },{ id: 10011, title: '任务11', start: '2024-03-01', end: '2024-03-08', progress: 90 },{ id: 10012, title: '任务12', start: '2024-03-03', end: '2024-03-06', progress: 60 },{ id: 10013, title: '任务13', start: '2024-03-02', end: '2024-03-05', progress: 50 },{ id: 10014, title: '任务14', start: '2024-03-04', end: '2024-03-15', progress: 0 },{ id: 10015, title: '任务15', start: '2024-03-01', end: '2024-03-05', progress: 30 }]
})
</script>

还可以实现更复杂的逻辑

<template><div><vxe-gantt ref="ganttRef" v-bind="ganttOptions" @task-bar-drag-end="onTaskDragEnd"></vxe-gantt></div>
</template><script setup>
import { reactive, ref } from 'vue'
import { VxeGanttDependencyType } from 'vxe-gantt'
import XEUtils from 'xe-utils'const ganttRef = ref(null)const ganttOptions = reactive({// ...(保持原有配置)taskBarMoveConfig: {// 自定义拖拽结束时任务日期被赋值的方法async moveSetMethod({ row, startValue, endValue, offsetSize, linkInfo }) {const { toRows, fromRows, toLinks, fromLinks } = linkInfo// 1. 获取变更前的日期(用于错误恢复)// const oldStart = row.start// const oldEnd = row.end// 2. 更新当前拖拽任务的日期row.start = startValuerow.end = endValue// 4. 统一更新依赖任务的方法//   根据依赖类型计算出新的日期,而不是简单粗暴地整体偏移const updateDependentTasks = (tasks, currentRow, linkType, offsetDays) => {tasks.forEach(task => {const currentStart = new Date(currentRow.start)const currentEnd = new Date(currentRow.end)let newStart, newEnd// 根据不同的依赖类型,更新关联任务的日期switch (linkType) {case VxeGanttDependencyType.FinishToStart:// 前置任务结束后,后置任务才能开始newStart = XEUtils.toDateString(XEUtils.getWhatDay(currentRow.end, offsetDays),'yyyy-MM-dd')newEnd = XEUtils.toDateString(XEUtils.getWhatDay(task.end, offsetDays),'yyyy-MM-dd')breakcase VxeGanttDependencyType.StartToStart:// 两个任务同时开始newStart = XEUtils.toDateString(XEUtils.getWhatDay(currentRow.start, offsetDays),'yyyy-MM-dd')newEnd = XEUtils.toDateString(XEUtils.getWhatDay(task.end, offsetDays),'yyyy-MM-dd')breakcase VxeGanttDependencyType.FinishToFinish:// 两个任务同时完成newStart = XEUtils.toDateString(XEUtils.getWhatDay(task.start, offsetDays),'yyyy-MM-dd')newEnd = XEUtils.toDateString(XEUtils.getWhatDay(currentRow.end, offsetDays),'yyyy-MM-dd')breakcase VxeGanttDependencyType.StartToFinish:// 当前任务完成才能开始newStart = XEUtils.toDateString(XEUtils.getWhatDay(currentRow.start, offsetDays),'yyyy-MM-dd')newEnd = XEUtils.toDateString(XEUtils.getWhatDay(task.end, offsetDays),'yyyy-MM-dd')breakdefault:// 默认整体偏移newStart = XEUtils.toDateString(XEUtils.getWhatDay(task.start, offsetDays),'yyyy-MM-dd')newEnd = XEUtils.toDateString(XEUtils.getWhatDay(task.end, offsetDays),'yyyy-MM-dd')}// 更新任务数据task.start = newStart || task.starttask.end = newEnd || task.end})}// 6. 更新依赖任务(前置和后置)// 使用依赖关系信息来精确更新if (fromRows.length && fromLinks.length) {updateDependentTasks([fromRows[0]], row, fromLinks[0], offsetSize)}if (toRows.length && toLinks.length) {updateDependentTasks([toRows[0]], row, toLinks[0], offsetSize)}}},// ...(保持原有数据配置)
})// 监听拖拽事件,执行其他业务逻辑(如保存到后端)
const onTaskDragEnd = ({ row, startValue, endValue }) => {// 可以在这里保存更新后的任务数据,或者执行其他业务逻辑console.log('任务拖拽完成', { row, startValue, endValue })// 可选:触发数据更新到后端// updateTaskToBackend(row)
}
</script>

依赖类型说明

依赖类型 原逻辑缺陷 优化后逻辑
FinishToStart 前置任务结束日期推迟,后置任务应该整体推迟?❌ 应该是后置任务的开始日期=前置任务的结束日期 仅更新后置任务的开始日期,保持持续时间不变
StartToStart 同时开始的任务,拖拽一个不应该导致另一个结束日期整体偏移 保持两个任务的结束日期相对不变,仅调整开始日期
FinishToFinish 两个任务同时结束,拖拽一个不应该影响另一个的开始日期 保持两个任务的开始日期相对不变,仅调整结束日期
StartToFinish 前置任务开始日期影响后置任务完成日期 根据依赖关系的具体约束来精确更新

https://gantt.vxeui.com

http://www.jsqmd.com/news/769467/

相关文章:

  • 《深入浅出通信原理》连载026-030
  • 联邦学习个性化实战指南:从核心原理到产业未来
  • 终极指南:如何让老款Mac重获新生,安装最新macOS系统
  • 2026年装修成品保护材料一站式采购方案:苏州、北京、上海、广州、深圳、成都、杭州、武汉、西安、重庆、南京、天津、长沙、郑州、沈阳、青岛、济南、宁波、厦门全覆盖 - 企业名录优选推荐
  • 基于HSV和RGB颜色空间的自然场景下草地黄花背景分割检测和计数
  • Docker小白也能搞定:5分钟在Ubuntu 22.04上部署ARL灯塔(附常见错误排查清单)
  • 2026 嘉兴彩钢瓦金属屋面厂房防水防腐公司排名|5 家正规防水防腐企业推荐 + 避坑指南 - 速递信息
  • 别只怪电容!实测拆解:DCDC降压芯片输出纹波里的‘神秘方波’从哪来?
  • 如何轻松安装Koikatu HF Patch:200+插件整合与游戏增强完整指南
  • 2026年3月27日NSSCTF之[SWPU 2019]漂流记的马里奥
  • 终极指南:免费Windows风扇控制软件让你的电脑静音又冷静
  • Linux内核驱动开发:遇到`-Werror=implicit-fallthrough`编译报错别慌,三种主流解决方案实测对比
  • Cookie 和 Session 详解
  • D2DX:让经典暗黑破坏神2在现代PC上完美运行的终极方案
  • 量子误差缓解技术在Schwinger模型中的应用与优化
  • 告别Source Insight!VSCode用highlight-words插件实现F8高亮,嵌入式C/C++开发者的迁移指南
  • 深蓝词库转换:打破输入法壁垒的技术革命
  • 机械格栅技术选型与运维指南 资深厂家实操干货分享 - 奔跑123
  • WarcraftHelper终极指南:解决魔兽争霸3在现代系统的所有痛点
  • 拆解Android 13音频HAL:给SoC厂商的定制指南与AOSP标准接口深度解读
  • OpenCV联合C++/Qt 学习笔记(十三)----边缘检测
  • 论文写作技巧
  • 观察Taotoken在高并发测试下的API响应稳定性表现
  • 服务器双卡5090 配置深度学习环境
  • 当免费遇上专业:思源宋体如何让中文排版不再妥协
  • 2026年装修成品保护材料源头工厂直供指南:苏州、北京、上海等18城一站式采购方案 - 企业名录优选推荐
  • Claw-Social插件:为AI Agent构建语义社交发现与双轨通讯系统
  • 使用ContextAI统一管理AI编程助手上下文,提升开发效率与代码一致性
  • 终极指南:3步解决Windows老游戏兼容性,让经典游戏重获新生
  • VSCode 2026 + Trace32深度协同指南:实现AURIX TC4xx实时变量观测、CoreSight ETM流解析与UDS诊断会话一键触发(仅限首批内测License持有者公开)