import { useState, useEffect, useRef } from "react"; import PageLayout from "@cqsjjb/jjb-react-admin-component/PageLayout"; import { Flex, Button, Tabs, Input, Tag, Progress, Typography, message, } from "antd"; import { ArrowLeftOutlined } from "@ant-design/icons"; import WebOfficeSDK from "~/web-office-sdk-solution-v2.0.7/web-office-sdk-solution-v2.0.7.es.js"; import { createPortal } from "react-dom"; import { tools } from "@cqsjjb/jjb-common-lib"; import { Connect } from "@cqsjjb/jjb-dva-runtime"; import { NS_SAFETY_EVAL_BUSINESS } from "~/enumerate/namespace"; import "./index.less"; const { router } = tools; const App = (props) => { const { onCancel, safetyEvalBusiness, readOnly } = props; const { createDocLoading } = safetyEvalBusiness; const [expandedMap, setExpandedMap] = useState({}); const [fileId, setFileId] = useState(props.fileId); const [templateMap, setTemplateMap] = useState([]); const sdkRef = useRef(null); useEffect(() => { props.fetchWpsDocTemplate().then((res) => { if (res?.data) { const list = Object.entries(res.data).map(([name, url]) => ({ name, url, })); setTemplateMap(list); } }); }, []); const handleSave = async () => { if (!sdkRef.current) { message.warning("文档尚未加载完成"); return; } await sdkRef.current.save(); message.success("保存成功"); }; const handleDownload = async () => { if (!sdkRef.current) { message.warning("文档尚未加载完成"); return; } try { // 先保存最新内容 await sdkRef.current.save(); // 调用后端下载接口获取下载地址 const res = await props.downloadWpsDoc({ fileId }); const url = res?.data?.url || res?.url; if (!url) throw new Error("下载地址获取失败"); // 跨域场景下 a.download 无效,通过 fetch 转 blob 再下载 const blobRes = await fetch(url); if (!blobRes.ok) throw new Error("文件下载失败"); const blob = await blobRes.blob(); const blobUrl = URL.createObjectURL(blob); const a = document.createElement("a"); a.href = blobUrl; a.download = `安全评价报告_${fileId}.docx`; a.click(); URL.revokeObjectURL(blobUrl); message.success("下载成功"); } catch { message.error("下载失败,请重试"); } }; const toggleExpand = (index) => { setExpandedMap((prev) => ({ ...prev, [index]: !prev[index] })); }; useEffect(() => { (async function () { const instance = WebOfficeSDK.init({ // 必填项 officeType: WebOfficeSDK.OfficeType.Writer, appId: "AK20260805KPWYZJ", mount: document.getElementById("app-wps"), fileId: fileId, token: sessionStorage.getItem("token"), ...(readOnly ? { commonOptions: { isBrowserViewMode: true } } : {}), }); await instance.ready(); sdkRef.current = instance; })(); return () => { sdkRef.current?.destroy(); }; }, [fileId]); return (