feat(admin-web): 批量下载支持断点续传
- 下载前检查文件是否已存在 - 已存在的文件自动跳过 - 显示跳过数量和新下载数量 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
b2bace1687
commit
cd1d16fc7f
|
|
@ -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();
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue