Newer
Older
adminAccountabilityFront / src / views / flling / treat / fillingDialog.vue
liyaguang on 23 Oct 2023 6 KB feat(*): 待填报得分规则限制
<!-- 考核填报弹窗 -->
<script lang="ts" setup name="FillingDialog">
import type { FormInstance, FormRules } from 'element-plus'
import { ElLoading, ElMessage, ElMessageBox } from 'element-plus'
import { uploadApi } from '@/api/common'
import { filling } from '@/api/home/filling/filling'
import { getProxyDetail } from '@/api/home/rule/proxy'
// ----------------------- 以下是字段定义 emits props ---------------------
const emits = defineEmits(['closeRefresh'])
const dialogVisible = ref(false)
// 显示标题
const textMap: { [key: string]: string } = {
  update: '编辑',
  create: '新增',
}
const rowData = ref()
const proxyData = ref()
const defaultFormData = {
  assDesc: '', // 考核说明
  fileId: '',
  fileName: '',
  score: '',
}
// 表单数据对象
const formData = reactive({ ...defaultFormData })

// ---------------表单提交--------------------------------
// 表单对象
const dataFormRef = ref<FormInstance>()
// 校验规则
const validateScore = (rule: any, value: any, callback: any) => {
  if (value === '') {
    callback(new Error('考核得分不能为空'))
  }
  else if (isNaN(value) || value.includes('-')) {
    callback(new Error('输入正确数字格式'))
  }
  else if (proxyData.value.score) {
    if (proxyData.value.score.includes('-')) {
      if (Number(value) <= Number(proxyData.value.score.split('-')[1])) {
        callback()
      }
      else {
        callback(new Error('不得大于考核指标得分'))
      }
    }
    else {
      if (Number(value) <= Number(proxyData.value.score)) {
        callback()
      }
      else {
        callback(new Error('不得大于考核指标得分'))
      }
    }
  }
  else {
    callback()
  }
}
const rules: FormRules = reactive({
  assDesc: [{ required: true, message: '考核说明不可为空', trigger: ['blur', 'change'] }],
  score: [{ required: true, validator: validateScore, trigger: ['blur', 'change'] }],
})

const submitForm = async (formEl: FormInstance | undefined) => {
  if (!formEl) { return }
  await formEl.validate((valid, fields) => {
    if (valid) {
      const data = {
        assDesc: formData.assDesc,
        fileId: formData.fileId,
        fileName: formData.fileName,
        score: formData.score,
        id: rowData.value.id,
      }
      filling(data).then((res) => {
        ElMessage.success('填报成功')
        dialogVisible.value = false
        resetForm()
        emits('closeRefresh')
      })
    }
  })
}
// 重置表单
function resetForm() {
  const form = formData
  const keys = Object.keys(formData)
  keys.forEach((key) => {
    form[key] = defaultFormData[key]
  })
  Object.assign(formData, form)
  nextTick(() => {
    dataFormRef.value?.clearValidate()
  })
}
// ----------初始化、关闭对话框相关-----------------
function initDialog(row: any) {
  getProxyDetail({ id: row.quotaId }).then((res) => {
    proxyData.value = res.data
    dialogVisible.value = true
    rowData.value = row
    resetForm()
  })
}

// 关闭弹窗
function dialogClose() {
  resetForm()
  dialogVisible.value = false
}
// ----------------------- 以下是暴露的方法内容 ----------------------------
defineExpose({ initDialog })
const fileRef = ref() // 文件上传input
const onFileChange = (event: any) => {
  if (event.target.files?.length !== 0) {
    // 创建formdata对象
    const fd = new FormData()
    const loading = ElLoading.service({
      lock: true,
      background: 'rgba(255, 255, 255, 0.8)',
    })
    fd.append('file', event.target.files[0])
    uploadApi(fd).then((res) => {
      if (res.code === 200) {
        formData.fileId = formData.fileId ? `${formData.fileId},${res.data.fileId}` : res.data.fileId
        formData.fileName = formData.fileName ? `${formData.fileName},${res.data.fileName}` : res.data.fileName
        // 重置当前验证
        // dataFormRef.value?.clearValidate('minioFileName')
        ElMessage.success('文件上传成功')
        fileRef.value.value = ''
        loading.close()
      }
      else {
        // ElMessage.error(res.message)
        loading.close()
      }
    })
  }
}
// 上传
const upload = () => {
  fileRef.value.click()
}
// 删除上传的文件
const deleteFile = (fileName: string) => {
  const data = formData.fileName.split(',')
  const ids = formData.fileId.split(',')
  const filterData = data.filter(item => item !== fileName)
  const filterid = ids.filter((item, index) => index !== data.findIndex(citem => citem === fileName))
  formData.fileId = filterid.length ? filterid.join(',') : ''
  formData.fileName = filterData.length ? filterData.join(',') : ''
}
</script>

<template>
  <el-dialog
    v-model="dialogVisible"
    title="填报"
    width="50%"
    :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="110px" class="form-container"
      size="default" @submit.prevent
    >
      <el-row :gutter="24">
        <el-col :span="24" class="grid-cell">
          <el-form-item label="考核得分" prop="score" class="required">
            <el-input v-model.trim="formData.score" type="text" :placeholder="proxyData.score.includes('-') ? `${proxyData.score}分` : `小于等于${proxyData.score}分`" clearable />
          </el-form-item>
        </el-col>
        <el-col :span="24" class="grid-cell">
          <el-form-item label="考核说明" prop="assDesc" class="required">
            <el-input v-model.trim="formData.assDesc" type="textarea" placeholder="考核说明" :rows="4" maxlength="100" show-word-limit />
          </el-form-item>
        </el-col>
        <el-col :span="24" class="grid-cell">
          <el-form-item label="附件上传">
            <show-photo :minio-file-name="formData.fileName" :minio-file-id="formData.fileId" @delete="deleteFile" />
            <input ref="fileRef" style="display: none;" type="file" accept="application/msword,application/pdf" @change="onFileChange">
            <el-button v-if="!$route.path.includes('detail')" type="primary" @click="upload">
              上传
            </el-button>
          </el-form-item>
        </el-col>
      </el-row>
    </el-form>
    <template #footer>
      <div class="dialog-footer">
        <el-button type="primary" @click="submitForm(dataFormRef)">
          保存
        </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%;
  }
}
</style>