index.vue 12.8 KB
<template>
    <div>
      <el-row :gutter="15">
        <el-form ref="elForm" :model="formData" :rules="rules" size="medium" label-width="100px">
          <el-col :span="24">
            <el-form-item label="合同编号" prop="contractno">
              <el-input v-model="formData.contractno" placeholder="请输入合同编号" clearable :style="{width: '50%'}">
              </el-input>
            </el-form-item>
          </el-col>
          <el-col :span="24">
            <el-form-item label="合同名称" prop="contractName">
              <el-input v-model="formData.contractName" placeholder="请输入合同名称" clearable
                :style="{width: '50%'}"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="24">
            <el-form-item label="合同类型" prop="contractType">
              <el-input v-model="formData.contractType" placeholder="请输入合同类型" clearable
                :style="{width: '50%'}"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="24">
            <el-form-item label="合同金额" prop="contractAmount">
              <el-input v-model="formData.contractAmount" placeholder="请输入合同金额" clearable
                :style="{width: '50%'}"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="24">
            <el-form-item label="生效日期" prop="effectiveDate">
              <el-date-picker v-model="formData.effectiveDate" format="yyyy-MM-dd" value-format="yyyy-MM-dd"
                :style="{width: '50%'}" placeholder="请选择生效日期" clearable></el-date-picker>
            </el-form-item>
          </el-col>
          <el-col :span="24">
            <el-form-item label="到期日期" prop="expirationDate">
              <el-date-picker v-model="formData.expirationDate" format="yyyy-MM-dd" value-format="yyyy-MM-dd"
                :style="{width: '50%'}" placeholder="请选择到期日期" clearable></el-date-picker>
            </el-form-item>
          </el-col>
          <el-col :span="24">
            <el-form-item label="甲方" prop="partyA">
              <el-input v-model="formData.partyA" placeholder="请输入甲方" clearable :style="{width: '50%'}">
              </el-input>
            </el-form-item>
          </el-col>
          <el-col :span="24">
            <el-form-item label="乙方" prop="partyB">
              <el-input v-model="formData.partyB" placeholder="请输入乙方" clearable :style="{width: '50%'}">
              </el-input>
            </el-form-item>
          </el-col>
          <el-col :span="24">
            <el-form-item label="付款方式" prop="paymentMethod">
              <el-input v-model="formData.paymentMethod" placeholder="请输入付款方式" clearable
                :style="{width: '50%'}"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="24">
            <el-form-item label="签订日期" prop="signingDate">
              <el-date-picker v-model="formData.signingDate" format="yyyy-MM-dd" value-format="yyyy-MM-dd"
                :style="{width: '50%'}" placeholder="请选择签订日期" clearable></el-date-picker>
            </el-form-item>
          </el-col>
          <el-col :span="24">
            <el-form-item label="标的物信息" prop="subjectInformation">
              <el-input v-model="formData.subjectInformation" placeholder="请输入标的物信息" clearable
                :style="{width: '50%'}"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="24">
            <el-form-item label="附件" prop="attachments">
              <!-- <el-input v-model="formData.attachments" placeholder="请输入附件" clearable :style="{width: '50%'}" />            -->
              <el-upload
                  multiple
                  :action="uploadFileUrl"
                  :before-upload="handleBeforeUpload"
                  :file-list="fileList"
                  :limit="limit"
                  :on-error="handleUploadError"
                  :on-exceed="handleExceed"
                  :on-success="handleUploadSuccess"
                  :show-file-list="false"
                  :headers="headers"
                  class="upload-file-uploader"
                  ref="fileUpload"
                >
                <!-- :auto-upload="false" -->
                  <!-- 上传按钮 -->
                  <el-button size="mini" type="primary">选取文件</el-button>
                  <!-- <el-button style="margin-left: 10px;" size="small" type="success" @click="submitUpload">上传到服务器</el-button> -->
                  <!-- 上传提示 -->
                  <div class="el-upload__tip" slot="tip">
                    请上传
                    <template v-if="fileSize"> 大小不超过 <b style="color: #f56c6c">{{ fileSize }}MB</b> </template>
                    <template v-if="fileType"> 格式为 <b style="color: #f56c6c">{{ fileType.join("/") }}</b> </template>
                    的文件
                  </div>
                </el-upload>
                <!-- 文件列表 -->
                <transition-group class="upload-file-list el-upload-list el-upload-list--text" name="el-fade-in-linear" tag="ul">
                  <li :key="file.url" class="el-upload-list__item ele-upload-list__item-content" v-for="(file, index) in fileList">
                    <el-link :href="`${file.url}`" :underline="false" target="_blank">
                      <span class="el-icon-document"> {{ getFileName(file.name) }} </span>
                    </el-link>
                    <div class="ele-upload-list__item-content-action">
                      <el-link :underline="false" @click="handleDelete(index)" type="danger">删除</el-link>
                    </div>
                  </li>
                </transition-group>
            </el-form-item>
          </el-col>
          <el-col :span="24">
            <el-form-item size="large">
              <el-button type="primary" @click="submitForm">提交</el-button>
              <el-button @click="resetForm">重置</el-button>
            </el-form-item>
          </el-col>
        </el-form>
      </el-row>
    </div>
  </template>
  <script>
  import { listContract, getContract, delContract, addAndStart, updateContract } from "@/api/compliancemanagement/contract";
  import { getToken } from "@/utils/auth";
  export default {
    components: {},
    props: {
       // 数量限制
    limit: {
      type: Number,
      default: 1,
    },
        // 大小限制(MB)
    fileSize: {
      type: Number,
      default: 5,
    },
    // 文件类型, 例如['png', 'jpg', 'jpeg']
    fileType: {
      type: Array,
      default: () => ["pdf"],
    },
    },
    data() {
      const validatAttachments = (rule, value, callback) => {
      console.log('this.fileList',this.fileList)
      if (this.fileList.length <=0 ) {
        callback(new Error("请上传附件!"));
      } else {
        callback();
      }
    };
      return {
        fileList:[],
        uploadFileUrl: process.env.VUE_APP_BASE_API + "/common/upload", // 上传文件服务器地址
        headers: {
            Authorization: "Bearer " + getToken(),
          },
        uploadList: [],
        number: 0,
        procDefId:null,
        formData: {
          contractno: undefined,
          contractName: undefined,
          contractType: undefined,
          contractAmount: undefined,
          effectiveDate: null,
          expirationDate: null,
          partyA: undefined,
          partyB: undefined,
          paymentMethod: undefined,
          signingDate: null,
          subjectInformation: undefined,
          attachments: undefined,
        },
        rules: {
          contractno: [{
            required: true,
            message: '请输入合同编号',
            trigger: 'blur'
          }],
          contractName: [{
            required: true,
            message: '请输入合同名称',
            trigger: 'blur'
          }],
          contractType: [{
            required: true,
            message: '请输入合同类型',
            trigger: 'blur'
          }],
          contractAmount: [{
            required: true,
            message: '请输入合同金额',
            trigger: 'blur'
          }],
          effectiveDate: [{
            required: true,
            message: '请选择生效日期',
            trigger: 'change'
          }],
          expirationDate: [{
            required: true,
            message: '请选择到期日期',
            trigger: 'change'
          }],
          partyA: [{
            required: true,
            message: '请输入甲方',
            trigger: 'blur'
          }],
          partyB: [{
            required: true,
            message: '请输入乙方',
            trigger: 'blur'
          }],
          paymentMethod: [
            {required: true, message: '请输入付款方式',trigger: 'blur'}
          ],
          signingDate: [
            {required: true,message: '请选择签订日期',trigger: 'change'}
          ],
          subjectInformation: [
            {required: true,message: '请输入标的物信息',trigger: 'blur'}
          ],
          attachments: [
          //   {
          //   required: true,
          //   message: '请输入附件',
          //   trigger: 'blur'
          // },
          { required: true, validator: validatAttachments, trigger: "blur" }],
        },
      }
    },
    computed: {},
    watch: {},
    created() {
    },
    mounted() {},
    methods: {
        
      submitForm() {
        this.$refs['elForm'].validate(valid => {
        // console.log(this.formData)
            if (valid) {
              console.log('===',this.formData)
              this.formData.attachments = this.fileList[0].name
            // return
                addAndStart(this.formData).then(response => {
              this.$modal.msgSuccess("流程启动成功");
              this.$router.push({ path: '/contract/compliancemanagement/contractmanagement/contract'});
            })
        }
        })
      },
      resetForm() {
        this.$refs['elForm'].resetFields()
      },
       // 上传前校检格式和大小
    handleBeforeUpload(file) {
      // 校检文件类型
      if (this.fileType) {
        const fileName = file.name.split('.');
        const fileExt = fileName[fileName.length - 1];
        const isTypeOk = this.fileType.indexOf(fileExt) >= 0;
        if (!isTypeOk) {
          this.$modal.msgError(`文件格式不正确, 请上传${this.fileType.join("/")}格式文件!`);
          return false;
        }
      }
      // 校检文件大小
      if (this.fileSize) {
        const isLt = file.size / 1024 / 1024 < this.fileSize;
        if (!isLt) {
          this.$modal.msgError(`上传文件大小不能超过 ${this.fileSize} MB!`);
          return false;
        }
      }
      this.$modal.loading("正在上传文件,请稍候...");
      this.number++;
      return true;
    },
    // 文件个数超出
    handleExceed() {
      this.$modal.msgError(`上传文件数量不能超过 ${this.limit} 个!`);
    },
    submitUpload() {
        this.$refs.upload.submit();
    },
    // 上传失败
    handleUploadError(err) {
      this.$modal.msgError("上传文件失败,请重试");
      this.$modal.closeLoading();
    },
    // 上传成功回调
    handleUploadSuccess(res, file) {
      console.log('handleUploadSuccess',res)
      if (res.code === 200) {
        this.uploadList.push({ name: res.data.fileName, url: res.data.url, ossId: res.data.ossId });
        this.uploadedSuccessfully();
      } else {
        this.number--;
        this.$modal.closeLoading();
        this.$modal.msgError(res.msg);
        this.$refs.fileUpload.handleRemove(file);
        this.uploadedSuccessfully();
      }
    },
    // 删除文件
    handleDelete(index) {
      let ossId = this.fileList[index].ossId;
      delOss(ossId);
      this.fileList.splice(index, 1);
      this.$emit("input", this.listToString(this.fileList));
    },
    // 上传结束处理
    uploadedSuccessfully() {
      if (this.number > 0 && this.uploadList.length === this.number) {
        this.fileList = this.fileList.concat(this.uploadList);
        this.uploadList = [];
        this.number = 0;
        this.$emit("input", this.listToString(this.fileList));
        this.$modal.closeLoading();
      }
    },
    // 获取文件名称
    getFileName(name) {
      // 如果是url那么取最后的名字 如果不是直接返回
      if (name.lastIndexOf("/") > -1) {
        return name.slice(name.lastIndexOf("/") + 1);
      } else {
        return name;
      }
    },
    // 对象转成指定字符串分隔
    listToString(list, separator) {
      let strs = "";
      separator = separator || ",";
      for (let i in list) {
        strs += list[i].ossId + separator;
      }
      return strs != "" ? strs.substr(0, strs.length - 1) : "";
    },
    }
  }
  
  </script>
  <style>
  </style>