Newer
Older
smartKitchenFront / src / views / companyDetail / qualifyInfo.vue
<template>
  <div class="form-table">
    <div>
      <el-table :data="busDetailQualifyCertificates" class="el-tab" border size="small" header-cell-class-name="form-table-header">
        <el-table-column prop="index" label="序号" width="100"/>
        <el-table-column prop="qualifyCode" label="资质要求编号" width="250"/>
        <el-table-column prop="qualifyName" label="资质要求名称" width="250"/>
        <el-table-column prop="qualifyDesc" label="资质描述" width="300"/>
        <el-table-column prop="qualifyProvScanFilename" label="资质证明材料" width="300"/>
        <el-table-column label="操作" width="100">
          <template slot-scope="scope">
            <el-button type="text" size="small" @click="delQualifyDetail(scope.row)">
              删除
            </el-button>
          </template>
        </el-table-column>
      </el-table>
    </div>
    <div>
      <el-button class="table-btn" type="primary" @click="showAddQualify">添加资质要求</el-button>
    </div>
    <el-dialog :visible.sync="dialogVisible" title="添加资质要求" :close-on-click-modal="false" append-to-body>
      <el-form ref="qualifyInfoForm" :model="qualifyInfo" :rules="qualifyRules" size="medium" label-width="120px">
        <el-row :gutter="20">
          <el-col :span="8">
            <el-form-item label="资质要求编号" prop="qualifyCode">
              <el-input v-model.trim="qualifyInfo.qualifyCode" type="text" placeholder="请输入资质要求编号"/>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="资质要求名称" prop="qualifyName">
              <el-input v-model.trim="qualifyInfo.qualifyName" type="text" placeholder="请输入资质要求名称"/>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="20">
          <el-col :span="20">
            <el-form-item label="资质描述" prop="qualifyDesc">
              <el-input v-model.trim="qualifyInfo.qualifyDesc" type="textarea" :rows="3" placeholder="请输入资质描述"/>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="20">
          <el-col :span="12">
            <el-form-item label="资质证明材料" prop="proveMaterialDesc">
              <el-upload
                ref="qualifyProvScanFileUpload"
                action="action"
                :file-list="qualifyProvScanFileList"
                :http-request="uploadQualifyProvScanFile"
                :on-remove="handleQualifyProvScanFileRemove"
                :on-exceed="qualifyProvScanFileExceed"
                :limit="1"
                accept=".jpg,.jpeg,.png,.pdf"
              >
                <el-button size="small" type="primary" icon="el-icon-upload">
                  上传文件
                </el-button>
              </el-upload>
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button type="primary" @click="saveData">
          保存
        </el-button>
      </div>
    </el-dialog>
  </div>
</template>

<script>
import { Uploadimg } from '@/api/common'

export default {
  name: 'QualifyInfo',
  data() {
    return {
      qualifyInfo: {
        qualifyCode: '',
        qualifyName: '',
        qualifyDesc: '',
        proveMaterialDesc: '',
        qualifyProvScanFilename: ''
      },
      busDetailQualifyCertificates: [],
      qualifyRules: {
        qualifyCode: [{ required: true, message: '请输入资质要求编号', trigger: 'blur' }],
        qualifyName: [{ required: true, message: '请输入资质要求名称', trigger: 'blur' }]
      },
      qualifyProvScanFileList: [],
      dialogVisible: false,
      qualifyInfoValid: false
    }
  },
  methods: {
    validateForm: function() {
      this.$refs.qualifyInfoForm.validate(valid => {
        this.qualifyInfoValid = valid
      })
    },
    showAddQualify() {
      this.dialogVisible = true
      // 清除已有的内容
      this.qualifyInfo = {
        qualifyCode: '',
        qualifyName: '',
        qualifyDesc: '',
        proveMaterialDesc: '',
        qualifyProvScanFilename: ''
      }
      this.qualifyProvScanFileList = []

      this.$nextTick(() => {
        //  延时到下一帧才开始,也就是页面刚刚渲染结束!!
        this.$refs.qualifyInfoForm.clearValidate()
      })
    },
    saveData() {
      this.validateForm()
      if (this.qualifyInfoValid === true) {
        const qualify = {}
        qualify.index = this.busDetailQualifyCertificates.length + 1
        qualify.qualifyCode = this.qualifyInfo.qualifyCode
        qualify.qualifyName = this.qualifyInfo.qualifyName
        qualify.qualifyDesc = this.qualifyInfo.qualifyDesc
        qualify.proveMaterialDesc = this.qualifyInfo.proveMaterialDesc
        qualify.qualifyProvScanFilename = this.qualifyInfo.qualifyProvScanFilename
        this.busDetailQualifyCertificates.push(qualify)
        this.dialogVisible = false
      }
    },
    delQualifyDetail(row) {
      for (const i in this.busDetailQualifyCertificates) {
        if (this.busDetailQualifyCertificates[i].index === row.index) {
          this.busDetailQualifyCertificates.splice(i, 1)
          return
        }
      }
    },
    // 文件上传
    uploadQualifyProvScanFile(file) {
      const upload = this.handleBeforeUpload(file.file, this.qualifyProvScanFileList)
      if (upload === false) {
        return
      }
      const base_url = this.baseConfig.baseUrl + '/static/'
      Uploadimg(file).then(res => {
        if (res.code === 200) {
          this.qualifyProvScanFileList = [] // 只保留一张图片或一个文件
          this.qualifyProvScanFileList.push({ name: res.data.fileName, url: base_url + res.data.fileId })
          this.qualifyInfo.provScanFileList = res.data.fileId
          this.qualifyInfo.qualifyProvScanFilename = res.data.fileName
          this.$refs.qualifyInfoForm.validateField('proveMaterialDesc')
          this.$message.success('文件上传成功')
        }
      })
    },
    handleQualifyProvScanFileRemove(file) {
      this.qualifyInfo.qualifyProvScanFilename = ''
      this.qualifyInfo.proveMaterialDesc = ''
      this.handleRemove(file, this.qualifyProvScanFileList)
      this.$refs.qualifyInfoForm.validateField('proveMaterialDesc')
    },
    qualifyProvScanFileExceed(file, fileList) {
      this.handleExceed(file, this.qualifyProvScanFileList)
    },
    // 上传前判断文件格式及大小
    handleBeforeUpload(file, fileList) {
      let res = true
      // 判断文件格式
      const isJPG = (file.type === 'image/jpeg') || (file.type === 'image/png')
      const isPDF = file.type === 'application/pdf'
      if (!isJPG && !isPDF) {
        this.$message.error('上传文件只能是 图片 或 PDF 格式!')
        res = false
      }

      // 判断文件大小
      const isLt5M = file.size / 1024 / 1024 < 5
      if (!isLt5M) {
        this.$message.error('上传文件大小不能超过 5MB!')
        res = false
      }

      // 判断文件是否已经上传过
      for (const i in fileList) {
        if (fileList[i].name === file.name) {
          this.$message.error('该文件已上传过,请选择其他文件')
          res = false
        }
      }

      return res
    },
    // 文件列表移除文件时的钩子
    handleRemove(file, fileList) {
      for (const i in fileList) {
        if (fileList[i].name === file.name) {
          fileList.splice(i, 1)
          return
        }
      }
    },
    handleExceed(files, fileList) {
      this.$message.warning('最多上传一个文件,请先删除再重新上传')
    }
  }
}
</script>

<style scoped lang="scss">
.form-table {
  display: flex;
  margin: 20px;

  .table-btn {
    margin-left: 100px;
  }

  ::v-deep .form-table-header {
    font-size: 16px;
  }
}
</style>