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/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..e476c08 --- /dev/null +++ b/src/views/biz/orderProject/components/GanttSchedule.vue @@ -0,0 +1,243 @@ + + + + + \ 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..c8d7bc2 --- /dev/null +++ b/src/views/biz/orderProject/index.vue @@ -0,0 +1,857 @@ + + + + +