Newer
Older
xc-business-system / src / views / resource / person / register / component / verifierDialog.vue
<!-- 人员证书编辑弹窗 -->
<script name="VerifierDialog" lang="ts" setup>
import { ElLoading, ElMessage, dayjs } from 'element-plus'
import type { IStaffVerifierDetail, IStaffVerifierInfo } from '../person-regitster'
import VerifierDetailDialog from './verifierDetailDialog.vue'
import type { IDictType } from '@/commonInterface/resource-interface'
import type { TableColumn } from '@/components/NormalTable/table_interface'
import { UploadFile } from '@/api/file'
import { addVerifierRec, updateVerifierRec } from '@/api/resource/register'

const props = defineProps({
  staffId: { type: String, default: '' },
})

const emit = defineEmits(['recordSaved'])

const verifierFormRef = ref()
const refVerifierDetail = ref()
const refFilePreviewDlg = ref()
const refImagePreviewDlg = ref()

const title = ref<string>('')
const disabled = ref<boolean>()
const verifierDetailSelected = ref<Array<IStaffVerifierDetail>>([])
const fileList = ref<Array<string>>([])

const staffVerifier = ref<IStaffVerifierInfo>({
  id: '',
  staffId: '',
  certNo: '',
  certName: '',
  certType: '',
  certTypeName: '',
  grantDate: '',
  effectiveDate: '',
  grantCompany: '',
  file: '',
  verifierDetailList: [],
})

const staffVerifierRules = ref({
  certType: [{ required: true, message: '证书类型不能为空', trigger: ['change', 'blur'] }],
  certNo: [{ required: true, message: '证书号不能为空', trigger: 'blur' }],
  certName: [{ required: true, message: '证书名称不能为空', trigger: 'blur' }],
  grantDate: [{ required: true, message: '发放日期不能为空', trigger: 'blur' }],
  effectiveDate: [{ required: true, message: '有效日期不能为空', trigger: 'blur' }],
  grantCompany: [{ required: true, message: '发放单位不能为空', trigger: 'blur' }],
}) // 表单验证规则

const verifierColumns = ref<Array<TableColumn>>([
  { text: '持证参数', value: 'certificateParameters', align: 'center', width: '240' },
  { text: '可开展检定项工作', value: 'identifiableWork', align: 'center' },
  { text: '发证日期', value: 'certificationDate', align: 'center', width: '120' },
]) // 表头

const showDialog = ref(false)

const certTypeDict = ref<Array<IDictType>>([])

// 逻辑
const initCertTypeDict = () => {
  if (sessionStorage.getItem('bizCertType') !== null && sessionStorage.getItem('bizCertType') !== '') {
    certTypeDict.value = JSON.parse(sessionStorage.getItem('bizCertType')!)
  }
}

const showRecordDialog = (show: boolean, tableTitle = '', operType = 'update') => {
  showDialog.value = show
  title.value = tableTitle
  disabled.value = operType === 'detail'

  initCertTypeDict()

  nextTick(() => {
    verifierFormRef.value.clearValidate()
  })

  if (show === false) {
    staffVerifier.value = {
      id: '',
      staffId: '',
      certNo: '',
      certName: '',
      certType: '',
      certTypeName: '',
      grantDate: '',
      effectiveDate: '',
      grantCompany: '',
      file: '',
      verifierDetailList: [],
    }
  }
}

const initRecordData = (record: IStaffVerifierInfo) => {
  staffVerifier.value = { ...record }
  fileList.value = staffVerifier.value.file === '' ? [] : staffVerifier.value.file.split(',')
  staffVerifier.value.verifierDetailList = staffVerifier.value.verifierDetailList.map((detail: IStaffVerifierDetail) => {
    return {
      ...detail,
      certificationDate: dayjs(detail.certificationDate).format('YYYY-MM-DD'),
    }
  })
}

