From 85d7346394c549b431677d40d2bbc0a0c0bdccc3 Mon Sep 17 00:00:00 2001 From: LiuJiaNan <15703339975@163.com> Date: Tue, 30 Dec 2025 15:42:47 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96excel=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- .../Average/Ledger/List/index.js | 540 ++++++++++-------- .../Average/Average/HiddenList/index.js | 4 +- 3 files changed, 289 insertions(+), 257 deletions(-) diff --git a/package.json b/package.json index d2549e7..2e1aeac 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "react-to-print": "^3.2.0", - "zy-react-library": "^1.1.10" + "zy-react-library": "^1.1.12" }, "devDependencies": { "@antfu/eslint-config": "^5.4.1", diff --git a/src/pages/Container/BranchCompany/Average/Ledger/List/index.js b/src/pages/Container/BranchCompany/Average/Ledger/List/index.js index e47adf1..2d36a6e 100644 --- a/src/pages/Container/BranchCompany/Average/Ledger/List/index.js +++ b/src/pages/Container/BranchCompany/Average/Ledger/List/index.js @@ -1,8 +1,8 @@ import { Permission } from "@cqsjjb/jjb-common-decorator/permission"; import { Connect } from "@cqsjjb/jjb-dva-runtime"; -import { Button, Form, message, Modal, Space, Spin } from "antd"; +import { Button, Checkbox, Form, message, Modal, Space } from "antd"; import dayjs from "dayjs"; -import { useEffect, useRef, useState } from "react"; +import { useEffect, useMemo, useRef, useState } from "react"; import { useReactToPrint } from "react-to-print"; import FormBuilder from "zy-react-library/components/FormBuilder"; import AddIcon from "zy-react-library/components/Icon/AddIcon"; @@ -18,7 +18,7 @@ import { FORM_ITEM_RENDER_ENUM } from "zy-react-library/enum/formItemRender"; import { HIDDEN_RECTIFICATION_TYPE_ENUM, HIDDEN_SOURCE_ENUM, HIDDEN_STATE_ENUM } from "zy-react-library/enum/hidden/gwj"; import useDownloadBlob from "zy-react-library/hooks/useDownloadBlob"; import useTable from "zy-react-library/hooks/useTable"; -import { getLabelName } from "zy-react-library/utils"; +import { getLabelName, getUnmatchedItems } from "zy-react-library/utils"; import { IS_RELATED_ENUM } from "~/enumerate/constant"; import { NS_LEDGER } from "~/enumerate/namespace"; import "./index.less"; @@ -28,7 +28,6 @@ function List(props) { const [selectedRowKeys, setSelectedRowKeys] = useState([]); const [exportByColumnModalOpen, setExportByColumnModalOpen] = useState(false); const [printModalOpen, setPrintModalOpen] = useState(false); - const { loading: downloadBlobLoading, downloadBlob } = useDownloadBlob(); const { tableProps, getData } = useTable(props["ledgerList"], { form, transform: formData => ({ @@ -51,254 +50,210 @@ function List(props) { }); }; - const onExportExcel = async () => { - const hiddenFindTime = form.getFieldValue("hiddenFindTime"); - if (!hiddenFindTime) { - message.error("请选择隐患发现时间"); - return; - } - if (hiddenFindTime.filter(Boolean).length === 0) { - message.error("请选择隐患发现时间"); - return; - } - Modal.confirm({ - title: "导出确认", - content: "确定要导出excel吗?", - onOk: async () => { - await downloadBlob("/hidden/hidden/exportHidden", { - params: { hiddenFindTime: hiddenFindTime[0], hiddenFindTimeLe: hiddenFindTime[1] }, - }); - message.success("导出成功"); - }, - }); - }; - return ( - - }, - { - name: "hiddenType", - label: "隐患类型", - render: , - }, - { - name: "hiddenLevel", - label: "隐患级别", - render: ( - - ), - }, - { name: "creatorName", label: "隐患发现人" }, - { - name: "state", - label: "隐患状态", - render: FORM_ITEM_RENDER_ENUM.SELECT, - items: HIDDEN_STATE_ENUM.filter(item => !["98", "102"].includes(item.bianma)), - }, - { name: "confirmUserName", label: "确认人" }, - { name: "rectificationUserName", label: "整改人" }, - { name: "rectificationDeptId", label: "整改部门", render: }, - { name: "checkUserName", label: "验收人" }, - { - name: "isRelated", - label: "是否相关方", - render: FORM_ITEM_RENDER_ENUM.SELECT, - items: IS_RELATED_ENUM, - }, - { - name: "isAi", - label: "是否使用AI", - render: FORM_ITEM_RENDER_ENUM.SELECT, - items: [{ bianma: "1", name: "是" }, { bianma: "0", name: "否" }], - }, - ]} - form={form} - onFinish={getData} - /> - { - setSelectedRowKeys(selectedRowKeys); - }, - }} - toolBarRender={() => ( - <> - {props.permission("fgs-tz-add") && ( - - )} - {props.permission("fgs-tz-dy") && ( - - )} - {props.permission("fgs-tz-dc") && ( - - )} - {props.permission("fgs-tz-aldc") && ( - - )} - - )} - columns={[ - { - title: "隐患来源", - dataIndex: "source", - render: (_, record) => getLabelName({ list: HIDDEN_SOURCE_ENUM, status: record.source }), - }, - { title: "隐患描述", dataIndex: "hiddenDesc" }, - { title: "隐患级别", dataIndex: "hiddenLevelName", width: 100 }, - { title: "隐患类型", dataIndex: "hiddenTypeName" }, - { title: "隐患发现部门", dataIndex: "hiddenFindDeptName", width: 180 }, - { title: "隐患发现人", dataIndex: "createName", width: 130 }, - { - title: "隐患发现时间", - dataIndex: "hiddenFindTime", - width: 180, - render: (_, record) => record.hiddenFindTime ? dayjs(record.hiddenFindTime).format("YYYY-MM-DD HH:mm:ss") : "", - }, - { - title: "整改类型", - dataIndex: "rectificationType", - width: 100, - render: (_, record) => getLabelName({ - list: HIDDEN_RECTIFICATION_TYPE_ENUM, - status: record.rectificationType, - }), - }, - { title: "确认人", dataIndex: "confirmUserName", width: 100 }, - { title: "整改人", dataIndex: "rectifyUserName", width: 100 }, - { - title: "整改时间", - dataIndex: "rectificationTime", - width: 180, - render: (_, record) => record.rectificationTime ? dayjs(record.rectificationTime).format("YYYY-MM-DD HH:mm:ss") : "", - }, - { title: "验收人", dataIndex: "hiddenYUserName", width: 100 }, - { - title: "是否相关方", - dataIndex: "isRelated", - width: 150, - render: (_, record) => getLabelName({ - list: IS_RELATED_ENUM, - status: record.isRelated, - }), - }, - { - title: "隐患状态", - dataIndex: "state", - render: (_, record) => getLabelName({ list: HIDDEN_STATE_ENUM, status: record.state }), - }, - { - title: "操作", - width: 220, - fixed: "right", - render: (_, record) => ( - - - { - (props.permission("fgs-tz-bj") && record.state === 201) && ( - - ) + }, + { + name: "hiddenType", + label: "隐患类型", + render: , + }, + { + name: "hiddenLevel", + label: "隐患级别", + render: ( + + ), + }, + { name: "creatorName", label: "隐患发现人" }, + { + name: "state", + label: "隐患状态", + render: FORM_ITEM_RENDER_ENUM.SELECT, + items: getUnmatchedItems({ list: HIDDEN_STATE_ENUM, value: ["98", "102"] }), + }, + { name: "confirmUserName", label: "确认人" }, + { name: "rectificationUserName", label: "整改人" }, + { name: "rectificationDeptId", label: "整改部门", render: }, + { name: "checkUserName", label: "验收人" }, + { + name: "isRelated", + label: "是否相关方", + render: FORM_ITEM_RENDER_ENUM.SELECT, + items: IS_RELATED_ENUM, + }, + { + name: "isAi", + label: "是否使用AI", + render: FORM_ITEM_RENDER_ENUM.SELECT, + items: [{ bianma: "1", name: "是" }, { bianma: "0", name: "否" }], + }, + ]} + form={form} + onFinish={getData} + /> +
{ + setSelectedRowKeys(selectedRowKeys); + }, + }} + toolBarRender={() => ( + <> + {props.permission("fgs-tz-add") && ( + + )} + {props.permission("fgs-tz-dy") && ( + - ) - } - {props.permission("fgs-tz-gcjl") && ( + setPrintModalOpen(true); + }} + > + 打印 + + )} + {props.permission("fgs-tz-aldc") && ( + + )} + + )} + columns={[ + { + title: "隐患来源", + dataIndex: "source", + render: (_, record) => getLabelName({ list: HIDDEN_SOURCE_ENUM, status: record.source }), + }, + { title: "隐患描述", dataIndex: "hiddenDesc" }, + { title: "隐患级别", dataIndex: "hiddenLevelName", width: 100 }, + { title: "隐患类型", dataIndex: "hiddenTypeName" }, + { title: "隐患发现部门", dataIndex: "hiddenFindDeptName", width: 180 }, + { title: "隐患发现人", dataIndex: "createName", width: 130 }, + { + title: "隐患发现时间", + dataIndex: "hiddenFindTime", + width: 180, + render: (_, record) => record.hiddenFindTime ? dayjs(record.hiddenFindTime).format("YYYY-MM-DD HH:mm:ss") : "", + }, + { + title: "整改类型", + dataIndex: "rectificationType", + width: 100, + render: (_, record) => getLabelName({ + list: HIDDEN_RECTIFICATION_TYPE_ENUM, + status: record.rectificationType, + }), + }, + { title: "确认人", dataIndex: "confirmUserName", width: 100 }, + { title: "整改人", dataIndex: "rectifyUserName", width: 100 }, + { + title: "整改时间", + dataIndex: "rectificationTime", + width: 180, + render: (_, record) => record.rectificationTime ? dayjs(record.rectificationTime).format("YYYY-MM-DD HH:mm:ss") : "", + }, + { title: "验收人", dataIndex: "hiddenYUserName", width: 100 }, + { + title: "是否相关方", + dataIndex: "isRelated", + width: 150, + render: (_, record) => getLabelName({ + list: IS_RELATED_ENUM, + status: record.isRelated, + }), + }, + { + title: "隐患状态", + dataIndex: "state", + render: (_, record) => getLabelName({ list: HIDDEN_STATE_ENUM, status: record.state }), + }, + { + title: "操作", + width: 220, + fixed: "right", + render: (_, record) => ( + + + { + (props.permission("fgs-tz-bj") && record.state === 201) && ( - )} - - ), - }, - ]} - {...tableProps} - /> - + ) + } + { + (props.permission("fgs-tz-sc") && record.state === 100) && ( + + ) + } + {props.permission("fgs-tz-gcjl") && ( + + )} + + ), + }, + ]} + {...tableProps} + /> {exportByColumnModalOpen && ( setExportByColumnModalOpen(false)} /> )} {printModalOpen && ( setPrintModalOpen(false)} /> )} @@ -308,32 +263,89 @@ function List(props) { const ExportByColumnModalComponent = (props) => { const [form] = Form.useForm(); + const exportFields = Form.useWatch("exportFields", form); const { loading, downloadBlob } = useDownloadBlob(); const [items, setItems] = useState([]); + + const indeterminate = useMemo( + () => { + if (!exportFields) + return false; + return exportFields.length > 0 && exportFields.length < items.length; + }, + [exportFields], + ); + const getExportColumn = async () => { const { data } = await props["hiddenExportColumn"](); setItems(data.map(item => ({ bianma: item, name: item }))); + + const defaultExportFields = data.filter(item => !item.includes("图片")); + form.setFieldsValue({ exportFields: [...defaultExportFields] }); }; + useEffect(() => { getExportColumn(); }, []); + const onSubmit = async (values) => { - Modal.confirm({ - title: "导出确认", - content: "确定要导出excel吗?", - onOk: async () => { - await downloadBlob("/hidden/hidden/exportHidden", { - params: { hiddenFindTime: props.hiddenFindTime[0], hiddenFindTimeLe: props.hiddenFindTime[1], ...values }, - }); - message.success("导出成功"); - props.onCancel(); - }, - }); + const hiddenFindTime = props.hiddenFindTime; + const selectedRowKeys = props.selectedRowKeys; + + // 检查导出字段是否包含"图片" + const hasPictureField = values.exportFields && values.exportFields.some(field => field.includes("图片")); + + if (hasPictureField) { + // 包含图片字段的验证逻辑 + if (!selectedRowKeys || selectedRowKeys.length === 0) { + message.error("请选择要导出的数据"); + return; + } + + if (selectedRowKeys.length > 10) { + message.error("选择的数据超过10条,请重新选择"); + return; + } + + // 执行导出 + Modal.confirm({ + title: "导出确认", + content: "确定要导出excel吗?", + onOk: async () => { + await downloadBlob("/hidden/hidden/exportHidden", { + params: { ids: props.selectedRowKeys.join(","), ...values }, + }); + message.success("导出成功"); + props.onCancel(); + }, + }); + } + else { + // 不包含图片字段的验证逻辑 + if (!hiddenFindTime || hiddenFindTime.length === 0) { + message.error("请选择隐患发现时间"); + return; + } + + // 执行导出 + Modal.confirm({ + title: "导出确认", + content: "确定要导出excel吗?", + onOk: async () => { + await downloadBlob("/hidden/hidden/exportHidden", { + params: { hiddenFindTime: hiddenFindTime[0], hiddenFindTimeLe: hiddenFindTime[1], ...values }, + }); + message.success("导出成功"); + props.onCancel(); + }, + }); + } }; + return ( { loading={loading} form={form} span={24} - labelCol={{ span: 8 }} + labelCol={{ span: 6 }} showActionButtons={false} onFinish={onSubmit} options={[ + { + key: "indeterminate", + label: "", + render: ( + { + const checked = e.target.checked; + if (checked) { + form.setFieldsValue({ exportFields: items.map(item => item.bianma) }); + } + else { + form.setFieldsValue({ exportFields: [] }); + } + }} + checked={items.length === (exportFields || []).length} + > + 全选(为保障导出效率,导出带图片的excel最多10条) + + ), + required: false, + }, { name: "exportFields", label: "导出内容", - render: FORM_ITEM_RENDER_ENUM.SELECT, + render: FORM_ITEM_RENDER_ENUM.CHECKBOX, items, - componentProps: { - mode: "multiple", - }, + checkboxCol: 6, }, ]} /> @@ -384,7 +416,7 @@ const PrintModalComponent = (props) => { const getData = async () => { const { data } = await props["hiddenPrintList"]({ - ids: props.data.join(","), + ids: props.selectedRowKeys.join(","), }); setList(data); }; diff --git a/src/pages/Container/Supervision/Average/Average/HiddenList/index.js b/src/pages/Container/Supervision/Average/Average/HiddenList/index.js index 3ee517c..2aa91fe 100644 --- a/src/pages/Container/Supervision/Average/Average/HiddenList/index.js +++ b/src/pages/Container/Supervision/Average/Average/HiddenList/index.js @@ -17,7 +17,7 @@ import { HIDDEN_RECTIFICATION_TYPE_ENUM, HIDDEN_SOURCE_ENUM, HIDDEN_STATE_ENUM } import useDownloadBlob from "zy-react-library/hooks/useDownloadBlob"; import useGetUrlQuery from "zy-react-library/hooks/useGetUrlQuery"; import useTable from "zy-react-library/hooks/useTable"; -import { getLabelName } from "zy-react-library/utils"; +import { getLabelName, getUnmatchedItems } from "zy-react-library/utils"; import { IS_RELATED_ENUM } from "~/enumerate/constant"; import { NS_AVERAGE } from "~/enumerate/namespace"; import "../../../../BranchCompany/Average/Ledger/List/index.less"; @@ -86,7 +86,7 @@ function HiddenList(props) { name: "state", label: "隐患状态", render: FORM_ITEM_RENDER_ENUM.SELECT, - items: HIDDEN_STATE_ENUM.filter(item => !["98", "102"].includes(item.bianma)), + items: getUnmatchedItems({ list: HIDDEN_STATE_ENUM, value: ["98", "102"] }), }, { name: "confirmUserName", label: "确认人" }, { name: "rectificationUserName", label: "整改人" },