Newer
Older
smart-metering-front / src / views / business / subpackage / certificate / edit.vue
<!-- 分包证书管理详情 -->
<script lang="ts" setup name="CertificateEdit">
import type { Ref } from 'vue'
import { ElLoading, ElMessage, ElMessageBox, formContextKey } from 'element-plus'
import type { FormInstance, UploadUserFile } from 'element-plus'
import { ref } from 'vue'
import dayjs from 'dayjs'
import type { IForm } from './certificate-interface'
import selectSample from './components/selectSample.vue'
import showPhoto from '@/views/system/tool/showPhoto.vue'
import TemplateTable from '@/views/customer/customerInfo/templateTable.vue'
import { UploadFile } from '@/api/measure/file'
import selectProjectApprove from '@/views/business/subpackage/apply/components/selectProjectApprove.vue'
import { addCertificateList, updateCertificateList } from '@/api/business/subpackage/certificate'
// 初始化router
const $router = useRouter()
const $route = useRoute()
const sampleVisible = ref(false) // 控制选择样品对话框显隐
const projectVisible = ref(false) // 控制选择分包方对话框显隐
const textMap: { [key: string]: string } = {
  edit: '编辑',
  add: '新建',
  detail: '详情',
}// 字典
const pageType = ref('add') // 页面类型: add, edit, detail
const loading = ref(false) // 表单加载状态
const infoId = ref('') // id
const dataForm: Ref<IForm> = ref({
  id: '', // 主键--编辑使用
  certificateCode: '', // 证书号
  certificateName: '', // 证书名称
  // expirationDate: '', // 证书有效期
  // issuanceDate: '', // 证书出具日期
  certificateFile: '', // 证书文件
  originalRecordFile: '', // 原始记录文件
  orderId: '', // 委托单id
  outsourcerId: '', // 分包方id
  outsourcerName: '', // 检测单位名称-分包方名称
  outsourcerNo: '', // 分包方编号
  sampleId: '', // 样品id
  sampleName: '', // 样品名称
  sampleNo: '', // 样品编号
  sampleModel: '', // 型号
  manufacturingNo: '', // 出厂编号
})// 表单
const ruleFormRef = ref<FormInstance>() // 表单ref
// 校验规则
const rules = ref({
  // sampleModel: [{ required: true, message: '样品型号必填', trigger: 'blur' }],
  // manufacturingNo: [{ required: true, message: '出厂编号必填', trigger: 'blur' }],
  certificateCode: [{ required: true, message: '证书编号必填', trigger: 'blur' }],
  certificateName: [{ required: true, message: '证书名称必填', trigger: 'blur' }],
  // expirationDate: [{ required: true, message: '证书有效期必填', trigger: 'blur, change' }],
  // issuanceDate: [{ required: true, message: '证书出具日期必填', trigger: 'blur, change' }],
  outsourcerName: [{ required: true, message: '检测单位名称必填', trigger: 'blur, change' }],
  sampleNo: [{ required: true, message: '样品编号必填', trigger: 'blur, change' }],
  // originalRecordFile: [{ required: true, message: '原始记录必填', trigger: 'blur, change' }],
  certificateFile: [{ required: true, message: '证书报告必填', trigger: 'blur, change' }],
}) // 表单验证规则

// 关闭
const close = () => {
  $router.back()
}

// -----------------------------------------路由参数--------------------------------
if ($route.params && $route.params.type) {
  pageType.value = $route.params.type as string
  if ($route.params.id) {
    infoId.value = $route.params.id as string
  }
}

// ------------------------------------------选择样品---------------------------------------
// 点击选择样品
const handleSelectSample = () => {
  if (!dataForm.value.outsourcerName) {
    ElMessage.warning('请先选择检测单位')
    return
  }
  sampleVisible.value = true // 选择样品对话框显隐
}
// 修改委托方对话框显隐
const changeSampleVisible = (val: boolean) => {
  sampleVisible.value = val
}
// 选好样品
const clickConfirmSample = (val: any) => {
  dataForm.value.sampleId = val[0].sampleId || val[0].id // 样品id
  dataForm.value.sampleName = val[0].sampleName // 样品名称
  dataForm.value.sampleNo = val[0].sampleNo // 样品编号
  dataForm.value.sampleModel = val[0].sampleModel // 型号
  dataForm.value.manufacturingNo = val[0].manufacturingNo // 出厂编号
  dataForm.value.orderId = val[0].orderId // 委托单id
}
// -----------------------------------------选择分包方------------------------------------------
// 修改项目选择对话框显隐
const changeProjectVisible = (val: boolean) => {
  projectVisible.value = val
}
// 点击选择分包方
const handleSelectOutsourcer = () => {
  projectVisible.value = true // 选择分包方对话框显隐
}
// 选择分好包方
const clickConfirmProject = (val: any) => {
  dataForm.value.outsourcerId = val[0].id // 分包方id
  dataForm.value.outsourcerNo = val[0].outsourcerNo // 分包方编号
  dataForm.value.outsourcerName = val[0].outsourcerName // 公司名称
  console.log(dataForm.value.outsourcerNo)
  // 清空样品信息
  dataForm.value.sampleId = '' // 样品id
  dataForm.value.sampleName = '' // 样品名称
  dataForm.value.sampleNo = '' // 样品编号
  dataForm.value.sampleModel = '' // 型号
  dataForm.value.manufacturingNo = '' // 出厂编号
  dataForm.value.orderId = '' // 委托单id
}
// ---------------------------------------------------------------------------------------
// ---------------------------------文件上传-------------------------------------------
const fileRef = ref()
const fileRefCertificate = ref()
const onFileChangeCertificateFile = (event: any) => {
  // 原生上传
  if (event.target.files?.length !== 0) {
    if (event.target.files[0].type !== 'application/pdf') {
      ElMessage.warning('请上传pdf格式文件')
      return false
    }
    // 创建formdata对象
    const fd = new FormData()
    fd.append('multipartFile', event.target.files[0])
    UploadFile(fd).then((res) => {
      if (res.code === 200) {
        dataForm.value.certificateFile = res.data[0]
        // 重置当前验证
        ElMessage.success('文件上传成功')
      }
      else {
        ElMessage.error(res.message)
      }
    })
  }
}
const uploadCertificate = () => {
  fileRefCertificate.value.click()
}