const uploadVerifierFile: 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('附件上传成功')
      fileList.value.push(res.data[0]) // 支持多个文件
      staffVerifier.value.file = fileList.value.join(',')
      loading.close()
    }
  }).catch(() => {
    loading.close()
    ElMessage.error('附件上传失败')
  })
}

const openFilePreviewDialog = (filename: string) => {
  if (filename.lastIndexOf('.pdf') > 0) {
    refFilePreviewDlg.value.initDialog(filename)
  }
  else {
    refImagePreviewDlg.value.initDialog(filename)
  }
}

const removeUploadedFile = (filename: string) => {
  const index = fileList.value.indexOf(filename)
  fileList.value = fileList.value.slice(0, index).concat(fileList.value.slice(index + 1))
  staffVerifier.value.file = fileList.value.join(',')
}

const saveStaffVerifier = async () => {
  await verifierFormRef.value.validate((valid: boolean) => {
    if (valid === true) {
      if (staffVerifier.value.id === '') {
        staffVerifier.value.staffId = props.staffId
        addVerifierRec(staffVerifier.value).then((res) => {
          if (res.code === 200) {
            ElMessage.success('人员证书保存成功')
            emit('recordSaved')
            showRecordDialog(false)
          }
          else {
            ElMessage.success(`人员证书保存失败:${res.message}`)
          }
        })
      }
      else {
        updateVerifierRec(staffVerifier.value).then((res) => {
          if (res.code === 200) {
            ElMessage.success('人员证书保存成功')
            emit('recordSaved')
            showRecordDialog(false)
          }
          else {
            ElMessage.success(`人员证书保存失败:${res.message}`)
          }
        })
      }
    }
  })
}

const showVerifierDetail = () => {
  refVerifierDetail.value.showDialog(true, '新增')
}

const delVerifierDetail = () => {
  verifierDetailSelected.value.forEach((select) => {
    const index = staffVerifier.value.verifierDetailList.indexOf(select)
    staffVerifier.value.verifierDetailList = staffVerifier.value.verifierDetailList.slice(0, index).concat(staffVerifier.value.verifierDetailList.slice(index + 1))
  })
}

const verDetailMultiSelect = (e: any) => {
  verifierDetailSelected.value = e
}

const editVerifierDetail = (detail: IStaffVerifierDetail) => {
  refVerifierDetail.value.initVerifierDetail(detail)
  refVerifierDetail.value.showDialog(true, '编辑')
}

const verifierDetailHandler = (record: IStaffVerifierDetail) => {
  if (record.id === '') {
    // 新建的持证参数
    staffVerifier.value.verifierDetailList.push(record)
  }
  else {
    // 遍历数组 更新指定的属性
    staffVerifier.value.verifierDetailList.forEach((item) => {
      if (item.id === record.id) {
        item.certificateParameters = record.certificateParameters
        item.identifiableWork = record.identifiableWork
        item.certificationDate = record.certificationDate
      }
    })
  }
}

defineExpose({
  showRecordDialog,
  initRecordData,
})
</script>

