Newer
Older
safe_production_front / src / views / system / multiTenant / editDialog.vue
dutingting on 6 Mar 6 KB 多租户、jessibucaPro组件
<!-- 租户管理编辑页面 -->
<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>