import React, { useState, useEffect } from "react"; import { Modal, TreeSelect, Input, Table, Button, Tag, Row, Col, Space, } from "antd"; import { CloseOutlined } from "@ant-design/icons"; import { NS_STAFF_INFO, NS_ORG_DEPARTMENT } from "~/enumerate/namespace"; import { Connect } from "@cqsjjb/jjb-dva-runtime"; import { QUALIFICATION_INDUSTRY_OPTIONS_MAP, TITLE_LEVEL_MAP } from "~/enumerate/enterpriseOptions"; const StaffPickerModal = (props) => { const { open, onCancel, onConfirm, selectedIds = [] } = props; const { staffInfoList: dataSource, staffInfoTotal: total, staffInfoLoading: loading } = props.staffInfo || {}; const { orgDepartmentTreeData } = props.orgDepartment || {}; const [deptId, setDeptId] = useState(undefined); const [keyword, setKeyword] = useState(""); const [page, setPage] = useState({ current: 1, size: 10 }); const [selectedRowKeys, setSelectedRowKeys] = useState([]); // 用 Map 存储所有已选行,翻页后不丢失 const [selectedRowMap, setSelectedRowMap] = useState({}); useEffect(() => { if (open) { props.orgDepartmentTree(); // 从父组件恢复已选数据 const initialIds = selectedIds; const initialRows = props.selectedParticipants || []; setSelectedRowKeys(initialIds); const map = {}; initialRows.forEach((r) => { map[r.id] = r; }); setSelectedRowMap(map); fetchData({ current: 1, size: 10 }); } }, [open]); const fetchData = (pagination) => { const params = { current: pagination?.current || page.current, size: pagination?.size || page.size, employmentStatusCode: 1, }; if (deptId) params.deptId = deptId; if (keyword) params.userName = keyword; props.staffInfoList(params); setPage(params); }; const handleSearch = () => { fetchData({ current: 1, size: 10 }); }; const handleTableChange = (pagination) => { fetchData(pagination); }; const handleSelectChange = (rowKeys, rows) => { setSelectedRowKeys(rowKeys); // rows 仅包含当前页的行,用 Map 合并新旧数据 setSelectedRowMap((prev) => { const next = { ...prev }; // 移除取消勾选的项 Object.keys(next).forEach((key) => { if (!rowKeys.includes(key)) { delete next[key]; } }); // 添加/更新当前页勾选的行 rows.forEach((row) => { next[row.id] = row; }); return next; }); }; const handleRemoveSelected = (record) => { const newKeys = selectedRowKeys.filter((id) => id !== record.id); setSelectedRowKeys(newKeys); setSelectedRowMap((prev) => { const next = { ...prev }; delete next[record.id]; return next; }); }; const handleConfirm = () => { onConfirm(Object.values(selectedRowMap)); }; const selectedRows = Object.values(selectedRowMap); const columns = [ { title: "用户名称", dataIndex: "userName", width: 200, render: (text, record) => { const name = record.userName || "-"; return ( {name} {record.technicalDirectorFlag && ( 技术 )} {record.processControlLeaderFlag && ( 过程 )} ); }, }, { title: "能力", dataIndex: "abilityNames", ellipsis: true, }, ]; return ( { setDeptId(value); setTimeout(() => handleSearch(), 0); }} /> setKeyword(e.target.value)} onPressEnter={handleSearch} />
技术 技术负责人 过程 过程控制负责人
`共 ${t} 条`, onChange: (cur, size) => handleTableChange({ current: cur, size }), }} scroll={{ y: 400, x: 600 }} />
已选人员({selectedRows.length})
{selectedRows.length === 0 && (
请从左侧勾选人员
)} {selectedRows.map((item) => (
{item.userName}
))}
); }; export default Connect( [NS_STAFF_INFO, NS_ORG_DEPARTMENT], true, )(StaffPickerModal);