feat: 模具管理-上下模弹窗目标产线改为自动填充

main^2
zhongwenkai 3 hours ago
parent f1982f2555
commit 5dce2ad2f3

@ -15,6 +15,8 @@ export interface DeviceLedgerVO {
deviceSpec: string // 设备规格 deviceSpec: string // 设备规格
deviceType: string | number // 设备类型 deviceType: string | number // 设备类型
deviceLine?: string | number // 设备产线 deviceLine?: string | number // 设备产线
topCategoryId?: number // 顶级分类 id
topCategoryName?: string // 顶级分类名称
deviceTypeName?: string // 设备类型名称 deviceTypeName?: string // 设备类型名称
supplier: string // 供应商 supplier: string // 供应商
workshop: string // 所属车间 workshop: string // 所属车间

@ -46,11 +46,8 @@
<!-- 左侧表单 --> <!-- 左侧表单 -->
<div class="mold-operate-page__form"> <div class="mold-operate-page__form">
<el-form ref="operateFormRef" :model="operateFormData" :rules="operateFormRules" label-width="100px"> <el-form ref="operateFormRef" :model="operateFormData" :rules="operateFormRules" label-width="100px">
<el-form-item :label="t('MoldManagement.MoldBrandPage.targetLine')" prop="lineId"> <el-form-item :label="t('MoldManagement.MoldBrandPage.targetLine')">
<el-select v-model="operateFormData.lineId" filterable clearable <el-input v-model="displayTopCategory" disabled :placeholder="'选择目标设备后自动显示'" class="!w-full" />
:placeholder="t('MoldManagement.MoldBrandPage.placeholderTargetLine')" class="!w-full">
<el-option v-for="line in lineOptions" :key="line.id" :label="line.name" :value="String(line.id)" />
</el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('MoldManagement.MoldBrandPage.targetDevice')" prop="deviceId"> <el-form-item :label="t('MoldManagement.MoldBrandPage.targetDevice')" prop="deviceId">
<el-select v-model="operateFormData.deviceId" filterable clearable <el-select v-model="operateFormData.deviceId" filterable clearable
@ -115,7 +112,7 @@
import { MoldBrandApi, type MoldBrandVO } from '@/api/erp/mold' import { MoldBrandApi, type MoldBrandVO } from '@/api/erp/mold'
import { DeviceLedgerApi, type DeviceLedgerVO } from '@/api/mes/deviceledger' import { DeviceLedgerApi, type DeviceLedgerVO } from '@/api/mes/deviceledger'
import { MoldOperateApi, type MoldOperateVO } from '@/api/mes/moldoperate' import { MoldOperateApi, type MoldOperateVO } from '@/api/mes/moldoperate'
import { OrganizationApi, type OrganizationVO } from '@/api/mes/organization' import { DeviceLineApi, type DeviceLineTreeVO } from '@/api/mes/deviceline'
import { getSimpleUserList, type UserVO } from '@/api/system/user' import { getSimpleUserList, type UserVO } from '@/api/system/user'
import { DICT_TYPE } from '@/utils/dict' import { DICT_TYPE } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime' import { dateFormatter } from '@/utils/formatTime'
@ -148,16 +145,16 @@ const operateFormData = reactive({
remark: undefined as string | undefined remark: undefined as string | undefined
}) })
// // 线
const operateFormRules = reactive({ const operateFormRules = reactive({
lineId: [{ required: true, message: t('MoldManagement.MoldBrandPage.validatorTargetLineRequired'), trigger: 'blur' }],
deviceId: [{ required: true, message: t('MoldManagement.MoldBrandPage.validatorTargetDeviceRequired'), trigger: 'blur' }], deviceId: [{ required: true, message: t('MoldManagement.MoldBrandPage.validatorTargetDeviceRequired'), trigger: 'blur' }],
operateTime: [{ required: true, message: t('MoldManagement.MoldBrandPage.validatorOperateTimeRequired'), trigger: 'blur' }], operateTime: [{ required: true, message: t('MoldManagement.MoldBrandPage.validatorOperateTimeRequired'), trigger: 'blur' }],
operatorId: [{ required: true, message: t('MoldManagement.MoldBrandPage.validatorOperatorRequired'), trigger: 'blur' }] operatorId: [{ required: true, message: t('MoldManagement.MoldBrandPage.validatorOperatorRequired'), trigger: 'blur' }]
}) })
// //
const lineOptions = ref<OrganizationVO[]>([]) const deviceLineTree = ref<DeviceLineTreeVO[]>([])
const displayTopCategory = ref('')
const operatorOptions = ref<UserVO[]>([]) const operatorOptions = ref<UserVO[]>([])
// //
@ -177,10 +174,10 @@ const getImageList = (images?: string) => {
const initOperateOptions = async () => { const initOperateOptions = async () => {
try { try {
const data = await OrganizationApi.getOrganizationList() const data = await DeviceLineApi.getDeviceLineTree()
lineOptions.value = Array.isArray(data) ? data : [] deviceLineTree.value = Array.isArray(data) ? data : []
} catch { } catch {
lineOptions.value = [] deviceLineTree.value = []
} }
try { try {
operatorOptions.value = (await getSimpleUserList()) ?? [] operatorOptions.value = (await getSimpleUserList()) ?? []
@ -189,6 +186,34 @@ const initOperateOptions = async () => {
} }
} }
// 线
watch(() => operateFormData.deviceId, async (deviceId) => {
displayTopCategory.value = ''
if (!deviceId) return
try {
const detail = await DeviceLedgerApi.getDeviceLedger(deviceId)
if (detail?.deviceLine != null) {
operateFormData.lineId = detail.deviceLine
}
//
displayTopCategory.value = detail?.topCategoryName || ''
// fallback: 线
if (!displayTopCategory.value && detail?.deviceLine != null && deviceLineTree.value.length) {
const lineId = Number(detail.deviceLine)
const containsId = (nodes: DeviceLineTreeVO[] | undefined, id: number): boolean => {
if (!nodes) return false
return nodes.some((n) => n.id === id || containsId(n.children, id))
}
for (const root of deviceLineTree.value) {
if (root.id === lineId || containsId(root.children, lineId)) {
displayTopCategory.value = root.name
break
}
}
}
} catch {}
})
const fetchRecentOperateList = async () => { const fetchRecentOperateList = async () => {
if (!props.mold?.id) return if (!props.mold?.id) return
recentLoading.value = true recentLoading.value = true
@ -217,6 +242,7 @@ const submitOperateForm = async () => {
operateType: props.type, operateType: props.type,
moldId: props.mold?.id, moldId: props.mold?.id,
lineId: operateFormData.lineId, lineId: operateFormData.lineId,
lineName: displayTopCategory.value,
deviceId: operateFormData.deviceId, deviceId: operateFormData.deviceId,
remark: operateFormData.remark, remark: operateFormData.remark,
operateTime: operateFormData.operateTime, operateTime: operateFormData.operateTime,
@ -240,6 +266,7 @@ const open = async () => {
operateFormData.operateTime = undefined operateFormData.operateTime = undefined
operateFormData.operatorId = undefined operateFormData.operatorId = undefined
operateFormData.remark = undefined operateFormData.remark = undefined
displayTopCategory.value = ''
await initOperateOptions() await initOperateOptions()
recentPageNo.value = 1 recentPageNo.value = 1
await fetchRecentOperateList() await fetchRecentOperateList()

@ -26,10 +26,8 @@
@click="openMoldSelectDialog" @click="openMoldSelectDialog"
/> />
</el-form-item> </el-form-item>
<el-form-item :label="t('MoldManagement.MoldOperate.productionLine')" prop="lineId"> <el-form-item :label="t('MoldManagement.MoldOperate.productionLine')" prop="lineId" v-if="formData.operateType != null">
<el-select v-model="formData.lineId" filterable clearable :placeholder="t('MoldManagement.MoldOperate.placeholderProductionLine')" class="!w-full"> <el-input :model-value="displayLineName" readonly />
<el-option v-for="line in lineOptions" :key="line.id" :label="line.name" :value="line.id" />
</el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('MoldManagement.MoldOperate.operateTime')" prop="operateTime"> <el-form-item :label="t('MoldManagement.MoldOperate.operateTime')" prop="operateTime">
<el-date-picker <el-date-picker
@ -113,7 +111,7 @@
import { MoldOperateApi } from '@/api/mes/moldoperate' import { MoldOperateApi } from '@/api/mes/moldoperate'
import { MoldBrandApi, MoldVO } from '@/api/erp/mold' import { MoldBrandApi, MoldVO } from '@/api/erp/mold'
import { DeviceLedgerApi, DeviceLedgerVO } from '@/api/mes/deviceledger' import { DeviceLedgerApi, DeviceLedgerVO } from '@/api/mes/deviceledger'
import { OrganizationApi, OrganizationVO } from '@/api/mes/organization' import { DeviceLineApi, DeviceLineTreeVO } from '@/api/mes/deviceline'
import { getSimpleUserList, type UserVO } from '@/api/system/user' import { getSimpleUserList, type UserVO } from '@/api/system/user'
import TableSelectDialog from '@/components/TableSelectDialog/TableSelectDialog.vue' import TableSelectDialog from '@/components/TableSelectDialog/TableSelectDialog.vue'
@ -123,7 +121,8 @@ defineOptions({ name: 'MoldOperateForm' })
const { t } = useI18n() // const { t } = useI18n() //
const message = useMessage() // const message = useMessage() //
const lineOptions = ref<OrganizationVO[]>([]) const deviceLineTree = ref<DeviceLineTreeVO[]>([])
const displayTopCategory = ref('')
const operatorOptions = ref<UserVO[]>([]) const operatorOptions = ref<UserVO[]>([])
const initializingOperateType = ref(false) const initializingOperateType = ref(false)
@ -169,7 +168,6 @@ const validateMoldId = (_rule: any, value: any, callback: (error?: Error) => voi
const formRules = reactive({ const formRules = reactive({
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: 'change' }], deviceId: [{ required: true, message: t('MoldManagement.MoldOperate.validatorDeviceRequired'), trigger: 'change' }],
lineId: [{ required: true, message: t('MoldManagement.MoldOperate.validatorProductionLineRequired'), trigger: 'change' }],
moldId: [{ required: true, validator: validateMoldId, trigger: 'change' }], moldId: [{ required: true, validator: validateMoldId, trigger: 'change' }],
operateTime: [{ required: true, message: t('MoldManagement.MoldOperate.validatorOperateTimeRequired'), trigger: 'blur' }], operateTime: [{ required: true, message: t('MoldManagement.MoldOperate.validatorOperateTimeRequired'), trigger: 'blur' }],
operatorId: [{ required: true, message: t('MoldManagement.MoldOperate.validatorOperatorRequired'), trigger: 'change' }], operatorId: [{ required: true, message: t('MoldManagement.MoldOperate.validatorOperatorRequired'), trigger: 'change' }],
@ -265,6 +263,7 @@ const submitForm = async () => {
deviceId: raw.deviceId, deviceId: raw.deviceId,
moldId: raw.moldId, moldId: raw.moldId,
lineId: raw.lineId, lineId: raw.lineId,
lineName: displayTopCategory.value, // 线
operateTime: raw.operateTime, operateTime: raw.operateTime,
operatorId: raw.operatorId, operatorId: raw.operatorId,
remark: raw.remark, remark: raw.remark,
@ -292,12 +291,12 @@ const submitForm = async () => {
} }
const ensureLineOptionsLoaded = async () => { const ensureLineOptionsLoaded = async () => {
if (lineOptions.value.length) return if (deviceLineTree.value.length) return
try { try {
const data = await OrganizationApi.getOrganizationList() const data = await DeviceLineApi.getDeviceLineTree()
lineOptions.value = Array.isArray(data) ? data : [] deviceLineTree.value = Array.isArray(data) ? data : []
} catch { } catch {
lineOptions.value = [] deviceLineTree.value = []
} }
try { try {
operatorOptions.value = (await getSimpleUserList()) ?? [] operatorOptions.value = (await getSimpleUserList()) ?? []
@ -347,6 +346,7 @@ const resetForm = () => {
selectedMoldRows.value = [] selectedMoldRows.value = []
ids.value = [] ids.value = []
moldIds.value = [] moldIds.value = []
displayTopCategory.value = ''
formRef.value?.resetFields() formRef.value?.resetFields()
} }
const deviceColumns = [ const deviceColumns = [
@ -377,12 +377,42 @@ const fetchMoldBrandPage = async (params: Record<string, any>) => {
} }
const selectedDeviceRows = ref<any[]>([]) const selectedDeviceRows = ref<any[]>([])
const selectedMoldRows = ref<any[]>([]) const selectedMoldRows = ref<any[]>([])
const handleDeviceSelectConfirm = (payload: { ids: (number | string)[]; rows: any[] }) => { const handleDeviceSelectConfirm = async (payload: { ids: (number | string)[]; rows: any[] }) => {
const row = payload.rows[0] const row = payload.rows[0]
if (row) { if (row) {
selectedDeviceRows.value = [row] selectedDeviceRows.value = [row]
formData.value.deviceId = Number(row.id) const deviceId = Number(row.id)
ids.value = [Number(row.id)] formData.value.deviceId = deviceId
ids.value = [deviceId]
// deviceLine
try {
const detail = await DeviceLedgerApi.getDeviceLedger(deviceId)
console.log('设备详情:', { detail, topCategoryName: detail?.topCategoryName, topCategoryId: detail?.topCategoryId, deviceLine: detail?.deviceLine })
if (detail?.deviceLine != null) {
formData.value.lineId = detail.deviceLine
}
//
displayTopCategory.value = detail?.topCategoryName || ''
// fallback: 线DeviceLineTree
if (!displayTopCategory.value && detail?.deviceLine != null && deviceLineTree.value.length) {
const lineId = Number(detail.deviceLine)
console.log('fallback 匹配: deviceLine=', lineId, '产线树根数=', deviceLineTree.value.length)
//
const containsId = (nodes: DeviceLineTreeVO[] | undefined, id: number): boolean => {
if (!nodes) return false
return nodes.some((n) => n.id === id || containsId(n.children, id))
}
for (const root of deviceLineTree.value) {
if (root.id === lineId || containsId(root.children, lineId)) {
displayTopCategory.value = root.name
console.log('产线匹配成功:', root.name)
break
}
}
}
} catch (e) {
console.error('获取设备详情失败', e)
}
} else { } else {
selectedDeviceRows.value = [] selectedDeviceRows.value = []
formData.value.deviceId = undefined formData.value.deviceId = undefined
@ -481,6 +511,10 @@ const moldDisplayText = computed(() => {
return map.get(formData.value.moldId) || '' return map.get(formData.value.moldId) || ''
}) })
const displayLineName = computed(() => displayTopCategory.value)
const openCriticalComponentDialog = async () => { const openCriticalComponentDialog = async () => {
searchParams.deviceCode='' searchParams.deviceCode=''

Loading…
Cancel
Save