From 4eee579aa38af2ac9b48e4f6e6cfc1bedebf4822 Mon Sep 17 00:00:00 2001
From: zhizhijie <zhizhijie@users.noreply.gitee.com>
Date: 星期二, 22 九月 2026 10:04:48 +0800
Subject: [PATCH] fix(报表生成): 汇总大表进度弹窗优化(自动化下载提示 + 再次下载走本地缓存)

---
 traffic-audit-web/src/views/ReportExport.vue |   54 +++++++++++++++++++++++---
 docs/功能测试报告/功能测试报告_汇总大表进度弹窗优化_2026-09-22.md  |   54 +++++++++++++++++++++++++++
 docs/工作日结/工作日结_2026-09-22.md                 |   12 ++++++
 3 files changed, 113 insertions(+), 7 deletions(-)

diff --git "a/docs/\345\212\237\350\203\275\346\265\213\350\257\225\346\212\245\345\221\212/\345\212\237\350\203\275\346\265\213\350\257\225\346\212\245\345\221\212_\346\261\207\346\200\273\345\244\247\350\241\250\350\277\233\345\272\246\345\274\271\347\252\227\344\274\230\345\214\226_2026-09-22.md" "b/docs/\345\212\237\350\203\275\346\265\213\350\257\225\346\212\245\345\221\212/\345\212\237\350\203\275\346\265\213\350\257\225\346\212\245\345\221\212_\346\261\207\346\200\273\345\244\247\350\241\250\350\277\233\345\272\246\345\274\271\347\252\227\344\274\230\345\214\226_2026-09-22.md"
new file mode 100644
index 0000000..b38f4b1
--- /dev/null
+++ "b/docs/\345\212\237\350\203\275\346\265\213\350\257\225\346\212\245\345\221\212/\345\212\237\350\203\275\346\265\213\350\257\225\346\212\245\345\221\212_\346\261\207\346\200\273\345\244\247\350\241\250\350\277\233\345\272\246\345\274\271\347\252\227\344\274\230\345\214\226_2026-09-22.md"
@@ -0,0 +1,54 @@
+# 鍔熻兘娴嬭瘯鎶ュ憡_姹囨�诲ぇ琛ㄨ繘搴﹀脊绐椾紭鍖朹2026-09-22
+
+## 涓�銆佸姛鑳借鏄�
+
+鐢ㄦ埛闂锛氥�屾眹鎬昏〃鐨勮繘搴︽潯寮圭獥鐨勩�庝繚瀛樸�忎細浣夸笅杞界殑姹囨�昏〃鍐嶆涓嬭浇锛涜繖涓脊绐楀彲浠ユ�庝箞浼樺寲涓�涓嬪憿锛熴��
+
+**鍘熷洜**锛氫换鍔″畬鎴愭椂 `downloadTaskFile(true)` 浼氳嚜鍔ㄤ笅杞戒竴娆★紱鑰屽脊绐楀簳閮ㄤ竴鐩存寕鐫�銆屼繚瀛樻枃浠躲�嶏紙缂撳瓨鍛戒腑鏃舵槸銆屼笅杞姐�嶏級锛岀偣涓�涓嬩細**鍐嶆璇锋眰鍚庣鎷垮悓涓�涓枃浠跺苟绗簩娆′笅杞�**锛岀湅璧锋潵鍍忋�屼繚瀛樺張涓嬩簡涓�閬嶃�嶃�傚悓鏃跺脊绐楁爣棰樺缁堟槸銆屾鍦ㄧ敓鎴愭眹鎬诲ぇ琛ㄣ�嶏紝瀹屾垚/澶辫触鍚庝笉鍙樺寲銆�
+
+**鏀瑰姩**锛坄traffic-audit-web/src/views/ReportExport.vue`锛夛細
+
+| # | 鏀瑰姩 | 璇存槑 |
+| --- | --- | --- |
+| 1 | 瀹屾垚鍚庢樉绀恒�屽凡鑷姩涓嬭浇銆� | `宸茶嚜鍔ㄤ笅杞斤細<鏂囦欢鍚�>锛�<澶у皬>锛塦 + 鎻愮ず銆屾祻瑙堝櫒娌″脊鍑轰笅杞芥椂鍙偣銆庡啀娆′笅杞姐�忊�斺�旂敤鏈湴缂撳瓨淇濆瓨锛屼笉浼氶噸鏂拌姹傛湇鍔″櫒銆� |
+| 2 | 鎸夐挳鏂囨闅忕姸鎬佸彉鍖� | 宸蹭笅杞� 鈫� **鍐嶆涓嬭浇**锛涙湭涓嬭浇锛堢紦瀛樺懡涓満鏅級鈫� 涓嬭浇锛涚敓鎴愪腑 鈫� 淇濆瓨鏂囦欢锛堢鐢級 |
+| 3 | 鍐嶆涓嬭浇璧�**鍐呭瓨缂撳瓨** | 棣栨涓嬭浇鍚庢妸 Blob 瀛樿繘 `taskBlob`锛屽啀娆$偣鍑荤洿鎺ユ湰鍦板彟瀛橈紙鎻愮ず銆屽凡浠庢湰鍦扮紦瀛樹繚瀛樸�嶏級锛�**涓嶅啀璇锋眰鍚庣** |
+| 4 | 寮圭獥鏍囬闅忕姸鎬佸彉鍖� | 姝e湪鐢熸垚姹囨�诲ぇ琛� / **姹囨�诲ぇ琛ㄥ凡鐢熸垚** / 姹囨�诲ぇ琛ㄧ敓鎴愬け璐� |
+| 5 | 瀹屾垚鎬佷富鎸夐挳鏀逛负銆屽叧闂�� | 鐢熸垚涓粛鏄�屽悗鍙拌繍琛屻�嶏紝瀹屾垚鍚庝富鎸夐挳鏄�屽叧闂�嶏紙涓嬭浇鎸夐挳闄嶄负娆¤锛� |
+| 6 | 姣忔鏂颁换鍔¢噸缃姸鎬� | `taskDownloaded/taskFileName/taskFileSize/taskBlob` 鍦� `startSummaryTask` 閲屾竻闆� |
+
+## 浜屻�佹祴璇曠幆澧�
+
+- 鍓嶇锛歚npm run serve`锛�8080锛夛紝鏀瑰悗鐑紪璇� `Compiled successfully in 592ms`锛�10:00:24锛�
+- 鍚庣锛歋pring Boot 8090锛堜粖鏃ヨ繍琛屼腑锛夛紱鏁版嵁搴� MySQL 3308 / `traffic_audit`
+- 娴忚鍣細Codex 鍐呯疆娴忚鍣紙瑙嗗彛 1280脳720锛夛紝鐧诲綍 `admin/123456`
+- 鎶ヨ〃鏈燂細2026-08锛堟湀鎶ワ紝姹囨�诲ぇ琛ㄣ�婇亾璺繍杈撻噺姹囨�昏〃锛堟暣鏈級銆嬫暟鎹姸鎬�=鏁版嵁灏辩华锛�
+- 鐢熸垚鑰楁椂锛�**13.5 绉�**锛堟湭鍛戒腑缂撳瓨锛夛紝浜х墿 `鐢熸垚_閬撹矾杩愯緭閲忔眹鎬昏〃_2026-08.xlsx`锛�**1.15 MB**
+
+## 涓夈�佺敤渚嬭〃
+
+| # | 鐢ㄤ緥 | 杈撳叆/鎿嶄綔 | 棰勬湡 | 瀹為檯 | 缁撹 |
+| --- | --- | --- | --- | --- | --- |
+| T01 | 鐢熸垚涓脊绐楃姸鎬侊紙姝e悜锛� | 閫� 2026-08 鈫� 鐐广�屽鍑恒�� | 鏍囬銆屾鍦ㄧ敓鎴愭眹鎬诲ぇ琛ㄣ�嶏紱杩涘害閫掑锛涙寜閽�屼繚瀛樻枃浠�(绂佺敤)/閲嶆柊鐢熸垚(绂佺敤)/鍚庡彴杩愯銆� | 鏍囬姝g‘锛涜繘搴� 6%鈫�45%锛涙楠ゆ枃瀛椼�岃鍙栨瘝鐗堝伐浣滅翱銆嶁啋銆屽埛鏂版帓鍚嶉〉涓庤法椤靛悎鎴愰〉銆嶏紱鎸夐挳鐘舵�佷笌棰勬湡涓�鑷� | 閫氳繃 |
+| T02 | 瀹屾垚鍚庤嚜鍔ㄤ笅杞� + 鎻愮ず锛堟鍚戯級 | 绛夊緟浠诲姟缁撴潫 | 鏍囬鍙樸�屾眹鎬诲ぇ琛ㄥ凡鐢熸垚銆嶏紱鏄剧ず銆屽凡鑷姩涓嬭浇锛氭枃浠跺悕锛堝ぇ灏忥級銆嶏紱鎸夐挳鍙樸�屽啀娆′笅杞�/閲嶆柊鐢熸垚/鍏抽棴銆� | 杩涘害 100%銆併�屽畬鎴愩�嶃�佸凡鐢� 13.5 绉掞紱鎻愮ず銆屽凡鑷姩涓嬭浇锛氱敓鎴恄閬撹矾杩愯緭閲忔眹鎬昏〃_2026-08.xlsx 锛�1.15 MB锛夈�嶏紱鎸夐挳宸插彉鏇� | 閫氳繃 |
+| T03 | 鍐嶆涓嬭浇璧版湰鍦扮紦瀛橈紙姝e悜锛屾牳蹇冿級 | 鐐广�屽啀娆′笅杞姐�� | 鎻愮ず璧扮紦瀛樸�佷笖**涓嶅啀璇锋眰鍚庣** | 鎻愮ず銆屽凡浠庢湰鍦扮紦瀛樹繚瀛橈細鐢熸垚_閬撹矾杩愯緭閲忔眹鎬昏〃_2026-08.xlsx銆嶏紝鏈嚭鐜般�屾姤琛ㄥ鍑烘垚鍔熴�嶏紙璇ユ枃妗堝彧鍦ㄨ蛋鍚庣鎺ュ彛鏃跺嚭鐜帮級鈫� 璧扮殑鏄紦瀛樺垎鏀� | 閫氳繃 |
+| T04 | 鍏抽棴鎸夐挳锛堟鍚戯級 | 鐐广�屽叧闂�� | 寮圭獥娑堝け銆佸垪琛ㄩ〉鍙户缁搷浣� | 寮圭獥瀹瑰櫒浠庡彲璁块棶鎬ф爲涓Щ闄わ紝鍒楄〃姝e父 | 閫氳繃 |
+| T05 | 鎺у埗鍙版棤鎶ラ敊锛堝洖褰掞級 | 璇诲彇 dev logs锛坋rror/warn锛� | 鏃犳柊澧為敊璇� | 0 鏉� | 閫氳繃 |
+| T06 | 鍏跺畠鎶ヨ〃瀵煎嚭璺緞鏈彈褰卞搷锛堝洖褰掞紝闈欐�侊級 | 鈥斺�� | 鍗曞紶/鎵归噺瀵煎嚭浠嶈蛋鍘� `downloadBlob` | 鏈鍙敼姹囨�诲ぇ琛ㄥ紓姝ヤ换鍔″垎鏀紝`exportChecked` 涓叾瀹冨垎鏀湭鍔� | 閫氳繃锛堥潤鎬侊級 |
+
+## 鍥涖�佸彂鐜扮殑闂涓庡缃�
+
+| # | 闂 | 澶勭疆 |
+| --- | --- | --- |
+| P1 | 寮圭獥鏍囬涓庢寜閽枃妗堝拰鐪熷疄鐘舵�佷笉绗︼紙宸插畬鎴愪粛鍐欍�屾鍦ㄧ敓鎴愩�嶏紱宸茶嚜鍔ㄤ笅杞戒粛鍐欍�屼繚瀛樻枃浠躲�嶏級 | 宸蹭慨锛堟爣棰橀殢鐘舵�併�佹寜閽枃妗堥殢涓嬭浇鐘舵�侊級 |
+| P2 | 鍚屼竴浠芥枃浠惰閲嶅璇锋眰鍚庣锛�1.15 MB 脳 娆℃暟锛� | 宸蹭慨锛堝唴瀛� Blob 缂撳瓨锛岄噸澶嶄繚瀛� 0 璇锋眰锛� |
+| P3 | 楠岃瘉鏂规硶璁板綍锛欵lement UI 鏈堜唤閫夋嫨妗嗘槸 **readonly** 杈撳叆妗嗭紝鑷姩鍖栦笉鑳界敤 fill/type锛屽繀椤诲厛鐐瑰紑寮瑰眰鍐嶉�夋湀浠斤紱`setValue` 瀵硅鎺т欢鏃犳晥 | 浠呰褰曚负娴嬭瘯鏂规硶澶囨敞锛岄潪绯荤粺缂洪櫡 |
+
+## 浜斻�佺粨璁�
+
+- 寮圭獥鐜板湪鑳芥槑纭憡璇夌敤鎴枫�屽凡鑷姩涓嬭浇浜嗕粈涔堟枃浠躲�佸澶с�嶏紝鎸夐挳璇箟涓庤涓轰竴鑷达紙銆屽啀娆′笅杞姐��= 鍐嶅瓨涓�浠斤紝璧版湰鍦扮紦瀛橈級锛�
+- 閲嶅涓嬭浇涓嶅啀閲嶅璇锋眰鍚庣锛屼綋楠屼笌甯﹀閮芥敼鍠勶紱
+- 鐢熸垚涓�/宸插畬鎴�/澶辫触涓夌鐘舵�佸湪鏍囬銆佽繘搴︺�佹寜閽笂閮芥湁鍖哄垎锛�
+- 娴忚鍣ㄧ瀹炴祴 6 鏉$敤渚嬮�氳繃锛屾棤鎺у埗鍙版姤閿欍��
+
+娴嬭瘯浜猴細Codex锛圓I锛夈��娴嬭瘯鏃ユ湡锛�2026-09-22
diff --git "a/docs/\345\267\245\344\275\234\346\227\245\347\273\223/\345\267\245\344\275\234\346\227\245\347\273\223_2026-09-22.md" "b/docs/\345\267\245\344\275\234\346\227\245\347\273\223/\345\267\245\344\275\234\346\227\245\347\273\223_2026-09-22.md"
index f922a1b..bf5081c 100644
--- "a/docs/\345\267\245\344\275\234\346\227\245\347\273\223/\345\267\245\344\275\234\346\227\245\347\273\223_2026-09-22.md"
+++ "b/docs/\345\267\245\344\275\234\346\227\245\347\273\223/\345\267\245\344\275\234\346\227\245\347\273\223_2026-09-22.md"
@@ -24,9 +24,21 @@
 
 鐢ㄦ埛鍦ㄥ埆澶勭湅鍒�"姹囨��"鎸夐挳锛屽疄闄呮牳鏌ワ細鍓嶇 `DataView.vue` 鍏ㄦ枃鏃�"姹囨��/瀵煎嚭"锛坄ReportExport.vue` 鎵嶆湁锛夛紝鍚庣鍙湁 `/api/data/list`锛屽叏浠� + `traffic-audit-web/dist` + 閮ㄧ讲 jar + gitea 杩滅 `main` 鍧囨棤鐩稿叧浠g爜銆傚凡鍚戠敤鎴疯鏄庯紝鎸�"灏氭湭瀹炵幇銆佺敱鏈粨瀹炵幇"鎺ㄨ繘銆�
 
