From 5153adf1cf0915af22c3c338b77f787721b209b3 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 15 Feb 2026 22:18:46 +0800 Subject: [PATCH] =?UTF-8?q?feat(mes):=20=E5=AE=8C=E5=96=84=E8=AE=A1?= =?UTF-8?q?=E9=87=8F=E5=8D=95=E4=BD=8D=E3=80=81=E7=89=A9=E6=96=99=E5=AF=BC?= =?UTF-8?q?=E5=85=A5=E4=B8=8E=E5=AE=A2=E6=88=B7=E7=AE=A1=E7=90=86=E5=89=8D?= =?UTF-8?q?=E7=AB=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 计量单位管理:新增 API + 列表页 + 表单(UnitMeasureForm) 2. 物料单位选择器:MdItemForm 单位字段从 el-input 改为 el-select 下拉 3. 物料导入:新增 MdItemImportForm 组件(上传 Excel、下载模板、更新已有数据) 4. 物料导入权限:v-hasPermi 改为 mes:md-item:import 5. API VO 字段调整:unitOfMeasure → unitMeasureId + unitMeasureName 6. 客户管理:新增 API + 列表页 + 表单(MdClientForm) --- src/api/mes/md/item/index.ts | 8 +- src/api/mes/md/unitmeasure/index.ts | 51 +++++ src/utils/dict.ts | 5 +- src/views/mes/md/item/MdItemForm.vue | 21 +- src/views/mes/md/item/index.vue | 19 +- .../mes/md/unitmeasure/UnitMeasureForm.vue | 175 +++++++++++++++ src/views/mes/md/unitmeasure/index.vue | 209 ++++++++++++++++++ 7 files changed, 480 insertions(+), 8 deletions(-) create mode 100644 src/api/mes/md/unitmeasure/index.ts create mode 100644 src/views/mes/md/unitmeasure/UnitMeasureForm.vue create mode 100644 src/views/mes/md/unitmeasure/index.vue diff --git a/src/api/mes/md/item/index.ts b/src/api/mes/md/item/index.ts index b64bd75b3..a0be1ac2e 100644 --- a/src/api/mes/md/item/index.ts +++ b/src/api/mes/md/item/index.ts @@ -6,7 +6,8 @@ export interface MdItemVO { code: string // 物料编码 name: string // 物料名称 specification: string // 规格型号 - unitOfMeasure: string // 单位编码 + unitMeasureId: number // 计量单位编号 + unitMeasureName?: string // 计量单位名称 itemTypeId: number // 物料分类编号 itemTypeName?: string // 物料分类名称 itemOrProduct?: string // 物料/产品标识 @@ -54,5 +55,10 @@ export const MdItemApi = { // 导出物料产品 Excel exportItem: async (params: any) => { return await request.download({ url: `/mes/md/item/export-excel`, params }) + }, + + // 下载物料导入模板 + importTemplate: async () => { + return await request.download({ url: `/mes/md/item/get-import-template` }) } } diff --git a/src/api/mes/md/unitmeasure/index.ts b/src/api/mes/md/unitmeasure/index.ts new file mode 100644 index 000000000..a2e697d34 --- /dev/null +++ b/src/api/mes/md/unitmeasure/index.ts @@ -0,0 +1,51 @@ +import request from '@/config/axios' + +// MES 计量单位 VO +export interface MdUnitMeasureVO { + id: number // 单位编号 + code: string // 单位编码 + name: string // 单位名称 + primaryFlag: boolean // 是否主单位 + primaryId: number // 主单位编号 + changeRate: number // 与主单位换算比例 + status: number // 状态 + remark: string // 备注 +} + +// MES 计量单位 API +export const MdUnitMeasureApi = { + // 查询计量单位分页 + getUnitMeasurePage: async (params: any) => { + return await request.get({ url: `/mes/md/unit-measure/page`, params }) + }, + + // 查询计量单位精简列表 + getUnitMeasureSimpleList: async () => { + return await request.get({ url: `/mes/md/unit-measure/simple-list` }) + }, + + // 查询计量单位详情 + getUnitMeasure: async (id: number) => { + return await request.get({ url: `/mes/md/unit-measure/get?id=` + id }) + }, + + // 新增计量单位 + createUnitMeasure: async (data: MdUnitMeasureVO) => { + return await request.post({ url: `/mes/md/unit-measure/create`, data }) + }, + + // 修改计量单位 + updateUnitMeasure: async (data: MdUnitMeasureVO) => { + return await request.put({ url: `/mes/md/unit-measure/update`, data }) + }, + + // 删除计量单位 + deleteUnitMeasure: async (id: number) => { + return await request.delete({ url: `/mes/md/unit-measure/delete?id=` + id }) + }, + + // 导出计量单位 Excel + exportUnitMeasure: async (params: any) => { + return await request.download({ url: `/mes/md/unit-measure/export-excel`, params }) + } +} diff --git a/src/utils/dict.ts b/src/utils/dict.ts index ec54b408b..a9b203eef 100644 --- a/src/utils/dict.ts +++ b/src/utils/dict.ts @@ -250,5 +250,8 @@ export enum DICT_TYPE { IOT_OTA_TASK_STATUS = 'iot_ota_task_status', // IoT OTA 任务状态 IOT_OTA_TASK_RECORD_STATUS = 'iot_ota_task_record_status', // IoT OTA 记录状态 IOT_MODBUS_MODE = 'iot_modbus_mode', // IoT Modbus 工作模式 - IOT_MODBUS_FRAME_FORMAT = 'iot_modbus_frame_format' // IoT Modbus 帧格式 + IOT_MODBUS_FRAME_FORMAT = 'iot_modbus_frame_format', // IoT Modbus 帧格式 + + // ========== MES - 制造执行系统模块 ========== + MES_CLIENT_TYPE = 'mes_client_type' // MES 客户类型 } diff --git a/src/views/mes/md/item/MdItemForm.vue b/src/views/mes/md/item/MdItemForm.vue index 20974d975..41a2f38e9 100644 --- a/src/views/mes/md/item/MdItemForm.vue +++ b/src/views/mes/md/item/MdItemForm.vue @@ -31,8 +31,15 @@ - - + + + + @@ -138,6 +145,7 @@ import { getIntDictOptions, DICT_TYPE } from '@/utils/dict' import { generateRandomStr } from '@/utils' import { MdItemApi, MdItemVO } from '@/api/mes/md/item' import { MdItemTypeApi, MdItemTypeVO } from '@/api/mes/md/item/type' +import { MdUnitMeasureApi, MdUnitMeasureVO } from '@/api/mes/md/unitmeasure' import { CommonStatusEnum } from '@/utils/constants' import { defaultProps, handleTree } from '@/utils/tree' @@ -157,7 +165,7 @@ const formData = ref({ code: undefined, name: undefined, specification: undefined, - unitOfMeasure: undefined, + unitMeasureId: undefined, itemTypeId: undefined, status: CommonStatusEnum.ENABLE, safeStockFlag: false, @@ -170,12 +178,13 @@ const formData = ref({ const formRules = reactive({ code: [{ required: true, message: '物料编码不能为空', trigger: 'blur' }], name: [{ required: true, message: '物料名称不能为空', trigger: 'blur' }], - unitOfMeasure: [{ required: true, message: '单位编码不能为空', trigger: 'blur' }], + unitMeasureId: [{ required: true, message: '计量单位不能为空', trigger: 'change' }], itemTypeId: [{ required: true, message: '物料分类不能为空', trigger: 'blur' }], status: [{ required: true, message: '状态不能为空', trigger: 'blur' }] }) const formRef = ref() // 表单 Ref const itemTypeList = ref([]) // 物料分类列表 +const unitMeasureList = ref([]) // 计量单位列表 /** 生成物料编码 */ const generateCode = () => { @@ -202,6 +211,8 @@ const open = async (type: string, id?: number) => { // 物料分类 const categoryData = await MdItemTypeApi.getItemTypeSimpleList() itemTypeList.value = handleTree(categoryData, 'id', 'parentId') + // 计量单位 + unitMeasureList.value = await MdUnitMeasureApi.getUnitMeasureSimpleList() } defineExpose({ open }) // 提供 open 方法,用于打开弹窗 @@ -236,7 +247,7 @@ const resetForm = () => { code: undefined, name: undefined, specification: undefined, - unitOfMeasure: undefined, + unitMeasureId: undefined, itemTypeId: undefined, status: CommonStatusEnum.ENABLE, safeStockFlag: false, diff --git a/src/views/mes/md/item/index.vue b/src/views/mes/md/item/index.vue index 28cd31ef4..07b5e8b65 100644 --- a/src/views/mes/md/item/index.vue +++ b/src/views/mes/md/item/index.vue @@ -65,6 +65,14 @@ > 新增 + + 导入 + - + diff --git a/src/views/mes/md/unitmeasure/index.vue b/src/views/mes/md/unitmeasure/index.vue new file mode 100644 index 000000000..84e2713da --- /dev/null +++ b/src/views/mes/md/unitmeasure/index.vue @@ -0,0 +1,209 @@ + + + +