From 2f3756eab8db19be2e0fa06d93b3f908a74b13b9 Mon Sep 17 00:00:00 2001 From: wuzilong <704541015@qq.com> Date: Wed, 23 Sep 2026 12:47:14 +0800 Subject: [PATCH] feat(web-admin): add archive data-and-attachments ZIP export menu. Extend ListExportDropdown with additional items and wire archive_zip on the plan-archive page. Co-authored-by: Cursor --- .../business/list-export-dropdown/index.vue | 47 ++++++++++++++++--- web-admin/src/views/pl/plan-archive/index.vue | 16 +++++++ 2 files changed, 56 insertions(+), 7 deletions(-) diff --git a/web-admin/src/components/business/list-export-dropdown/index.vue b/web-admin/src/components/business/list-export-dropdown/index.vue index 90cb031b5..6fa28880e 100644 --- a/web-admin/src/components/business/list-export-dropdown/index.vue +++ b/web-admin/src/components/business/list-export-dropdown/index.vue @@ -16,6 +16,14 @@ {{ selectedCount ? `导出已选(${selectedCount})` : '导出已选' }} + + {{ item.label }} + @@ -50,6 +58,14 @@ columns?: string[] } + export type ListExportAdditionalMenuItem = { + command: string + label: string + withIds?: boolean + disabled?: boolean + payloadExtra?: Record + } + const props = withDefaults( defineProps<{ exportFn: (payload: ListExportPayload) => Promise @@ -59,13 +75,15 @@ visibleColumns?: string[] filename?: string disabled?: boolean + additionalMenuItems?: ListExportAdditionalMenuItem[] }>(), { selectedIds: () => [], hasSelection: false, visibleColumns: undefined, filename: '导出.xlsx', - disabled: false + disabled: false, + additionalMenuItems: () => [] } ) @@ -73,8 +91,14 @@ const selectedCount = computed(() => props.selectedIds?.length || 0) - function buildPayload(withIds: boolean): ListExportPayload { - const payload: ListExportPayload = { ...props.getFilterParams() } + function buildPayload( + withIds: boolean, + payloadExtra?: Record + ): ListExportPayload { + const payload: ListExportPayload = { + ...props.getFilterParams(), + ...(payloadExtra || {}) + } if (props.visibleColumns?.length) { payload.columns = [...props.visibleColumns] } @@ -84,12 +108,12 @@ return payload } - async function runExport(withIds: boolean) { + async function runExport(withIds: boolean, payloadExtra?: Record) { if (exporting.value || props.disabled) return if (withIds && !(props.selectedIds?.length > 0)) return exporting.value = true try { - const res = await props.exportFn(buildPayload(withIds)) + const res = await props.exportFn(buildPayload(withIds, payloadExtra)) const { blob, filenameHeader } = pickBlobFromExportResponse(res) const name = filenameFromContentDisposition(filenameHeader, props.filename) triggerBlobDownload(blob, name) @@ -107,8 +131,17 @@ } function handleCommand(cmd: string) { - if (cmd === 'filtered') void runExport(false) - if (cmd === 'selected') void runExport(true) + if (cmd === 'filtered') { + void runExport(false) + return + } + if (cmd === 'selected') { + void runExport(true) + return + } + const extra = props.additionalMenuItems?.find((item) => item.command === cmd) + if (!extra) return + void runExport(!!extra.withIds, extra.payloadExtra) } diff --git a/web-admin/src/views/pl/plan-archive/index.vue b/web-admin/src/views/pl/plan-archive/index.vue index 9bc0e4955..8f156d298 100644 --- a/web-admin/src/views/pl/plan-archive/index.vue +++ b/web-admin/src/views/pl/plan-archive/index.vue @@ -40,6 +40,7 @@ :get-filter-params="getPlanArchiveExportFilterParams" :has-selection="true" :selected-ids="selectedRows.map((r) => r.id)" + :additional-menu-items="archiveZipMenuItems" filename="计划归档.xlsx" /> @@ -1088,6 +1089,21 @@ function getPlanArchiveExportFilterParams() { return { exportFormat: 'archive', ...buildListQueryParams() } } +const archiveZipMenuItems = [ + { + command: 'filtered-zip', + label: '导出筛选结果(数据及附件 ZIP)', + withIds: false, + payloadExtra: { exportFormat: 'archive_zip' } + }, + { + command: 'selected-zip', + label: '导出已选(数据及附件 ZIP)', + withIds: true, + payloadExtra: { exportFormat: 'archive_zip' } + } +] + const viewingPlan = ref(null) function syncViewingPlanFromList() {