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