From 062bdce1dfee76973080c96c06df794b36489be2 Mon Sep 17 00:00:00 2001 From: hwj Date: Fri, 10 Apr 2026 14:35:19 +0800 Subject: [PATCH] =?UTF-8?q?style=EF=BC=9A=E7=94=98=E7=89=B9=E5=9B=BE?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/TaskSchedulePreviewDialog.vue | 63 ++++++++++++++++--- 1 file changed, 54 insertions(+), 9 deletions(-) diff --git a/src/views/mes/tasksummary/components/TaskSchedulePreviewDialog.vue b/src/views/mes/tasksummary/components/TaskSchedulePreviewDialog.vue index ac2c40ae..571920a2 100644 --- a/src/views/mes/tasksummary/components/TaskSchedulePreviewDialog.vue +++ b/src/views/mes/tasksummary/components/TaskSchedulePreviewDialog.vue @@ -89,6 +89,20 @@ const formatGanttDate = (value: unknown) => { return date.format('YYYY-MM-DD HH:mm') } +const getDeviceTaskRangeByChildren = (planTasks: any[]) => { + const starts = planTasks.map((item: any) => dayjs(item?.start_date)).filter((item: any) => item.isValid()) + const ends = planTasks.map((item: any) => dayjs(item?.end_date)).filter((item: any) => item.isValid()) + if (!starts.length || !ends.length) return undefined + const earliestStart = starts.reduce((min: any, current: any) => (current.valueOf() < min.valueOf() ? current : min)) + const latestEnd = ends.reduce((max: any, current: any) => (current.valueOf() > max.valueOf() ? current : max)) + const duration = Math.max(latestEnd.endOf('day').diff(earliestStart.startOf('day'), 'day') + 1, 1) + return { + start_date: earliestStart.toDate(), + end_date: latestEnd.toDate(), + duration + } +} + const buildPreviewGanttData = (scheduleList: any[]) => { const tasks: any[] = [] const links: any[] = [] @@ -105,19 +119,23 @@ const buildPreviewGanttData = (scheduleList: any[]) => { .filter((plan: any) => plan._start.isValid() && plan._end.isValid()) .sort((a: any, b: any) => a._start.valueOf() - b._start.valueOf()) const firstPlan = validPlans[0] - const lastPlan = validPlans[validPlans.length - 1] - const parentDuration = - firstPlan && lastPlan ? Math.max(lastPlan._end.endOf('day').diff(firstPlan._start.startOf('day'), 'day') + 1, 1) : 1 + const deviceRange = getDeviceTaskRangeByChildren( + validPlans.map((item: any) => ({ + start_date: item?._start, + end_date: item?._end + })) + ) tasks.push({ id: deviceId, text: `${device.deviceName ?? '-'}`, - start_date: formatGanttDate(firstPlan?._start), - end_date: formatGanttDate(lastPlan?._end), - duration: parentDuration, + start_date: formatGanttDate(deviceRange?.start_date ?? firstPlan?._start), + end_date: formatGanttDate(deviceRange?.end_date ?? firstPlan?._end), + duration: deviceRange?.duration ?? 1, parent: 0, progress: 0, open: true, + readonly: true, deviceName: device.deviceName ?? '-', _deviceData: device }) @@ -181,6 +199,23 @@ const syncPlanTimeFromTask = (task: any) => { activePreviewDevice.value = task._deviceData } +const syncDeviceTaskRangeFromChildren = (task: any) => { + if (!task?._planData) return + const deviceTaskId = task.parent + if (!deviceTaskId) return + const childTaskIds = gantt.getChildren(deviceTaskId) + if (!Array.isArray(childTaskIds) || !childTaskIds.length) return + const childTasks = childTaskIds.map((childId: string | number) => gantt.getTask(childId)).filter((item: any) => item?._planData) + if (!childTasks.length) return + const deviceRange = getDeviceTaskRangeByChildren(childTasks) + if (!deviceRange) return + const deviceTask = gantt.getTask(deviceTaskId) + deviceTask.start_date = deviceRange.start_date + deviceTask.end_date = deviceRange.end_date + deviceTask.duration = deviceRange.duration + gantt.updateTask(deviceTaskId) +} + const refreshTimelineRangeByTasks = () => { let minStart = Number.POSITIVE_INFINITY let maxEnd = Number.NEGATIVE_INFINITY @@ -318,18 +353,28 @@ const initGanttPreview = () => { return true }) + const beforeDragEventId = gantt.attachEvent('onBeforeTaskDrag', (id) => { + const task = gantt.getTask(id) + if (!task?._planData) return false + return String(task?._planData?.sourceType ?? '').toUpperCase() === 'CURRENT' + }) + const dragEventId = gantt.attachEvent('onAfterTaskDrag', (id) => { - syncPlanTimeFromTask(gantt.getTask(id)) + const task = gantt.getTask(id) + syncPlanTimeFromTask(task) + syncDeviceTaskRangeFromChildren(task) refreshTimelineRangeByTasks() }) const updateEventId = gantt.attachEvent('onAfterTaskUpdate', (id) => { - syncPlanTimeFromTask(gantt.getTask(id)) + const task = gantt.getTask(id) + syncPlanTimeFromTask(task) + syncDeviceTaskRangeFromChildren(task) refreshTimelineRangeByTasks() gantt.refreshTask(id) }) - ganttEventIds.value.push(clickEventId, dragEventId, updateEventId) + ganttEventIds.value.push(clickEventId, beforeDragEventId, dragEventId, updateEventId) } const handlePreviewSave = async () => {