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

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

@ -73,9 +73,13 @@ export const MoldBrandApi = {
getMoldList: async (params) => { getMoldList: async (params) => {
return await request.get({ url: `/erp/mold-brand/getMoldList`, params }) return await request.get({ url: `/erp/mold-brand/getMoldList`, params })
}, },
// 查询模具列表 // 查询全部模具列表
getMoldAllList: async () => { 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) => { getMoldPage: async (params) => {

@ -51,6 +51,11 @@ export const DeviceModelAttributeApi = {
return await request.download({ url: `/iot/device-model-attribute/export-excel`, params }) 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: { operationAnalysisDetails: async (params: {
deviceId: number deviceId: number
modelId?: number modelId?: number

@ -4,9 +4,10 @@ import request from '@/config/axios'
export interface MoldOperateVO { export interface MoldOperateVO {
id: number // ID id: number // ID
operateType: string // 操作类型 operateType: string // 操作类型
moldId: number // 关联模具id moldId: number | string // 关联模具id(上模/下模剩余模具,支持逗号分隔)
deviceId: number // 关联设备id deviceId: number // 关联设备id
remark: string // 备注 remark: string // 备注
lowerMoldId?: number | string // 下模的模具id
} }
// 模具上下模 API // 模具上下模 API
@ -41,8 +42,8 @@ export const MoldOperateApi = {
return await request.download({ url: `/mes/mold-operate/export-excel`, params }) return await request.download({ url: `/mes/mold-operate/export-excel`, params })
}, },
// 查询设备是否有模具 // 查询设备可下模具列表
getMoldOperateMold: async (id: number) => { getLowerMoldList: async (id: number) => {
return await request.get({ url: `/mes/mold-operate/get-mold?id=` + id }) return await request.get({ url: `/mes/mold-operate/getLowerMoldList`, params: { id } })
}, },
} }

@ -2206,6 +2206,7 @@ export default {
operateTypeDown: 'Mold Down', operateTypeDown: 'Mold Down',
mold: 'Mold', mold: 'Mold',
moldName: 'Mold Name', moldName: 'Mold Name',
lowerMold: 'Lower Mold',
device: 'Device', device: 'Device',
deviceName: 'Device Name', deviceName: 'Device Name',
remark: 'Remark', remark: 'Remark',
@ -2220,6 +2221,7 @@ export default {
export: 'Export', export: 'Export',
exportFilename: 'MoldOperate.xls', exportFilename: 'MoldOperate.xls',
placeholderMold: 'Please select mold', placeholderMold: 'Please select mold',
placeholderLowerMold: 'Please select lower mold',
placeholderRemark: 'Please input remark', placeholderRemark: 'Please input remark',
placeholderCreateTimeStart: 'Start Date', placeholderCreateTimeStart: 'Start Date',
placeholderCreateTimeEnd: 'End Date', placeholderCreateTimeEnd: 'End Date',
@ -2229,6 +2231,7 @@ export default {
validatorOperateTypeRequired: 'Operation type can not be empty', validatorOperateTypeRequired: 'Operation type can not be empty',
validatorDeviceRequired: 'Device can not be empty', validatorDeviceRequired: 'Device can not be empty',
validatorMoldRequired: 'Mold 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!', alertNeedRemoveMoldFirst: 'Please remove the mold from this device first!',
alertNoMoldOnDevice: 'No mold is installed on this device!' alertNoMoldOnDevice: 'No mold is installed on this device!'
}, },

@ -1789,6 +1789,7 @@ export default {
operateTypeDown: '下模', operateTypeDown: '下模',
mold: '模具', mold: '模具',
moldName: '模具名称', moldName: '模具名称',
lowerMold: '下模模具',
device: '设备', device: '设备',
deviceName: '设备名称', deviceName: '设备名称',
remark: '备注', remark: '备注',
@ -1803,6 +1804,7 @@ export default {
export: '导出', export: '导出',
exportFilename: '模具上下模.xls', exportFilename: '模具上下模.xls',
placeholderMold: '请选择模具', placeholderMold: '请选择模具',
placeholderLowerMold: '请选择下模模具',
placeholderRemark: '请输入备注', placeholderRemark: '请输入备注',
placeholderCreateTimeStart: '开始日期', placeholderCreateTimeStart: '开始日期',
placeholderCreateTimeEnd: '结束日期', placeholderCreateTimeEnd: '结束日期',
@ -1812,6 +1814,7 @@ export default {
validatorOperateTypeRequired: '操作类型不能为空', validatorOperateTypeRequired: '操作类型不能为空',
validatorDeviceRequired: '关联设备不能为空', validatorDeviceRequired: '关联设备不能为空',
validatorMoldRequired: '关联模具不能为空', validatorMoldRequired: '关联模具不能为空',
validatorLowerMoldRequired: '下模模具不能为空',
alertNeedRemoveMoldFirst: '请先将该设备上的模具换下!', alertNeedRemoveMoldFirst: '请先将该设备上的模具换下!',
alertNoMoldOnDevice: '该设备没有安装模具!' alertNoMoldOnDevice: '该设备没有安装模具!'
}, },

@ -13,19 +13,27 @@
<el-radio :label="2">{{ t('MoldManagement.MoldOperate.operateTypeDown') }}</el-radio> <el-radio :label="2">{{ t('MoldManagement.MoldOperate.operateTypeDown') }}</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item :label="t('MoldManagement.MoldOperate.device')" prop="deviceId"> <el-form-item :label="t('MoldManagement.MoldOperate.device')" prop="deviceId" v-if="formData.operateType != null">
<el-select <el-select
v-model="formData.deviceId" filterable clearable :loading="deviceLoading" v-model="formData.deviceId"
:placeholder="t('MoldManagement.MoldOperate.placeholderDevice')" class="!w-full" @change="deviceChange(formData.deviceId)"> filterable
<el-option v-for="opt in deviceOptions" :key="String(opt.value)" :label="opt.label" :value="opt.value" /> clearable
</el-select> :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>
<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 <el-select
v-model="formData.moldId" v-model="formData.moldId"
multiple
clearable clearable
filterable filterable
:placeholder="t('MoldManagement.MoldOperate.placeholderMold')" :placeholder="t('MoldManagement.MoldOperate.placeholderMold')"
class="!w-full"
> >
<el-option <el-option
v-for="item in moldList" v-for="item in moldList"
@ -35,6 +43,27 @@ v-model="formData.deviceId" filterable clearable :loading="deviceLoading"
/> />
</el-select> </el-select>
</el-form-item> </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-form-item :label="t('MoldManagement.MoldOperate.remark')" prop="remark">
<el-input v-model="formData.remark" :placeholder="t('MoldManagement.MoldOperate.placeholderRemark')" /> <el-input v-model="formData.remark" :placeholder="t('MoldManagement.MoldOperate.placeholderRemark')" />
</el-form-item> </el-form-item>
@ -55,11 +84,13 @@ defineOptions({ name: 'MoldOperateForm' })
const { t } = useI18n() // const { t } = useI18n() //
const message = useMessage() // const message = useMessage() //
const moldList = ref<MoldVO[]>([]) // const moldList = ref<MoldVO[]>([]) //
const lowerMoldList = ref<any[]>([]) //
const deviceLoading = ref(false) const deviceLoading = ref(false)
const deviceOptions = ref<{ label: string; value: number; raw?: DeviceLedgerVO }[]>([]) const deviceOptions = ref<{ label: string; value: number; raw?: DeviceLedgerVO }[]>([])
const deviceOptionsLoaded = ref(false) const deviceOptionsLoaded = ref(false)
const initializingOperateType = ref(false)
const dialogVisible = ref(false) // const dialogVisible = ref(false) //
const dialogTitle = ref('') // const dialogTitle = ref('') //
@ -71,11 +102,40 @@ const formData = ref({
moldId: undefined, moldId: undefined,
deviceId: undefined, deviceId: undefined,
remark: 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({ const formRules = reactive({
moldId: [{ required: true, message: t('MoldManagement.MoldOperate.validatorMoldRequired'), trigger: 'blur' }],
operateType: [{ required: true, message: t('MoldManagement.MoldOperate.validatorOperateTypeRequired'), trigger: 'blur' }], operateType: [{ required: true, message: t('MoldManagement.MoldOperate.validatorOperateTypeRequired'), trigger: 'blur' }],
deviceId: [{ required: true, message: t('MoldManagement.MoldOperate.validatorDeviceRequired'), 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 const formRef = ref() // Ref
@ -85,14 +145,35 @@ const open = async (type: string, id?: number) => {
dialogTitle.value = t('action.' + type) dialogTitle.value = t('action.' + type)
formType.value = type formType.value = type
resetForm() resetForm()
moldList.value = await MoldBrandApi.getMoldAllList()
await ensureDeviceOptionsLoaded() await ensureDeviceOptionsLoaded()
// //
if (id) { if (id) {
formLoading.value = true formLoading.value = true
try { 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 { } finally {
initializingOperateType.value = false
formLoading.value = false formLoading.value = false
} }
} }
@ -106,7 +187,7 @@ const emit = defineEmits(['success']) // 定义 success 事件,用于操作成
// await formRef.value.validate() // await formRef.value.validate()
// // // //
// if (formData.value.operateType === '1') { // if (formData.value.operateType === '1') {
// const data = await MoldOperateApi.getMoldOperateMold(formData.value.deviceId) // const data = await someApiToCheck(formData.value.deviceId)
// if (data === true) { // if (data === true) {
// message.alert('') // message.alert('')
// return; // return;
@ -139,22 +220,33 @@ const submitForm = async () => {
// 1. // 1.
await formRef.value.validate() await formRef.value.validate()
// 2. // 2.
if (formData.value.operateType == '1') { const raw = formData.value as any
const data = await MoldOperateApi.getMoldOperateMold(formData.value.deviceId) const submitData: any = {
if (data === true) { id: raw.id,
message.alert(t('MoldManagement.MoldOperate.alertNeedRemoveMoldFirst')) operateType: raw.operateType,
return deviceId: raw.deviceId,
} remark: raw.remark,
} else { }
const data = await MoldOperateApi.getMoldOperateMold(formData.value.deviceId) if (String(raw.operateType) === '1') {
if (data === false) { const ids = Array.isArray(raw.moldId) ? raw.moldId : raw.moldId != null ? [raw.moldId] : []
message.alert(t('MoldManagement.MoldOperate.alertNoMoldOnDevice')) submitData.moldId = ids.map((v: any) => v).join(',')
return } 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. // 3.
const submitData = formData.value as unknown as MoldOperateVO
if (formType.value === 'create') { if (formType.value === 'create') {
await MoldOperateApi.createMoldOperate(submitData) await MoldOperateApi.createMoldOperate(submitData)
message.success(t('common.createSuccess')) message.success(t('common.createSuccess'))
@ -192,18 +284,47 @@ const ensureDeviceOptionsLoaded = async () => {
// //
const deviceChange = async (deviceId:number) => { const deviceChange = async (deviceId:number) => {
const data = await MoldOperateApi.getMoldOperateMold(deviceId) if (String(formData.value.operateType) === '2' && deviceId) {
if (formData.value.operateType == '1') { await loadLowerMoldList()
if (data === true) { formData.value.lowerMoldId = undefined as any
message.alert(t('MoldManagement.MoldOperate.alertNeedRemoveMoldFirst'))
}
} else {
if (data === false) {
message.alert(t('MoldManagement.MoldOperate.alertNoMoldOnDevice'))
} }
}
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 = () => { const resetForm = () => {
formData.value = { formData.value = {
@ -212,6 +333,7 @@ const resetForm = () => {
moldId: undefined, moldId: undefined,
deviceId: undefined, deviceId: undefined,
remark: undefined, remark: undefined,
lowerMoldId: undefined,
} }
formRef.value?.resetFields() formRef.value?.resetFields()
} }

Loading…
Cancel
Save