From 654556a05394481b138b1070d83a22dbf311e94b Mon Sep 17 00:00:00 2001
From: zhizhijie <zhizhijie@users.noreply.gitee.com>
Date: 星期二, 22 九月 2026 10:40:37 +0800
Subject: [PATCH] fix(报表生成): 已自动下载后不再显示下载按钮(按用户反馈调整)

---
 traffic-audit-web/src/views/ReportExport.vue |   45 ++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 38 insertions(+), 7 deletions(-)

diff --git a/traffic-audit-web/src/views/ReportExport.vue b/traffic-audit-web/src/views/ReportExport.vue
index 22e12cf..e649937 100644
--- a/traffic-audit-web/src/views/ReportExport.vue
+++ b/traffic-audit-web/src/views/ReportExport.vue
@@ -162,7 +162,7 @@
         </el-dialog>
 
         <!-- 姹囨�诲ぇ琛ㄥ紓姝ョ敓鎴愯繘搴︼紙鐢熸垚涓�娆$害 10~20 绉掞紝閬垮厤鐐瑰嚮鍚庨暱鏃堕棿鏃犲搷搴旓級 -->
-        <el-dialog title="姝e湪鐢熸垚姹囨�诲ぇ琛�" :visible.sync="taskVisible" width="460px"
+        <el-dialog :title="taskDialogTitle" :visible.sync="taskVisible" width="460px"
                    :close-on-click-modal="false" :show-close="taskFinished">
           <div class="task-body">
             <el-progress :percentage="taskInfo.percent || 0" :status="taskInfo.status === 'FAILED' ? 'exception' : (taskDone ? 'success' : null)"
@@ -170,13 +170,17 @@
             <p class="task-step">{{ taskInfo.step || '鎺掗槦涓�' }}</p>
             <p class="task-meta" v-if="taskInfo.period">鎶ヨ〃鏈� {{ taskInfo.period }}銆�{{ taskInfo.fromCache ? '涓婃鐢熸垚鐢ㄦ椂' : '宸茬敤' }} {{ (taskInfo.elapsedMs / 1000).toFixed(1) }} 绉�</p>
             <p class="task-meta" v-if="taskInfo.fromCache">鏈鐩存帴浣跨敤 {{ taskCacheTime }} 鐢熸垚鐨勭粨鏋滐紙10 鍒嗛挓鍐呬笖鏈熼棿娌℃湁鏂板鍏ユ暟鎹級銆傚闇�鎸夋渶鏂版暟鎹噸绠楋紝璇风偣銆岄噸鏂扮敓鎴愩�嶃��</p>
+            <p class="task-done" v-if="taskDownloaded">
+              宸茶嚜鍔ㄤ笅杞斤細<b>{{ taskFileName }}</b><span v-if="taskFileSize">锛坽{ taskFileSizeText }}锛�</span>锛屾枃浠跺湪娴忚鍣ㄩ粯璁や笅杞界洰褰曘��
+            </p>
+            <p class="task-error" v-else-if="taskDone">鑷姩涓嬭浇娌℃垚鍔燂紝鍙偣銆屼繚瀛樻枃浠躲�嶅啀瀛樹竴娆°��</p>
             <p class="task-error" v-if="taskInfo.status === 'FAILED'">{{ taskInfo.error }}</p>
           </div>
           <span slot="footer">
-            <el-button size="small" type="primary" :disabled="!taskDone" @click="downloadTaskFile">{{ taskInfo.fromCache ? '涓嬭浇' : '淇濆瓨鏂囦欢' }}</el-button>
+            <el-button size="small" v-if="taskDone && !taskDownloaded" @click="downloadTaskFile()">淇濆瓨鏂囦欢</el-button>
             <el-button size="small" :disabled="taskRunning" @click="restartTask">閲嶆柊鐢熸垚</el-button>
             <el-button size="small" v-if="taskRunning" @click="minimizeTask">鍚庡彴杩愯</el-button>
-            <el-button size="small" v-else @click="closeTask">鍏抽棴</el-button>
+            <el-button size="small" v-else type="primary" @click="closeTask">鍏抽棴</el-button>
           </span>
         </el-dialog>
       </el-main>
@@ -212,6 +216,10 @@
       taskVisible: false,
       taskInfo: {},
       taskTimer: null,
