feat: 批量下载失败-重新下载

This commit is contained in:
rd
2025-07-21 15:42:35 +08:00
parent e6798bf313
commit 4387037b2d
2 changed files with 50 additions and 15 deletions

View File

@ -11,7 +11,7 @@ import { useTableSelectionWithPagination } from '@/hooks/useTableSelectionWithPa
import { downloadByUrl } from '@/utils/tools';
import DeleteTaskModal from './delete-task-modal.vue';
import icon1 from '@/assets/img/media-account/icon-delete.png';
import { showExportNotification } from '@/utils/arcoD';
import { showExportNotification, showFailExportNotification } from '@/utils/arcoD';
export default {
setup(props, { emit, expose }) {
@ -102,12 +102,13 @@ export default {
}
};
const clearQueryTaskTimer = () => {
if (queryTaskTimer) {
clearInterval(queryTaskTimer);
queryTaskTimer = null;
// 批量下载
const handleBatchDownload = debounce(async () => {
const { code, data } = await postBatchDownload({ ids: selectedRowKeys.value });
if (code === 200) {
startBatchDownload(data.id);
}
};
}, 500);
const startBatchDownload = (id) => {
const randomId = genRandomId();
showExportNotification(
@ -122,17 +123,10 @@ export default {
randomId,
});
// getSyncTaskStatus(randomId);
if (!queryTaskTimer) {
queryTaskTimer = setInterval(() => getSyncTaskStatus(), 3000);
}
};
const handleBatchDownload = debounce(async () => {
const { code, data } = await postBatchDownload({ ids: selectedRowKeys.value });
if (code === 200) {
startBatchDownload(data.id);
}
}, 500);
const getSyncTaskStatus = async () => {
const { code, data } = await batchQueryTaskStatus({ ids: downloadTaskIds.value.map((v) => v.id) });
if (code === 200) {
@ -149,8 +143,17 @@ export default {
AMessage.success('批量下载已完成,正在下载文件...');
downloadByUrl(file);
} else if (status === 2) {
AMessage.error('批量下载失败,请重新尝试下载');
const onReDownload = () => {
startBatchDownload(id);
};
showFailExportNotification(
`${selectedRows.value[0]?.name}”等${selectedRows.value.length}个文件下载失败`,
{ onReDownload },
);
}
// 结束的任务过滤掉
downloadTaskIds.value = downloadTaskIds.value.filter((v) => v.id !== id);
}
});
@ -182,6 +185,13 @@ export default {
selectedRowKeys.value = [];
getData();
};
const clearQueryTaskTimer = () => {
if (queryTaskTimer) {
clearInterval(queryTaskTimer);
queryTaskTimer = null;
}
};
const unloadComp = () => {
clearQueryTaskTimer();
};

View File

@ -5,6 +5,7 @@ import { IconLoading } from '@arco-design/web-vue/es/icon';
import icon1 from '@/assets/img/media-account/icon-warn-1.png';
import icon2 from '@/assets/img/media-account/icon-success.png';
import icon3 from "@/assets/img/media-account/icon-warn.png"
interface RenderNotificationData {
total_number: number;
@ -13,7 +14,9 @@ interface RenderNotificationData {
file?: string;
}
export function showExportNotification(label: string, { id = '', duration = 3000}) {
// 下载通知框
export function showExportNotification(label: string, others: { id?: string, duration?: number }) {
const { id = '', duration = 3000 } = others ?? {}
Notification.warning({
id,
showIcon: false,
@ -29,6 +32,28 @@ export function showExportNotification(label: string, { id = '', duration = 300
});
}
// 下载失败框
export function showFailExportNotification(label: string, others: { id?: string, duration?: number, onReDownload?: Function }) {
const { id = '', duration = 0, onReDownload } = others ?? {}
Notification.warning({
id,
showIcon: false,
closable: true,
content: () => (
<div class="flex items-center justify-between pr-16px">
<div class="flex items-center mr-10px">
<img src={icon3} width={16} height={16} class=" mr-8px" />
<p class="text-14px lh-22px font-400 color-#211F24 ">{label}</p>
</div>
<p class="text-14px lh-22px font-400 color-#6D4CFE cursor-pointer" onClick={() => onReDownload?.()}></p>
</div>
),
duration,
class: 'px-16px py-9px w-500px rounded-2px bg-#FFE9E7',
});
}
export const showImportResultNotification = (data: RenderNotificationData) => {
const { total_number, success_number, fail_number, file } = data;
const hasError = fail_number > 0;