From 6e5ff559023efd2d24fdca2adcb7268d06420e46 Mon Sep 17 00:00:00 2001
From: zhou zhou <3272660260@qq.com>
Date: 星期二, 24 三月 2026 15:38:34 +0800
Subject: [PATCH] #打印+导出

---
 rsf-admin/src/page/components/MyExportButton.jsx |  166 ++++++++++++++++++++++++++++++-------------------------
 1 files changed, 91 insertions(+), 75 deletions(-)

diff --git a/rsf-admin/src/page/components/MyExportButton.jsx b/rsf-admin/src/page/components/MyExportButton.jsx
index 143bdc1..1e132f1 100644
--- a/rsf-admin/src/page/components/MyExportButton.jsx
+++ b/rsf-admin/src/page/components/MyExportButton.jsx
@@ -1,87 +1,103 @@
-import * as React from 'react';
-import { useCallback } from 'react';
-import DownloadIcon from '@mui/icons-material/GetApp';
+import * as React from "react";
+import DownloadIcon from "@mui/icons-material/GetApp";
 import {
-    Button, useDataProvider, useNotify, useListContext
-} from 'react-admin';
+  Button,
+  useDataProvider,
+  useNotify,
+  useListContext,
+  useUnselectAll,
+} from "react-admin";
+import { useListReportActionParams } from "./listReport/useListReportOutput";
+import {
+  downloadBlobFile,
+  resolveReportMeta,
+} from "./listReport/listReportUtils";
 
 const MyExportButton = (props) => {
-    const {
-        maxResults = 1000,
-        onClick,
-        label = 'ra.action.export',
-        icon = defaultIcon,
-        exporter: customExporter,
-        meta,
-        ...rest
-    } = props;
+  const {
+    maxResults = 1000,
+    onClick,
+    ids,
+    label = "ra.action.export",
+    icon = defaultIcon,
+    exporter: customExporter,
+    meta,
+    reportConfig,
+    onExport,
+    loading = false,
+    filename,
+    ...rest
+  } = props;
 
-    const {
-        filter,
-        filterValues,
-        resource,
-        sort,
-        total,
-    } = useListContext();
-
-    const dataProvider = useDataProvider();
-    const notify = useNotify();
-
-    const handleClick = useCallback(
-        event => {
-            dataProvider.export(resource, {
-                sort,
-                filter: filter
-                    ? { ...filterValues, ...filter }
-                    : filterValues,
-                pagination: { page: 1, perPage: maxResults },
-                meta,
-            }).then((res) => {
-                const url = window.URL.createObjectURL(new Blob([res.data], { type: res.headers['content-type'] }));
-                const link = document.createElement('a');
-                link.href = url;
-                link.setAttribute('download', `${resource}.xlsx`);
-                document.body.appendChild(link);
-                link.click();
-                link.remove();
-            }).catch(error => {
-                console.error(error);
-                notify('ra.notification.http_error', { type: 'error' });
-            });
-            if (typeof onClick === 'function') {
-                onClick(event);
-            }
-        },
-        [
-            dataProvider,
-            filter,
-            filterValues,
-            maxResults,
-            notify,
-            onClick,
-            resource,
-            sort,
+  const { filter, selectedIds, filterValues, resource, sort, total } = useListContext();
+  const { visibleColumns, params } = useListReportActionParams(reportConfig, { ids });
+  const unSelect = useUnselectAll(resource);
+  const dataProvider = useDataProvider();
+  const notify = useNotify();
+  const handleClick = async (event) => {
+    try {
+      const hasReportConfig = Boolean(reportConfig?.resource && Array.isArray(reportConfig?.columns));
+      if (hasReportConfig) {
+        const actionParams = {
+          ...params,
+          columns: visibleColumns,
+        };
+        if (typeof onExport === "function") {
+          await onExport(actionParams, event);
+        } else {
+          const resolvedResource = reportConfig.resource || params.resource;
+          const response = await dataProvider.export(resolvedResource, {
+            sort: actionParams.sort,
+            ids: actionParams.ids,
+            filter: actionParams.filter
+              ? { ...actionParams.filterValues, ...actionParams.filter }
+              : actionParams.filterValues,
+            pagination: { page: 1, perPage: maxResults },
             meta,
-        ]
-    );
+            columns: visibleColumns,
+            reportMeta: resolveReportMeta(reportConfig, actionParams),
+          });
+          downloadBlobFile(
+            response,
+            filename || reportConfig.exportFileName || `${resolvedResource}.xlsx`,
+          );
+        }
+      } else {
+        const response = await dataProvider.export(resource, {
+          sort,
+          ids: ids ?? selectedIds,
+          filter: filter ? { ...filterValues, ...filter } : filterValues,
+          pagination: { page: 1, perPage: maxResults },
+          meta,
+        });
+        downloadBlobFile(response, filename || `${resource}.xlsx`);
+      }
+      unSelect();
+      if (typeof onClick === "function") {
+        onClick(event);
+      }
+    } catch (error) {
+      console.error(error);
+      notify("ra.notification.http_error", { type: "error" });
+    }
+  };
 
-    return (
-        <Button
-            onClick={handleClick}
-            label={label}
-            disabled={total === 0}
-            {...sanitizeRestProps(rest)}
-        >
-            {icon}
-        </Button>
-    );
+  const disabled = total === 0 || loading || (reportConfig?.columns && visibleColumns.length === 0);
+
+  return (
+    <Button
+      onClick={handleClick}
+      label={label}
+      disabled={disabled}
+      {...sanitizeRestProps(rest)}
+    >
+      {icon}
+    </Button>
+  );
 };
 
 const defaultIcon = <DownloadIcon />;
 
-const sanitizeRestProps = ({
-    resource,
-    ...rest
-}) => rest;
+const sanitizeRestProps = ({ resource, ...rest }) => rest;
 
 export default MyExportButton;

--
Gitblit v1.9.1