import React, { useEffect, useState } from "react"; import { Tag, Button, Card, Row, Col, Table, Statistic, Flex, Modal, Radio, Checkbox, message, Spin, } from "antd"; import { Connect } from "@cqsjjb/jjb-dva-runtime"; import { NS_SAFETY_EVAL_BUSINESS } from "~/enumerate/namespace"; import { tools } from "@cqsjjb/jjb-common-lib"; const { router } = tools; const ROLE_DEFINITIONS = [ { value: "MARKETING_BUSINESS_REP", name: "市场部业务员", unique: false, summary: "获取项目基础信息,形成风险分析记录;风险通过后签订合同并下达任务通知单。" }, { value: "TECHNICAL_LEAD", name: "技术负责人", unique: false, summary: "评估人员专业匹配与技术可行性,审核检查表并开展评价报告技术审核。" }, { value: "PROCESS_CONTROL_LEAD", name: "过程控制负责人", unique: true, summary: "核查利益冲突、资质范围和人员配置,负责受控管理、程序合规审核及归档前校验。" }, { value: "FINANCE_STAFF", name: "财务人员", unique: false, summary: "核算人工、费用、税金和利润等全成本,评估项目经济性及合同金额合理性。" }, { value: "EVALUATION_AGENCY_HEAD", name: "评价机构负责人", unique: false, summary: "综合多方意见决定是否承接项目,并在全部审核通过后终审签发评价报告。" }, { value: "EVALUATION_DEPT_MANAGER", name: "评价部经理", unique: false, summary: "签发项目组任命文件,审核组长资格、行业经验及成员专业配置。" }, { value: "PROJECT_LEAD", name: "项目负责人(项目组组长)", unique: true, summary: "制定实施计划并组织启动、初勘、检查表、现场勘查、整改复查及报告编制。" }, { value: "PROJECT_TEAM_MEMBERS", name: "项目组各专业组员", unique: false, summary: "按专业分工开展资料收集、检查表编制、现场检查、危险辨识和评价报告专业内容编写。" }, { value: "INTERNAL_AUDITOR", name: "内审人", unique: false, summary: "审核报告初稿及修改结果,重点核查依据、危险辨识、单元划分、评价方法和结论。" }, { value: "REPORT_COMPILER", name: "报告编制人", unique: false, summary: "整合各专业内容形成报告初稿,根据各级审核意见修改并整理全过程档案。" }, { value: "ARCHIVES_ADMIN", name: "档案管理员", unique: false, summary: "办理档案交接、编号、分类、装订和入库,并按规定开展报告信息公开。" }, ]; const TeamContent = (props) => { const { safetyEvalBusiness, evalProjectMemberPage, evalProjectMemberSave } = props; const { evalProjectDetailData, memberLoading, memberSaveLoading } = safetyEvalBusiness || {}; const participants = evalProjectDetailData?.participants || []; const projectId = router.query?.id; const [modalOpen, setModalOpen] = useState(false); const [selectedRole, setSelectedRole] = useState(null); const [selectedPersons, setSelectedPersons] = useState([]); const [teamMembers, setTeamMembers] = useState([]); const fetchData = async () => { if (!projectId) return; const res = await evalProjectMemberPage({ projectId }); if (res?.success !== false && res?.data) { setTeamMembers( res.data.map((item) => ({ ...item, roles: (item.role || []).map((r) => ({ role: r, duty: item.responsibility || ROLE_DEFINITIONS.find((d) => d.value === r)?.summary || "", })), })), ); } }; useEffect(() => { if (evalProjectDetailData?.id) fetchData(); }, [projectId, evalProjectDetailData?.id]); const isUniqueRole = selectedRole && ROLE_DEFINITIONS.find((r) => r.value === selectedRole)?.unique; const handlePersonChange = (checkedValues) => { if (isUniqueRole && checkedValues.length > 1) { setSelectedPersons([checkedValues[checkedValues.length - 1]]); return; } setSelectedPersons(checkedValues); }; const handleOpenModal = () => { setSelectedRole(null); setSelectedPersons([]); setModalOpen(true); }; const handleConfirm = () => { if (!selectedRole) { message.warning("请选择1个项目角色"); return; } if (selectedPersons.length === 0) { message.warning("请至少选择1名人员"); return; } const role = ROLE_DEFINITIONS.find((r) => r.value === selectedRole); if (role?.unique && selectedPersons.length > 1) { message.warning("该角色为单人唯一角色,只能选择1名人员"); return; } const newEntries = selectedPersons.map((personId) => { const p = participants.find((item) => item.id === personId); const existing = teamMembers.find((m) => m.personnelId === personId); return { personnelId: p.id, personnelName: p.name, deptName: p.deptName, capacity: p.capacity, ...(existing?.id ? { id: existing.id } : {}), roles: [{ role: selectedRole, duty: role?.summary || "" }], }; }); setTeamMembers((prev) => { const merged = [...prev]; newEntries.forEach((entry) => { const existing = merged.find((m) => m.personnelId === entry.personnelId); if (existing) { if (!existing.roles.find((r) => r.role === entry.roles[0].role)) { existing.roles.push(entry.roles[0]); } } else { merged.push(entry); } }); return merged; }); setModalOpen(false); }; const handleRemovePerson = (personnelId) => { setTeamMembers((prev) => prev.filter((m) => m.personnelId !== personnelId)); }; const handleSave = async () => { const payload = teamMembers.map((m) => ({ id: m.id, projectId, personnelId: m.personnelId, personnelName: m.personnelName, deptName: m.deptName, capacity: m.capacity, role: m.roles.map((r) => r.role), responsibility: m.roles[0]?.duty, })); const res = await evalProjectMemberSave(payload); if (res?.success !== false) { message.success("保存成功"); fetchData(); } }; const allRoles = teamMembers.flatMap((m) => m.roles.map((r) => r.role)); const columns = [ { title: "姓名", dataIndex: "personnelName", width: 120, ellipsis: true }, { title: "部门/岗位", dataIndex: "deptName", width: 200, ellipsis: true }, { title: "项目角色", dataIndex: "roles", width: 350, render: (roles) => (
{role.summary}