zipdownload.js 8.81 KB
import axios from 'axios'
import store from '@/store'
import { getToken } from '@/utils/auth'
import { getDownLoadFileStatus } from '@/utils/iClearExp.js'
import { alertWarningMsg } from '@/utils/index.js'
import { getdownloadExlFileType } from '@/api/custom-api.js'

const mimeMap = {
  xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
  xlsm: 'application/vnd.ms-excel.sheet.macroEnabled.12',
  xls: 'application/vnd.ms-excel',
  zip: 'application/zip',
  pdf: 'application/pdf',
  png: 'image/png',
  jpg: 'image/jpeg',
  docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
}

const apiUrl = {
  //exl
  customDownloadXls: '/bus-employees/export/custom/setting',//自定义导出
  epoaDownload: '/bus-employees/port/op/download',//epoa文件下载
  pbiListDownload: '/bus-employees/data/report/export/daily',//报表列表导出
  pbiLogDownload: '/bus-employees/data/report/export/efficiency',//预审人员效绩统计
  osprDownload: '/bus-employees/ospr/download',//opsr文件下载
  portCDownload: '/bus-employees/port/op/decC/export',//C类申报导出
  //other
  portDownloadZip: '/bus-employees/port/op/downLoadZip',//口岸异步下载
  staffEntryDownloadZip: '/bus-employees/chm/qry/downLoadZip',//运单查询异步下载
  entryUploadData: '/bus-customer/consignment/upload/export',//批量导入数据导出
  entryUploadModel: '/bus-customer/upload/excel/template/downLoad',//批量上传模版导出
  opsrDownloadZip: '/bus-employees/ospr/export',//opsr批量导出
}

const baseUrl = process.env.VUE_APP_BASE_API
export function downLoadZip(urlStatus, str, filename, type, method, data) {
  return new Promise((resolve, reject) => {
    var url = ''
    if (urlStatus == 'api') {
      url = baseUrl + apiUrl[str]
    } else if (urlStatus == 'res') {
      url = str
    }

    if (method == 'get' && data) {
      url = url + '?';
      for (const propName of Object.keys(data)) {
        const value = data[propName];
        var part = encodeURIComponent(propName) + "=";
        if (value !== null && typeof (value) !== "undefined") {
          if (typeof value === 'object') {
            for (const key of Object.keys(value)) {
              let params = propName + '[' + key + ']';
              var subPart = encodeURIComponent(params) + "=";
              url += subPart + encodeURIComponent(value[key]) + "&";
            }
          } else {
            url += part + encodeURIComponent(value) + "&";
          }
        }
      }
      url = url.slice(0, -1)
    }

    axios({
      method: method,
      url: url,
      data: data,
      responseType: 'blob',
      headers: {
        'Authorization': 'Bearer ' + getToken(),
        "Ver": process.env.VUE_APP_APIVERSION,
      }
    }).then(res => {
      if (filename == null) {
        if (res.headers['content-disposition']) {
          var patt = new RegExp('filename=([^;]+\\.[^\\.;]+);*')
          var contentDisposition = decodeURI(res.headers['content-disposition'])
          var result = patt.exec(contentDisposition)
          filename = result[0].split('=')[1]
        } else {
          filename = 'error'
        }
      }
      resolveBlob(res, mimeMap[type], filename)
      resolve()
    }).catch(() => {
      reject()
    })
  })
}
/**
 * 解析blob响应内容并下载
 * @param {*} res blob响应内容
 * @param {String} mimeType MIME类型
 */
