import { Button, Descriptions, Image, Modal, Table } from "antd"; import { useEffect, useRef, useState } from "react"; import { fetchOrgPersonnelDetail } from "~/utils/qualFiling/personnelHelper"; import { REGISTER_ENGINEER_CATEGORY_MAP, PERSONNEL_POST_TYPE_MAP, ABILITY_SOURCE_MAP, TITLE_LEVEL_MAP, } from "~/enumerate/enterpriseOptions"; import { CERT_LEVEL_LABEL_BY_TYPE, CAPABILITY_MAP, PROFESSIONAL_MAJOR_MAP, } from "~/enumerate/constant"; const GENDER_MAP = { 1: "男", 2: "女" }; const REGISTER_ENGINEER_MAP = { 1: "是", 2: "否" }; const EVALUATOR_MAP = { 1: "是", 2: "否" }; const parseFileList = (raw) => { if (!raw) return []; if (Array.isArray(raw)) return raw; try { const parsed = JSON.parse(raw); return Array.isArray(parsed) ? parsed : []; } catch { return []; } }; export default function StaffViewModal({ open, currentId, requestDetails = fetchOrgPersonnelDetail, onCancel, }) { const [info, setInfo] = useState({}); const [detailLoading, setDetailLoading] = useState(false); const requestDetailsRef = useRef(requestDetails); requestDetailsRef.current = requestDetails; useEffect(() => { if (!open || !currentId) { setInfo({}); return; } let cancelled = false; setDetailLoading(true); Promise.resolve(requestDetailsRef.current({ id: currentId })) .catch((err) => { console.warn("[StaffViewModal] load detail failed:", err); return { data: {} }; }) .then((detailRes) => { if (!cancelled) { setInfo(detailRes?.data || {}); } }) .finally(() => { if (!cancelled) { setDetailLoading(false); } }); return () => { cancelled = true; }; }, [open, currentId]); const proofMaterialFiles = parseFileList(info.proofMaterialUrl); const titleInfo = Array.isArray(info.titleCodeArr) ? info.titleCodeArr.map((item) => ({ titleName: TITLE_LEVEL_MAP[item.titleCode] || item.titleCode || "-", industryName: PROFESSIONAL_MAJOR_MAP[item.industryCode] || item.industryCode || "-", proveUrlList: parseFileList(item.proveUrl), })) : []; const regCert = info.registeredSafetyEngineerCert; const regCertLevelMap = CERT_LEVEL_LABEL_BY_TYPE.registered_safety_engineer; const regCertFiles = parseFileList(regCert?.certAttachmentUrl); const evaluatorCert = info.evaluatorCert; const evaluatorFlag = info.evaluatorFlag || (evaluatorCert ? 1 : 2); const evalCertLevelMap = CERT_LEVEL_LABEL_BY_TYPE.evaluator; const evalCertFiles = parseFileList(evaluatorCert?.certAttachmentUrl); const capabilityList = Array.isArray(info.capabilityAssessment) ? info.capabilityAssessment.map((item) => ({ capabilityName: CAPABILITY_MAP[item.professionalCapabilityCode] || item.professionalCapabilityCode || "-", sourceName: ABILITY_SOURCE_MAP[item.professionalCapabilitySourceCode] || item.professionalCapabilitySourceCode || "-", })) : []; const renderFileList = (files) => { if (!files?.length) return "-"; return files.map((item) => { const isImage = /\.(jpg|jpeg|png|gif|webp|bmp|svg)(\?.*)?$/i.test( item.url, ); return (
{isImage ? ( ) : ( )}
); }); }; return ( {info.userName} {GENDER_MAP[info.genderCode]} {info.birthDate} {info.joinWorkDate} {info.account} {info.deptName} {info.postName} {info.idCardNo} {info.currentAddress} {info.officeAddress} {info.educationTypeName || "-"} {info.graduateSchool} {info.educationLevelName || "-"} {info.basicDisciplineMajorName || "-"} {PERSONNEL_POST_TYPE_MAP[info.personnelPositionType] || "-"} {info.workExperience || "-"} {renderFileList(proofMaterialFiles)}
注安信息
{REGISTER_ENGINEER_MAP[info.registerEngineerFlag] ?? "-"} {REGISTER_ENGINEER_CATEGORY_MAP[regCert?.certCategoryCode] || "-"} {regCertLevelMap[regCert?.certLevel] || "-"} {regCert?.certNo || "-"} {renderFileList(regCertFiles)}
评价师信息
{EVALUATOR_MAP[evaluatorFlag] ?? "-"} {evalCertLevelMap[evaluatorCert?.certLevel] || "-"} {evaluatorCert?.certNo || "-"} {renderFileList(evalCertFiles)}
职称信息
idx} dataSource={titleInfo} columns={[ { title: "职称", dataIndex: "titleName", width: 120 }, { title: "专业", dataIndex: "industryName", width: 150 }, { title: "证明材料", dataIndex: "proveUrlList", render: renderFileList, }, ]} />
专业能力信息
idx} dataSource={capabilityList} locale={{ emptyText: "暂无专业能力信息" }} columns={[ { title: "专业能力", dataIndex: "capabilityName" }, { title: "来源", dataIndex: "sourceName", width: 280 }, ]} /> ); }