dev-tmp1
tangjie 2026-08-12 17:26:27 +08:00
parent c05a311bd6
commit c3a5f1f75f
2 changed files with 178 additions and 1 deletions

View File

@ -0,0 +1,163 @@
import { Button, Modal, Space, message } from "antd";
import dayjs from "dayjs";
/** 原型 .reg-modal-section */
const ModalSection = ({ title, desc, children }) => (
<div className="redb-modal-section">
<h4>{title}</h4>
{desc ? <p>{desc}</p> : null}
{children}
</div>
);
/** 原型 tableHtml字段表 / 数据表kv=字段-内容两列表 */
const ProtoTable = ({ headers, rows, kv = false }) => (
<div className={`redb-data-table${kv ? " redb-data-table-kv" : ""}`}>
<table>
<thead>
<tr>
{headers.map((h) => (
<th key={h}>{h}</th>
))}
</tr>
</thead>
<tbody>
{rows.map((row, idx) => (
<tr key={idx}>
{row.map((cell, cIdx) => (
<td key={cIdx}>{cell}</td>
))}
</tr>
))}
</tbody>
</table>
</div>
);
const getFileExtLabel = (name = "") => {
const ext = String(name).split(".").pop();
return ext && ext !== name ? ext.toUpperCase() : "PDF";
};
/** 解析存储的 JSON 文件列表字符串,返回数组 */
const parseFileList = (jsonStr) => {
if (!jsonStr) return [];
try {
const arr = JSON.parse(jsonStr);
return Array.isArray(arr) ? arr : [];
} catch {
return [];
}
};
/** 单文件本地下载 */
const downloadFileByUrl = async (fileUrl, fileName) => {
const response = await fetch(fileUrl, {
headers: { token: sessionStorage.getItem("token") || "" },
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const blob = await response.blob();
const blobUrl = window.URL.createObjectURL(blob);
const link = document.createElement("a");
link.href = blobUrl;
link.download = fileName || "报告文件";
link.style.display = "none";
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
window.URL.revokeObjectURL(blobUrl);
};
/**
* 抽检报告详情弹窗直接用抽检接口返回的行数据展示不调详情接口
*/
const SpotCheckDetailModal = ({ open, record, onCancel }) => {
const detailData = record || {};
const handleFileDownload = (fileUrl, fileName) => {
if (!fileUrl) {
message.warning("文件地址不存在");
return;
}
const hide = message.loading("正在下载...", 0);
downloadFileByUrl(fileUrl, fileName)
.then(() => message.success("下载已开始"))
.catch(() => message.error("下载失败,请稍后重试"))
.finally(() => hide());
};
return (
<Modal
title={`查看安全评价报告 - ${detailData.reportNo || ""}`}
open={open}
onCancel={onCancel}
width={980}
destroyOnClose
className="redb-modal"
footer={
<Space>
<Button onClick={onCancel}>关闭</Button>
</Space>
}
>
<ModalSection
title="报告基本信息"
desc="展示评价机构上传的正式安全评价报告信息。"
>
<ProtoTable
kv
headers={["字段", "内容"]}
rows={[
["报告编号", detailData.reportNo || "-"],
["报告名称", detailData.reportName || "-"],
["评价机构", detailData.orgName || "-"],
["评价类型", detailData.evalTypeName || "-"],
["所属行业", detailData.industryName || "-"],
[
"签发日期",
detailData.issueDate
? dayjs(detailData.issueDate).format("YYYY-MM-DD")
: "-",
],
[
"报送时间",
detailData.archiveTime
? dayjs(detailData.archiveTime).format("YYYY-MM-DD HH:mm")
: "-",
],
]}
/>
</ModalSection>
<ModalSection title="报告文件" desc="支持在线查看和下载正式报告。">
<ProtoTable
headers={["文件名称", "文件类型", "版本"]}
rows={[
[
<span
style={{ color: "#1677ff", cursor: "pointer" }}
onClick={() =>
handleFileDownload(
detailData.fileUrl,
detailData.fileName ||
detailData.reportName ||
"正式安全评价报告.pdf",
)
}
>
{detailData.fileName ||
detailData.reportName ||
"正式安全评价报告.pdf"}
</span>,
getFileExtLabel(detailData.fileName),
"V1.0",
],
]}
/>
</ModalSection>
</Modal>
);
};
export default SpotCheckDetailModal;

View File

@ -24,6 +24,7 @@ import { NS_REGULATOR_EVAL_REPORT, NS_ORG_INFO } from "~/enumerate/namespace";
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { tools } from "@cqsjjb/jjb-common-lib";
import { renderDocxBlob, fillDocxTemplate } from "~/utils/fillDocxTemplate";
import SpotCheckDetailModal from "./components/SpotCheckDetailModal";
import dayjs from "dayjs";
import "./index.less";
@ -266,6 +267,8 @@ const EvalReportDatabase = (props) => {
const [orgOptions, setOrgOptions] = useState([]);
const [spotCheckForm] = Form.useForm();
const [viewChecklistLoading, setViewChecklistLoading] = useState(false);
const [spotDetailVisible, setSpotDetailVisible] = useState(false);
const [spotDetailData, setSpotDetailData] = useState(null);
const {
regulatorEvalReportPageLoading,
@ -506,6 +509,12 @@ const EvalReportDatabase = (props) => {
}
};
/** 抽检报告详情:直接用行数据展示,不调接口 */
const handleViewSpotDetail = (record) => {
setSpotDetailData(record);
setSpotDetailVisible(true);
};
const handleDownloadOne = async (record) => {
let fileUrl = record.fileUrl;
let fileName = record.fileName || record.reportName || "报告文件";
@ -1573,7 +1582,7 @@ const EvalReportDatabase = (props) => {
<Button
type="primary"
size="small"
onClick={() => handleViewDetail(record)}
onClick={() => handleViewSpotDetail(record)}
>
查看
</Button>
@ -1587,6 +1596,11 @@ const EvalReportDatabase = (props) => {
</>
)}
</Modal>
<SpotCheckDetailModal
open={spotDetailVisible}
record={spotDetailData}
onCancel={() => setSpotDetailVisible(false)}
/>
</PageLayout>
</ConfigProvider>
);