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 (