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"; import {ROLE_DEFINITIONS} from '~/enumerate/constant' const { router } = tools; 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; } // 唯一角色校验:检查是否已有人担任该角色 if (role?.unique) { const existing = teamMembers.some((m) => m.roles.some((r) => r.role === selectedRole)); if (existing) { message.warning(`"${role.name}"已配置,不可重复添加`); 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 allRoles = teamMembers.flatMap((m) => m.roles.map((r) => r.role)); if (!allRoles.includes("PROJECT_LEAD")) { message.warning("请先配置项目负责人(项目组组长)"); return; } if (!allRoles.includes("PROCESS_CONTROL_LEAD")) { message.warning("请先配置过程控制负责人"); return; } 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(); props.getDetail(); } }; 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, record) => (
{role.summary}