import { Button, Descriptions, Modal, Space, Table } from "antd"; import { useEffect, useState } from "react"; import FilePreviewModal, { FilePreviewContent } from "~/components/FilePreviewModal"; import { fetchStaffCertDetail, fetchStaffCertListByPersonnelId } from "~/api/staffCertificate"; import { safeRequest } from "~/utils"; const GENDER_MAP = { 1: "男", 2: "女" }; const REGISTER_ENGINEER_MAP = { 1: "是", 2: "否" }; export default function StaffViewModal({ open, currentId, requestDetails, requestCertList = fetchStaffCertListByPersonnelId, requestCertDetails = fetchStaffCertDetail, onCancel, }) { const [info, setInfo] = useState({}); const [certificates, setCertificates] = useState([]); const [detailLoading, setDetailLoading] = useState(false); const [attachmentPreview, setAttachmentPreview] = useState(null); const [certPreview, setCertPreview] = useState(null); const [certPreviewLoading, setCertPreviewLoading] = useState(false); const [certPreviewInfo, setCertPreviewInfo] = useState(null); useEffect(() => { if (!open || !currentId) { setInfo({}); setCertificates([]); return; } let cancelled = false; setDetailLoading(true); Promise.all([ safeRequest(requestDetails, { id: currentId }), typeof requestCertList === "function" ? Promise.resolve(requestCertList(currentId)).catch((err) => { console.warn("[StaffViewModal] load certificates failed:", err); return []; }) : Promise.resolve([]), ]).then(([detailRes, certList]) => { if (!cancelled) { setInfo(detailRes?.data || {}); setCertificates(Array.isArray(certList) ? certList : []); } }).finally(() => { if (!cancelled) { setDetailLoading(false); } }); return () => { cancelled = true; }; }, [open, currentId, requestDetails, requestCertList]); const openCertPreview = async (record) => { setCertPreview(record); setCertPreviewInfo(null); if (typeof requestCertDetails !== "function") { setCertPreviewInfo(record); return; } setCertPreviewLoading(true); try { const res = await safeRequest(requestCertDetails, { id: record.id }); setCertPreviewInfo(res?.data || record); } finally { setCertPreviewLoading(false); } }; const proofFiles = info.proofMaterials || []; const certPreviewFiles = certPreviewInfo?.certImgs?.length ? certPreviewInfo.certImgs : certPreviewInfo?.certImgFiles || []; const certPreviewUrl = certPreviewFiles[0]?.url; const certPreviewName = certPreviewFiles[0]?.fileName || certPreviewFiles[0]?.name || certPreviewInfo?.certName; return ( <> {info.staffName} {GENDER_MAP[info.gender]} {info.birthDate} {info.account} {info.deptName} {info.positionName} {info.personType || "基础人员"} {info.qualScope || "-"} {info.professionalLevel || "-"} {info.evaluatorCertNo || "-"} {info.educationType || "-"} {info.educationLevel || "-"} {info.titleName || "-"} {REGISTER_ENGINEER_MAP[info.registerEngineerFlag] ?? "-"} {info.idCardNo} {info.education || "-"} {info.homeAddress} {info.officeAddress} {info.graduateSchool} {info.major} {info.publications || "-"} {info.abilityDeclaration || "-"} {info.workExperience || "-"} {proofFiles.length ? ( {proofFiles.map((file, index) => { const fileName = file.name || file.fileName || `专业能力证明${index + 1}.pdf`; return ( {fileName} ); })} ) : "-"}
证照信息
( ), }, ]} /> setAttachmentPreview(null)} /> { setCertPreview(null); setCertPreviewInfo(null); }} onOk={() => { if (certPreviewUrl) { window.open(certPreviewUrl, "_blank"); } setCertPreview(null); setCertPreviewInfo(null); }} > {certPreviewInfo && (
{certPreviewInfo.certName} {certPreviewInfo.certNo} {certPreviewInfo.certCategory || "-"} {certPreviewInfo.issueOrg || "-"} {certPreviewInfo.validStartDate || "-"} {certPreviewInfo.validEndDate || "-"}
)}
); }