export function resolveBlob(res, mimeType, filename) {
  const aLink = document.createElement('a')
  var blob = new Blob([res.data], { type: mimeType })
  if (blob.size < 500) {
    var reader = new FileReader()
    reader.readAsText(blob, 'utf-8')
    reader.onloadend = () => {
      // 获取文本内容并将其转换为JSON格式
      if (reader.result && reader.result != null && reader.result != '') {
        // try {
        //   JSON.parse(reader.result)
        // } catch (error) {

        // }
        if (JSON.parse(reader.result)) {
          var jsonData = JSON.parse(reader.result);
          alertWarningMsg(jsonData.message)
        } else {
          alertWarningMsg('文件无法下载,请重新生成后再试!')
        }
      } else {
        alertWarningMsg('文件无法下载,请重新生成后再试!')
      }
    }
  } else {
    // //从response的headers中获取filename, 后端response.setHeader("Content-disposition", "attachment; filename=xxxx.docx") 设置的文件名;
    // var patt = new RegExp('filename=([^;]+\\.[^\\.;]+);*')
    // var contentDisposition = decodeURI(res.headers['content-disposition'])
    // var result = patt.exec(contentDisposition)
    var fileName = filename
    fileName = fileName.replace(/\"/g, '')
    aLink.href = URL.createObjectURL(blob)
    aLink.setAttribute('download', fileName) // 设置下载文件名称
    document.body.appendChild(aLink)
    aLink.click()
    document.body.removeChild(aLink);
  }
}

export function downLoadFile(url, filename, type) {
  const aLink = document.createElement('a')
  const fileName = filename
  aLink.href = URL.createObjectURL(url)
  aLink.setAttribute('download', fileName) // 设置下载文件名称
  document.body.appendChild(aLink)
  aLink.click()
  document.body.removeChild(aLink);
}

export function formDataDownload(str, filename, type, method, data, exportSign) {
  store.dispatch('SetLoadingType', { type: true, text: '正在导出中,请稍候!' })
  return new Promise((resolve, reject) => {
    let iframe = document.createElement("iframe");
    iframe.style.display = "none";
    iframe.name = "formTarget";
    document.getElementsByTagName("body")[0].appendChild(iframe);
    var form = document.createElement("form");
    form.target = "formTarget";
    form.action = baseUrl + apiUrl.customDownloadXls;
    form.method = method;

    var tokenInput = document.createElement("input");
    tokenInput.type = "hidden";
    tokenInput.name = "Param_Authorization";
    tokenInput.value = getToken();

    var belongBizTypeInput = document.createElement("input");
    belongBizTypeInput.type = "hidden";
    belongBizTypeInput.name = "downloadSreachData";
    belongBizTypeInput.value = JSON.stringify(data);

    var verInput = document.createElement('input')
    verInput.type = "hidden";
    verInput.name = "Param_Ver";
    verInput.value = process.env.VUE_APP_APIVERSION;

    form.appendChild(tokenInput);
    form.appendChild(belongBizTypeInput);
    form.appendChild(verInput);
    document.getElementsByTagName("body")[0].appendChild(form);
    form.submit();
    document.getElementsByTagName("body")[0].removeChild(form);
    // 查询导出结果
    // getType = setInterval(() => {
    getDownLoadFileStatus(exportSign).then(() => {
      resolve()
    }).catch(() => {
      reject()
    })
    //   getdownloadExlFileType(exportSign).then((res) => {
    //     if (res.code == '200') {
    //       if (res.data.extra == 'true') {
    //         clearInterval(getType)
    //         store.dispatch('SetLoadingType', { type: false, text: '' })
    //         resolve()
    //       }
    //     } else {
    //       clearInterval(getType)
    //       store.dispatch('SetLoadingType', { type: false, text: '' })
    //       alertWarningMsg(res.message)
    //       reject()
    //     }
    //   }).catch(() => {
    //     clearInterval(getType)
    //     store.dispatch('SetLoadingType', { type: false, text: '' })
    //     reject()
    //   })
    // }, 1000);
  })
}

//form.submit()导出xls/xlsx
export function formSubmitDownload(url, method, data, exportSign = null) {
  return new Promise((resolve, reject) => {
    let iframe = document.createElement("iframe");
    iframe.style.display = "none";
    iframe.name = "formTarget";
    document.getElementsByTagName("body")[0].appendChild(iframe);
    var form = document.createElement("form");
    form.target = "formTarget";
    form.action = baseUrl + apiUrl[url]
    form.method = method
    if (data) {
      let domObj = {}
      data.forEach((item, i) => {
        domObj[`input${i}`] = document.createElement("input");
        domObj[`input${i}`].type = "hidden";
        domObj[`input${i}`].name = item.key;
        domObj[`input${i}`].value = item.value;
        form.appendChild(domObj[`input${i}`]);
      })
      var tokenInput = document.createElement("input");
      tokenInput.type = "hidden";
      tokenInput.name = "Param_Authorization";
      tokenInput.value = getToken();
      form.appendChild(tokenInput);
      var verInput = document.createElement('input')
      verInput.type = "hidden";
      verInput.name = "Param_Ver";
      verInput.value = process.env.VUE_APP_APIVERSION;
      form.appendChild(verInput);
    }
    document.getElementsByTagName("body")[0].appendChild(form);
    form.submit();
    document.getElementsByTagName("body")[0].removeChild(form);
    if (exportSign != null) {
      getDownLoadFileStatus(exportSign).then(() => {
        resolve()
      }).catch(() => {
        reject()
      })
    } else {
      resolve()
    }
  })
}