- {[
- { name: "市场部业务员", unique: false, summary: "获取项目基础信息,形成风险分析记录;风险通过后签订合同并下达任务通知单。" },
- { name: "技术负责人", unique: false, summary: "评估人员专业匹配与技术可行性,审核检查表并开展评价报告技术审核。" },
- { name: "过程控制负责人", unique: true, summary: "核查利益冲突、资质范围和人员配置,负责受控管理、程序合规审核及归档前校验。" },
- { name: "财务人员", unique: false, summary: "核算人工、费用、税金和利润等全成本,评估项目经济性及合同金额合理性。" },
- { name: "评价机构负责人", unique: false, summary: "综合多方意见决定是否承接项目,并在全部审核通过后终审签发评价报告。" },
- { name: "评价部经理", unique: false, summary: "签发项目组任命文件,审核组长资格、行业经验及成员专业配置。" },
- { name: "项目负责人(项目组组长)", unique: true, summary: "制定实施计划并组织启动、初勘、检查表、现场勘查、整改复查及报告编制。" },
- { name: "项目组各专业组员", unique: false, summary: "按专业分工开展资料收集、检查表编制、现场检查、危险辨识和评价报告专业内容编写。" },
- { name: "内审人", unique: false, summary: "审核报告初稿及修改结果,重点核查依据、危险辨识、单元划分、评价方法和结论。" },
- { name: "报告编制人", unique: false, summary: "整合各专业内容形成报告初稿,根据各级审核意见修改并整理全过程档案。" },
- { name: "档案管理员", unique: false, summary: "办理档案交接、编号、分类、装订和入库,并按规定开展报告信息公开。" },
- ].map((role) => (
-
-
- {role.name}
- {role.unique && 单人唯一}
-
-
{role.summary}
-
+ 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) => (
+
+ {roles.map((r) => (
+
+ {ROLE_DEFINITIONS.find((d) => d.value === r.role)?.name || r.role}
+
))}
-
+ ),
+ },
+ { title: "资质与专业", dataIndex: "capacity", width: 200, ellipsis: true },
+ {
+ title: "主要职责", dataIndex: "roles", ellipsis: true,
+ render: (roles) => roles.map((r) => r.duty).join(";"),
+ },
+ {
+ title: "操作", width: 80, fixed: "right",
+ render: (_, record) => (
+
+ ),
+ },
+ ];
-
-
-
-
-
-
-
-);
+ return (
+