From 108b94fd672a308c16ec4f334cf8d1904bd0c47b Mon Sep 17 00:00:00 2001 From: hwj Date: Tue, 3 Feb 2026 18:40:49 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E6=A8=A1=E5=85=B7=E7=AE=A1?= =?UTF-8?q?=E7=90=86-=E4=B8=8A=E4=B8=8B=E6=A8=A1-=E6=96=B0=E5=A2=9E/?= =?UTF-8?q?=E7=BC=96=E8=BE=91=E5=BC=B9=E6=A1=86=E6=96=B0=E5=A2=9E=E4=B8=8B?= =?UTF-8?q?=E6=A8=A1=E6=A8=A1=E5=85=B7=EF=BC=8C=E6=94=AF=E6=8C=81=E5=A4=9A?= =?UTF-8?q?=E9=80=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/erp/mold/index.ts | 8 +- src/api/iot/devicemodelattribute/index.ts | 5 + src/api/mes/moldoperate/index.ts | 9 +- src/locales/en.ts | 3 + src/locales/zh-CN.ts | 3 + src/views/mes/moldoperate/MoldOperateForm.vue | 192 ++++++++++++++---- 6 files changed, 179 insertions(+), 41 deletions(-) diff --git a/src/api/erp/mold/index.ts b/src/api/erp/mold/index.ts index 9721c2c0..62c77486 100644 --- a/src/api/erp/mold/index.ts +++ b/src/api/erp/mold/index.ts @@ -73,9 +73,13 @@ export const MoldBrandApi = { getMoldList: async (params) => { return await request.get({ url: `/erp/mold-brand/getMoldList`, params }) }, - // 查询模具列表 + // 查询全部模具列表 getMoldAllList: async () => { - return await request.get({ url: `/erp/mold-brand/getMoldAllList`}) + return await request.get({ url: `/erp/mold-brand/getMoldAllList` }) + }, + // 查询在途模具列表(用于上模) + getInTransitMoldAllList: async () => { + return await request.get({ url: `/erp/mold/getInTransitMoldAllList` }) }, // 获得模具分页 getMoldPage: async (params) => { diff --git a/src/api/iot/devicemodelattribute/index.ts b/src/api/iot/devicemodelattribute/index.ts index c09b6507..0cf314b0 100644 --- a/src/api/iot/devicemodelattribute/index.ts +++ b/src/api/iot/devicemodelattribute/index.ts @@ -51,6 +51,11 @@ export const DeviceModelAttributeApi = { return await request.download({ url: `/iot/device-model-attribute/export-excel`, params }) }, + // 下载采集设备模型-点位管理导入模板 + importDeviceModelAttributeTemplate: async () => { + return await request.download({ url: `/iot/device-model-attribute/get-import-template` }) + }, + operationAnalysisDetails: async (params: { deviceId: number modelId?: number diff --git a/src/api/mes/moldoperate/index.ts b/src/api/mes/moldoperate/index.ts index df58b588..5ed64370 100644 --- a/src/api/mes/moldoperate/index.ts +++ b/src/api/mes/moldoperate/index.ts @@ -4,9 +4,10 @@ import request from '@/config/axios' export interface MoldOperateVO { id: number // ID operateType: string // 操作类型 - moldId: number // 关联模具id + moldId: number | string // 关联模具id(上模/下模剩余模具,支持逗号分隔) deviceId: number // 关联设备id remark: string // 备注 + lowerMoldId?: number | string // 下模的模具id } // 模具上下模 API @@ -41,8 +42,8 @@ export const MoldOperateApi = { return await request.download({ url: `/mes/mold-operate/export-excel`, params }) }, - // 查询设备是否有模具 - getMoldOperateMold: async (id: number) => { - return await request.get({ url: `/mes/mold-operate/get-mold?id=` + id }) + // 查询设备可下模具列表 + getLowerMoldList: async (id: number) => { + return await request.get({ url: `/mes/mold-operate/getLowerMoldList`, params: { id } }) }, } diff --git a/src/locales/en.ts b/src/locales/en.ts index 59389e1d..fe4ae200 100644 --- a/src/locales/en.ts +++ b/src/locales/en.ts @@ -2206,6 +2206,7 @@ export default { operateTypeDown: 'Mold Down', mold: 'Mold', moldName: 'Mold Name', + lowerMold: 'Lower Mold', device: 'Device', deviceName: 'Device Name', remark: 'Remark', @@ -2220,6 +2221,7 @@ export default { export: 'Export', exportFilename: 'MoldOperate.xls', placeholderMold: 'Please select mold', + placeholderLowerMold: 'Please select lower mold', placeholderRemark: 'Please input remark', placeholderCreateTimeStart: 'Start Date', placeholderCreateTimeEnd: 'End Date', @@ -2229,6 +2231,7 @@ export default { validatorOperateTypeRequired: 'Operation type can not be empty', validatorDeviceRequired: 'Device can not be empty', validatorMoldRequired: 'Mold can not be empty', + validatorLowerMoldRequired: 'Lower mold can not be empty', alertNeedRemoveMoldFirst: 'Please remove the mold from this device first!', alertNoMoldOnDevice: 'No mold is installed on this device!' }, diff --git a/src/locales/zh-CN.ts b/src/locales/zh-CN.ts index 7554fe82..601dc21c 100644 --- a/src/locales/zh-CN.ts +++ b/src/locales/zh-CN.ts @@ -1789,6 +1789,7 @@ export default { operateTypeDown: '下模', mold: '模具', moldName: '模具名称', + lowerMold: '下模模具', device: '设备', deviceName: '设备名称', remark: '备注', @@ -1803,6 +1804,7 @@ export default { export: '导出', exportFilename: '模具上下模.xls', placeholderMold: '请选择模具', + placeholderLowerMold: '请选择下模模具', placeholderRemark: '请输入备注', placeholderCreateTimeStart: '开始日期', placeholderCreateTimeEnd: '结束日期', @@ -1812,6 +1814,7 @@ export default { validatorOperateTypeRequired: '操作类型不能为空', validatorDeviceRequired: '关联设备不能为空', validatorMoldRequired: '关联模具不能为空', + validatorLowerMoldRequired: '下模模具不能为空', alertNeedRemoveMoldFirst: '请先将该设备上的模具换下!', alertNoMoldOnDevice: '该设备没有安装模具!' }, diff --git a/src/views/mes/moldoperate/MoldOperateForm.vue b/src/views/mes/moldoperate/MoldOperateForm.vue index 59ded897..c1ea2e52 100644 --- a/src/views/mes/moldoperate/MoldOperateForm.vue +++ b/src/views/mes/moldoperate/MoldOperateForm.vue @@ -13,19 +13,27 @@ {{ t('MoldManagement.MoldOperate.operateTypeDown') }} - - - - + + + + - + + + + + + @@ -55,11 +84,13 @@ defineOptions({ name: 'MoldOperateForm' }) const { t } = useI18n() // 国际化 const message = useMessage() // 消息弹窗 -const moldList = ref([]) // 模具列表 +const moldList = ref([]) // 上模可选模具列表(在途) +const lowerMoldList = ref([]) // 下模可选模具列表 const deviceLoading = ref(false) const deviceOptions = ref<{ label: string; value: number; raw?: DeviceLedgerVO }[]>([]) const deviceOptionsLoaded = ref(false) +const initializingOperateType = ref(false) const dialogVisible = ref(false) // 弹窗的是否展示 const dialogTitle = ref('') // 弹窗的标题 @@ -71,11 +102,40 @@ const formData = ref({ moldId: undefined, deviceId: undefined, remark: undefined, + lowerMoldId: undefined, }) + +const validateMoldId = (_rule: any, value: any, callback: (error?: Error) => void) => { + if (String(formData.value.operateType) !== '1') { + callback() + return + } + const hasValue = Array.isArray(value) ? value.length > 0 : value !== undefined && value !== null && value !== '' + if (!hasValue) { + callback(new Error(t('MoldManagement.MoldOperate.validatorMoldRequired'))) + } else { + callback() + } +} + +const validateLowerMoldId = (_rule: any, value: any, callback: (error?: Error) => void) => { + if (String(formData.value.operateType) !== '2') { + callback() + return + } + const hasValue = Array.isArray(value) ? value.length > 0 : value !== undefined && value !== null && value !== '' + if (!hasValue) { + callback(new Error(t('MoldManagement.MoldOperate.validatorLowerMoldRequired'))) + } else { + callback() + } +} + const formRules = reactive({ - moldId: [{ required: true, message: t('MoldManagement.MoldOperate.validatorMoldRequired'), trigger: 'blur' }], operateType: [{ required: true, message: t('MoldManagement.MoldOperate.validatorOperateTypeRequired'), trigger: 'blur' }], deviceId: [{ required: true, message: t('MoldManagement.MoldOperate.validatorDeviceRequired'), trigger: 'blur' }], + moldId: [{ validator: validateMoldId, trigger: 'change' }], + lowerMoldId: [{ validator: validateLowerMoldId, trigger: 'change' }], }) const formRef = ref() // 表单 Ref @@ -85,14 +145,35 @@ const open = async (type: string, id?: number) => { dialogTitle.value = t('action.' + type) formType.value = type resetForm() - moldList.value = await MoldBrandApi.getMoldAllList() await ensureDeviceOptionsLoaded() // 修改时,设置数据 if (id) { formLoading.value = true try { - formData.value = await MoldOperateApi.getMoldOperate(id) + initializingOperateType.value = true + const data = await MoldOperateApi.getMoldOperate(id) + formData.value = { + ...formData.value, + ...data, + lowerMoldId: (data as any).lowerMoldId, + } + // 编辑时根据类型格式化模具字段 + if (String(formData.value.operateType) === '1') { + if (typeof formData.value.moldId === 'string') { + const parts = formData.value.moldId.split(',').map((v: string) => Number(v)).filter((v) => !Number.isNaN(v)) + formData.value.moldId = parts as any + } + await loadUpMoldList() + } else if (String(formData.value.operateType) === '2') { + const rawLower = (formData.value as any).lowerMoldId + if (typeof rawLower === 'string') { + const parts = rawLower.split(',').map((v: string) => Number(v)).filter((v) => !Number.isNaN(v)) + ;(formData.value as any).lowerMoldId = parts + } + await loadLowerMoldList() + } } finally { + initializingOperateType.value = false formLoading.value = false } } @@ -106,7 +187,7 @@ const emit = defineEmits(['success']) // 定义 success 事件,用于操作成 // await formRef.value.validate() // // 检验 // if (formData.value.operateType === '1') { -// const data = await MoldOperateApi.getMoldOperateMold(formData.value.deviceId) +// const data = await someApiToCheck(formData.value.deviceId) // if (data === true) { // message.alert('请先将该设备上的模具换下!') // return; @@ -139,22 +220,33 @@ const submitForm = async () => { // 1. 表单校验 await formRef.value.validate() - // 2. 业务条件检查 - if (formData.value.operateType == '1') { - const data = await MoldOperateApi.getMoldOperateMold(formData.value.deviceId) - if (data === true) { - message.alert(t('MoldManagement.MoldOperate.alertNeedRemoveMoldFirst')) - return - } - } else { - const data = await MoldOperateApi.getMoldOperateMold(formData.value.deviceId) - if (data === false) { - message.alert(t('MoldManagement.MoldOperate.alertNoMoldOnDevice')) - return - } - } + // 2. 组装提交数据 + const raw = formData.value as any + const submitData: any = { + id: raw.id, + operateType: raw.operateType, + deviceId: raw.deviceId, + remark: raw.remark, + } + if (String(raw.operateType) === '1') { + const ids = Array.isArray(raw.moldId) ? raw.moldId : raw.moldId != null ? [raw.moldId] : [] + submitData.moldId = ids.map((v: any) => v).join(',') + } else if (String(raw.operateType) === '2') { + const allIds = lowerMoldList.value + .map((item: any) => item?.id) + .filter((id: any) => id !== undefined && id !== null) + const lowerIds = Array.isArray(raw.lowerMoldId) + ? raw.lowerMoldId + : raw.lowerMoldId != null + ? [raw.lowerMoldId] + : [] + submitData.lowerMoldId = lowerIds.map((v: any) => v).join(',') + const lowerIdSet = new Set(lowerIds.map((v: any) => String(v))) + const remainIds = allIds.filter((id: any) => !lowerIdSet.has(String(id))) + submitData.moldId = remainIds.join(',') + } + // 3. 提交数据 - const submitData = formData.value as unknown as MoldOperateVO if (formType.value === 'create') { await MoldOperateApi.createMoldOperate(submitData) message.success(t('common.createSuccess')) @@ -192,18 +284,47 @@ const ensureDeviceOptionsLoaded = async () => { // 设备更改 const deviceChange = async (deviceId:number) => { - const data = await MoldOperateApi.getMoldOperateMold(deviceId) - if (formData.value.operateType == '1') { - if (data === true) { - message.alert(t('MoldManagement.MoldOperate.alertNeedRemoveMoldFirst')) - } - } else { -if (data === false) { - message.alert(t('MoldManagement.MoldOperate.alertNoMoldOnDevice')) + if (String(formData.value.operateType) === '2' && deviceId) { + await loadLowerMoldList() + formData.value.lowerMoldId = undefined as any } +} + +const loadUpMoldList = async () => { + moldList.value = await MoldBrandApi.getInTransitMoldAllList() +} + +const loadLowerMoldList = async () => { + if (!formData.value.deviceId) { + lowerMoldList.value = [] + return } + const list = await MoldOperateApi.getLowerMoldList(formData.value.deviceId) + lowerMoldList.value = Array.isArray(list) ? list : [] } +watch( + () => formData.value.operateType, + async (val) => { + if (initializingOperateType.value) { + return + } + formData.value.deviceId = undefined as any + formData.value.moldId = undefined as any + formData.value.lowerMoldId = undefined as any + moldList.value = [] + lowerMoldList.value = [] + if (!val) { + return + } + if (String(val) === '1') { + await loadUpMoldList() + } else if (String(val) === '2') { + await loadLowerMoldList() + } + } +) + /** 重置表单 */ const resetForm = () => { formData.value = { @@ -212,6 +333,7 @@ const resetForm = () => { moldId: undefined, deviceId: undefined, remark: undefined, + lowerMoldId: undefined, } formRef.value?.resetFields() }