const onFileChange = (event: any) => {
  // 原生上传
  if (event.target.files?.length !== 0) {
    // 创建formdata对象
    const fd = new FormData()
    fd.append('multipartFile', event.target.files[0])
    const loading = ElLoading.service({
      lock: true,
      background: 'rgba(255, 255, 255, 0.8)',
    })
    UploadFile(fd).then((res) => {
      if (res.code === 200) {
        dataForm.value.originalRecordFile = res.data[0]
        // 重置当前验证
        ElMessage.success('文件上传成功')
        loading.close()
      }
      else {
        ElMessage.error(res.message)
        loading.close()
      }
    })
  }
}
const upload = () => {
  fileRef.value.click()
}
// -----------------------------------------------------------------------------------

// 点击保存
const saveForm = () => {
  ruleFormRef.value!.validate((valid: boolean) => {
    if (valid) {
      const loading = ElLoading.service({
        lock: true,
        background: 'rgba(255, 255, 255, 0.8)',
      })
      if (pageType.value === 'add') {
        addCertificateList(dataForm.value).then((res) => {
          ElMessage.success('保存成功')
          close()
          loading.close()
        }).catch(() => {
          loading.close()
        })
      }
      else if (pageType.value === 'edit') {
        dataForm.value.id = infoId.value
        updateCertificateList(dataForm.value).then((res) => {
          ElMessage.success('保存成功')
          close()
          loading.close()
        }).catch(() => {
          loading.close()
        })
      }
    }
  })
}
onMounted(() => {
  if (pageType.value !== 'add') {
    dataForm.value.certificateCode = $route.query.certificateCode as string// 证书号
    dataForm.value.certificateName = $route.query.certificateName as string// 证书名称
    dataForm.value.certificateFile = $route.query.certificateFile as string// 证书文件
    dataForm.value.originalRecordFile = $route.query.originalRecordFile as string// 原始记录文件
    dataForm.value.outsourcerName = $route.query.outsourcerName as string// 检测单位名称-分包方名称
    dataForm.value.sampleName = $route.query.sampleName as string// 样品名称
    dataForm.value.sampleNo = $route.query.sampleNo as string// 样品编号
    dataForm.value.sampleModel = $route.query.sampleModel as string// 型号
    dataForm.value.manufacturingNo = $route.query.manufacturingNo as string// 出厂编号
  }
})
</script>

