style:上下模-模具必填

main
黄伟杰 4 weeks ago
parent 4dd9ba1378
commit ac7e65cec8

@ -16,7 +16,12 @@
@selection-change="handleSelectionChange" @selection-change="handleSelectionChange"
@row-click="handleRowClick" @row-click="handleRowClick"
> >
<el-table-column type="selection" width="55" reserve-selection /> <el-table-column
type="selection"
width="55"
reserve-selection
:selectable="isSelectionColumnSelectable"
/>
<el-table-column <el-table-column
v-for="column in columns" v-for="column in columns"
:key="column.prop || column.slotName" :key="column.prop || column.slotName"
@ -71,6 +76,7 @@ const props = withDefaults(
pageSize?: number pageSize?: number
initialRows?: any[] initialRows?: any[]
queryParams?: Record<string, any> // queryParams?: Record<string, any> //
selectable?: (row: any, index: number) => boolean
/** ✅ 新增 */ /** ✅ 新增 */
defaultSelectedKeys?: (string | number)[] defaultSelectedKeys?: (string | number)[]
}>(), }>(),
@ -102,6 +108,18 @@ const syncingSelection = ref(false)
const isSingleSelect = computed(() => props.selectionType === 'single') const isSingleSelect = computed(() => props.selectionType === 'single')
const resolveRowKey = (row: Record<string, any>) => row[props.rowKey] const resolveRowKey = (row: Record<string, any>) => row[props.rowKey]
const isRowSelectable = (row: any, index = list.value.findIndex((item) => resolveRowKey(item) === resolveRowKey(row))) => {
return props.selectable ? props.selectable(row, index) : true
}
const isSelectionColumnSelectable = (row: any, index: number) => isRowSelectable(row, index)
const removeUnselectableSelections = () => {
list.value.forEach((row, index) => {
if (!isRowSelectable(row, index)) {
selectedMap.value.delete(resolveRowKey(row))
}
})
}
const refreshSelectionOnTable = async () => { const refreshSelectionOnTable = async () => {
await nextTick() await nextTick()
@ -111,9 +129,9 @@ const refreshSelectionOnTable = async () => {
try { try {
table.clearSelection() table.clearSelection()
const selectedIds = selectedMap.value const selectedIds = selectedMap.value
list.value.forEach((row) => { list.value.forEach((row, index) => {
const rowId = resolveRowKey(row) const rowId = resolveRowKey(row)
if (selectedIds.has(rowId)) { if (selectedIds.has(rowId) && isRowSelectable(row, index)) {
table.toggleRowSelection(row, true) table.toggleRowSelection(row, true)
} }
}) })
@ -139,6 +157,7 @@ const getList = async () => {
const data = await props.fetchApi(params) const data = await props.fetchApi(params)
list.value = data.list || [] list.value = data.list || []
total.value = data.total || 0 total.value = data.total || 0
removeUnselectableSelections()
await refreshSelectionOnTable() await refreshSelectionOnTable()
} finally { } finally {
loading.value = false loading.value = false
@ -147,9 +166,10 @@ const getList = async () => {
const handleSelectionChange = (rows: any[]) => { const handleSelectionChange = (rows: any[]) => {
if (syncingSelection.value) return if (syncingSelection.value) return
const selectableRows = rows.filter((row) => isRowSelectable(row))
if (isSingleSelect.value) { if (isSingleSelect.value) {
selectedMap.value.clear() selectedMap.value.clear()
const latestRow = rows.length ? rows[rows.length - 1] : undefined const latestRow = selectableRows.length ? selectableRows[selectableRows.length - 1] : undefined
if (latestRow) { if (latestRow) {
selectedMap.value.set(resolveRowKey(latestRow), latestRow) selectedMap.value.set(resolveRowKey(latestRow), latestRow)
} }
@ -160,13 +180,14 @@ const handleSelectionChange = (rows: any[]) => {
pageIdSet.forEach((id) => { pageIdSet.forEach((id) => {
selectedMap.value.delete(id) selectedMap.value.delete(id)
}) })
rows.forEach((row) => { selectableRows.forEach((row) => {
selectedMap.value.set(resolveRowKey(row), row) selectedMap.value.set(resolveRowKey(row), row)
}) })
} }
const handleRowClick = (row: any) => { const handleRowClick = (row: any) => {
if (!isSingleSelect.value) return if (!isSingleSelect.value) return
if (!isRowSelectable(row)) return
const table = tableRef.value const table = tableRef.value
if (!table) return if (!table) return
syncingSelection.value = true syncingSelection.value = true

@ -22,7 +22,12 @@
<el-input :model-value="displayLineName" readonly /> <el-input :model-value="displayLineName" readonly />
</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"
:required="String(formData.operateType) === '1'"
v-if="formData.operateType == 1"
>
<el-input <el-input
:model-value="moldDisplayText" :model-value="moldDisplayText"
:placeholder="t('MoldManagement.MoldOperate.placeholderMold')" :placeholder="t('MoldManagement.MoldOperate.placeholderMold')"
@ -67,6 +72,7 @@
selection-type="single" selection-type="single"
@confirm="handleDeviceSelectConfirm" @confirm="handleDeviceSelectConfirm"
:query-params="mergedQueryParams" :query-params="mergedQueryParams"
:selectable="isDeviceSelectable"
> >
<!-- 使用 header 插槽插入查询表单 --> <!-- 使用 header 插槽插入查询表单 -->
<template #header> <template #header>
@ -210,7 +216,7 @@ const formData = ref<MoldOperateFormData>({
}) })
const validateMoldId = (_rule: any, value: any, callback: (error?: Error) => void) => { const validateMoldId = (_rule: any, value: any, callback: (error?: Error) => void) => {
if (formData.value.operateType == null) { if (String(formData.value.operateType) !== '1') {
callback() callback()
return return
} }
@ -225,6 +231,7 @@ 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' }],
moldId: [{ 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' }],
}) })
@ -432,6 +439,8 @@ const resetForm = () => {
displayTopCategory.value = '' displayTopCategory.value = ''
formRef.value?.resetFields() formRef.value?.resetFields()
} }
const isDeviceSelectable = (row: any) => String(row?.moldGroup ?? '').trim() === ''
const deviceColumns = computed(() => { const deviceColumns = computed(() => {
const baseColumns = [ const baseColumns = [
{ label: '设备编号', prop: 'deviceCode', minWidth: 140 }, { label: '设备编号', prop: 'deviceCode', minWidth: 140 },

Loading…
Cancel
Save