feat:模具管理-上下模-新增/编辑弹框新增下模模具,支持多选

main
黄伟杰 1 day ago
parent 56478433ae
commit 108b94fd67

@ -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) => {

@ -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

@ -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 } })
},
}

@ -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!'
},

@ -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: '该设备没有安装模具!'
},

@ -13,19 +13,27 @@
<el-radio :label="2">{{ t('MoldManagement.MoldOperate.operateTypeDown') }}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item :label="t('MoldManagement.MoldOperate.device')" prop="deviceId">
<el-select
v-model="formData.deviceId" filterable clearable :loading="deviceLoading"
:placeholder="t('MoldManagement.MoldOperate.placeholderDevice')" class="!w-full" @change="deviceChange(formData.deviceId)">
<el-option v-for="opt in deviceOptions" :key="String(opt.value)" :label="opt.label" :value="opt.value" />
</el-select>
<el-form-item :label="t('MoldManagement.MoldOperate.device')" prop="deviceId" v-if="formData.operateType != null">
<el-select
v-model="formData.deviceId"
filterable
clearable
:loading="deviceLoading"
:placeholder="t('MoldManagement.MoldOperate.placeholderDevice')"
class="!w-full"
@change="deviceChange(formData.deviceId)"
>
<el-option v-for="opt in deviceOptions" :key="String(opt.value)" :label="opt.label" :value="opt.value" />
</el-select>
</el-form-item>
<el-form-item :label="t('MoldManagement.MoldOperate.mold')" prop="moldId" v-if = "formData.operateType == '1'">
<el-form-item :label="t('MoldManagement.MoldOperate.mold')" prop="moldId" v-if="formData.operateType == '1'">
<el-select
v-model="formData.moldId"
multiple
clearable
filterable
:placeholder="t('MoldManagement.MoldOperate.placeholderMold')"
class="!w-full"
>
<el-option
v-for="item in moldList"
@ -35,6 +43,27 @@ v-model="formData.deviceId" filterable clearable :loading="deviceLoading"
/>
</el-select>
</el-form-item>
<el-form-item
v-if="formData.operateType == '2' && formData.deviceId"
:label="t('MoldManagement.MoldOperate.lowerMold')"
prop="lowerMoldId"
>
<el-select
v-model="formData.lowerMoldId"
multiple
clearable
filterable
:placeholder="t('MoldManagement.MoldOperate.placeholderLowerMold')"
class="!w-full"
>
<el-option
v-for="item in lowerMoldList"
:key="item.id"
:label="item.name || item.moldName || `ID:${item.id}`"
:value="item.id"
/>
</el-select>
</el-form-item>
<el-form-item :label="t('MoldManagement.MoldOperate.remark')" prop="remark">
<el-input v-model="formData.remark" :placeholder="t('MoldManagement.MoldOperate.placeholderRemark')" />
</el-form-item>
@ -55,11 +84,13 @@ defineOptions({ name: 'MoldOperateForm' })
const { t } = useI18n() //
const message = useMessage() //
const moldList = ref<MoldVO[]>([]) //
const moldList = ref<MoldVO[]>([]) //
const lowerMoldList = ref<any[]>([]) //
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()
}

Loading…
Cancel
Save