import React, { useState, useEffect } from 'react'; import { Table, Button, Space, Tag, Input, Select, message, Modal, Form, Popconfirm, Card } from 'antd'; import { PlusOutlined, EditOutlined, DeleteOutlined, KeyOutlined, SwapOutlined, EyeOutlined } from '@ant-design/icons'; import { useNavigate } from 'react-router-dom'; import request from '../../utils/request'; import { USER_ROLES, USER_STATUS } from '../../utils/constants'; const { Search } = Input; const { Option } = Select; const UserList = () => { const navigate = useNavigate(); const [loading, setLoading] = useState(false); const [dataSource, setDataSource] = useState([]); const [pagination, setPagination] = useState({ page: 1, limit: 20, total: 0 }); const [filters, setFilters] = useState({}); const [createModalVisible, setCreateModalVisible] = useState(false); const [editModalVisible, setEditModalVisible] = useState(false); const [resetPasswordModalVisible, setResetPasswordModalVisible] = useState(false); const [transferModalVisible, setTransferModalVisible] = useState(false); const [currentUser, setCurrentUser] = useState(null); const [allUsers, setAllUsers] = useState([]); const [createForm] = Form.useForm(); const [editForm] = Form.useForm(); const [resetPasswordForm] = Form.useForm(); const [transferForm] = Form.useForm(); useEffect(() => { fetchData(); }, [pagination.page, pagination.limit, filters]); useEffect(() => { fetchAllUsers(); }, []); const fetchData = async () => { setLoading(true); try { const params = { page: pagination.page, limit: pagination.limit, ...filters }; const response = await request.get('/users', { params }); if (response.success) { setDataSource(response.data.users || []); setPagination(prev => ({ ...prev, total: response.data.pagination.total })); } } catch (error) { message.error('获取用户列表失败'); } finally { setLoading(false); } }; const fetchAllUsers = async () => { try { const response = await request.get('/users', { params: { limit: 1000 } }); if (response.success) { setAllUsers(response.data.users || []); } } catch (error) { console.error('获取用户列表失败'); } }; const handleSearch = (value) => { setFilters(prev => ({ ...prev, keyword: value })); setPagination(prev => ({ ...prev, page: 1 })); }; const handleRoleChange = (value) => { setFilters(prev => ({ ...prev, role: value })); setPagination(prev => ({ ...prev, page: 1 })); }; const handleStatusChange = (value) => { setFilters(prev => ({ ...prev, status: value })); setPagination(prev => ({ ...prev, page: 1 })); }; const handleCreate = async (values) => { try { const response = await request.post('/users', values); if (response.success) { message.success('用户创建成功'); setCreateModalVisible(false); createForm.resetFields(); fetchData(); fetchAllUsers(); } } catch (error) { message.error(error.message || '创建用户失败'); } }; const handleEdit = async (values) => { try { const response = await request.put(`/users/${currentUser.id}`, values); if (response.success) { message.success('用户信息更新成功'); setEditModalVisible(false); editForm.resetFields(); setCurrentUser(null); fetchData(); fetchAllUsers(); } } catch (error) { message.error(error.message || '更新用户失败'); } }; const handleResetPassword = async (values) => { try { const response = await request.post(`/users/${currentUser.id}/reset-password`, values); if (response.success) { message.success('密码重置成功'); setResetPasswordModalVisible(false); resetPasswordForm.resetFields(); setCurrentUser(null); } } catch (error) { message.error(error.message || '重置密码失败'); } }; const handleDelete = async (id) => { try { const response = await request.delete(`/users/${id}`); if (response.success) { message.success('用户已禁用'); fetchData(); } } catch (error) { message.error(error.message || '禁用用户失败'); } }; const handleTransfer = async (values) => { try { const response = await request.post('/users/transfer-customers', values); if (response.success) { message.success(response.message); setTransferModalVisible(false); transferForm.resetFields(); fetchData(); } } catch (error) { message.error(error.message || '转移客户失败'); } }; const showEditModal = (record) => { setCurrentUser(record); editForm.setFieldsValue(record); setEditModalVisible(true); }; const showResetPasswordModal = (record) => { setCurrentUser(record); setResetPasswordModalVisible(true); }; const columns = [ { title: '用户名', dataIndex: 'username', key: 'username', fixed: 'left', width: 120, }, { title: '姓名', dataIndex: 'real_name', key: 'real_name', width: 100, }, { title: '角色', dataIndex: 'role', key: 'role', width: 120, render: (role) => { const roleInfo = USER_ROLES.find(r => r.value === role); return {roleInfo?.label || role}; }, }, { title: '部门', dataIndex: 'department', key: 'department', width: 100, }, { title: '团队', dataIndex: 'team', key: 'team', width: 100, }, { title: '邮箱', dataIndex: 'email', key: 'email', width: 180, }, { title: '手机', dataIndex: 'phone', key: 'phone', width: 120, }, { title: '客户数', dataIndex: 'customer_count', key: 'customer_count', width: 80, render: (count) => count || 0, }, { title: '成交数', dataIndex: 'closed_count', key: 'closed_count', width: 80, render: (count) => {count || 0}, }, { title: '状态', dataIndex: 'status', key: 'status', width: 80, render: (status) => { const statusInfo = USER_STATUS.find(s => s.value === status); return {statusInfo?.label || status}; }, }, { title: '最后登录', dataIndex: 'last_login', key: 'last_login', width: 160, render: (time) => time || '从未登录', }, { title: '操作', key: 'action', fixed: 'right', width: 200, render: (_, record) => ( handleDelete(record.id)} okText="确定" cancelText="取消" > ), }, ]; return ( `共 ${total} 条`, onChange: (page, limit) => setPagination({ ...pagination, page, limit }), }} /> {/* 创建用户 Modal */} createForm.submit()} onCancel={() => { setCreateModalVisible(false); createForm.resetFields(); }} width={600} >
{/* 编辑用户 Modal */} editForm.submit()} onCancel={() => { setEditModalVisible(false); editForm.resetFields(); setCurrentUser(null); }} width={600} >
{/* 重置密码 Modal */} resetPasswordForm.submit()} onCancel={() => { setResetPasswordModalVisible(false); resetPasswordForm.resetFields(); setCurrentUser(null); }} >
{/* 转移客户 Modal */} transferForm.submit()} onCancel={() => { setTransferModalVisible(false); transferForm.resetFields(); }} >
); }; export default UserList;