<!-- 租户管理编辑页面 --> <script lang="ts" setup name="multiTenantEditDialog"> import type { Ref } from 'vue' import { nextTick, reactive, ref } from 'vue' import { ElMessage, ElMessageBox } from 'element-plus' import type { FormInstance, FormRules } from 'element-plus' import type { IForm, IList } from './multiTenant-interface' import { addTenant, detailTenant, editTenant } from '@/api/system/multiTenant' const emits = defineEmits(['closeRefresh']) const dialogStatus = ref('add') const dialogVisible = ref(false) // 弹窗显示隐藏 // 显示标题 const textMap: { [key: string]: string } = { detail: '详情', edit: '编辑', add: '新增', } // 表单数据对象 const formData: Ref<IForm> = ref({ id: '', // 主键 tenantCode: '', // 租户代码 tenantName: '', // 租户名称 linkPerson: '', // 联系人 tel: '', // 电话 }) const btnLoading = ref(false) // 保存按钮加载状态 const dataFormRef = ref<FormInstance>() // 表单对象 // 校验规则 const rules = reactive<FormRules>({ tenantCode: [{ required: true, message: '租户编号必填', trigger: ['blur', 'change'] }], tenantName: [{ required: true, message: '租户名称必填', trigger: ['blur', 'change'] }], linkPerson: [{ required: true, message: '联系人必填', trigger: ['blur', 'change'] }], tel: [{ required: true, pattern: /^1[34578]\d{9}$/, message: '请输入正确的手机号', trigger: ['blur', 'change'] }], }) // 表单提交 function submitForm() { if (dataFormRef.value) { dataFormRef.value?.validate((valid: boolean) => { if (valid) { if (dialogStatus.value === 'add') { // 新建 createData() } else if (dialogStatus.value === 'edit') { // 编辑 updateData() } } }) } } // 新增数据 function createData() { btnLoading.value = true addTenant(formData.value).then((res) => { ElMessageBox.confirm( '新增成功,是否继续新增?', '提示', { confirmButtonText: '是', cancelButtonText: '否', type: 'info', }, ).then(() => { resetForm() }).catch(() => { closeRefresh() }) btnLoading.value = false }).catch((_) => { btnLoading.value = false }) } // 更新数据 function updateData() { editTenant(formData.value).then((res) => { ElMessage.success('修改成功') btnLoading.value = false closeRefresh() }).catch((_) => { // 异常情况,loading置为false btnLoading.value = false }) } // 重置表单 function resetForm() { formData.value = { id: '', tenantCode: '', // 租户代码 tenantName: '', // 租户名称 linkPerson: '', // 联系人 tel: '', // 电话 } } // ----------初始化、关闭对话框相关----------------- function initDialog(dialogstatus: string, row: IList) { dialogStatus.value = dialogstatus // 类型 新建add 编辑edit 详情detail dialogVisible.value = true btnLoading.value = false if (dialogstatus === 'add') { resetForm() nextTick(() => { dataFormRef.value?.clearValidate() }) } else if (dialogstatus === 'edit' || dialogstatus === 'detail') { nextTick(() => { dataFormRef.value?.clearValidate() }) fetchEdgeDeviceDetail(row.id) } } function fetchEdgeDeviceDetail(id: string) { detailTenant({ tenantId: id }).then((response) => { formData.value.id = response.data.id formData.value.tenantCode = response.data.tenantCode // 租户代码 formData.value.tenantName = response.data.tenantName // 租户名称 formData.value.linkPerson = response.data.linkPerson // 联系人 formData.value.tel = response.data.tel // 电话 }) } // 关闭并刷新 function closeRefresh() { dialogVisible.value = false resetForm() emits('closeRefresh') } // 关闭弹窗 function dialogClose() { dialogVisible.value = false resetForm() closeRefresh() } onMounted(() => { // }) // ----------------------- 以下是暴露的方法内容 ---------------------------- defineExpose({ initDialog }) </script> <template> <el-dialog v-model="dialogVisible" :title="textMap[dialogStatus]" width="600" :before-close="dialogClose" append-to-body :open-delay="0" :close-on-click-modal="false" > <el-form ref="dataFormRef" :model="formData" :rules="rules" label-position="left" label-width="80px" class="form-container" size="default" @submit.prevent > <el-row :gutter="10"> <el-col :span="24" class="grid-cell"> <el-form-item label="租户编号" prop="tenantCode" class="required"> <el-input v-model.trim="formData.tenantCode" :disabled="dialogStatus === 'detail'" type="text" placeholder="必填" clearable /> </el-form-item> </el-col> <el-col :span="24" class="grid-cell"> <el-form-item label="租户名称" prop="tenantName" class="required"> <el-input v-model.trim="formData.tenantName" :disabled="dialogStatus === 'detail'" type="text" placeholder="必填" clearable /> </el-form-item> </el-col> <el-col :span="24" class="grid-cell"> <el-form-item label="联系人" prop="linkPerson" class="required"> <el-input v-model.trim="formData.linkPerson" :disabled="dialogStatus === 'detail'" type="text" placeholder="必填" clearable /> </el-form-item> </el-col> <el-col :span="24" class="grid-cell"> <el-form-item label="联系电话" prop="tel" class="required"> <el-input v-model.trim="formData.tel" :disabled="dialogStatus === 'detail'" type="text" placeholder="必填" clearable /> </el-form-item> </el-col> </el-row> </el-form> <template #footer> <div v-show="dialogStatus !== 'detail'" class="dialog-footer"> <el-button :loading="btnLoading" type="primary" @click="submitForm"> 保存 </el-button> <el-button @click="dialogClose"> 取消 </el-button> </div> </template> </el-dialog> </template> <style lang="scss" scoped> .form-container { width: 100%; .full-width-input { width: 100%; } .dict-detail { padding: 10px; .title { font-size: 16px; font-weight: bold; margin-bottom: 15px; } } } </style>