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() {