You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

370 lines
14 KiB
Vue

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<Dialog :title="dialogTitle" v-model="dialogVisible" width="900px">
<el-form ref="formRef" :model="formData" :rules="formRules" label-width="100px" v-loading="formLoading">
<el-form-item :label="t('EquipmentManagement.RepairItems.subjectCode')" prop="subjectCode">
<el-input
v-model="formData.subjectCode"
:placeholder="t('EquipmentManagement.RepairItems.placeholderSubjectCode')"
/>
</el-form-item>
<el-form-item :label="t('EquipmentManagement.RepairItems.subjectName')" prop="subjectName">
<el-input
v-model="formData.subjectName"
:placeholder="t('EquipmentManagement.RepairItems.placeholderSubjectName')"
/>
</el-form-item>
<el-form-item :label="t('EquipmentManagement.RepairItems.deviceType')" prop="deviceType">
<el-radio-group v-model="formData.deviceType">
<el-radio :label="1">{{ t('EquipmentManagement.RepairItems.deviceTypeDevice') }}</el-radio>
<el-radio :label="2">{{ t('EquipmentManagement.RepairItems.deviceTypeComponent') }}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item v-if="showDeviceSelect" :label="t('EquipmentManagement.RepairItems.device')" prop="deviceId">
<el-select
v-model="formData.deviceId"
multiple
collapse-tags
collapse-tags-tooltip
filterable
remote
reserve-keyword
clearable
:remote-method="handleDeviceSearch"
:loading="deviceLoading"
:placeholder="t('EquipmentManagement.RepairItems.placeholderDevice')"
class="!w-full"
>
<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 v-if="showComponentSelect" :label="t('EquipmentManagement.RepairItems.component')" prop="componentId">
<el-select
v-model="formData.componentId"
clearable
:loading="componentLoading"
:placeholder="t('EquipmentManagement.RepairItems.placeholderComponent')"
class="!w-full"
>
<el-option v-for="opt in componentOptions" :key="String(opt.value)" :label="opt.label" :value="opt.value" />
</el-select>
</el-form-item>
<!--
<el-form-item label="检验方式" prop="inspectionMethod">
<el-select v-model="formData.inspectionMethod" placeholder="请选择检验方式" clearable filterable class="!w-full">
<el-option v-for="dict in inspectionMethodOptions" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="值类型" prop="valueType">
<el-select v-model="formData.valueType" placeholder="请选择值类型" clearable filterable class="!w-full">
<el-option v-for="dict in valueTypeOptions" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="判定基准" prop="judgmentCriteria">
<el-input v-model="formData.judgmentCriteria" placeholder="请输入判定基准" type="textarea" />
</el-form-item>
-->
<el-form-item :label="t('EquipmentManagement.RepairItems.projectContent')" prop="projectContent">
<el-input
v-model="formData.projectContent"
:placeholder="t('EquipmentManagement.RepairItems.placeholderProjectContent')"
type="textarea"
/>
</el-form-item>
<el-form-item :label="t('EquipmentManagement.RepairItems.isEnable')" prop="isEnable">
<el-radio-group v-model="formData.isEnable">
<el-radio v-for="dict in getBoolDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING)" :key="dict.value" :label="dict.value">
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading">{{ t('common.ok') }}</el-button>
<el-button @click="dialogVisible = false">{{ t('common.cancel') }}</el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { getBoolDictOptions, DICT_TYPE } from '@/utils/dict'
import { RepairItemsApi, RepairItemVO } from '@/api/mes/repairItems'
import { useDictStoreWithOut } from '@/store/modules/dict'
import { DeviceLedgerApi, DeviceLedgerVO } from '@/api/mes/deviceledger'
defineOptions({ name: 'RepairItemsForm' })
const { t } = useI18n()
const message = useMessage()
const dictStore = useDictStoreWithOut()
const dictReady = ref(false)
// const inspectionMethodOptions = computed(() => (dictReady.value ? getStrDictOptions('Inspection_method') : []))
// const valueTypeOptions = computed(() => (dictReady.value ? getStrDictOptions('value_types') : []))
const dialogVisible = ref(false)
const dialogTitle = ref('')
const formLoading = ref(false)
const formType = ref('')
const formRef = ref()
const isInitializing = ref(false)
const isSwitchingDeviceType = ref(false)
const formData = ref({
id: undefined as number | undefined,
subjectCode: undefined as string | undefined,
subjectName: undefined as string | undefined,
deviceType: undefined as number | undefined,
deviceId: undefined as number | number[] | undefined,
componentId: undefined as number | undefined,
inspectionMethod: undefined as string | undefined,
valueType: undefined as string | undefined,
judgmentCriteria: undefined as string | undefined,
projectContent: undefined as string | undefined,
isEnable: undefined as string | undefined
})
const showDeviceSelect = computed(() => formData.value.deviceType === 1 || formData.value.deviceType === 2)
const showComponentSelect = computed(() => formData.value.deviceType === 2)
const deviceLoading = ref(false)
const deviceOptions = ref<{ label: string; value: number }[]>([])
const componentLoading = ref(false)
const componentOptions = ref<{ label: string; value: number }[]>([])
const upsertOption = (options: { label: string; value: number }[], option: { label: string; value: number }) => {
const existed = options.some((o) => o.value === option.value)
return existed ? options : [option, ...options]
}
const handleDeviceSearch = async (keyword: string) => {
deviceLoading.value = true
try {
const data = await DeviceLedgerApi.getDeviceLedgerPage({
pageNo: 1,
pageSize: 50,
deviceCode: keyword || undefined,
deviceName: keyword || undefined
})
const rows = (data?.list ?? []) as DeviceLedgerVO[]
deviceOptions.value = rows
.filter((r) => typeof r?.id === 'number')
.map((r) => ({ label: `${r.deviceCode ?? ''} ${r.deviceName ?? ''}`.trim(), value: r.id }))
} finally {
deviceLoading.value = false
}
}
const toComponentOption = (item: any) => {
const id = typeof item?.id === 'number' ? item.id : Number(item?.id)
if (Number.isNaN(id)) return undefined
const code = item?.code ?? item?.componentCode ?? item?.subjectCode
const name = item?.name ?? item?.componentName ?? item?.subjectName
const label = `${code ?? ''} ${name ?? ''}`.trim() || String(id)
return { label, value: id }
}
const loadComponentOptionsByDeviceId = async (deviceId: number) => {
componentLoading.value = true
try {
const data = await RepairItemsApi.getComponentList(deviceId)
const rows = (Array.isArray(data) ? data : data?.list ?? data?.data ?? []) as any[]
componentOptions.value = rows.map(toComponentOption).filter(Boolean) as { label: string; value: number }[]
} finally {
componentLoading.value = false
}
}
watch(
() => formData.value.deviceType,
async () => {
if (isInitializing.value) return
isSwitchingDeviceType.value = true
formData.value.deviceId = formData.value.deviceType === 1 ? [] : undefined
deviceOptions.value = []
formData.value.componentId = undefined
componentOptions.value = []
await nextTick()
formRef.value?.clearValidate?.(['deviceId', 'componentId'])
isSwitchingDeviceType.value = false
}
)
watch(
() => formData.value.deviceId,
async (deviceId) => {
if (formData.value.deviceType !== 2) return
formData.value.componentId = undefined
componentOptions.value = []
const selectedId = typeof deviceId === 'number' ? deviceId : undefined
if (typeof selectedId !== 'number') return
await loadComponentOptionsByDeviceId(selectedId)
}
)
const validateDeviceId = (_: any, value: any, callback: any) => {
if (isSwitchingDeviceType.value) {
callback()
return
}
const dt = formData.value.deviceType
if (dt === 1) {
const ids = Array.isArray(value) ? value : []
if (!ids.length) {
callback(new Error(t('EquipmentManagement.RepairItems.validatorDeviceRequired')))
return
}
callback()
return
}
if (dt === 2 && (value === undefined || value === null || value === '')) {
callback(new Error(t('EquipmentManagement.RepairItems.validatorDeviceRequired')))
return
}
callback()
}
const validateComponentId = (_: any, value: any, callback: any) => {
if (isSwitchingDeviceType.value) {
callback()
return
}
const dt = formData.value.deviceType
if (dt === 2 && (value === undefined || value === null || value === '')) {
callback(new Error(t('EquipmentManagement.RepairItems.validatorComponentRequired')))
return
}
callback()
}
const formRules = reactive({
subjectCode: [{ required: true, message: t('EquipmentManagement.RepairItems.validatorSubjectCodeRequired') }],
subjectName: [{ required: true, message: t('EquipmentManagement.RepairItems.validatorSubjectNameRequired') }],
deviceType: [{ required: true, message: t('EquipmentManagement.RepairItems.validatorDeviceTypeRequired') }],
deviceId: [{ validator: validateDeviceId }],
componentId: [{ validator: validateComponentId }],
isEnable: [{ required: true, message: t('EquipmentManagement.RepairItems.validatorIsEnableRequired') }]
})
const open = async (type: string, row?: any) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
isInitializing.value = true
resetForm()
if (!dictReady.value) {
await dictStore.setDictMap()
dictReady.value = true
}
if (type === 'update' && row) {
const parseDeviceIds = (input: unknown) => {
if (input === undefined || input === null || input === '') return []
if (Array.isArray(input)) return input.map((v) => Number(v)).filter((v) => !Number.isNaN(v))
if (typeof input === 'number') return [input]
return String(input)
.split(',')
.map((v) => Number(v.trim()))
.filter((v) => !Number.isNaN(v))
}
const deviceIds = parseDeviceIds(row.deviceId)
formData.value = {
id: row.id,
subjectCode: row.subjectCode,
subjectName: row.subjectName,
deviceType: row.deviceType !== undefined && row.deviceType !== null ? Number(row.deviceType) : undefined,
deviceId: (row.deviceType !== undefined && row.deviceType !== null ? Number(row.deviceType) : undefined) === 1
? deviceIds
: deviceIds[0],
componentId: row.componentId !== undefined && row.componentId !== null ? Number(row.componentId) : undefined,
inspectionMethod: row.inspectionMethod !== undefined && row.inspectionMethod !== null ? String(row.inspectionMethod) : undefined,
valueType: row.valueType !== undefined && row.valueType !== null ? String(row.valueType) : undefined,
judgmentCriteria: row.judgmentCriteria,
projectContent: row.projectContent,
isEnable: row.isEnable !== undefined && row.isEnable !== null ? String(row.isEnable) : undefined
}
if (formData.value.deviceType === 1) {
const ids = Array.isArray(formData.value.deviceId) ? formData.value.deviceId : []
const nameParts = row.deviceName ? String(row.deviceName).split(/[,]/).map((v) => v.trim()).filter(Boolean) : []
ids.forEach((id, idx) => {
const label = nameParts[idx] ? String(nameParts[idx]) : `ID:${id}`
deviceOptions.value = upsertOption(deviceOptions.value, { label, value: id })
})
} else if (typeof formData.value.deviceId === 'number') {
const label = row.deviceName ? String(row.deviceName) : `ID:${formData.value.deviceId}`
deviceOptions.value = upsertOption(deviceOptions.value, { label, value: formData.value.deviceId })
}
if (formData.value.deviceType === 2 && typeof formData.value.deviceId === 'number') {
await loadComponentOptionsByDeviceId(formData.value.deviceId)
if (typeof formData.value.componentId === 'number') {
const label = row.componentName ? String(row.componentName) : `ID:${formData.value.componentId}`
componentOptions.value = upsertOption(componentOptions.value, { label, value: formData.value.componentId })
}
}
}
await nextTick()
formRef.value?.clearValidate?.()
isInitializing.value = false
}
defineExpose({ open })
const emit = defineEmits(['success'])
const submitForm = async () => {
await formRef.value.validate()
formLoading.value = true
try {
const buildDeviceIdParam = () => {
if (Array.isArray(formData.value.deviceId)) return formData.value.deviceId.join(',')
return formData.value.deviceId
}
const data = {
id: formType.value === 'update' ? formData.value.id : undefined,
subjectCode: formData.value.subjectCode,
subjectName: formData.value.subjectName,
deviceType: formData.value.deviceType,
deviceId: buildDeviceIdParam(),
componentId: formData.value.componentId,
inspectionMethod: formData.value.inspectionMethod,
valueType: formData.value.valueType,
judgmentCriteria: formData.value.judgmentCriteria,
isEnable: formData.value.isEnable,
projectContent: formData.value.projectContent
} as unknown as RepairItemVO
if (formType.value === 'create') {
await RepairItemsApi.createRepairItem(data)
message.success(t('common.createSuccess'))
} else {
await RepairItemsApi.updateRepairItem(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
emit('success')
} finally {
formLoading.value = false
}
}
const resetForm = () => {
formData.value = {
id: undefined,
subjectCode: undefined,
subjectName: undefined,
deviceType: undefined,
deviceId: undefined,
componentId: undefined,
inspectionMethod: undefined,
valueType: undefined,
judgmentCriteria: undefined,
projectContent: undefined,
isEnable: true
}
deviceOptions.value = []
componentOptions.value = []
formRef.value?.resetFields()
}
</script>