<!-- 供方名录 可编辑基本信息 -->
<script name="SupplierInfoBasicForEdit" lang="ts" setup>
import type { UploadProps, UploadUserFile } from 'element-plus'
import { ElLoading, ElMessage, ElMessageBox, dayjs } from 'element-plus'
import type { ISupplierInfo } from './supplier-interface'
import { mailboxValidator, phoneValidator, postalCodeValidator, websiteValidator } from './supplier-interface'
import { UploadFile } from '@/api/file'
import type { IDictType } from '@/commonInterface/resource-interface'
import { failUpdateSupplierBasic, saveSupplierBasic, submitSupplierBasic, updateSupplierBasic } from '@/api/resource/supplier'
import useUserStore from '@/store/modules/user'
const props = defineProps({
operation: { type: String, default: '' },
})
const emit = defineEmits(['afterSaveDraft', 'commitSuccess'])
const userInfo = useUserStore()
const operationName = ref('')
const updateTime = ref('')
// 关键字段是否可以编辑
const keyFieldsDisable = ref<boolean>(true)
// 供方类型字典值
const supplierTypeDict = ref<Array<IDictType>>([])
const labCodeDict = ref<IDictType[]>([])
const groupCodeDict = ref<IDictType[]>([])
const supplierInfo = ref<ISupplierInfo>({
id: '',
labCode: '',
groupCode: '',
supplierNo: '',
supplierName: '',
briefName: '',
supplierType: '',
supplierTypeName: '',
taxNumber: '',
bankAccount: '',
bankName: '',
bankAccountNumber: '',
director: '',
phone: '',
postalCode: '',
fax: '',
mailbox: '',
website: '',
companyAddress: '',
supplierContent: '',
minioFileName: '',
remark: '',
approvalStatus: '',
approvalStatusName: '',
processId: '',
taskId: '',
createUserName: '',
createTime: '',
})
const fileNameList = ref<Array<UploadUserFile>>([])
const basicFormRef = ref()
const supplierBasicRules = ref({
labCode: [{ required: true, message: '实验室代码不能为空,请选择', trigger: ['change', 'blur'] }],
groupCode: [{ required: true, message: '组别代码不能为空,请选择', trigger: ['change', 'blur'] }],
supplierName: [{ required: true, message: '供方名称不能为空', trigger: 'blur' }],
supplierType: [{ required: true, message: '供方类型不能为空,请选择', trigger: ['change', 'blur'] }],
supplierContent: [{ required: true, message: '服务和供应内容不能为空', trigger: 'blur' }],
phone: [{ required: true, trigger: 'blur', validator: phoneValidator }],
postalCode: [{ message: '邮政编码为6位数字', trigger: 'blur', validator: postalCodeValidator }],
companyAddress: [{ required: true, message: '地址不能为空', trigger: 'blur' }],
mailbox: [{ message: '请输入规范的邮箱', trigger: 'blur', validator: mailboxValidator }],
website: [{ message: '请输入规范的网址', trigger: 'blur', validator: websiteValidator }],
}) // 表单验证规则
// 逻辑
// 查询人员基本信息 从缓存中直接取
const getSupplierBasicInCache = () => {
supplierInfo.value = JSON.parse(sessionStorage.getItem('supplierInfo')!)
}
// 设置字段是否可以编辑
const setFieldsDisable = (editable: boolean) => {
keyFieldsDisable.value = editable
}
// 保存至草稿箱
const addSupplierBase = () => {
saveSupplierBasic(supplierInfo.value).then((res) => {
if (res.code === 200) {
// 提示保存成功
ElMessage.success('保存成功')
// 设置返回的供方id和供方编号
supplierInfo.value.supplierNo = res.data.supplierNo
supplierInfo.value.id = res.data.id
// 返回保存后生成的id
emit('afterSaveDraft', res.data.id)
}
else {
// 提示失败信息
ElMessage.error(`保存失败:${res.message}`)
}
})
}
// 编辑草稿箱(不走流程审批)
const updateSupplierBase = () => {
updateSupplierBasic(supplierInfo.value).then((res) => {
if (res.code === 200) {
// 提示保存成功
ElMessage.success('保存成功')
}
else {
// 提示失败信息
ElMessage.error(`保存失败:${res.message}`)
}
})
}
// 保存基本信息
const saveBasicForm = async () => {
if (!basicFormRef) { return }
await basicFormRef.value.validate((valid: boolean, fields: any) => {
if (valid === true) {
ElMessageBox.confirm(
'确认保存吗?',
'提示',
{
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
},
).then(() => {
if (props.operation === 'create') {
addSupplierBase()
}
else if (props.operation === 'update') {
updateSupplierBase()
}
})
}
})
}
// 提交供方审批
const submitBasicForm = async () => {
ElMessageBox.confirm(`是否提交审批单 ${supplierInfo.value.supplierNo}`, '提示', {
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
submitSupplierBasic({
formId: 'zyglhggfml',
id: supplierInfo.value.id,
}).then((res) => {
if (res.code === 200) {
ElMessage.success(`审批单 ${supplierInfo.value.supplierNo} 提交成功`)
emit('commitSuccess', supplierInfo.value)
}
else {
ElMessage.error(`审批单 ${supplierInfo.value.supplierNo} 提交失败:${res.message}`)
}
})
})
}
// 保存并提交审批单 重新进入流程审批
const failUpdateSubmitBasicForm = async () => {
if (!basicFormRef) { return }
await basicFormRef.value.validate((valid: boolean) => {
if (valid === true) {
failUpdateSupplierBasic(supplierInfo.value).then((res) => {
if (res.code === 200) {
// 提示保存成功
ElMessage.success(`审批单 ${supplierInfo.value.supplierNo} 提交成功`)
emit('commitSuccess', supplierInfo.value)
}
else {
// 提示失败信息
ElMessage.error(`审批单 ${supplierInfo.value.supplierNo} 提交失败:${res.message}`)
}
})
}
})
}
const getFileListNames = () => {
supplierInfo.value.minioFileName = ''
fileNameList.value.forEach((file) => {
supplierInfo.value.minioFileName += `${file.name},`
})
supplierInfo.value.minioFileName = supplierInfo.value.minioFileName?.substring(0, supplierInfo.value.minioFileName.length - 1)
}
// 上传请求
const uploadFile: any = (file: any) => {
const fd = new FormData()
fd.append('multipartFile', file.file)
const loading = ElLoading.service({
lock: true,
background: 'rgba(255, 255, 255, 0.8)',
})
UploadFile(fd).then((res) => {
if (res.code === 200) {
ElMessage.success('上传成功')
fileNameList.value.pop() // 手动将选择文件时添加的数据去掉
fileNameList.value.push({
name: res.data[0],
status: 'success',
})
getFileListNames()
loading.close()
}
}).catch(() => {
loading.close()
ElMessage.error('上传失败')
})
}
// 删除已上传的文件
const handleRemove: UploadProps['onRemove'] = (file, uploadFiles) => {
getFileListNames()
}
// 监听 显示中文 立即监听
watch(() => supplierInfo.value.supplierType, (newVal) => {
labCodeDict.value = JSON.parse(sessionStorage.getItem('bizLabCode')!)
groupCodeDict.value = JSON.parse(sessionStorage.getItem('bizGroupCode')!)
supplierTypeDict.value = JSON.parse(sessionStorage.getItem('bizSupplierType')!)
if (supplierTypeDict.value.length > 0) {
const targetList = supplierTypeDict.value.filter(item => item.value === newVal)
if (targetList.length > 0) {
supplierInfo.value.supplierTypeName = targetList[0].name
}
else {
supplierInfo.value.supplierTypeName = ''
}
}
}, { immediate: true })
// 监听 显示中文 立即监听
watch(() => props.operation, (newVal) => {
if (newVal === 'create') { operationName.value = '新建' }
else if (newVal === 'update') { operationName.value = '编辑' }
updateTime.value = dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss')
}, { immediate: true })
defineExpose({
getSupplierBasicInCache,
setFieldsDisable,
saveBasicForm,
submitBasicForm,
failUpdateSubmitBasicForm,
})
</script>
<template>
<el-form ref="basicFormRef" :model="supplierInfo" :rules="supplierBasicRules" label-position="right" label-width="110" border stripe>
<el-row v-show="props.operation !== 'detail'" :gutter="24" style="margin-bottom: 20px;">
<el-col :span="6">
<el-form-item label="变更类型">
<el-input v-model="operationName" :disabled="true" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="操作部门">
<el-input v-model="userInfo.deptName" :disabled="true" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="编辑人">
<el-input v-model="userInfo.name" :disabled="true" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="编辑时间">
<el-input v-model="updateTime" :disabled="true" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<!-- 第一行 第一列 -->
<el-col :span="6">
<el-form-item label="实验室代码" prop="labCode">
<el-select v-model="supplierInfo.labCode" placeholder="请选择实验室代码" tabindex="1" :disabled="keyFieldsDisable" style="width: 100%;">
<el-option v-for="dict in labCodeDict" :key="dict.id" :label="dict.name" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="供方名称" prop="supplierName">
<el-input v-model="supplierInfo.supplierName" :clearable="true" tabindex="4" placeholder="请输入供方名称" :disabled="keyFieldsDisable" />
</el-form-item>
<el-form-item label="税号">
<el-input v-model="supplierInfo.taxNumber" :clearable="true" tabindex="8" placeholder="请输入税号" />
</el-form-item>
<el-form-item label="邮编" prop="postalCode">
<el-input v-model="supplierInfo.postalCode" tabindex="12" placeholder="请输入邮政编码" :clearable="true" />
</el-form-item>
</el-col>
<!-- 第一行 第二列 -->
<el-col :span="6">
<el-form-item label="组别代码" prop="groupCode">
<el-select v-model="supplierInfo.groupCode" placeholder="请选择组别代码" tabindex="2" :disabled="keyFieldsDisable" style="width: 100%;">
<el-option v-for="dict in groupCodeDict" :key="dict.id" :label="dict.name" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="供方简称">
<el-input v-model="supplierInfo.briefName" :clearable="true" tabindex="5" placeholder="请输入供方简称" />
</el-form-item>
<el-form-item label="银行账户名">
<el-input v-model="supplierInfo.bankAccount" :clearable="true" tabindex="9" placeholder="请输入银行账户名" />
</el-form-item>
<el-form-item label="传真" prop="fax">
<el-input v-model="supplierInfo.fax" :clearable="true" tabindex="13" placeholder="请输入传真" />
</el-form-item>
</el-col>
<!-- 第一行 第三列 -->
<el-col :span="6">
<el-form-item label="供方编号">
<el-input v-model="supplierInfo.supplierNo" placeholder="供方编号,保存后自动生成" :readonly="true" :disabled="true" />
</el-form-item>
<el-form-item label="联系人">
<el-input v-model="supplierInfo.director" :clearable="true" tabindex="6" placeholder="请输入联系人" />
</el-form-item>
<el-form-item label="银行名称">
<el-input v-model="supplierInfo.bankName" :clearable="true" tabindex="10" placeholder="请输入银行名称" />
</el-form-item>
<el-form-item label="邮箱" prop="mailbox">
<el-input v-model="supplierInfo.mailbox" tabindex="14" placeholder="请输入邮箱" :clearable="true" />
</el-form-item>
</el-col>
<!-- 第一行 第四列 -->
<el-col :span="6">
<el-form-item label="供方类型" prop="supplierType">
<el-select v-model="supplierInfo.supplierType" tabindex="3" placeholder="请选择供方类型" style="width: 100%;" :clearable="true">
<el-option v-for="dict in supplierTypeDict" :key="dict.id" :label="dict.name" :value="dict.value" />
</el-select>
<el-input v-model="supplierInfo.supplierTypeName" type="hidden" />
</el-form-item>
<el-form-item label="联系电话" prop="phone">
<el-input v-model="supplierInfo.phone" :clearable="true" tabindex="7" placeholder="请输入联系电话" />
</el-form-item>
<el-form-item label="银行账号">
<el-input v-model="supplierInfo.bankAccount" :clearable="true" tabindex="11" placeholder="请输入银行账号" />
</el-form-item>
<el-form-item label="网址" prop="website">
<el-input v-model="supplierInfo.website" :clearable="true" tabindex="15" placeholder="请输入网址, http://或http://" />
</el-form-item>
</el-col>
</el-row>
<!-- 第二行 -->
<el-row :gutter="24">
<!-- 第一列 -->
<el-col :span="12">
<el-form-item label="地址" prop="companyAddress">
<el-input v-model="supplierInfo.companyAddress" tabindex="16" placeholder="请输入地址" :clearable="true" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="12">
<el-form-item label="服务和供应的内容" prop="supplierContent">
<el-input v-model="supplierInfo.supplierContent" placeholder="请输入服务和供应的内容" type="textarea" tabindex="17" :rows="2" :clearable="true" />
</el-form-item>
</el-col>
</el-row>
<!-- 第三行 -->
<el-row :gutter="24">
<el-col :span="12">
<el-form-item label="备注">
<el-input v-model="supplierInfo.remark" placeholder="请输入备注信息" tabindex="18" type="textarea" :clearable="true" :rows="2" />
</el-form-item>
</el-col>
</el-row>
<!-- 第四行 -->
<el-row :gutter="24">
<el-col :span="12">
<el-form-item label="附件">
<el-input v-model="supplierInfo.minioFileName" type="hidden" />
<el-upload
v-model:file-list="fileNameList"
multiple
:http-request="uploadFile"
:on-remove="handleRemove"
>
<el-button type="primary">
上传
</el-button>
</el-upload>
</el-form-item>
</el-col>
</el-row>
</el-form>
</template>