From fdd0da6b46bb236a7ea080e81595ad6b3e37e5bd Mon Sep 17 00:00:00 2001 From: tzy <1042411602@qq.com> Date: Sat, 18 Jul 2026 10:13:53 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A7=94=E5=A4=96=EF=BC=8C=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mes-ui/src/api/outsourcing.ts | 100 ++++ mes-ui/src/views/biz/outsourcing/index.vue | 492 +++++++++++++++ src/api/device.ts | 37 ++ src/api/orderProcessPlan.ts | 57 ++ src/api/outsourcing.ts | 105 ++++ src/router/index.ts | 24 + src/utils/request.ts | 4 +- src/views/biz/device/board.vue | 438 ++++++++++++++ src/views/biz/device/index.vue | 25 +- src/views/biz/orderProcessPlan/board.vue | 558 +++++++++++++++++- .../components/ProcessCard.vue | 10 + .../components/ProcessFlowStepper.vue | 31 +- src/views/biz/orderProcessPlan/index.vue | 15 +- src/views/biz/outsourcing/index.vue | 539 +++++++++++++++++ vite.config.ts | 5 +- 15 files changed, 2412 insertions(+), 28 deletions(-) create mode 100644 mes-ui/src/api/outsourcing.ts create mode 100644 mes-ui/src/views/biz/outsourcing/index.vue create mode 100644 src/api/outsourcing.ts create mode 100644 src/views/biz/device/board.vue create mode 100644 src/views/biz/outsourcing/index.vue diff --git a/mes-ui/src/api/outsourcing.ts b/mes-ui/src/api/outsourcing.ts new file mode 100644 index 0000000..cd1e044 --- /dev/null +++ b/mes-ui/src/api/outsourcing.ts @@ -0,0 +1,100 @@ +import { request } from '@/utils/request' + +// 委外记录表 类型定义 +export interface Outsourcing { + id?: number + + name?: string + + code?: string + + businessType?: number + + businessId?: number + + businessCode?: string + + orderItemId?: number + + quantity?: number + + supplierId?: number + + supplierName?: string + + unitPrice?: string + + totalAmount?: string + + beginPreparationTime?: string + + endPreparationTime?: string + + beginTime?: string + + endTime?: string + + remark?: string + + createTime?: string + + createBy?: string + + overdue?: number + +} + +// 委外记录表 API +export const outsourcingApi = { + // 分页查询 + page(params: { page: number; pageSize: number; id?: number; name?: string; businessType?: number }) { + return request({ url: '/biz/outsourcing/page', method: 'get', params }) + }, + + // 获取详情 + detail(id: string) { + return request({ url: `/biz/outsourcing/${id}`, method: 'get' }) + }, + + // 新增 + create(data: Outsourcing) { + return request({ url: '/biz/outsourcing', method: 'post', data }) + }, + + // 修改 + update(data: Outsourcing) { + return request({ url: '/biz/outsourcing', method: 'put', data }) + }, + + // 删除 + delete(ids: string[]) { + return request({ url: `/biz/outsourcing/${ids.join(',')}`, method: 'delete' }) + }, + + // 导出 + export(params?: { ids?: string[]; id?: number; name?: string; businessType?: 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?.businessType !== undefined && params?.businessType !== null) p.businessType = params.businessType + return request({ url: `/biz/outsourcing/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/outsourcing/import`, + method: 'post', + data: formData, + headers: { 'Content-Type': 'multipart/form-data' } + }) + }, + + // 下载导入模板 + downloadTemplate() { + return request({ url: `/biz/outsourcing/template`, method: 'get', responseType: 'blob' }) + } +} diff --git a/mes-ui/src/views/biz/outsourcing/index.vue b/mes-ui/src/views/biz/outsourcing/index.vue new file mode 100644 index 0000000..0b68648 --- /dev/null +++ b/mes-ui/src/views/biz/outsourcing/index.vue @@ -0,0 +1,492 @@ + + + + + diff --git a/src/api/device.ts b/src/api/device.ts index ff636b2..ac2a6bb 100644 --- a/src/api/device.ts +++ b/src/api/device.ts @@ -8,16 +8,37 @@ export interface Device{ deviceTypeId:number, deviceType:string, sectionId:number, + sectionName?:string, spec:string, manufacturer:string, manufactureDate:string, workshopId:number, remark:string, status:number, + deviceFlag?:string, + /** 新代 SynFactory equipID */ + synEquipId?: number | null, createTime:string, updateTime:string } +export interface DeviceRealtimeVO { + deviceId?: number + deviceCode?: string + displayName: string + synEquipId: number + bound: boolean + connected?: number | null + cncStatus?: number | null + cncStatusText?: string + partCount?: number | null + mainProgram?: string | null + alarmCount?: number + alarmMessages?: string[] + dataTimestamp?: number + sectionName?: string +} + export const deviceApi = { @@ -25,6 +46,7 @@ export const deviceApi = { page:number, pageSize:number, deviceCode:any + deviceFlag?: string }) { return request({ url:"/biz/device/page", @@ -33,6 +55,21 @@ export const deviceApi = { }) }, + /** 设备机联网看板:MES名称 + 新代即时状态 */ + realtimeBoard(equipIds?: string | number[]) { + const params: Record = {} + if (Array.isArray(equipIds) && equipIds.length) { + params.equipIds = equipIds.join(',') + } else if (typeof equipIds === 'string' && equipIds) { + params.equipIds = equipIds + } + return request({ + url: '/biz/device/realtime-board', + method: 'get', + params + }) + }, + create(data:Device) { return request({ url:"/biz/device", diff --git a/src/api/orderProcessPlan.ts b/src/api/orderProcessPlan.ts index 9b0da35..35f9c32 100644 --- a/src/api/orderProcessPlan.ts +++ b/src/api/orderProcessPlan.ts @@ -64,6 +64,8 @@ export interface ProcessPlanItemVO { planId?: number + workOrderCode?: string + processCode?: string operNumber?: number @@ -442,5 +444,60 @@ export const orderProcessPlanApi = { }, + /** 委外第一步:获取可选工序 */ + getOutsourcingOptions(processPlanId: number) { + return request({ + url: `/biz/orderProcessPlan/outsourcing/options/${processPlanId}`, + method: 'get', + }) + }, + + /** 委外第二步:创建委外单 */ + createOutsourcing(data: OutsourcingCreate) { + return request({ + url: '/biz/orderProcessPlan/outsourcing', + method: 'post', + data, + }) + }, + +} + +/** 委外可选工序项 */ +export interface OutsourcingProcessOption { + planId?: number + workOrderCode?: string + processCode?: string + operNumber?: number + processName?: string + quantity?: number + outsource?: number + planStartTime?: string + planFinishTime?: string + current?: boolean +} + +/** 委外可选工序(第一步) */ +export interface OutsourcingOptions { + orderItemId?: number + mainCode?: string + materialCode?: string + materialName?: string + orderCode?: string + quantity?: number + currentProcessPlanId?: number + processList?: OutsourcingProcessOption[] +} + +/** 创建委外单(第二步) */ +export interface OutsourcingCreate { + processPlanId: number + supplierId?: number + supplierName: string + quantity: number + unitPrice?: number + planStartTime?: string + planEndTime?: string + remark?: string } diff --git a/src/api/outsourcing.ts b/src/api/outsourcing.ts new file mode 100644 index 0000000..be639fd --- /dev/null +++ b/src/api/outsourcing.ts @@ -0,0 +1,105 @@ +import { request } from '@/utils/request' + +/** 委外工单 */ +export interface Outsourcing { + id?: number + outsourceCode?: string + name?: string + code?: string + businessType?: number + businessId?: number + businessCode?: string + orderItemId?: number + quantity?: number + supplierId?: number + supplierName?: string + unitPrice?: number | string + totalAmount?: number | string + beginPreparationTime?: string + endPreparationTime?: string + beginTime?: string + endTime?: string + remark?: string + createTime?: string + createBy?: string + overdue?: number + /** 0草稿 1执行中 2已完成 3已关闭 */ + status?: number + /** 1正常 2紧急 3低 */ + priority?: number + issuedQuantity?: number | string + receivedQuantity?: number | string + qualifiedQuantity?: number | string +} + +export const OUTSOURCE_STATUS_MAP: Record = { + 0: { label: '草稿', type: 'default' }, + 1: { label: '执行中', type: 'info' }, + 2: { label: '已完成', type: 'success' }, + 3: { label: '已关闭', type: 'default' }, +} + +export const OUTSOURCE_PRIORITY_MAP: Record = { + 1: { label: '正常', type: 'info' }, + 2: { label: '紧急', type: 'error' }, + 3: { label: '低', type: 'default' }, +} + +export const outsourcingApi = { + page(params: { + page: number + pageSize: number + id?: number + name?: string + businessType?: number + outsourceCode?: string + supplierName?: string + status?: number + }) { + return request<{ list: Outsourcing[]; total: number; page: number; pageSize: number }>({ + url: '/biz/outsourcing/page', + method: 'get', + params, + }) + }, + + detail(id: number | string) { + return request({ url: `/biz/outsourcing/${id}`, method: 'get' }) + }, + + create(data: Outsourcing) { + return request({ url: '/biz/outsourcing', method: 'post', data }) + }, + + update(data: Outsourcing) { + return request({ url: '/biz/outsourcing', method: 'put', data }) + }, + + delete(ids: number[]) { + return request({ url: `/biz/outsourcing/${ids.join(',')}`, method: 'delete' }) + }, + + export(params?: { ids?: number[]; id?: number; name?: string; businessType?: number }) { + const p: Record = {} + if (params?.ids?.length) p.ids = params.ids.join(',') + if (params?.id != null) p.id = params.id + if (params?.name) p.name = params.name + if (params?.businessType != null) p.businessType = params.businessType + return request({ url: '/biz/outsourcing/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/outsourcing/import', + method: 'post', + data: formData, + headers: { 'Content-Type': 'multipart/form-data' }, + }) + }, + + downloadTemplate() { + return request({ url: '/biz/outsourcing/template', method: 'get', responseType: 'blob' }) + }, +} diff --git a/src/router/index.ts b/src/router/index.ts index 4da2bfa..ff3851a 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -148,6 +148,24 @@ const routes: RouteRecordRaw[] = [ component: () => import('@/views/biz/orderProcessPlan/index.vue'), meta: { title: '工序计划', icon: 'ListOutline' } }, + { + path: 'biz/orderProcessPlan/board', + name: 'orderProcessPlanBoard', + component: () => import('@/views/biz/orderProcessPlan/board.vue'), + meta: { title: '工序计划看板', icon: 'ListOutline', activeMenu: '/biz/orderProcessPlan' } + }, + { + path: 'biz/device', + name: 'device', + component: () => import('@/views/biz/device/index.vue'), + meta: { title: '设备管理', icon: 'HardwareChipOutline' } + }, + { + path: 'biz/device/board', + name: 'deviceRealtimeBoard', + component: () => import('@/views/biz/device/board.vue'), + meta: { title: '设备状态看板', icon: 'GridOutline', activeMenu: '/biz/device' } + }, { path: 'biz/user', name: 'user', @@ -264,6 +282,12 @@ const routes: RouteRecordRaw[] = [ component: () => import('@/views/biz/flowingAround/index.vue'), meta: { title: '流转记录表', icon: 'ListOutline' } }, + { + path: 'biz/outsourcing', + name: 'outsourcing', + component: () => import('@/views/biz/outsourcing/index.vue'), + meta: { title: '工序委外', icon: 'ListOutline' } + }, { // 开发工具 path: 'tool/gen', diff --git a/src/utils/request.ts b/src/utils/request.ts index 2f5fe72..9a67eae 100644 --- a/src/utils/request.ts +++ b/src/utils/request.ts @@ -116,8 +116,8 @@ async function decryptResponseData(data: string): Promise { // 创建axios实例 // 后端 API 统一使用 /api 前缀 const service: AxiosInstance = axios.create({ - // baseURL:'/api', - baseURL: BASE_API, + baseURL:'/api', + //baseURL: BASE_API, timeout: 30000 }) diff --git a/src/views/biz/device/board.vue b/src/views/biz/device/board.vue new file mode 100644 index 0000000..13ea600 --- /dev/null +++ b/src/views/biz/device/board.vue @@ -0,0 +1,438 @@ + + + + + + + diff --git a/src/views/biz/device/index.vue b/src/views/biz/device/index.vue index f89c3a1..ced75dd 100644 --- a/src/views/biz/device/index.vue +++ b/src/views/biz/device/index.vue @@ -29,6 +29,9 @@ 新增设备 + + 设备状态看板 + + + + + + + + + + @@ -338,17 +526,18 @@ diff --git a/vite.config.ts b/vite.config.ts index 632bef7..1fa2d3a 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -16,14 +16,13 @@ export default defineConfig({ emptyOutDir: true }, server: { - // 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://192.168.5.230:8888', - //target:'http://192.168.5.200:8888', + //target:'http://192.168.5.230:8888', + target:'http://localhost:8888', changeOrigin: true }, '/druid': {