From 5fae83d994995f6c95b3d01366da58adf04a278d Mon Sep 17 00:00:00 2001 From: tzy <1042411602@qq.com> Date: Mon, 1 Jun 2026 10:40:30 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E9=83=A8=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.json | 1 + src/api/orderProject.ts | 142 +++ .../orderProject/components/GanttSchedule.vue | 162 ++++ src/views/biz/orderProject/index.vue | 872 ++++++++++++++++++ vite.config.ts | 5 +- 5 files changed, 1180 insertions(+), 2 deletions(-) create mode 100644 src/api/orderProject.ts create mode 100644 src/views/biz/orderProject/components/GanttSchedule.vue create mode 100644 src/views/biz/orderProject/index.vue diff --git a/package.json b/package.json index bbf93b2..4158236 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,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", diff --git a/src/api/orderProject.ts b/src/api/orderProject.ts new file mode 100644 index 0000000..1db6bc2 --- /dev/null +++ b/src/api/orderProject.ts @@ -0,0 +1,142 @@ +import { request } from '@/utils/request' + +// 项目表 类型定义 +export interface OrderProject { + id?: number + + name?: string + + code?: string + + mainCode?: string + + mainName?: string + + quantity?: string + + source?: number + + prodType?: number + + sourceId?: string + + bomVersion?: string + + specModel?: string + + unit?: string + + customerName?: string + + version?: string + + salesDept?: string + + parentId?: number + + deliveryTime?: string + + status?: number + + planFinishTime?: string + + createTime?: string + + createBy?: string + + changeTime?: string + + changeBy?: string + +} + +/** 金蝶生产订单(树父节点) */ +export interface KingdeePrdMo { + productionOrderNo: string + billNo: string + workShopName: string + materialCode: string + quantity: number | null + specModel: string | null + unit: string | null + materialName: string | null + routingNo: string | null + planStartTime: string | null + planFinishTime: string | null + pickMtrlStatus: string | null + children: KingdeeProcessRoute[] +} + +/** 金蝶工艺路线工序(树子节点) */ +export interface KingdeeProcessRoute { + operNumber: number | null + workCenterName: string | null + departmentName: string | null + processProperty: string | null + operDescription: string | null + activityUnit: string | null + optCtrlCodeName: string | null + activityQty: number | null + planStartTime: string | null + planFinishTime: string | null +} + +// 项目表 API +export const orderProjectApi = { + // 分页查询 + page(params: { page: number; pageSize: number; id?: number; name?: string; status?: number }) { + return request({ url: '/biz/orderProject/page', method: 'get', params }) + }, + + // 获取详情 + detail(id: string) { + return request({ url: `/biz/orderProject/${id}`, method: 'get' }) + }, + + // 新增 + create(data: OrderProject) { + return request({ url: '/biz/orderProject', method: 'post', data }) + }, + + // 修改 + update(data: OrderProject) { + return request({ url: '/biz/orderProject', method: 'put', data }) + }, + + // 删除 + delete(ids: string[]) { + return request({ url: `/biz/orderProject/${ids.join(',')}`, method: 'delete' }) + }, + + // 导出 + export(params?: { ids?: string[]; id?: number; name?: string; status?: number }) { + const p: Record = {} + if (params?.ids?.length) p.ids = params.ids.join(',') + if (params?.id !== undefined && params?.id !== null) p.id = params.id + if (params?.name !== undefined && params?.name !== null) p.name = params.name + if (params?.status !== undefined && params?.status !== null) p.status = params.status + return request({ url: `/biz/orderProject/export`, method: 'get', params: p, responseType: 'blob' }) + }, + + // 导入 + importData(file: File) { + const formData = new FormData() + formData.append('file', file) + return request<{ success: number; fail: number; errors: string[] }>({ + url: `/biz/orderProject/import`, + method: 'post', + data: formData, + headers: { 'Content-Type': 'multipart/form-data' } + }) + }, + + // 下载导入模板 + downloadTemplate() { + return request({ url: `/biz/orderProject/template`, method: 'get', responseType: 'blob' }) + }, + + // 查询金蝶生产订单 + getKingdeeOrder(id: number) { + return request({ url: `/biz/orderProject/kingdee/order/${id}`, method: 'get' }) + }, +} diff --git a/src/views/biz/orderProject/components/GanttSchedule.vue b/src/views/biz/orderProject/components/GanttSchedule.vue new file mode 100644 index 0000000..a9bb8be --- /dev/null +++ b/src/views/biz/orderProject/components/GanttSchedule.vue @@ -0,0 +1,162 @@ + + + + + \ No newline at end of file diff --git a/src/views/biz/orderProject/index.vue b/src/views/biz/orderProject/index.vue new file mode 100644 index 0000000..914de76 --- /dev/null +++ b/src/views/biz/orderProject/index.vue @@ -0,0 +1,872 @@ + + + + + diff --git a/vite.config.ts b/vite.config.ts index ea60498..c74694c 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -16,11 +16,12 @@ export default defineConfig({ emptyOutDir: true }, server: { - host: "192.168.5.231", + // host: "192.168.5.231", + host: true, port: 3000, proxy: { '/api': { - target:'http://192.168.6.107:8080', //'http://192.168.5.230:8888', + target:'http://localhost:8888', //'http://192.168.5.230:8888', //target:'http://192.168.5.230:8888', changeOrigin: true }, 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 2/2] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E9=83=A8=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') } // 金蝶预生产查询