+### 4. 姹囨�诲ぇ琛ㄨ繘搴﹀脊绐椾紭鍖栵紙鐢ㄦ埛锛�"淇濆瓨"浼氬鑷村啀涓嬭浇涓�娆★級
+
+- **鏍瑰洜**锛氫换鍔″畬鎴愭椂浼氳嚜鍔ㄤ笅杞戒竴娆★紝浣嗗脊绐楀簳閮ㄤ粛鎸傜潃銆屼繚瀛樻枃浠躲�嶆寜閽紝鐐瑰畠浼氬啀娆¤姹傚悗绔嬁鍚屼竴浠芥枃浠跺苟绗簩娆′笅杞斤紱鍚屾椂鏍囬/鎸夐挳鏂囨涓嶉殢鐘舵�佸彉鍖栥��
+- **鏀瑰姩**锛坄traffic-audit-web/src/views/ReportExport.vue`锛夛細
+  1. 瀹屾垚鍚庢樉绀恒�屽凡鑷姩涓嬭浇锛�<鏂囦欢鍚�>锛�<澶у皬>锛夈��+ 鎻愮ず鍙偣銆屽啀娆′笅杞姐�嶏紙鏈湴缂撳瓨锛屼笉鍐嶈姹傛湇鍔″櫒锛夛紱
+  2. 鎸夐挳鏂囨闅忕姸鎬侊細鍐嶆涓嬭浇 / 涓嬭浇 / 淇濆瓨鏂囦欢锛堢敓鎴愪腑绂佺敤锛夛紱
+  3. 棣栨涓嬭浇鍚庢妸 Blob 瀛樺唴瀛橈紝閲嶅淇濆瓨 **0 璇锋眰**锛�
+  4. 寮圭獥鏍囬闅忕姸鎬侊細姝e湪鐢熸垚 / **宸茬敓鎴�** / 鐢熸垚澶辫触锛涘畬鎴愭�佷富鎸夐挳鏀逛负銆屽叧闂�嶏紱
+  5. 姣忔鏂颁换鍔¢噸缃� `taskDownloaded/taskFileName/taskFileSize/taskBlob`銆�
+- **娴忚鍣ㄥ疄娴�**锛坅dmin/123456锛�2026-08锛夛細鐢熸垚 13.5 绉掋�佷骇鐗� 1.15 MB锛涘畬鎴愬悗鏍囬銆屾眹鎬诲ぇ琛ㄥ凡鐢熸垚銆嶃�佹彁绀恒�屽凡鑷姩涓嬭浇锛氱敓鎴恄閬撹矾杩愯緭閲忔眹鎬昏〃_2026-08.xlsx 锛�1.15 MB锛夈�嶃�佺偣銆屽啀娆′笅杞姐�嶆彁绀恒�屽凡浠庢湰鍦扮紦瀛樹繚瀛樸�嶏紱鎺у埗鍙� 0 鎶ラ敊銆�
+
 ## 浜屻�佹祴璇曠粨鏋滄憳瑕�
 
 - 鎶ュ憡锛歚docs/鍔熻兘娴嬭瘯鎶ュ憡/鍔熻兘娴嬭瘯鎶ュ憡_鏁版嵁鏌ョ湅琛ラ綈缃戠害杞︿笌涓綋瀹㈣繍绫诲瀷_2026-09-22.md`
