fix(material): 修复物料管理中的字典类型和表单验证问题

This commit is contained in:
zxy 2026-05-07 17:02:24 +08:00
parent 97008f1d5d
commit f4fd13b81d
5 changed files with 340 additions and 10 deletions

View File

@ -0,0 +1,97 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible" width="800px">
<el-form :model="queryParams" inline label-width="80px">
<el-form-item label="检索条件">
<el-input v-model="queryParams.keyWord" placeholder="请输入机台编码或者机台名称" clearable class="!w-200px" />
</el-form-item>
<el-form-item>
<el-button @click="searchMachine">搜索</el-button>
<el-button @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-table ref="tableRef" v-loading="loading" :data="machineList" :show-overflow-tooltip="true" class="mt-15px" @selection-change="handleSelection">
<el-table-column type="selection" width="50px" />
<el-table-column label="序号" width="60px" align="center" type="index" />
<el-table-column label="机台编码" align="center" prop="machineCd" />
<el-table-column label="机台名称" align="center" prop="machineName" />
<el-table-column label="创建人" align="center" prop="createBy" />
<el-table-column label="创建时间" align="center" prop="createTime" :formatter="dateFormatter2" />
</el-table>
<template #footer>
<el-button @click="confirmSelection" type="primary"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { ref, reactive, nextTick } from 'vue'
import { dateFormatter2 } from '@/utils/formatTime'
import * as MachineApi from '@/api/biz/machine'
const message = useMessage()
const dialogVisible = ref(false)
const dialogTitle = ref('选择机台')
const loading = ref(false)
const machineList = ref([])
const selection = ref([])
const tableRef = ref()
const selectedMachineIds = ref([])
const queryParams = reactive({
keyWord: undefined
})
const emit = defineEmits(['confirm'])
const open = (selectedIds: number[] = []) => {
dialogVisible.value = true
selection.value = []
selectedMachineIds.value = selectedIds
searchMachine()
}
const searchMachine = async () => {
loading.value = true
try {
const data = await MachineApi.getMachinePage(queryParams)
machineList.value = data.list || []
await nextTick(() => {
if (tableRef.value && selectedMachineIds.value.length > 0) {
machineList.value.forEach(item => {
if (selectedMachineIds.value.includes(item.id)) {
tableRef.value.toggleRowSelection(item, true)
}
})
}
})
} finally {
loading.value = false
}
}
const resetQuery = () => {
queryParams.keyWord = undefined
searchMachine()
}
const handleSelection = (val: any[]) => {
selection.value = val
}
const confirmSelection = () => {
if (selection.value.length === 0) {
message.warning('请选择机台')
return
}
emit('confirm', selection.value)
dialogVisible.value = false
}
defineExpose({ open })
</script>
<style scoped>
.mt-15px {
margin-top: 15px;
}
</style>

View File

