Newer
Older
ProductionSysFront / src / views / factoryManager / components / exportDialog.vue
dutingting on 16 May 2023 6 KB 新增项目管理页面
<template>
  <el-dialog :visible.sync="exportDialogVisible" :close-on-click-modal="false" title="批量导出" class="export-dialog" append-to-body @close="close">
    <div class="top-area">
      <el-checkbox v-model="includeImage" :disabled="isExporting" class="checkBox">导出施工图片</el-checkbox>
      <div>
        <el-button :disabled="isExporting" type="primary" size="small" @click="startExport" >
          <i v-if="isExporting" class="el-icon-loading" />
          <span>{{ isExporting ? '正在导出' : '开始导出' }}</span>
        </el-button>
        <el-button v-if="list.length" type="primary" size="small" @click="hanldeDownloadZip()">下载最近一次文件压缩包</el-button>
        <el-button v-if="list.length" type="primary" size="small" @click="refresh">刷新列表</el-button>
      </div>
    </div>
    <el-table v-loading="listLoading" :data="list" class="table" border height="350">
      <el-table-column align="center" type="index" label="序号" width="55"/>
      <el-table-column v-for="column in columns" :key="column.value" :label="column.text" :width="column.width" align="center" show-overflow-tooltip>
        <template slot-scope="scope">
          <span :class="column.class">{{ scope.row[column.value] }}</span>
        </template>
      </el-table-column>
      <el-table-column label="操作" align="center" width="80">
        <template slot-scope="scope">
          <el-button type="text" size="small" @click="download(scope.row)">下载</el-button>
        </template>
      </el-table-column>
    </el-table>

    <!--分页-->
    <div class="pagination-container">
      <el-pagination
        :current-page="listQuery.offset"
        :page-sizes="[10,20,30]"
        :page-size="listQuery.limit"
        :total="total"
        align="center"
        layout="total, sizes, prev, pager, next"
        @size-change="handleSizeChange"
        @current-change="handleCurrentChange"/>
    </div>
  </el-dialog>
</template>
<script>
import { getLastExportList, downloadZip } from '@/api/factory'
import { downloadTemplate } from '@/api/common'
export default {
  name: 'ExportDialog',
  props: {
    exportDialogVisible: { // 对话框显隐
      type: Boolean,
      default: false
    },
    isExporting: { // 是否正在导出中
      type: Boolean,
      default: false
    }
  },
  data() {
    return {
      columns: [
        {
          text: '文件名',
          value: 'fileName'
        },
        {
          text: '完成时间',
          value: 'createTime'
        }
      ], // 显示列
      includeImage: false, // 0-fasle不导出图片、1-true导出图片
      list: [], // 表格数据
      total: 0, // 数据总数
      listQuery: {
        begTime: '',
        endTime: '',
        offset: 1,
        limit: 10
      },
      listLoading: false // 加载动画
    }
  },
  watch: {
    exportDialogVisible(val) {
      if (val) {
        this.fetchLastExportList()
        this.websocket()
      }
    }
  },
  methods: {
    websocket() {
      console.log(this.$store.state)
      if (!this.$store.state.websocket.wsStatus) {
        this.$store.dispatch('initWebSocket')
      }
    },
    fileHandle(data, fileName) {
      const blob = new Blob([data], { type: 'application/zip' })
      const url = window.URL.createObjectURL(blob)
      const link = document.createElement('a') // 创建a标签
      link.href = url
      link.download = fileName // 重命名文件
      link.click()
      URL.revokeObjectURL(url) // 释放内存
    },
    // 点击下载压缩包
    hanldeDownloadZip() {
      if (this.list[0].fileDir !== '') {
        const fileDir = this.list[0].fileDir
        // 全屏加载动画
        const loading = this.$loading({
          lock: true,
          text: '数据处理中,请稍后...',
          spinner: 'el-icon-loading',
          background: 'rgba(0, 0, 0, 0.7)'
        })
        downloadZip(fileDir).then(res => {
          loading.close() // 关闭加载动画
          // const blob = new Blob([res.data])
          // const zip = new JSZip()
          // zip.file(this.list[0].fileName, blob)
          // zip.generateAsync({
          //   type: 'blob'
          // }).then(res => {
          //   saveAs(res, `${this.list[0].fileName}.zip`)
          // })
          const name = this.list[0].fileName.slice(0, this.list[0].fileName.indexOf('.'))
          console.log(name)
          this.fileHandle(res.data, `${name}.zip`)
        }).catch((res) => {
          loading.close()
          // this.$message.error(res.message)
        })
      }
    },
    // 点击下载
    download(row) {
      console.log(row)
      if (row.fileName !== '' && row.fileDir !== '') {
        const fileName = row.fileName
        const sendFileName = row.fileDir + row.fileName
        // 全屏加载动画
        const loading = this.$loading({
          lock: true,
          text: '数据处理中,请稍后...',
          spinner: 'el-icon-loading',
          background: 'rgba(0, 0, 0, 0.7)'
        })
        downloadTemplate(sendFileName).then(res => {
          loading.close() // 关闭加载动画
          const blob = new Blob([res.data])
          const downloadElement = document.createElement('a')
          const href = window.URL.createObjectURL(blob) // 创建下载的链接
          downloadElement.href = href
          console.log('fileName');
          console.log(fileName);
          downloadElement.download = fileName // 下载后文件名
          document.body.appendChild(downloadElement)
          downloadElement.click() // 点击下载
          document.body.removeChild(downloadElement) // 下载完成移除元素
          window.URL.revokeObjectURL(href) // 释放blob对象
        }).catch((res) => {
          loading.close()
          this.$message.error(res.message)
        })
      }
    },
    // 关闭弹窗
    close() {
      this.$emit('closeDialog')
    },
    // 点击开始导出
    startExport() {
      this.$emit('startExport', this.includeImage)
    },
    // 获取上次导出的列表
    fetchLastExportList() {
      this.listLoading = true
      getLastExportList({ offset: this.listQuery.offset, limit: this.listQuery.limit }).then(res => {
        console.log('上次导出列表返回', res)
        this.list = res.data.rows
        this.total = res.data.total
        this.listLoading = false
      })
    },
    // 改变页容量
    handleSizeChange(val) {
      this.listQuery.limit = val
      this.fetchLastExportList()
    },
    // 改变当前页
    handleCurrentChange(val) {
      this.listQuery.offset = val
      this.fetchLastExportList()
    },
    // 点击刷新
    refresh() {
      this.fetchLastExportList()
    }
  }
}
</script>
<style lang="scss" scoped>
  .export-dialog {
    .top-area {
      width: 100%;
      display: flex;
      justify-content: space-between;
      align-items: center;
      margin-bottom: 40px;
      .checkBox {
        margin-right: 40px;
      }
    }
    .pagination-container{
      margin-bottom: 20px;
      margin-top: 20px;
    }
  }
</style>