commonAttachmentModal.vue 6.19 KB
<template>
  <a-modal
    :title="title"
    :width="800"
    :centered="true"
    :visible="visible"
    :loading="confirmLoading"
    @ok="handleSubmit"
    @cancel="handleCancel"
    cancelText="关闭"
    :maskClosable="false"
    style="top:20px;"
    class="scope-attachment"
  >
    <a-spin :spinning="confirmLoading">
      <a-form :form="form">
        <a-form-item label="资料名称" :labelCol="{span:4}" :wrapperCol="{span:12}">
          <a-input
            placeholder="请输入资料名称"
            v-decorator="[ 'name', validatorRules.name]"
            :readOnly="onlyread && disableSubmit"
          />
        </a-form-item>
        <a-form-item
          class="uploadVerify"
          label="上传文件"
          extra="仅支持上传jpg\png\jpeg\bmp\pdf\excel文件格式"
          :labelCol="{span:4}"
          :wrapperCol="{span:12}"
        >
          <a-upload
            name="file"
            :action="url.upload"
            @change="handleChange"
            :disabled="(onlyread && disableSubmit )|| fileList.length >= 1"
          >
            <a-button v-if="fileList.length < 1">
              <a-icon type="upload" />选择
            </a-button>
          </a-upload>
          <div
            class="hoverEvent"
            style="position:relative;width:500px;"
            v-for="v in fileList"
            :key="v.id"
          >
            <span @click.stop="clickProject(v)">{{v.fileUrl}}</span>
            <a-popconfirm title="确定删除吗?" @confirm="handleDelete(v)">
              <a class="hoverShow">删除</a>
            </a-popconfirm>
          </div>
          <span v-show="fileListShow" style="color:red;font-size:14px;padding-left:10px;">请上传文件</span>
        </a-form-item>
        <a-form-item label="备注" :labelCol="{span:4}" :wrapperCol="{span:12}">
          <a-textarea
            rows="4"
            placeholder="备注"
            v-decorator="['remark']"
            :readOnly="onlyread && disableSubmit"
          />
        </a-form-item>
      </a-form>
    </a-spin>
  </a-modal>
</template>

<script>
import { saveOrUpdateCusExtAttachment, deleteCusExtAttachment } from '@/api/configApi'
import pick from 'lodash.pick'

export default {
  name: 'commonAttachmentModal',
  data() {
    return {
      visible: false,
      confirmLoading: false,
      onlyread: false,
      disableSubmit: false,
      title: '',
      fileUrl: '',
      validatorRules: {
        name: {
          rules: [
            {
              required: true,
              message: '请输入资料名称'
            }
          ]
        }
      },

      model: {},
      fileName: '',
      fileList: [],
      fileListShow: false,
      form: this.$form.createForm(this),
      url: {
        upload: window._CONFIG['uploadUrl']
      },
      applyNo: ''
    }
  },
  methods: {
    edit(record) {
      this.fileList = []
      this.fileListShow = false
      this.form.resetFields()
      console.log(record)
      this.model = Object.assign({}, record)
      this.fileList.push(record)
      console.log(this.fileList)
      this.visible = true
      this.$nextTick(() => {
        this.form.setFieldsValue(pick(this.model, 'name', 'remark'))
      })
    },

    add(applyNo) {
      this.applyNo = applyNo
      this.fileList = []
      this.form.resetFields()
      this.visible = true
    },

    close() {
      this.$emit('close')
      this.visible = false
      this.disableSubmit = false
      this.selectedRole = []
    },
    handleChange(info) {
      this.confirmLoading = true
      let fileList = [...info.fileList]
      fileList.slice(-2)
      if (info.file.status === 'done') {
        if (info.file.response.code == 200) {
          this.confirmLoading = false
          fileList.map(file => {
            if (file.response) {
              let fileData = {
                applyNo: this.applyNo,
                fileUrl: file.response.data.fileURL,
                name: file.response.data.fileName,
                tempType: 'CUSTOMIZE'
              }
              this.fileList.push(fileData)
              this.fileList = this.fileList.filter(item => {
                return item.fileUrl == fileData.fileUrl
              })
              console.log(this.fileList)
              this.fileListShow = false
            }
          })
        }
        this.$message.success(`${info.file.name} 上传成功!`)
      } else if (info.file.status === 'error') {
        this.$message.error(`${info.file.name} 上传失败.`)
      }
    },
    handleSubmit() {
      // 触发表单验证
      this.form.validateFields((err, values) => {
        console.log(err, values)
        if (this.fileList.length < 1) {
          this.fileListShow = true
        }
        if (!err && this.fileList.length >= 1) {
          this.confirmLoading = true
          delete this.fileList[0].attachmentType
          this.fileList[0].name = values.name
          this.fileList[0].remark = values.remark
          let formData = this.fileList
          console.log(formData)
          saveOrUpdateCusExtAttachment(formData)
            .then(res => {
              if (res.status.statusCode == 0) {
                this.fileList = []
                this.$message.success(res.status.statusReason)
                this.$emit('ok')
              } else {
                this.$message.warning(res.status.statusReason)
              }
            })
            .finally(() => {
              this.confirmLoading = false
              this.close()
            })
        }
      })
    },
    handleCancel() {
      this.fileList = []
      this.close()
    },
    clickProject(v) {
      console.log(v)
      window.open(v.fileUrl)
    },
    handleDelete(v) {
      this.fileListShow = true
      this.fileList = []
    }
  }
}
</script>
  
  
 
<style>
.scope-attachment .hoverShow {
  position: absolute;
  top: 0;
  right: 0;
  display: block;
}
.scope-attachment .hoverEvent {
  cursor: pointer;
}
.scope-attachment .hoverEvent:hover .hoverShow {
  display: block;
}
.scope-attachment .ant-upload-list {
  display: none;
}
.scope-attachment .uploadVerify label::before {
  display: inline-block;
  margin-right: 4px;
  color: #f5222d;
  font-size: 14px;
  font-family: SimSun, sans-serif;
  line-height: 1;
  content: '*';
}
</style>