From 0e65eb52e15db923fd89e1806496776262953889 Mon Sep 17 00:00:00 2001 From: tzy <1042411602@qq.com> Date: Mon, 1 Jun 2026 17:00:06 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E7=AE=A1=E7=90=86,=E7=94=98?= =?UTF-8?q?=E7=89=B9=E5=9B=BE=E5=A2=9E=E5=8A=A0=E4=BF=9D=E5=AD=98=E8=8D=89?= =?UTF-8?q?=E7=A8=BF=EF=BC=8C=E5=90=8C=E6=AD=A5=E5=B7=A5=E5=BA=8F=E8=AE=A1?= =?UTF-8?q?=E5=88=92=E5=92=8C=E7=94=9F=E4=BA=A7=E8=AE=A2=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/orderProject.ts | 12 ++- .../orderProject/components/GanttSchedule.vue | 100 +++++++++++++---- src/views/biz/orderProject/index.vue | 102 ++++++++++++++++-- 3 files changed, 187 insertions(+), 27 deletions(-) diff --git a/src/api/orderProject.ts b/src/api/orderProject.ts index 1db6bc2..7cea8aa 100644 --- a/src/api/orderProject.ts +++ b/src/api/orderProject.ts @@ -135,8 +135,18 @@ export const orderProjectApi = { return request({ url: `/biz/orderProject/template`, method: 'get', responseType: 'blob' }) }, - // 查询金蝶生产订单 + // 查询金蝶生产订单 (支持优先读取本地暂存) getKingdeeOrder(id: number) { return request({ url: `/biz/orderProject/kingdee/order/${id}`, method: 'get' }) }, + + // 暂存金蝶生产订单数据(草稿) + saveKingdeeOrderDraft(id: number, data: KingdeePrdMo[]) { + return request({ url: `/biz/orderProject/kingdee/order/${id}/draft`, method: 'post', data }) + }, + + // 同步订单和计划表 + saveKingdeeOrderAndPlan(id: number, data: KingdeePrdMo[]) { + return request({ url: `/biz/orderProject/kingdee/order/${id}/saveOrderAndPlan`, method: 'post', data }) + }, } diff --git a/src/views/biz/orderProject/components/GanttSchedule.vue b/src/views/biz/orderProject/components/GanttSchedule.vue index e476c08..692b1f5 100644 --- a/src/views/biz/orderProject/components/GanttSchedule.vue +++ b/src/views/biz/orderProject/components/GanttSchedule.vue @@ -3,7 +3,10 @@
甘特图排产 - 返回 + + 保存排产草稿 + 返回 +
@@ -16,7 +19,7 @@ import { useMessage } from 'naive-ui' import { useRouter } from 'vue-router' import { gantt } from 'dhtmlx-gantt' import 'dhtmlx-gantt/codebase/dhtmlxgantt.css' -import { orderProjectApi } from '@/api/orderProject' +import { orderProjectApi, type KingdeePrdMo } from '@/api/orderProject' const router = useRouter() const ganttContainer = ref(null) @@ -24,11 +27,39 @@ const message = useMessage() let ganttEventIds: string[] = [] const tableData = ref([]) +const projectId = ref(null) +const saving = ref(false) function handleBack() { router.back() } +async function handleSaveDraft() { + if (!projectId.value) { + message.warning('缺少项目ID,无法保存') + return + } + + saving.value = true + try { + // 恢复数据结构,将 processRoutes 转换为 children + const draftData = tableData.value.map(mo => { + const { processRoutes, ...rest } = mo + return { ...rest, children: processRoutes } as KingdeePrdMo + }) + + await orderProjectApi.saveKingdeeOrderDraft(projectId.value, draftData) + message.success('排产草稿保存成功') + + // 更新 session 里的暂存,以防返回页面时不一致 + sessionStorage.setItem('gantt_schedule_data', JSON.stringify(tableData.value)) + } catch (error) { + // 错误拦截器已处理 + } finally { + saving.value = false + } +} + onMounted(async () => { try { @@ -36,6 +67,12 @@ onMounted(async () => { const stateStr = sessionStorage.getItem('gantt_schedule_data') + const idStr = sessionStorage.getItem('gantt_project_id') + + if (idStr) { + projectId.value = Number(idStr) + } + if (stateStr) { const parsedData = JSON.parse(stateStr) tableData.value = parsedData @@ -179,24 +216,49 @@ function renderGanttData() { ganttEventIds.push(evDragId) // 绑定拖拽结束事件 - const evId = gantt.attachEvent("onAfterTaskDrag", (id, mode, e) => { - const task = gantt.getTask(id) - if (mode === 'move' || mode === 'resize') { - const start = gantt.date.date_to_str(gantt.config.date_format)(task.start_date) - const end = gantt.date.date_to_str(gantt.config.date_format)(task.end_date) - - message.success(`任务 [${task.text}] 计划时间已更新: ${start} ~ ${end}`) - - // 更新原数据 - if (task._type === 'mo') { - task._raw.planStartTime = start - task._raw.planFinishTime = end - } else if (task._type === 'route') { - task._raw.planStartTime = start - task._raw.planFinishTime = end + const evId = gantt.attachEvent("onAfterTaskDrag", (id, mode, e) => { + const task = gantt.getTask(id) + if (mode === 'move' || mode === 'resize') { + const start = gantt.date.date_to_str(gantt.config.date_format)(task.start_date) + const end = gantt.date.date_to_str(gantt.config.date_format)(task.end_date) + + // 更新原数据 + if (task._type === 'mo') { + task._raw.planStartTime = start + task._raw.planFinishTime = end + } else if (task._type === 'route') { + task._raw.planStartTime = start + task._raw.planFinishTime = end + + // 自动汇总更新父级工单的时间 + const parentId = task.parent + if (parentId) { + const parentTask = gantt.getTask(parentId) + if (parentTask) { + const children = gantt.getChildren(parentId) + let minDate: Date | null = null + let maxDate: Date | null = null + + children.forEach((childId: string | number) => { + const childTask = gantt.getTask(childId) + if (!minDate || childTask.start_date < minDate) minDate = childTask.start_date + if (!maxDate || childTask.end_date > maxDate) maxDate = childTask.end_date + }) + + if (minDate && maxDate) { + parentTask.start_date = new Date(minDate) + parentTask.end_date = new Date(maxDate) + parentTask._raw.planStartTime = gantt.date.date_to_str(gantt.config.date_format)(minDate) + parentTask._raw.planFinishTime = gantt.date.date_to_str(gantt.config.date_format)(maxDate) + gantt.updateTask(parentId) + } + } + } + } + + message.success(`任务 [${task.text}] 计划时间已更新`) } - } - }) + }) ganttEventIds.push(evId) } diff --git a/src/views/biz/orderProject/index.vue b/src/views/biz/orderProject/index.vue index c8d7bc2..c0075fa 100644 --- a/src/views/biz/orderProject/index.vue +++ b/src/views/biz/orderProject/index.vue @@ -180,7 +180,15 @@ size="small" /> @@ -218,21 +226,30 @@