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, ABILITY_SOURCE_MAP, TITLE_LEVEL_MAP, QUALIFICATION_INDUSTRY_OPTIONS_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) => ({ industryCode: item.industryCode, 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 (