+- 鎶ュ憡锛歚docs/鍔熻兘娴嬭瘯鎶ュ憡/鍔熻兘娴嬭瘯鎶ュ憡_姹囨�诲ぇ琛ㄨ繘搴﹀脊绐椾紭鍖朹2026-09-22.md`锛�6 鏉$敤渚嬮�氳繃锛氱敓鎴愪腑鐘舵�� / 瀹屾垚鎻愮ず / 鍐嶆涓嬭浇璧扮紦瀛� / 鍏抽棴 / 鏃犳帶鍒跺彴鎶ラ敊 / 鍏跺畠瀵煎嚭鏈彈褰卞搷锛�
 - 鐜锛氬悗绔� `mvn spring-boot:run`锛�8090锛宍Started TrafficAuditApplication`锛夛紱鍓嶇 `npm run serve`锛�8080锛宍Compiled successfully in 4769ms`锛夛紱MySQL `localhost:3308/traffic_audit`锛涚櫥褰� admin/123456 鍙� JWT銆�
 - 缁撴灉锛�3 涓柊绫诲瀷姝e悜锛堝惈鏈熼棿/鍏抽敭瀛楃瓫閫夛級銆佽礋鍚戯紙鏈煡绫诲瀷銆佹棤鏁版嵁鏈熴�佹棤 token锛夊叏閮ㄩ�氳繃锛涘叆搴撴娊鏌ユ潯鏁颁笌搴撳唴涓�鑷达紙20 / 20 / 139锛夛紱鍘熸湁 15 绫诲洖褰掓甯搞��
 
diff --git a/traffic-audit-web/src/views/ReportExport.vue b/traffic-audit-web/src/views/ReportExport.vue
index 22e12cf..cdebf87 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><br>
+              娴忚鍣ㄦ病寮瑰嚭涓嬭浇鏃跺彲鐐广�屽啀娆′笅杞姐�嶁�斺�旂敤鏈湴缂撳瓨淇濆瓨锛屼笉浼氶噸鏂拌姹傛湇鍔″櫒銆�
+            </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" :disabled="!taskDone" @click="downloadTaskFile()">{{ taskDownloaded ? '鍐嶆涓嬭浇' : (taskInfo.fromCache ? '涓嬭浇' : '淇濆瓨鏂囦欢') }}</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,11 @@
       taskVisible: false,
       taskInfo: {},
       taskTimer: null,
+      // 杩涘害寮圭獥锛氬畬鎴愬悗浼氳嚜鍔ㄤ笅杞戒竴娆★紝杩欓噷璁板綍銆屽凡涓嬭浇銆嶄笌鏂囦欢淇℃伅锛堥噸澶嶇偣鍑昏蛋鏈湴缂撳瓨锛屼笉鍐嶈姹傚悗绔級
+      taskDownloaded: false,
+      taskFileName: '',
+      taskFileSize: 0,
+      taskBlob: null,
       taskKey: 'summaryWorkbook',
       modules: [
         {
@@ -320,6 +329,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 +545,10 @@
       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.taskBlob = null
       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 +561,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 +593,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 +606,26 @@
     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
+      // 宸茬粡涓嬭浇杩囷細鐩存帴鐢ㄥ唴瀛橀噷鐨� Blob 鍐嶅瓨涓�娆★紝涓嶅啀璇锋眰鍚庣锛堥伩鍏嶅悓涓�浠芥枃浠堕噸澶嶆媺鍙� 1MB+锛�
+      if (this.taskBlob) {
+        this.downloadBlob(this.taskBlob, name)
+        this.$message.success('宸蹭粠鏈湴缂撳瓨淇濆瓨锛�' + name)
+        return
+      }
       api.get('/report/exportTask/' + id + '/file', { responseType: 'blob', timeout: 120000 })
-        .then(res => { this.downloadBlob(res, name); this.$message.success('鎶ヨ〃瀵煎嚭鎴愬姛') })
+        .then(res => {
+          this.taskBlob = 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 +795,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