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) => (
}
onClick={() => navigate(`/users/${record.id}`)}
>
详情
}
onClick={() => showEditModal(record)}
>
编辑
}
onClick={() => showResetPasswordModal(record)}
>
重置密码
handleDelete(record.id)}
okText="确定"
cancelText="取消"
>
}>
禁用
),
},
];
return (
}
onClick={() => setTransferModalVisible(true)}
>
转移客户
}
onClick={() => setCreateModalVisible(true)}
>
新建用户