From f05c908a7dba4d225dd871f8f1f431db4b045e30 Mon Sep 17 00:00:00 2001 From: hwj Date: Mon, 6 Jul 2026 16:34:02 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E7=89=A9=E6=96=99=E6=A1=A3?= =?UTF-8?q?=E6=A1=88/=E7=94=9F=E4=BA=A7=E8=AE=A1=E5=88=92/=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E6=8E=92=E4=BA=A7-=E6=B7=BB=E5=8A=A0=E5=B7=A5?= =?UTF-8?q?=E8=89=BA=E8=B7=AF=E7=BA=BF=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/erp/product/category/index.ts | 9 +- src/api/erp/product/product/index.ts | 25 + src/api/erp/stock/stock/index.ts | 1 + src/api/mes/plan/index.ts | 61 +++ src/locales/en.ts | 38 +- src/locales/zh-CN.ts | 38 +- .../product/category/ProductCategoryForm.vue | 315 ++++++++++- src/views/mes/plan/PlanForm.vue | 505 +++++++++--------- src/views/mes/plan/components/PlanDetail.vue | 416 ++++++++++----- src/views/mes/plan/index.vue | 235 +++++++- 10 files changed, 1208 insertions(+), 435 deletions(-) diff --git a/src/api/erp/product/category/index.ts b/src/api/erp/product/category/index.ts index bf70d21c..21b9b525 100644 --- a/src/api/erp/product/category/index.ts +++ b/src/api/erp/product/category/index.ts @@ -9,8 +9,13 @@ export interface ProductCategoryVO { sort: number // 分类排序 status: number // 开启状态 type: number // 类型 + processRouteId?: string | number // 工艺路线 ID + processRouteName?: string // 工艺路线名称 } +const getProductCategoryRequestParams = (data: ProductCategoryVO) => ({ + processRouteId: data.processRouteId || undefined +}) // ERP 产品分类 API export const ProductCategoryApi = { // 查询产品分类分组树 @@ -35,12 +40,12 @@ export const ProductCategoryApi = { // 新增产品分类 createProductCategory: async (data: ProductCategoryVO) => { - return await request.post({ url: `/erp/product-category/create`, data }) + return await request.post({ url: `/erp/product-category/create`, data, params: getProductCategoryRequestParams(data) }) }, // 修改产品分类 updateProductCategory: async (data: ProductCategoryVO) => { - return await request.put({ url: `/erp/product-category/update`, data }) + return await request.put({ url: `/erp/product-category/update`, data, params: getProductCategoryRequestParams(data) }) }, // 删除产品分类 diff --git a/src/api/erp/product/product/index.ts b/src/api/erp/product/product/index.ts index 1f176047..968978f0 100644 --- a/src/api/erp/product/product/index.ts +++ b/src/api/erp/product/product/index.ts @@ -29,6 +29,26 @@ export interface ProductVO { moldList?: any[] } +export interface ErpProductCategoryProcessRouteItemRespVO { + id?: number + categoryId?: number + processRouteId?: number + processRouteItemId?: number + sort?: number + processParameterId?: number + processParameterCode?: string + processParameterName?: string + remark?: string + deviceId?: number | string + deviceName?: string +} + +export interface ErpProductProcessRouteRespVO { + productId?: number + processRouteId?: number + processRouteName?: string + processRouteItems?: ErpProductCategoryProcessRouteItemRespVO[] +} // ERP 产品 API export const ProductApi = { // 查询产品分页 @@ -57,6 +77,11 @@ export const ProductApi = { return await request.get({ url: `/erp/product/simple-list-component` }) }, + // 查询产品工艺路线快照 + getProductProcessRoute: async (productId: number | string) => { + return await request.get({ url: '/erp/product/get-process-route', params: { productId } }) + }, + // 查询产品详情 getProduct: async (id: number) => { return await request.get({ url: `/erp/product/get?id=` + id }) diff --git a/src/api/erp/stock/stock/index.ts b/src/api/erp/stock/stock/index.ts index 26ecb3ac..64d78c05 100644 --- a/src/api/erp/stock/stock/index.ts +++ b/src/api/erp/stock/stock/index.ts @@ -101,6 +101,7 @@ export interface StockVO { totalBaseCount?: number // 库存数量 count: number + lockedStockCount?: number latestInTime?: number | string lastInTime?: number | string recentInTime?: number | string diff --git a/src/api/mes/plan/index.ts b/src/api/mes/plan/index.ts index aa005db7..9eed98c3 100644 --- a/src/api/mes/plan/index.ts +++ b/src/api/mes/plan/index.ts @@ -31,6 +31,55 @@ export interface PlanRecordVO { createTime: number // 创建时间戳 } +export interface PlanProcessRouteItemVO { + id?: number + categoryId?: number + processRouteId?: number + processRouteItemId?: number + sort?: number + processParameterId?: number + processParameterCode?: string + processParameterName?: string + remark?: string + deviceId?: number | string + deviceName?: string +} +export interface LineChangeRecordVO { + id: number + planId: number + changeBatchNo?: string + planProcessRouteItemId: number + processParameterId?: number + processParameterName?: string + beforeDeviceId?: number + beforeDeviceName?: string + afterDeviceId?: number + afterDeviceName?: string + changeTime?: string + operatorUserId?: number + passNumber?: number + remark?: string +} +export interface LineChangeRecordBatchVO { + changeBatchNo: string + planId: number + changeTime?: string + operatorUserId?: number + passNumber?: number + remark?: string + changeCount?: number + items?: LineChangeRecordVO[] +} +export interface LineChangeRecordPageReqVO { + planId: number | string + pageNo: number + pageSize: number +} +export interface ChangeLineBatchItemVO { + planProcessRouteItemId: number | string + deviceId: number | string + remark?: string +} // 生产计划 VO export interface PlanVO { id: number // ID @@ -59,6 +108,9 @@ export interface PlanVO { passNumber?: number // 合格数量 noPassNumber?: number // 不合格数量 deviceName?: string // 设备名称 + processRouteId?: number | string // 工艺路线 ID + processRouteName?: string // 工艺路线名称 + processRouteItems?: PlanProcessRouteItemVO[] // 工艺路线明细 planRecordList?: PlanRecordVO[] // 计划记录列表 } @@ -179,6 +231,15 @@ export const PlanApi = { return await request.get({ url: `/mes/plan/page-by-task`, params }) }, + changeLine: async (params: { planId: number | string; planProcessRouteItemId: number | string; deviceId: number | string }) => { + return await request.put({ url: `/mes/plan/change-line`, params }) + }, + changeLineBatch: async (params: { planId: number | string; items: ChangeLineBatchItemVO[] }) => { + return await request.put({ url: `/mes/plan/change-line-batch`, data: params }) + }, + getLineChangeRecordPage: async (params: LineChangeRecordPageReqVO) => { + return await request.get<{ list: LineChangeRecordBatchVO[]; total: number }>({ url: `/mes/plan/line-change-record/page`, params }) + }, getProductCapacityPage: async (params: any) => { return await request.get({ url: `/mes/plan/product-capacity-page`, params }) } diff --git a/src/locales/en.ts b/src/locales/en.ts index 71674546..5222b8aa 100644 --- a/src/locales/en.ts +++ b/src/locales/en.ts @@ -775,6 +775,7 @@ export default { materialLabel: 'Material', sparePartLabel: 'Spare Part', stock: 'Stock', + lockedStock: 'Locked Stock', barcode: 'Barcode', unit: 'Unit', inventoryUnit: 'Inventory Unit', @@ -2567,6 +2568,7 @@ export default { tableSortColumn: 'Sort', tableStatusColumn: 'Status', tableCreateTimeColumn: 'Create Time', + tableRemarkColumn: 'Remark', tableOperateColumn: 'Operation', tableEditAction: 'Edit', tableDeleteAction: 'Delete', @@ -2576,6 +2578,8 @@ export default { dialogCodePlaceholder: 'Please enter code', dialogNameLabel: 'Name', dialogNamePlaceholder: 'Please enter name', + dialogProcessRouteLabel: 'Process Route', + dialogProcessRoutePlaceholder: 'Please select process route', dialogTypeLabel: 'Type', dialogSortLabel: 'Sort', dialogSortPlaceholder: 'Please enter sort', @@ -2588,7 +2592,14 @@ export default { validatorCodeRequired: 'Code can not be empty', validatorSortRequired: 'Sort can not be empty', validatorStatusRequired: 'Status can not be empty', - validatorTypeRequired: 'Type can not be empty' + validatorTypeRequired: 'Type can not be empty', + processRouteDialogTitle: 'Select Process Route', + processRouteCodeLabel: 'Process Route Code', + processRouteCodePlaceholder: 'Please enter process route code', + processRouteNameLabel: 'Process Route Name', + processRouteNamePlaceholder: 'Please enter process route name', + processRouteSelectButton: 'Select', + processRouteSelectRequired: 'Please select process route' }, ProductInformation: { moduleName: 'Product Material Information', @@ -4779,11 +4790,30 @@ export default { dialogTaskPlaceholder: 'Please select task order', dialogTaskDetailLabel: 'Detail Item', dialogTaskDetailPlaceholder: 'Please select detail item', + dialogTaskDetailUnplannedPrefix: 'Unplanned ', dialogCodeLabel: 'Plan Code', dialogCodeTooltip: 'Production plan code', dialogCodePlaceholder: 'Code will be generated automatically after saving', dialogFeedingPipelineLabel: 'Production Line', dialogFeedingPipelinePlaceholder: 'Please select production line', + dialogDeliveryDateLabel: 'Delivery Date', + dialogLatestStartLabel: 'Latest Start Time', + dialogLatestStartPlaceholder: 'Please select latest start time', + dialogProcessRouteLabel: 'Process Route', + dialogProcessRouteItemsLabel: 'Process Route Items', + dialogProcessRouteEmptyText: 'No process route', + routeItemSortColumn: 'Sort', + routeItemParameterCodeColumn: 'Process Parameter Code', + routeItemParameterNameColumn: 'Process Parameter Name', + routeItemRemarkColumn: 'Remark', + routeItemDeviceColumn: 'Device', + routeItemDevicePlaceholder: 'Please select device', + routeItemDeviceSelectButton: 'Select', + selectDeviceDialogTitle: 'Select Device', + deviceColumnCode: 'Device Code', + deviceColumnName: 'Device Name', + deviceColumnModel: 'Device Model', + deviceColumnWorkshop: 'Workshop', dialogWorkerLabel: 'Feeding Worker', dialogWorkerPlaceholder: 'Please select worker', dialogPlanNumberLabel: 'Quantity', @@ -4802,6 +4832,12 @@ export default { validatorPlanNumberRequired: 'Quantity cannot be empty', validatorPlanStartRequired: 'Plan start time cannot be empty', validatorPlanEndRequired: 'Plan end time cannot be empty', + validatorLatestStartRequired: 'Please select latest start time', + validatorLatestStartAfterDelivery: 'Latest start time cannot be later than delivery date', + validatorPlanStartBeforeEnd: 'Plan start time cannot be later than plan end time', + validatorPlanEndAfterStart: 'Plan end time cannot be earlier than plan start time', + validatorPlanNumberNumeric: 'Plan quantity must be a number', + validatorPlanNumberLimit: 'Plan quantity cannot be greater than unplanned quantity {limit}', validatorFeedingPipelineRequired: 'Production line cannot be empty', validatorWorkerRequired: 'Feeding worker cannot be empty', validatorPreProductionRequired: 'Trial production cannot be empty', diff --git a/src/locales/zh-CN.ts b/src/locales/zh-CN.ts index c036444e..f0a77337 100644 --- a/src/locales/zh-CN.ts +++ b/src/locales/zh-CN.ts @@ -775,6 +775,7 @@ export default { materialLabel: '物料', sparePartLabel: '备件', stock: '库存', + lockedStock: '锁定库存', barcode: '编码', unit: '单位', inventoryUnit: '库存单位', @@ -3797,6 +3798,7 @@ export default { tableSortColumn: '排序', tableStatusColumn: '状态', tableCreateTimeColumn: '创建时间', + tableRemarkColumn: '备注', tableOperateColumn: '操作', tableEditAction: '编辑', tableDeleteAction: '删除', @@ -3806,6 +3808,8 @@ export default { dialogCodePlaceholder: '请输入编码', dialogNameLabel: '名称', dialogNamePlaceholder: '请输入名称', + dialogProcessRouteLabel: '工艺路线', + dialogProcessRoutePlaceholder: '请选择工艺路线', dialogTypeLabel: '类型', dialogSortLabel: '排序', dialogSortPlaceholder: '请输入排序', @@ -3818,7 +3822,14 @@ export default { validatorCodeRequired: '编码不能为空', validatorSortRequired: '排序不能为空', validatorStatusRequired: '状态不能为空', - validatorTypeRequired: '类型不能为空' + validatorTypeRequired: '类型不能为空', + processRouteDialogTitle: '选择工艺路线', + processRouteCodeLabel: '工艺路线编码', + processRouteCodePlaceholder: '请输入工艺路线编码', + processRouteNameLabel: '工艺路线名称', + processRouteNamePlaceholder: '请输入工艺路线名称', + processRouteSelectButton: '选择', + processRouteSelectRequired: '请选择工艺路线' }, ProductInformation: { moduleName: '产品物料信息', @@ -4627,11 +4638,30 @@ export default { dialogTaskPlaceholder: '请选择任务单', dialogTaskDetailLabel: '明细项', dialogTaskDetailPlaceholder: '请选择明细项', + dialogTaskDetailUnplannedPrefix: '未计划', dialogCodeLabel: '计划编码', dialogCodeTooltip: '生产计划编码', dialogCodePlaceholder: '编码保存后自动生成', dialogFeedingPipelineLabel: '生产线', dialogFeedingPipelinePlaceholder: '请选择生产线', + dialogDeliveryDateLabel: '交货日期', + dialogLatestStartLabel: '最晚开工时间', + dialogLatestStartPlaceholder: '请选择最晚开工时间', + dialogProcessRouteLabel: '工艺路线', + dialogProcessRouteItemsLabel: '工艺路线明细', + dialogProcessRouteEmptyText: '暂无工艺路线', + routeItemSortColumn: '排序', + routeItemParameterCodeColumn: '工艺参数编码', + routeItemParameterNameColumn: '工艺参数名称', + routeItemRemarkColumn: '备注', + routeItemDeviceColumn: '设备', + routeItemDevicePlaceholder: '请选择设备', + routeItemDeviceSelectButton: '选择', + selectDeviceDialogTitle: '选择设备', + deviceColumnCode: '设备编号', + deviceColumnName: '设备名称', + deviceColumnModel: '设备型号', + deviceColumnWorkshop: '所属车间', dialogWorkerLabel: '领料人', dialogWorkerPlaceholder: '请选择领料人', dialogPlanNumberLabel: '数量', @@ -4650,6 +4680,12 @@ export default { validatorPlanNumberRequired: '数量不能为空', validatorPlanStartRequired: '计划开始时间不能为空', validatorPlanEndRequired: '计划结束时间不能为空', + validatorLatestStartRequired: '请选择最晚开工时间', + validatorLatestStartAfterDelivery: '最晚开工时间不能晚于交货日期', + validatorPlanStartBeforeEnd: '计划开始时间不能晚于计划结束时间', + validatorPlanEndAfterStart: '计划结束时间不能早于计划开始时间', + validatorPlanNumberNumeric: '计划数量必须为数字', + validatorPlanNumberLimit: '计划数量不能大于未计划数量{limit}', validatorFeedingPipelineRequired: '生产线不能为空', validatorWorkerRequired: '下料工人不能为空', validatorPreProductionRequired: '试生产不能为空', diff --git a/src/views/erp/product/category/ProductCategoryForm.vue b/src/views/erp/product/category/ProductCategoryForm.vue index 8323ba28..6b39e62f 100644 --- a/src/views/erp/product/category/ProductCategoryForm.vue +++ b/src/views/erp/product/category/ProductCategoryForm.vue @@ -29,13 +29,38 @@ /> - + + + + + + - + @@ -50,35 +75,157 @@ + + + +
+ + + + + + + + + + {{ t('FactoryModeling.ProductCategory.searchButtonText') }} + + + {{ t('FactoryModeling.ProductCategory.resetButtonText') }} + + + + + + + + + + + + + + +
+ +
+
+
+ + + diff --git a/src/views/mes/plan/PlanForm.vue b/src/views/mes/plan/PlanForm.vue index 2bc3551a..e0e9b44a 100644 --- a/src/views/mes/plan/PlanForm.vue +++ b/src/views/mes/plan/PlanForm.vue @@ -1,14 +1,13 @@ - - - diff --git a/src/views/mes/plan/components/PlanDetail.vue b/src/views/mes/plan/components/PlanDetail.vue index 173256d3..5b768310 100644 --- a/src/views/mes/plan/components/PlanDetail.vue +++ b/src/views/mes/plan/components/PlanDetail.vue @@ -1,129 +1,230 @@ + + \ No newline at end of file diff --git a/src/views/mes/plan/index.vue b/src/views/mes/plan/index.vue index 2e9e8b38..290c1863 100644 --- a/src/views/mes/plan/index.vue +++ b/src/views/mes/plan/index.vue @@ -72,21 +72,6 @@ - - - - - + @@ -132,19 +117,22 @@ - +