@ -114,8 +114,8 @@ const formData = ref({
schemeId: undefined,
})
const validateSafeStock = (rule: any, value: number, callback: any) => {
if (value === undefined || value === null || value === '') {
const validateSafeStock = (_rule: any, value: number, callback: any) => {
if (value === undefined || value === null ) {
callback()
return
}
@ -149,20 +149,25 @@ const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
//
//
if (id) {
formLoading.value = true
try {
formData.value = await MaterialApi.getMaterial(id)
const data = await MaterialApi.getMaterial(id)
//
if (formData.value.schemeId) {
const inspPlan = await InspPlanApi.getInspPlan(formData.value.schemeId)
if (data.schemeId) {
const inspPlan = await InspPlanApi.getInspPlan(data.schemeId)
schemeName.value = inspPlan.schemeName
}
//
resetForm()
formData.value = data
} finally {
formLoading.value = false
}
} else {
//
resetForm()
}
}
/** 打开质检方案选择弹窗 */

View File

@ -34,7 +34,7 @@
class="!w-240px"
>
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.MAT_TYPE)"
v-for="dict in getIntDictOptions(DICT_TYPE.MAT_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
@ -85,7 +85,7 @@
<el-table-column label="单位" align="center" prop="unit" >
<template #default="scope">
<dict-tag :type="DICT_TYPE.UNIT" :value="scope.row.unit" />
<dict-tag :type="DICT_TYPE.MAT_UNIT" :value="scope.row.unit" />
</template>
</el-table-column>

View File

@ -98,7 +98,7 @@ import { dateFormatter } from '@/utils/formatTime'
import * as ProLineApi from '@/api/biz/proline'
import ProLineForm from './ProLineForm.vue'
defineOptions({ name: 'Proline' })
defineOptions({ name: 'ProLine' })
const message = useMessage() //
const { t } = useI18n() //

View File

@ -0,0 +1,228 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible" width="1200px">
<el-form
ref="formRef"
:model="formData"
label-width="110px"
v-loading="formLoading"
>
<!-- 基础信息 -->
<div class="form-section">
<div class="section-title">基础信息</div>
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="供应商编码">
<el-input v-model="formData.supplierNo" disabled />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="供应商名称">
<el-input v-model="formData.supplierName" disabled />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="简称">
<el-input v-model="formData.supplierSimName" disabled />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="供应商类型">
<el-select v-model="formData.supplierType" disabled>
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.SUPPLIER_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="供应商等级">
<el-select v-model="formData.supplierReg" disabled>
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.SUPPLIER_GRADE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="公司税号">
<el-input v-model="formData.comTaxNumber" disabled />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="启用状态">
<el-select v-model="formData.enabledStatus" disabled>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.SYSTEM_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="供应商状态">
<el-select v-model="formData.status" disabled>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.SUPPLIER_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="是否黑名单">
<el-select v-model="formData.isBlacklist" disabled>
<el-option label="是" :value="1" />
<el-option label="否" :value="0" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="备注">
<el-input v-model="formData.remark" type="textarea" :rows="2" disabled />
</el-form-item>
</div>
<!-- 联系方式 -->
<div class="form-section">
<div class="section-title">联系方式</div>
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="联系人1">
<el-input v-model="formData.contact1" disabled />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="联系电话1">
<el-input v-model="formData.conPhone1" disabled />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="联系地址1">
<el-input v-model="formData.conAddress1" disabled />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="联系人2">
<el-input v-model="formData.contact2" disabled />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="联系电话2">
<el-input v-model="formData.conPhone2" disabled />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="联系地址2">
<el-input v-model="formData.conAddress2" disabled />
</el-form-item>
</el-col>
</el-row>
</div>
<!-- 银行信息 -->
<div class="form-section">
<div class="section-title">银行信息</div>
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="开户地区">
<el-input v-model="formData.accountRegion" disabled />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开户银行">
<el-input v-model="formData.accountBank" disabled />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="开户账号">
<el-input v-model="formData.accountNo" disabled />
</el-form-item>
</el-col>
</el-row>
</div>
</el-form>
<template #footer>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { getStrDictOptions, getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import * as SupplierApi from '@/api/biz/supplier'
const dialogVisible = ref(false)
const dialogTitle = ref('查看详情')
const formLoading = ref(false)
const formData = ref({
id: undefined,
supplierNo: undefined,
supplierName: undefined,
supplierSimName: undefined,
supplierType: undefined,
supplierReg: undefined,
contact1: undefined,
conPhone1: undefined,
conAddress1: undefined,
contact2: undefined,
conPhone2: undefined,
conAddress2: undefined,
comTaxNumber: undefined,
accountRegion: undefined,
accountBank: undefined,
accountNo: undefined,
remark: undefined,
enabledStatus: 0,
status: 1,
isBlacklist: 0,
})
const open = async (id: number) => {
dialogVisible.value = true
formLoading.value = true
try {
const data = await SupplierApi.getSupplier(id)
if (data.enabledStatus !== undefined && data.enabledStatus !== null) {
data.enabledStatus = Number(data.enabledStatus)
}
if (data.status !== undefined && data.status !== null) {
data.status = Number(data.status)
}
if (data.isBlacklist !== undefined && data.isBlacklist !== null) {
data.isBlacklist = Number(data.isBlacklist)
}
formData.value = data
} finally {
formLoading.value = false
}
}
defineExpose({ open })
</script>
<style scoped>
.form-section {
margin-bottom: 24px;
}
.section-title {
font-size: 14px;
font-weight: 600;
color: #606266;
margin-bottom: 16px;
padding-left: 8px;
border-left: 3px solid #409eff;
}
</style>