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()
}