import { Connect } from "@cqsjjb/jjb-dva-runtime"; import { tools } from "@cqsjjb/jjb-common-lib"; import { Button, Form, message, Modal, Space, Spin, Table, Tabs } from "antd"; import dayjs from "dayjs"; import { useCallback, useEffect, useRef, useState } from "react"; import PageLayout from "@cqsjjb/jjb-react-admin-component/PageLayout"; import { fetchQualFilingDetail, fetchQualChangeDetail } from "~/api/qualFiling"; import { NS_QUAL_FILING } from "~/enumerate/namespace"; import { FILING_FORM_MODE } from "~/enumerate/qualFilingOptions"; import { getFilingMaterialTemplate } from "../filingMaterialTemplate"; import { fetchOrgPersonnelOptions, mapEquipRowToFilingEquipment, mergeDetailFromForms, } from "../filingPersist"; import { verifyFilingPrerequisites } from "../filingVerify"; import BasicInfoStep from "./components/BasicInfoStep"; import CommitmentStep from "./components/CommitmentStep"; import EquipmentStep from "./components/EquipmentStep"; import MaterialStep from "./components/MaterialStep"; import PersonnelStep from "./components/PersonnelStep"; import PrerequisiteVerifyModal from "./components/PrerequisiteVerifyModal"; const router = tools.router; const MODE_TITLE = { [FILING_FORM_MODE.APPLICATION]: "资质申请管理", [FILING_FORM_MODE.FILED]: "资质备案填报", [FILING_FORM_MODE.CHANGE]: "修改备案信息", }; function FilingFormPage(props) { const query = router.query; const mode = query.mode; const [submitting, setSubmitting] = useState(false); const [activeStep, setActiveStep] = useState("basic"); const [detail, setDetail] = useState(null); const [personnelOptions, setPersonnelOptions] = useState([]); const [verifyOpen, setVerifyOpen] = useState(false); const [verifyResult, setVerifyResult] = useState(null); const [verifyFailItems, setVerifyFailItems] = useState([]); const [basicForm] = Form.useForm(); const [commitmentForm] = Form.useForm(); const detailRef = useRef(null); const readOnly = query.readOnly; const saveActionHint = mode === FILING_FORM_MODE.FILED ? "请点击提交后保存" : "请点击暂存或提交后保存"; const loadPersonnelOptions = useCallback(async () => { if (personnelOptions.length) { return personnelOptions; } const options = await fetchOrgPersonnelOptions().catch(() => []); setPersonnelOptions(options); return options; }, [personnelOptions.length]); useEffect(() => { detailRef.current = detail; }, [detail]); useEffect(() => { loadPersonnelOptions(); if (query.id) { let aciotn = () => {}; if (mode === FILING_FORM_MODE.CHANGE) { aciotn = fetchQualChangeDetail; } else { aciotn = fetchQualFilingDetail; } aciotn(query.id).then((res) => { setDetail((prev) => ({ ...prev, ...(res?.data || {}) })); basicForm.setFieldsValue(res?.data || {}); const commitment = res?.data?.commitment || {}; commitmentForm.setFieldsValue({ ...commitment, signDate: commitment.signDate ? dayjs(commitment.signDate) : undefined, }); }); } else { setDetail((prev) => ({ ...prev, materials: getFilingMaterialTemplate(mode) })); } }, []); const collectCurrentDetail = useCallback(() => { const current = detailRef.current || detail; return mergeDetailFromForms(current, { basicValues: basicForm.getFieldsValue(true), commitmentValues: commitmentForm.getFieldsValue(true), }); }, [basicForm, commitmentForm, detail]); const syncCommitmentFromBasic = useCallback(() => { const filingUnitName = basicForm.getFieldValue("filingUnitName") || detail?.filingUnitName || ""; const legalRepName = commitmentForm.getFieldValue("legalRepName") || ""; commitmentForm.setFieldsValue({ filingUnitName, legalRepName }); }, [basicForm, commitmentForm, detail?.filingUnitName]); const goToStep = useCallback( (key) => { if (key === "commitment") { syncCommitmentFromBasic(); } setActiveStep(key); }, [syncCommitmentFromBasic], ); useEffect(() => { if (activeStep === "commitment") { syncCommitmentFromBasic(); } }, [activeStep, syncCommitmentFromBasic]); const handleSubmitRequest = async () => { if (readOnly) { return; } try { await basicForm.validateFields(); } catch (err) { setActiveStep("basic"); return; } try { await commitmentForm.validateFields(); } catch (err) { setActiveStep("commitment"); return; } const currentDetail = collectCurrentDetail(); if(!currentDetail?.commitment.legalRepSignatureUrl){ message.warning("法定代表人尚未签字"); return; } if (!currentDetail?.personnelList?.length) { message.warning("请至少添加一位备案人员"); setActiveStep("managementPersonnel"); return; } if (!currentDetail?.equipmentList?.length) { message.warning("请至少添加一条装备清单"); setActiveStep("equipment"); return; } const result = verifyFilingPrerequisites(currentDetail); setVerifyResult(result); setVerifyOpen(true); }; const handleVerifyConfirm = async (config = {}) => { setSubmitting(true); const currentDetail = collectCurrentDetail(); const word = mode === "change" ? "Change" : ""; const body = { [`qualFiling${word}AddCmd`]: { ...currentDetail, filingStatusCode: config.isSaveDraft ? 5 : 2, applyTypeCode: mode === "application" ? 1 : 3, }, }; const params = body[`qualFiling${word}AddCmd`]; if (params.materials) { body[`qualFilingMaterial${word}AddCmds`] = params.materials; delete params.materials; } if (params.personnelList) { body[`qualFilingPersonnel${word}AddCmds`] = params.personnelList.map( (item) => { return { ...item, personName: item.userName || item.personName, sourcePersonnelId: item.sourcePersonnelId || item.id, }; }, ); delete params.personnelList; } if (params.equipmentList) { body[`qualFilingEquipment${word}AddCmds`] = params.equipmentList; delete params.equipmentList; } if (params.commitment) { body[`qualFilingCommitment${word}AddCmd`] = { ...params.commitment, commitmentContent: JSON.stringify({ filingUnitName: params.filingUnitName || "", legalRepName: params.commitment.legalRepName || "", }), }; delete params.commitment; } let action = props.submitQualFiling; if (mode === FILING_FORM_MODE.CHANGE) { action = props.submitQualFilingChange; } const result = await action(body); if (result?.success) { setVerifyOpen(false); if (Array.isArray(result.data) && result.data.length) { setVerifyFailItems(result.data); } else { if (config.isSign) { message.success("已推送签字"); } else { message.success(config.isSaveDraft ? "暂存成功" : "提交成功"); if(!config.isSaveDraft){ props.history.goBack(); } } } } setSubmitting(false); }; const handleMaterialUpload = (record, { url, ext }) => { const attachmentUrl = url; setDetail((prev) => ({ ...prev, materials: (prev.materials || []).map((item) => { return item.id === record.id ? { ...item, attachmentUrl, materialFormat: ext, uploadStatusCode: 2, uploadStatusName: "已上传", } : item; }), })); message.success(`材料已选择,${saveActionHint}`); }; const handlePersonnelAdd = (sourcePersonnelIds, rows = []) => { const existing = new Set( (detailRef.current?.personnelList || []).map((item) => String(item.sourcePersonnelId || item.id), ), ); const idsToAdd = sourcePersonnelIds.filter( (id) => !existing.has(String(id)), ); if (!idsToAdd.length) { return; } const rowMap = new Map((rows || []).map((row) => [String(row.id), row])); const newRows = idsToAdd.map((id) => { const row = rowMap.get(String(id)); return row; }); setDetail((prev) => ({ ...prev, personnelList: [...(prev.personnelList || []), ...newRows], })); message.success(`已添加至列表,${saveActionHint}`); }; const handlePersonnelRemove = (records) => { const list = Array.isArray(records) ? records : [records]; const names = list.map((r) => r.userName || r.personName).join("、"); Modal.confirm({ title: "提示", content: `确认删除人员「${names}」?`, onOk: () => { const ids = new Set(list.map((r) => r.id)); setDetail((prev) => ({ ...prev, personnelList: (prev.personnelList || []).filter( (item) => !ids.has(item.id), ), })); }, }); }; const handleEquipmentAdd = (sourceEquipmentIds, rows = []) => { const existing = new Set( (detailRef.current?.equipmentList || []).map((item) => String(item.sourceEquipmentId), ), ); const idsToAdd = sourceEquipmentIds.filter( (id) => !existing.has(String(id)), ); if (!idsToAdd.length) { return; } const rowMap = new Map((rows || []).map((row) => [String(row.id), row])); const newRows = idsToAdd.map((id) => { const row = rowMap.get(String(id)); return row ? mapEquipRowToFilingEquipment(row) : mapEquipRowToFilingEquipment({ id }); }); setDetail((prev) => ({ ...prev, equipmentList: [...(prev.equipmentList || []), ...newRows], })); message.success(`已添加至列表,${saveActionHint}`); }; const handleEquipmentRemove = (records) => { const list = Array.isArray(records) ? records : [records]; const names = list.map((r) => r.deviceName).join("、"); Modal.confirm({ title: "提示", content: `确认移除装备「${names}」?`, onOk: () => { const ids = new Set(list.map((r) => r.id)); setDetail((prev) => ({ ...prev, equipmentList: (prev.equipmentList || []).filter( (item) => !ids.has(item.id), ), })); }, }); }; const handleEquipmentCalibration = (record, { url }) => { setDetail((prev) => ({ ...prev, equipmentList: (prev.equipmentList || []).map((item) => item.id === record.id ? { ...item, calibrationReportUrl: url } : item, ), })); }; const STEP_ITEMS = [ { key: "basic", label: "1. 基本信息备案", children: ( ), forceRender: true, }, { key: "managementPersonnel", label: "2. 管理人员基本情况汇总表", children: ( item.technicalDirectorFlag || item.processControlLeaderFlag)} disabled={readOnly} onAdd={handlePersonnelAdd} key="managementPersonnel" onRemove={handlePersonnelRemove} managementFlag={true} /> ), }, { key: "personnel", label: "3. 专职安全评价师基本情况汇总表", children: ( !item.technicalDirectorFlag && !item.processControlLeaderFlag)} disabled={readOnly} onAdd={handlePersonnelAdd} key="personnel" onRemove={handlePersonnelRemove} managementFlag={false} /> ), }, { key: "materials", label: "4. 申请材料", children: ( ), }, { key: "equipment", label: "5. 设备清单", children: ( ), }, { key: "commitment", label: "6. 机构负责人签字", children: ( ), forceRender: true, }, ]; const stepIndex = STEP_ITEMS.findIndex((item) => item.key === activeStep); const isLastStep = stepIndex === STEP_ITEMS.length - 1; return ( handleVerifyConfirm({ isSaveDraft: true })} > 暂存 ) : null } > {stepIndex > 0 && ( )} {!isLastStep && ( )} {!readOnly && isLastStep && ( <> )} setVerifyOpen(false)} onConfirm={handleVerifyConfirm} /> 0} onCancel={() => setVerifyFailItems([])} footer={} > ); } export default Connect([NS_QUAL_FILING], true)(FilingFormPage);