<template> 
 | 
<div id="recordDownload" > 
 | 
  <el-dialog :title="title" v-if="showDialog"  width="45rem" :append-to-body="true" :close-on-click-modal="false" :visible.sync="showDialog" :destroy-on-close="true" @close="close()" center> 
 | 
    <el-row> 
 | 
      <el-col :span="18" style="padding-top: 7px;"> 
 | 
        <el-progress :percentage="percentage"></el-progress> 
 | 
      </el-col> 
 | 
      <el-col :span="6" > 
 | 
        <el-button icon="el-icon-download" v-if="percentage < 100" size="mini" title="点击下载可将以缓存部分下载到本地" @click="download()">停止缓存并下载</el-button> 
 | 
        <el-button icon="el-icon-download" v-if="downloadFile" size="mini" title="点击下载" @click="downloadFileClientEvent()">点击下载</el-button> 
 | 
      </el-col> 
 | 
    </el-row> 
 | 
  </el-dialog> 
 | 
</div> 
 | 
</template> 
 | 
  
 | 
  
 | 
<script> 
 | 
  
 | 
import moment from "moment"; 
 | 
  
 | 
export default { 
 | 
    name: 'recordDownload', 
 | 
    created() { 
 | 
      window.addEventListener('beforeunload', this.stopDownloadRecord) 
 | 
  
 | 
    }, 
 | 
    data() { 
 | 
        return { 
 | 
          title: "四倍速下载中...", 
 | 
          deviceId: "", 
 | 
          channelId: "", 
 | 
          app: "", 
 | 
          stream: "", 
 | 
          mediaServerId: "", 
 | 
          showDialog: false, 
 | 
          scale: 1, 
 | 
          percentage: 0.00, 
 | 
          streamInfo: null, 
 | 
          taskId: null, 
 | 
          getProgressRun: false, 
 | 
          getProgressForFileRun: false, 
 | 
          timer: null, 
 | 
          downloadFile: null, 
 | 
  
 | 
        }; 
 | 
    }, 
 | 
    methods: { 
 | 
        openDialog: function (deviceId, channelId, app, stream, mediaServerId) { 
 | 
            this.deviceId = deviceId; 
 | 
            this.channelId = channelId; 
 | 
            this.app = app; 
 | 
            this.stream = stream; 
 | 
            this.mediaServerId = mediaServerId; 
 | 
            this.showDialog = true; 
 | 
            this.getProgressRun = true; 
 | 
            this.percentage = 0.0; 
 | 
            this.getProgressTimer() 
 | 
        }, 
 | 
        getProgressTimer: function (){ 
 | 
          if (!this.getProgressRun) { 
 | 
            return; 
 | 
          } 
 | 
          if (this.percentage == 100 ) { 
 | 
            this.getFileDownload(); 
 | 
            return; 
 | 
          } 
 | 
          setTimeout( ()=>{ 
 | 
            if (!this.showDialog) return; 
 | 
            this.getProgress(this.getProgressTimer()) 
 | 
          }, 5000) 
 | 
        }, 
 | 
        getProgress: function (callback){ 
 | 
          this.$axios({ 
 | 
            method: 'get', 
 | 
            url: `/api/gb_record/download/progress/${this.deviceId}/${this.channelId}/${this.stream}` 
 | 
          }).then((res)=> { 
 | 
            console.log(res) 
 | 
              if (res.data.code === 0) { 
 | 
                this.streamInfo = res.data.data; 
 | 
                if (parseFloat(res.data.progress) == 1) { 
 | 
                  this.percentage = 100; 
 | 
                }else { 
 | 
                  this.percentage = (parseFloat(res.data.data.progress)*100).toFixed(1); 
 | 
                } 
 | 
                if (callback)callback(); 
 | 
              }else { 
 | 
                this.$message({ 
 | 
                  showClose: true, 
 | 
                  message: res.data.msg, 
 | 
                  type: "error", 
 | 
                }); 
 | 
                this.close(); 
 | 
              } 
 | 
  
 | 
          }).catch((e) =>{ 
 | 
            console.log(e) 
 | 
          }); 
 | 
        }, 
 | 
        close: function (){ 
 | 
          if (this.streamInfo.progress < 1) { 
 | 
            this.stopDownloadRecord(); 
 | 
          } 
 | 
  
 | 
          if (this.timer !== null) { 
 | 
            window.clearTimeout(this.timer); 
 | 
            this.timer = null; 
 | 
          } 
 | 
          this.showDialog=false; 
 | 
          this.getProgressRun = false; 
 | 
          this.getProgressForFileRun = false; 
 | 
        }, 
 | 
        gbScale: function (scale){ 
 | 
          this.scale = scale; 
 | 
        }, 
 | 
        download: function (){ 
 | 
          this.getProgressRun = false; 
 | 
          if (this.streamInfo != null ) { 
 | 
            if (this.streamInfo.progress < 1) { 
 | 
              // 发送停止缓存 
 | 
              this.stopDownloadRecord((res)=>{ 
 | 
                  this.getFileDownload() 
 | 
              }) 
 | 
            }else { 
 | 
              this.getFileDownload() 
 | 
            } 
 | 
          } 
 | 
        }, 
 | 
        stopDownloadRecord: function (callback) { 
 | 
          this.$axios({ 
 | 
            method: 'get', 
 | 
            url: '/api/gb_record/download/stop/' + this.deviceId + "/" + this.channelId+ "/" + this.stream 
 | 
          }).then((res)=> { 
 | 
            if (callback) callback(res) 
 | 
          }); 
 | 
        }, 
 | 
        getFileDownload: function (){ 
 | 
          this.$axios({ 
 | 
            method: 'get', 
 | 
            url:`/record_proxy/${this.mediaServerId}/api/record/file/download/task/add`, 
 | 
            params: { 
 | 
              app: this.app, 
 | 
              stream: this.stream, 
 | 
              startTime: null, 
 | 
              endTime: null, 
 | 
            } 
 | 
          }).then((res) =>{ 
 | 
            if (res.data.code === 0 ) { 
 | 
              // 查询进度 
 | 
              this.title = "录像文件处理中..." 
 | 
              this.taskId = res.data.data; 
 | 
              this.percentage = 0.0; 
 | 
              this.getProgressForFileRun = true; 
 | 
              this.getProgressForFileTimer(); 
 | 
            } 
 | 
          }).catch(function (error) { 
 | 
            console.log(error); 
 | 
          }); 
 | 
        }, 
 | 
        getProgressForFileTimer: function (){ 
 | 
          if (!this.getProgressForFileRun || this.percentage == 100) { 
 | 
            return; 
 | 
          } 
 | 
          setTimeout( ()=>{ 
 | 
            if (!this.showDialog) return; 
 | 
            this.getProgressForFile(this.getProgressForFileTimer) 
 | 
          }, 1000) 
 | 
        }, 
 | 
        getProgressForFile: function (callback){ 
 | 
          this.$axios({ 
 | 
            method: 'get', 
 | 
            url:`/record_proxy/${this.mediaServerId}/api/record/file/download/task/list`, 
 | 
            params: { 
 | 
              app: this.app, 
 | 
              stream: this.stream, 
 | 
              taskId: this.taskId, 
 | 
              isEnd: true, 
 | 
            } 
 | 
          }).then((res) => { 
 | 
            console.log(res) 
 | 
            if (res.data.code === 0) { 
 | 
              if (res.data.data.length === 0){ 
 | 
                this.percentage = 0 
 | 
                // 往往在多次请求后(实验五分钟的视频是三次请求),才会返回数据,第一次请求通常是返回空数组 
 | 
                if (callback)callback() 
 | 
                return 
 | 
              } 
 | 
              // res.data.data应是数组类型 
 | 
                this.percentage = parseFloat(res.data.data[0].percentage)*100 
 | 
                 if (res.data.data[0].percentage === '1') { 
 | 
                   this.getProgressForFileRun = false; 
 | 
                   this.downloadFile = res.data.data[0].downloadFile 
 | 
                   this.title = "文件处理完成,点击按扭下载" 
 | 
                   // window.open(res.data.data[0].downloadFile) 
 | 
                 }else { 
 | 
                   if (callback)callback() 
 | 
                 } 
 | 
            } 
 | 
          }).catch(function (error) { 
 | 
            console.log(error); 
 | 
          }); 
 | 
        }, 
 | 
      downloadFileClientEvent: function (){ 
 | 
        window.open(this.downloadFile ) 
 | 
      } 
 | 
    }, 
 | 
    destroyed() { 
 | 
      window.removeEventListener('beforeunload', this.stopDownloadRecord) 
 | 
    } 
 | 
}; 
 | 
</script> 
 | 
  
 | 
<style> 
 | 
  
 | 
</style> 
 |