import React, { useState, useEffect } from "react"; import { Tag, Button, Card, Table, Select, Input, Flex, Typography, message, Popover, Image, Collapse, Row, Col, DatePicker, Form, } from "antd"; import dayjs from "dayjs"; import { CheckCircleFilled } from "@ant-design/icons"; import { Connect } from "@cqsjjb/jjb-dva-runtime"; import { NS_SAFETY_EVAL_BUSINESS } from "~/enumerate/namespace"; import { tools } from "@cqsjjb/jjb-common-lib"; const { TextArea } = Input; const { router } = tools; const ControlContent = (props) => { const projectId = router.query?.id; const { processControlDetail, processControlFiles, evalProjectDetailData } = props.safetyEvalBusiness || {}; const { processControl, controllers, reviewItems } = processControlDetail || {}; const [selectPeople, setSelectPeople] = useState(null); // 当前步骤:1-过程控制审核 2-机构负责人签发 3-项目归档 const [step, setStep] = useState(1); // 过程控制审核 const [rows, setRows] = useState([]); // 项目归档 const [files, setFiles] = useState([]); const [archiveForm] = Form.useForm(); // 机构负责人签发 const [approvalOpinion, setApprovalOpinion] = useState(""); const fetchDetail = () => { props.evalProcessControlDetail({ projectId }).then((res) => { if (res?.success) { if (res?.data?.signTaskPersonCo) { setSelectPeople({ value: res?.data?.signTaskPersonCo?.signerPersonnelId, label: res?.data?.signTaskPersonCo?.signerName, }); } } }); }; const fetchFiles = () => { props.evalProcessControlFiles({ projectId }); }; useEffect(() => { if (projectId) { fetchDetail(); fetchFiles(); } }, [projectId]); useEffect(() => { if (reviewItems) { setRows( reviewItems.map((item) => ({ ...item, _key: item.id || item.reviewDimensionCode, })), ); } if (processControl?.opinionContent) { setApprovalOpinion(processControl.opinionContent); } if (processControl) { archiveForm.setFieldsValue({ projectNo: evalProjectDetailData.projectNo, archiveTransferorName: processControlDetail.archiveTransferorName || "", archiveArchivistName: processControlDetail.archiveArchivistName || "", archiveDate: processControlDetail.archiveDate ? dayjs(processControlDetail.archiveDate) : null, }); } }, [processControlDetail]); useEffect(() => { if (processControlFiles) { setFiles(processControlFiles); } }, [processControlFiles]); const updateRow = (index, field, value) => { const next = [...rows]; next[index] = { ...next[index], [field]: value }; setRows(next); }; const isDispatched = processControl?.reviewerSignatureTaskStatus !== "non_dispatched"; const isSignatureCompleted = processControl?.reviewerSignatureTaskStatus === "completed"; const canArchive = isSignatureCompleted; // 过程控制签字提交(confirm) const handleConfirm = async (resultCode) => { if (!projectId) return; if (!rows.every((r) => r.reviewConclusion)) { message.error("请填写所有核查项的结果"); return; } const payload = { id: processControl?.id, projectId, resultCode, opinionContent: approvalOpinion, reviewItems: rows.map((r) => ({ bizType: "eval_process_control", bizId: processControl?.id, reviewDimensionCode: r.reviewDimensionCode, reviewDimensionName: r.reviewDimensionName, reviewFocus: r.reviewFocus, reviewConclusion: r.reviewConclusion, reviewOpinion: r.reviewOpinion, })), }; const res = await props.evalProcessControlConfirm(payload); if (res?.success !== false) { message.success( resultCode === "passed" ? "已提交通过审核" : "已提交退回修改", ); fetchDetail(); } }; // 下发签字任务(assign) const handleAssign = async () => { if (!projectId) return; const res = await props.evalProcessControlAssign({ projectId, signTaskPersonCmd: { signerPersonnelId: selectPeople?.value, signerName: selectPeople?.label, }, opinionContent: approvalOpinion, }); if (res?.success !== false) { message.success("已下发签字任务"); fetchDetail(); } }; // 归档项目并入库 const handleArchive = async () => { if (!projectId) return; const values = await archiveForm.validateFields(); const res = await props.evalProcessControlArchive({ projectId, ...values }); if (res?.success !== false) { message.success("项目已归档入库"); fetchDetail(); props.getDetail?.(); } }; const reviewColumns = [ { title: "程序审核项", dataIndex: "reviewDimensionName", width: 120 }, { title: "核查内容", dataIndex: "reviewFocus", width: 200 }, { title: "结果", dataIndex: "reviewConclusion", width: 150, render: (val, _, idx) => ( ), }, { title: "意见", dataIndex: "reviewOpinion", render: (val, _, idx) => ( updateRow(idx, "reviewOpinion", e.target.value)} /> ), }, ]; const isImage = (name) => /\.(jpg|jpeg|png|gif|webp|bmp|svg)$/i.test(name || ""); const fileColumns = [ { title: "流程名称", dataIndex: "processName", ellipsis: true }, { title: "条目名称", dataIndex: "itemName", ellipsis: true }, { title: "文件", dataIndex: "projectDocUrl", render: (val) => { let files = []; if (typeof val === "string") { try { files = JSON.parse(val); } catch { files = []; } } else if (Array.isArray(val)) { files = val; } if (!files.length) return "-"; return ( {files.map((f, i) => { const url = f.url || f.response?.url; return isImage(f.name) ? ( {} ) : ( window.open(url)} > {f.name || "查看文件"} ); })} } trigger="hover" placement="topLeft" > e.preventDefault()} style={{ cursor: "pointer" }} > {files.length}个附件 ); }, }, ]; const STEP_ITEMS = [ { key: 1, label: "过程控制审核" }, { key: 2, label: "机构负责人签发" }, { key: 3, label: "项目归档" }, ]; return (
{STEP_ITEMS.map((item) => ( ))} {step === 1 && (
  • 合同签订前是否进行项目风险分析。
  • 是否签订技术服务合同。
  • 是否下达项目任务通知单。
  • 是否有项目组成立和项目负责人任命记录。
  • 是否编制项目实施计划。
  • 现场检查记录是否完整、有效。
  • 是否有书面整改通知单并由被评价单位盖章或签字确认。
  • 是否进行现场复查,复查单是否双方签名或盖章并注明日期。
  • 是否有现场勘查、整改复查影像资料。
  • 是否完成内审、技审并保留审核记录、签字和日期。
  • 委托方提供资料是否齐全并由被评价单位盖章。
  • 委托方资料、评价过程资料和评价报告存档是否符合要求。
  • 存档资料是否完整且具有可追溯性。
  • ), }, ]} /> )} {step === 2 && (
    无可能引发法律纠纷的重大风险
    评价过程无违规现象
    全过程记录和签字完整
    签发意见