From 8b7872d20506b152d91b9ccfbf67665acb213c2c Mon Sep 17 00:00:00 2001 From: hailin Date: Thu, 5 Feb 2026 23:59:04 -0800 Subject: [PATCH] =?UTF-8?q?fix(admin-web):=20=E6=89=B9=E9=87=8F=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD=E5=AE=8C=E6=88=90=E5=90=8E=E7=9B=B4=E6=8E=A5=E8=A7=A6?= =?UTF-8?q?=E5=8F=91=E6=B5=8F=E8=A7=88=E5=99=A8=E5=8F=A6=E5=AD=98=E4=B8=BA?= =?UTF-8?q?=E5=AF=B9=E8=AF=9D=E6=A1=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 创建任务后自动轮询等待完成 - 完成后使用 触发浏览器下载对话框 - 按钮显示打包进度 - 打包期间禁用按钮防止重复点击 Co-Authored-By: Claude Opus 4.5 --- .../src/app/(dashboard)/contracts/page.tsx | 104 +++++++++++++++--- 1 file changed, 86 insertions(+), 18 deletions(-) diff --git a/frontend/admin-web/src/app/(dashboard)/contracts/page.tsx b/frontend/admin-web/src/app/(dashboard)/contracts/page.tsx index 3ee42a9d..8b6071ab 100644 --- a/frontend/admin-web/src/app/(dashboard)/contracts/page.tsx +++ b/frontend/admin-web/src/app/(dashboard)/contracts/page.tsx @@ -139,9 +139,42 @@ export default function ContractsPage() { window.open(downloadUrl, '_blank'); }; - // 批量下载(创建下载任务) + // 批量下载状态 + const [batchDownloading, setBatchDownloading] = useState(false); + const [batchProgress, setBatchProgress] = useState(0); + + // 轮询任务状态直到完成 + const pollTaskUntilComplete = async (taskNo: string): Promise => { + const maxAttempts = 120; // 最多轮询2分钟 + for (let i = 0; i < maxAttempts; i++) { + try { + const status = await contractService.getBatchDownloadStatus(taskNo); + setBatchProgress(status.progress); + + if (status.status === 'COMPLETED' && status.resultFileUrl) { + return status.resultFileUrl; + } else if (status.status === 'FAILED') { + throw new Error('任务处理失败'); + } + + // 等待1秒后继续轮询 + await new Promise(resolve => setTimeout(resolve, 1000)); + } catch (error) { + console.error('查询任务状态失败:', error); + throw error; + } + } + throw new Error('任务处理超时'); + }; + + // 批量下载(创建下载任务并等待完成后自动下载) const handleBatchDownload = async () => { + setBatchDownloading(true); + setBatchProgress(0); + try { + toast.info('正在准备批量下载,请稍候...'); + const result = await contractService.createBatchDownload({ filters: { signedAfter: filters.signedAfter || undefined, @@ -151,15 +184,30 @@ export default function ContractsPage() { }, }); - toast.success(`批量下载任务已创建,任务号: ${result.taskNo}`); + // 轮询等待任务完成 + const downloadUrl = await pollTaskUntilComplete(result.taskNo); - // 保存当前时间作为最后下载时间 - const now = new Date().toISOString(); - localStorage.setItem('contract_last_download_time', now); - setLastDownloadTime(now); + if (downloadUrl) { + // 创建隐藏的 a 标签触发浏览器下载(会弹出另存为对话框) + const link = document.createElement('a'); + link.href = downloadUrl; + link.download = ''; // 设置 download 属性触发下载 + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + toast.success('请选择保存位置'); + + // 保存当前时间作为最后下载时间 + const now = new Date().toISOString(); + localStorage.setItem('contract_last_download_time', now); + setLastDownloadTime(now); + } } catch (error) { - console.error('创建批量下载任务失败:', error); - toast.error('创建批量下载任务失败'); + console.error('批量下载失败:', error); + toast.error('批量下载失败,请重试'); + } finally { + setBatchDownloading(false); + setBatchProgress(0); } }; @@ -170,7 +218,12 @@ export default function ContractsPage() { return; } + setBatchDownloading(true); + setBatchProgress(0); + try { + toast.info('正在准备增量下载,请稍候...'); + const result = await contractService.createBatchDownload({ filters: { signedAfter: lastDownloadTime, @@ -179,15 +232,30 @@ export default function ContractsPage() { }, }); - toast.success(`增量下载任务已创建,任务号: ${result.taskNo}`); + // 轮询等待任务完成 + const downloadUrl = await pollTaskUntilComplete(result.taskNo); - // 更新最后下载时间 - const now = new Date().toISOString(); - localStorage.setItem('contract_last_download_time', now); - setLastDownloadTime(now); + if (downloadUrl) { + // 创建隐藏的 a 标签触发浏览器下载(会弹出另存为对话框) + const link = document.createElement('a'); + link.href = downloadUrl; + link.download = ''; // 设置 download 属性触发下载 + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + toast.success('请选择保存位置'); + + // 更新最后下载时间 + const now = new Date().toISOString(); + localStorage.setItem('contract_last_download_time', now); + setLastDownloadTime(now); + } } catch (error) { - console.error('创建增量下载任务失败:', error); - toast.error('创建增量下载任务失败'); + console.error('增量下载失败:', error); + toast.error('增量下载失败,请重试'); + } finally { + setBatchDownloading(false); + setBatchProgress(0); } }; @@ -295,11 +363,11 @@ export default function ContractsPage() {
- {lastDownloadTime && ( - )}