<template>
  <div>
    <!-- 布局 -->
    <app-container>
      <detail-page v-loading="loading" :title="`分包证书管理-${textMap[pageType]}`">
        <template #btns>
          <el-button v-if="pageType !== 'detail'" type="primary" @click="saveForm">
            保存
          </el-button>
          <el-button type="info" @click="close">
            关闭
          </el-button>
        </template>
        <div id="form">
          <el-form
            ref="ruleFormRef"
            :model="dataForm"
            :label-width="120"
            label-position="right"
            :rules="rules"
          >
            <el-row :gutter="24">
              <el-col :span="6">
                <el-form-item label="证书编号:" prop="certificateCode">
                  <el-input
                    v-model="dataForm.certificateCode"
                    :placeholder="pageType === 'detail' ? '' : '请输入证书编号'"
                    :class="{ 'detail-input': pageType === 'detail' }"
                    :disabled="pageType === 'detail'"
                  />
                </el-form-item>
              </el-col>
              <el-col :span="6">
                <el-form-item label="证书名称:" prop="certificateName">
                  <el-input
                    v-model.trim="dataForm.certificateName"
                    :placeholder="pageType === 'detail' ? '' : '请输入证书名称'"
                    :class="{ 'detail-input': pageType === 'detail' }"
                    :disabled="pageType === 'detail'"
                  />
                </el-form-item>
              </el-col>
              <!-- <el-col :span="6">
                <el-form-item label="证书有效期 :" prop="expirationDate">
                  <el-date-picker
                    v-model="dataForm.expirationDate"
                    type="date"
                    style="width: 100%;"
                    :placeholder="pageType === 'detail' ? '' : '请选择证书有效期'"
                    format="YYYY-MM-DD"
                    value-format="YYYY-MM-DD"
                    :disabled="pageType === 'detail'"
                  />
                </el-form-item>
              </el-col> -->
              <!-- <el-col :span="6">
                <el-form-item label="证书出具日期  :" prop="issuanceDate">
                  <el-date-picker
                    v-model="dataForm.issuanceDate"
                    type="date"
                    style="width: 100%;"
                    :placeholder="pageType === 'detail' ? '' : '请选择证书出具日期 '"
                    format="YYYY-MM-DD"
                    value-format="YYYY-MM-DD"
                    :disabled="pageType === 'detail'"
                  />
                </el-form-item>
              </el-col> -->
              <el-col :span="6">
                <el-form-item label="检测单位:" prop="outsourcerName">
                  <el-input
                    v-model="dataForm.outsourcerName"
                    :placeholder="pageType === 'detail' ? '' : '请选择检测单位'"
                    :class="{ 'detail-input': pageType === 'detail' }"
                    disabled
                  >
                    <template v-if="pageType !== 'detail'" #append>
                      <el-button size="small" @click="handleSelectOutsourcer">
                        选择
                      </el-button>
                    </template>
                  </el-input>
                </el-form-item>
              </el-col>
              <el-col :span="6">
                <el-form-item label="样品编号:" prop="sampleNo">
                  <el-input
                    v-model="dataForm.sampleNo"
                    :placeholder="pageType === 'detail' ? '' : '请选择样品'"
                    :class="{ 'detail-input': pageType === 'detail' }"
                    disabled
                  >
                    <template v-if="pageType !== 'detail'" #append>
                      <el-button size="small" @click="handleSelectSample">
                        选择
                      </el-button>
                    </template>
                  </el-input>
                </el-form-item>
              </el-col>
              <el-col :span="6">
                <el-form-item label="样品名称:" prop="sampleName">
                  <el-input
                    v-model="dataForm.sampleName"
                    placeholder="样品名称"
                    :class="{ 'detail-input': pageType === 'detail' }"
                    disabled
                  />
                </el-form-item>
              </el-col>
              <el-col :span="6">
                <el-form-item label="样品型号:" prop="sampleModel">
                  <el-input
                    v-model="dataForm.sampleModel"
                    placeholder="样品型号"
                    :class="{ 'detail-input': pageType === 'detail' }"
                    disabled
                  />
                </el-form-item>
              </el-col>
              <el-col :span="6">
                <el-form-item label="出厂编号:" prop="manufacturingNo">
                  <el-input
                    v-model="dataForm.manufacturingNo"
                    placeholder="出厂编号"
                    :class="{ 'detail-input': pageType === 'detail' }"
                    disabled
                  />
                </el-form-item>
              </el-col>
            </el-row>
            <el-row :gutter="24" class="marg">
              <el-col :span="24">
                <el-form-item label="原始记录附件:" prop="originalRecordFile">
                  <show-photo v-if="dataForm.originalRecordFile" :minio-file-name="dataForm.originalRecordFile" />
                  <span v-else-if="pageType === 'detail'">无</span>
                  <input v-show="pageType === ''" ref="fileRef" type="file" @change="onFileChange">
                  <el-button v-if="pageType !== 'detail'" id="file" type="primary" :disabled="pageType === 'detail'" :style="{ 'margin-left': dataForm.originalRecordFile === '' ? '0px' : '20px' }" @click="upload">
                    {{ dataForm.originalRecordFile === '' ? '上传' : '更换附件' }}
                  </el-button>
                </el-form-item>
              </el-col>
            </el-row>
            <el-row :gutter="24" class="marg">
              <el-col :span="24">
                <el-form-item label="证书报告附件:" prop="certificateFile">
                  <show-photo v-if="dataForm.certificateFile" :minio-file-name="dataForm.certificateFile" />
                  <span v-else-if="pageType === 'detail'">无</span>
                  <input v-show="pageType === ''" ref="fileRefCertificate" type="file" @change="onFileChangeCertificateFile">
                  <el-button v-if="pageType !== 'detail'" id="file" type="primary" :disabled="pageType === 'detail'" :style="{ 'margin-left': dataForm.certificateFile === '' ? '0px' : '20px' }" @click="uploadCertificate">
                    {{ dataForm.certificateFile === '' ? '上传' : '更换附件' }}
                  </el-button>
                </el-form-item>
              </el-col>
            </el-row>
          </el-form>
        </div>
      </detail-page>
      <!-- 项目选择 -->
      <select-project-approve
        v-model:visible="projectVisible" @clickConfirmProject="clickConfirmProject"
        @change-visible="changeProjectVisible(false)"
      />
      <!-- 样品增加弹窗 -->
      <select-sample v-model:visible="sampleVisible" :outsourcer-id="dataForm.outsourcerId" :customer-no="dataForm.outsourcerNo" :is-multi="false" @click-confirm-sample="clickConfirmSample" @change-visible="changeSampleVisible" />
    </app-container>
  </div>
</template>