+      // 杩涘害寮圭獥锛氬畬鎴愬悗浼氳嚜鍔ㄤ笅杞戒竴娆★紝杩欓噷璁板綍銆屾槸鍚﹀凡涓嬭浇銆嶄笌鏂囦欢淇℃伅锛堝凡涓嬭浇灏变笉鍐嶆樉绀轰笅杞芥寜閽級
+      taskDownloaded: false,
+      taskFileName: '',
+      taskFileSize: 0,
       taskKey: 'summaryWorkbook',
       modules: [
         {
@@ -320,6 +328,18 @@
       const d = new Date(t)
       const p = (n) => String(n).padStart(2, '0')
       return d.getFullYear() + '-' + p(d.getMonth() + 1) + '-' + p(d.getDate()) + ' ' + p(d.getHours()) + ':' + p(d.getMinutes()) + ':' + p(d.getSeconds())
+    },
+    // 寮圭獥鏍囬闅忎换鍔$姸鎬佸彉鍖栵紝閬垮厤銆屽凡瀹屾垚銆嶈繕鍐欑潃銆屾鍦ㄧ敓鎴愩��
+    taskDialogTitle() {
+      const s = this.taskInfo && this.taskInfo.status
+      if (s === 'FAILED') return '姹囨�诲ぇ琛ㄧ敓鎴愬け璐�'
+      if (s === 'DONE') return '姹囨�诲ぇ琛ㄥ凡鐢熸垚'
+      return '姝e湪鐢熸垚姹囨�诲ぇ琛�'
+    },
+    taskFileSizeText() {
+      const n = this.taskFileSize || 0
+      if (!n) return ''
+      return n >= 1048576 ? (n / 1048576).toFixed(2) + ' MB' : Math.round(n / 1024) + ' KB'
     }
   },
   watch: {
@@ -524,6 +544,9 @@
       this.stopTaskPolling()
       this.taskInfo = { status: 'PENDING', percent: 0, step: '鎻愪氦浠诲姟', period: this.period, elapsedMs: 0 }
       this.taskVisible = true
+      this.taskDownloaded = false
+      this.taskFileName = ''
+      this.taskFileSize = 0
       this.loading = 'gen-' + this.curModule.key
       const params = Object.assign({}, this.buildParams(), { refresh: refresh ? 'true' : 'false' })
       api.get('/report/exportTask/summaryWorkbook', { params, timeout: 60000 })
@@ -536,7 +559,7 @@
             return
           }
           this.taskInfo = res.data
-          if (this.taskInfo.status === 'DONE') { this.loading = ''; this.downloadTaskFile(); return }
+          if (this.taskInfo.status === 'DONE') { this.loading = ''; this.downloadTaskFile(true); return }
           if (this.taskInfo.status === 'FAILED') { this.loading = ''; return }
           this.pollTask()
         })
@@ -568,7 +591,7 @@
             if (this.taskInfo.status === 'DONE') {
               this.stopTaskPolling()
               this.loading = ''
-              this.downloadTaskFile()
+              this.downloadTaskFile(true)
             } else if (this.taskInfo.status === 'FAILED') {
               this.stopTaskPolling()
               this.loading = ''
@@ -581,12 +604,19 @@
     stopTaskPolling() {
       if (this.taskTimer) { clearInterval(this.taskTimer); this.taskTimer = null }
     },
-    downloadTaskFile() {
+    // auto=true 琛ㄧず銆屼换鍔″畬鎴愬悗鐨勮嚜鍔ㄤ笅杞姐�嶏紱鐢ㄦ埛鐐规寜閽椂涓� false
+    downloadTaskFile(auto) {
       const id = this.taskInfo && this.taskInfo.taskId
       if (!id) return
       const name = this.taskInfo.fileName || ('鐢熸垚_閬撹矾杩愯緭閲忔眹鎬昏〃_' + this.period + '.xlsx')
+      this.taskFileName = name
       api.get('/report/exportTask/' + id + '/file', { responseType: 'blob', timeout: 120000 })
-        .then(res => { this.downloadBlob(res, name); this.$message.success('鎶ヨ〃瀵煎嚭鎴愬姛') })
+        .then(res => {
+          this.taskFileSize = (res && res.size) || 0
+          this.taskDownloaded = true
+          this.downloadBlob(res, name)
+          this.$message.success(auto ? '鐢熸垚瀹屾垚锛屽凡鑷姩涓嬭浇' : '鎶ヨ〃瀵煎嚭鎴愬姛')
+        })
         .catch(err => this.failWith(err))
     },
     restartTask() { this.startSummaryTask(true) },
@@ -756,6 +786,7 @@
 .task-step { margin: 12px 0 4px; font-size: 14px; color:#303133; }
 .task-meta { margin: 2px 0; font-size: 12px; color:#909399; line-height: 1.6; }
 .task-error { margin: 8px 0 0; font-size: 13px; color:#F56C6C; word-break: break-all; }
+.task-done { margin: 8px 0 0; font-size: 13px; color:#67C23A; line-height: 1.6; }
 </style>
 
 <style>

--
Gitblit v1.9.1