<template>
  <el-dialog v-model="showDialog" :title="`${title}人员证书`" :append-to-body="true" :close-on-click-modal="false" width="60%">
    <detail-block title="">
      <el-form ref="verifierFormRef" :model="staffVerifier" :rules="staffVerifierRules" label-position="right" label-width="110px" border stripe>
        <el-row :gutter="24">
          <el-col :span="9" :offset="3">
            <el-form-item label="证书类型" prop="certType">
              <el-select v-model="staffVerifier.certType" placeholder="请选择证书类型" clearable :disabled="disabled" style="width: 100%;">
                <el-option v-for="dict in certTypeDict" :key="dict.id" :value="dict.value" :label="dict.name" />
              </el-select>
            </el-form-item>
          </el-col>

          <el-col :span="9">
            <el-form-item label="证书号" prop="certNo">
              <el-input v-model="staffVerifier.certNo" placeholder="请输入证书号" clearable :disabled="disabled" />
            </el-form-item>
          </el-col>
        </el-row>

        <el-row :gutter="24">
          <el-col :span="9" :offset="3">
            <el-form-item label="证书名称" prop="certName">
              <el-input v-model="staffVerifier.certName" placeholder="请输入证书名称" clearable :disabled="disabled" />
            </el-form-item>
          </el-col>

          <el-col :span="9">
            <el-form-item label="发放日期" prop="grantDate">
              <el-date-picker
                v-model="staffVerifier.grantDate" placeholder="请选择发放日期" :disabled="disabled"
                format="YYYY-MM-DD" value-format="YYYY-MM-DD" type="date" style="width: 100%;"
              />
            </el-form-item>
          </el-col>
        </el-row>

        <el-row :gutter="24">
          <el-col :span="9" :offset="3">
            <el-form-item label="有效日期" prop="effectiveDate">
              <el-date-picker
                v-model="staffVerifier.effectiveDate" placeholder="请选择有效日期" :disabled="disabled"
                format="YYYY-MM-DD" value-format="YYYY-MM-DD" type="date" style="width: 100%;"
              />
            </el-form-item>
          </el-col>

          <el-col :span="9">
            <el-form-item label="发放单位" prop="grantCompany">
              <el-input v-model="staffVerifier.grantCompany" placeholder="请输入发放单位" :disabled="disabled" />
            </el-form-item>
          </el-col>
        </el-row>

        <el-row :gutter="24">
          <el-col :span="18" :offset="3">
            <el-form-item label="附件">
              <el-input v-model="staffVerifier.file" type="hidden" />

              <el-upload
                :show-file-list="false"
                multiple
                :http-request="uploadVerifierFile"
              >
                <el-button :disabled="disabled" type="primary">
                  上传
                </el-button>
              </el-upload>
            </el-form-item>
          </el-col>
        </el-row>

        <el-row :gutter="24">
          <el-col :span="18" :offset="3">
            <el-form-item>
              <template v-if="fileList.length > 0">
                <el-tag
                  v-for="file in fileList" :key="file" size="large" :closable="!disabled" style="margin-right: 10px; margin-bottom: 10px; cursor: pointer;"
                  @click="openFilePreviewDialog(file)"
                  @close="removeUploadedFile(file)"
                >
                  {{ file }}
                </el-tag>
              </template>
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
    </detail-block>

    <template v-if="staffVerifier.certType === '1'">
      <table-container title="人员证书">
        <template v-if="disabled === false" #btns-right>
          <el-button type="primary" @click="showVerifierDetail">
            增加行
          </el-button>
          <el-button type="info" @click="delVerifierDetail">
            删除行
          </el-button>
        </template>

        <!-- 表格区域 -->
        <normal-table
          id="verifierTabel"
          :data="staffVerifier.verifierDetailList" :columns="verifierColumns"
          :pagination="false"
          :is-showmulti-select="disabled === false"
          @multi-select="verDetailMultiSelect"
        >
          <template #preColumns>
            <el-table-column label="序号" width="55" align="center">
              <template #default="scope">
                {{ scope.$index + 1 }}
              </template>
            </el-table-column>
          </template>

          <template v-if="disabled === false" #columns>
            <el-table-column fixed="right" label="操作" align="center" width="60">
              <template #default="{ row }">
                <el-button size="small" type="primary" link @click="editVerifierDetail(row)">
                  编辑
                </el-button>
              </template>
            </el-table-column>
          </template>
        </normal-table>
      </table-container>
    </template>

    <verifier-detail-dialog ref="refVerifierDetail" :staff-id="staffVerifier.staffId" @record-saved="verifierDetailHandler" />
    <file-preview-dialog ref="refFilePreviewDlg" />
    <image-preview-dialog ref="refImagePreviewDlg" />

    <template #footer>
      <span class="dialog-footer">
        <el-button @click="showRecordDialog(false)">取消</el-button>
        <el-button v-if="disabled === false" type="primary" @click="saveStaffVerifier">
          保存
        </el-button>
      </span>
    </template>
  </el-dialog>
</template>