feat(admin-web): 批量下载支持断点续传

- 下载前检查文件是否已存在
- 已存在的文件自动跳过
- 显示跳过数量和新下载数量

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
hailin 2026-02-06 00:22:04 -08:00
parent b2bace1687
commit cd1d16fc7f
1 changed files with 40 additions and 4 deletions

View File

@ -224,13 +224,27 @@ export default function ContractsPage() {
toast.info(`开始下载 ${total} 份合同...`); toast.info(`开始下载 ${total} 份合同...`);
// 第三步:逐个下载合同到用户选择的目录 // 第三步:逐个下载合同到用户选择的目录(支持断点续传)
let downloaded = 0; let downloaded = 0;
let skipped = 0;
for (const contract of contracts) { for (const contract of contracts) {
try { try {
// 生成文件名 // 生成文件名
const fileName = `${contract.contractNo}_${contract.userRealName || '未实名'}_${contract.treeCount}棵.pdf`; const fileName = `${contract.contractNo}_${contract.userRealName || '未实名'}_${contract.treeCount}棵.pdf`;
// 检查文件是否已存在(断点续传)
try {
await dirHandle.getFileHandle(fileName, { create: false });
// 文件已存在,跳过
skipped++;
downloaded++;
setDownloadedCount(downloaded);
setDownloadProgress(Math.round((downloaded / total) * 100));
continue;
} catch {
// 文件不存在,继续下载
}
// 下载 PDF // 下载 PDF
const downloadUrl = contractService.getDownloadUrl(contract.orderNo); const downloadUrl = contractService.getDownloadUrl(contract.orderNo);
const response = await fetch(downloadUrl); const response = await fetch(downloadUrl);
@ -255,7 +269,11 @@ export default function ContractsPage() {
} }
} }
toast.success(`下载完成!成功 ${downloaded}/${total}`); if (skipped > 0) {
toast.success(`下载完成!新下载 ${downloaded - skipped} 份,跳过已存在 ${skipped}`);
} else {
toast.success(`下载完成!成功 ${downloaded}/${total}`);
}
// 保存当前时间作为最后下载时间 // 保存当前时间作为最后下载时间
const now = new Date().toISOString(); const now = new Date().toISOString();
@ -327,11 +345,25 @@ export default function ContractsPage() {
toast.info(`开始下载 ${total} 份新增合同...`); toast.info(`开始下载 ${total} 份新增合同...`);
// 第三步:逐个下载合同 // 第三步:逐个下载合同(支持断点续传)
let downloaded = 0; let downloaded = 0;
let skipped = 0;
for (const contract of contracts) { for (const contract of contracts) {
try { try {
const fileName = `${contract.contractNo}_${contract.userRealName || '未实名'}_${contract.treeCount}棵.pdf`; const fileName = `${contract.contractNo}_${contract.userRealName || '未实名'}_${contract.treeCount}棵.pdf`;
// 检查文件是否已存在(断点续传)
try {
await dirHandle.getFileHandle(fileName, { create: false });
skipped++;
downloaded++;
setDownloadedCount(downloaded);
setDownloadProgress(Math.round((downloaded / total) * 100));
continue;
} catch {
// 文件不存在,继续下载
}
const downloadUrl = contractService.getDownloadUrl(contract.orderNo); const downloadUrl = contractService.getDownloadUrl(contract.orderNo);
const response = await fetch(downloadUrl); const response = await fetch(downloadUrl);
if (!response.ok) continue; if (!response.ok) continue;
@ -350,7 +382,11 @@ export default function ContractsPage() {
} }
} }
toast.success(`下载完成!成功 ${downloaded}/${total}`); if (skipped > 0) {
toast.success(`下载完成!新下载 ${downloaded - skipped} 份,跳过已存在 ${skipped}`);
} else {
toast.success(`下载完成!成功 ${downloaded}/${total}`);
}
// 更新最后下载时间 // 更新最后下载时间
const now = new Date().toISOString(); const now = new Date().toISOString();