From 8794a8cfc63f96985076b58f64d8b1b64b957f97 Mon Sep 17 00:00:00 2001 From: tzy <1042411602@qq.com> Date: Mon, 1 Jun 2026 13:59:37 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E7=AE=A1=E7=90=86=E9=83=A8?= =?UTF-8?q?=E5=88=86=E7=94=98=E7=89=B9=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 28 +++ src/router/index.ts | 13 ++ .../orderProject/components/GanttSchedule.vue | 211 ++++++++++++------ src/views/biz/orderProject/index.vue | 29 +-- 4 files changed, 194 insertions(+), 87 deletions(-) diff --git a/package-lock.json b/package-lock.json index 30b5d4e..14b0c0a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,7 @@ "@xterm/addon-fit": "^0.11.0", "@xterm/xterm": "^6.0.0", "axios": "^1.6.5", + "dhtmlx-gantt": "^9.1.4", "disable-devtool": "^0.3.9", "echarts": "^6.0.0", "jsencrypt": "^3.3.2", @@ -19,6 +20,7 @@ "pinia": "^2.1.7", "pinia-plugin-persistedstate": "^3.2.1", "vue": "^3.4.15", + "vue-draggable-plus": "^0.6.1", "vue-router": "^4.2.5" }, "devDependencies": { @@ -1201,6 +1203,11 @@ "undici-types": "~6.21.0" } }, + "node_modules/@types/sortablejs": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/@types/sortablejs/-/sortablejs-1.15.9.tgz", + "integrity": "sha512-7HP+rZGE2p886PKV9c9OJzLBI6BBJu1O7lJGYnPyG3fS4/duUCcngkNCjsLwIMV+WMqANe3tt4irrXHSIe68OQ==" + }, "node_modules/@vicons/ionicons5": { "version": "0.12.0", "resolved": "https://registry.npmmirror.com/@vicons/ionicons5/-/ionicons5-0.12.0.tgz", @@ -1555,6 +1562,11 @@ "node": ">=8" } }, + "node_modules/dhtmlx-gantt": { + "version": "9.1.4", + "resolved": "https://registry.npmjs.org/dhtmlx-gantt/-/dhtmlx-gantt-9.1.4.tgz", + "integrity": "sha512-XCNA5QUiuV79Xq1ykNpH9LFNR2IVpDZMqnmBV6dsBeOkHyPMOpkyQ/gqAPCcK2GAvYHoN2nGAMYb2LldCWhMuQ==" + }, "node_modules/disable-devtool": { "version": "0.3.9", "resolved": "https://registry.npmmirror.com/disable-devtool/-/disable-devtool-0.3.9.tgz", @@ -2392,6 +2404,22 @@ } } }, + "node_modules/vue-draggable-plus": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/vue-draggable-plus/-/vue-draggable-plus-0.6.1.tgz", + "integrity": "sha512-FbtQ/fuoixiOfTZzG3yoPl4JAo9HJXRHmBQZFB9x2NYCh6pq0TomHf7g5MUmpaDYv+LU2n6BPq2YN9sBO+FbIg==", + "dependencies": { + "@types/sortablejs": "^1.15.8" + }, + "peerDependencies": { + "@types/sortablejs": "^1.15.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, "node_modules/vue-router": { "version": "4.6.4", "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.6.4.tgz", diff --git a/src/router/index.ts b/src/router/index.ts index 5ceceab..711c57d 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -116,6 +116,19 @@ const routes: RouteRecordRaw[] = [ component: () => import('@/views/org/post/index.vue'), meta: { title: '岗位管理', icon: 'IdCardOutline' } }, + // 项目管理 + { + path: 'biz/orderProject', + name: 'OrderProject', + component: () => import('@/views/biz/orderProject/index.vue'), + meta: { title: '项目管理', icon: 'PersonOutline' } + }, + { + path: 'biz/orderProject/gantt', + name: 'OrderProjectGantt', + component: () => import('@/views/biz/orderProject/components/GanttSchedule.vue'), + meta: { title: '甘特图排产', icon: 'CalendarOutline', activeMenu: '/biz/orderProject' } + }, //运营管理 { path: 'biz/product', diff --git a/src/views/biz/orderProject/components/GanttSchedule.vue b/src/views/biz/orderProject/components/GanttSchedule.vue index a9bb8be..e476c08 100644 --- a/src/views/biz/orderProject/components/GanttSchedule.vue +++ b/src/views/biz/orderProject/components/GanttSchedule.vue @@ -1,57 +1,66 @@ \ No newline at end of file diff --git a/src/views/biz/orderProject/index.vue b/src/views/biz/orderProject/index.vue index 914de76..c8d7bc2 100644 --- a/src/views/biz/orderProject/index.vue +++ b/src/views/biz/orderProject/index.vue @@ -214,13 +214,6 @@ 关闭 - - - @@ -231,11 +224,13 @@ import { SearchOutline, RefreshOutline, AddOutline, TrashOutline, CreateOutline, import { orderProjectApi, type OrderProject, type KingdeePrdMo, type KingdeeProcessRoute } from '@/api/orderProject' import { dictDataApi } from '@/api/org' import { useUserStore } from '@/stores/user' -import GanttSchedule from './components/GanttSchedule.vue' + +import { useRouter } from 'vue-router' const message = useMessage() const dialog = useDialog() const userStore = useUserStore() +const router = useRouter() const hasPermission = (permission: string) => userStore.hasPermission(permission) // 搜索表单 @@ -264,7 +259,6 @@ const importModalVisible = ref(false) const kingdeeModalVisible = ref(false) const kingdeeModalTitle = ref('金蝶生产订单') const kingdeeLoading = ref(false) -const ganttModalVisible = ref(false) /** 主表行:工序仅存 processRoutes,避免 children 触发树形重复行 */ type KingdeeMoTableRow = Omit & { processRoutes: KingdeeProcessRoute[] } @@ -647,19 +641,10 @@ async function handleSubmit() { // 甘特图排产 function handleGanttSchedule() { - ganttModalVisible.value = true -} - -// 接收甘特图拖拽更新的时间 -function handleGanttTimeUpdate(payload: { id: string; type: string; item: any; start: string; end: string }) { - const { type, item, start, end } = payload - if (type === 'mo') { - item.planStartTime = start - item.planFinishTime = end - } else if (type === 'route') { - item.planStartTime = start - item.planFinishTime = end - } + // 将待排产数据存入 sessionStorage + sessionStorage.setItem('gantt_schedule_data', JSON.stringify(kingdeeTableData.value)) + // 跳转到甘特图排产独立页面 + router.push('/biz/orderProject/gantt') } // 金蝶预生产查询