生产管理系统 - 员工管理列表联调

This commit is contained in:
2025-11-04 15:55:29 +08:00
parent aec67101cb
commit fffd37a0a9
23 changed files with 2251 additions and 276 deletions

View File

@@ -10,10 +10,25 @@ import { EmployeeList } from './components/EmployeeList';
import { EmployeeFormDialog } from './components/EmployeeFormDialog';
import { EmployeeDetailDialog } from './components/EmployeeDetailDialog';
import { Employee, Role, EmployeeFilters, EmployeeFormData } from './types';
import {
fetchEmployees,
transformEmployeesList,
PaginationState,
EmployeesQueryParams
} from './components/employeeApi';
export default function EmployeeManagementPage() {
const [employees, setEmployees] = useState<Employee[]>([]);
const [roles, setRoles] = useState<Role[]>([]);
const [loading, setLoading] = useState(false);
const [pagination, setPagination] = useState<PaginationState>({
page: 1,
size: 10,
total: 0,
totalPages: 0,
hasNext: false,
hasPrev: false,
});
const [filters, setFilters] = useState<EmployeeFilters>({
searchKeyword: '',
statusFilter: 'all'
@@ -26,13 +41,16 @@ export default function EmployeeManagementPage() {
enterpriseId: 'ent-2',
enterpriseName: '丰收现代农业集团',
status: 'active',
auditStatus: 'pending',
roleIds: [],
idCard: '',
address: '',
});
useEffect(() => {
loadEmployees();
loadRoles();
}, []);
}, [pagination.page, pagination.size,filters.searchKeyword, filters.statusFilter]);
const loadRoles = () => {
const data = localStorage.getItem('smart_agriculture_roles');
@@ -41,79 +59,83 @@ export default function EmployeeManagementPage() {
}
};
const loadEmployees = () => {
const data = localStorage.getItem('smart_agriculture_employees');
if (data) {
setEmployees(JSON.parse(data));
} else {
// 初始化示例数据
const mockEmployees: Employee[] = [
{
id: 'emp-1',
enterpriseId: 'ent-2',
enterpriseName: '丰收现代农业集团',
username: 'zhangsan',
name: '张三',
phone: '13800138001',
email: 'zhangsan@example.com',
department: '技术部',
position: '农机操作员',
roleIds: ['role-3'],
roles: ['操作员'],
status: 'active',
createdAt: '2024-10-01T08:00:00',
updatedAt: '2024-10-01T08:00:00',
lastLoginTime: '2024-10-14T09:30:00',
},
{
id: 'emp-2',
enterpriseId: 'ent-2',
enterpriseName: '丰收现代农业集团',
username: 'lisi',
name: '李四',
phone: '13900139002',
email: 'lisi@example.com',
department: '管理部',
position: '部门主管',
roleIds: ['role-2'],
roles: ['企业管理员'],
status: 'active',
createdAt: '2024-10-02T10:00:00',
updatedAt: '2024-10-02T10:00:00',
lastLoginTime: '2024-10-14T08:15:00',
},
{
id: 'emp-3',
enterpriseId: 'ent-2',
enterpriseName: '丰收现代农业集团',
username: 'wangwu',
name: '王五',
phone: '13700137003',
department: '维修部',
position: '维修技师',
roleIds: ['role-3'],
roles: ['操作员'],
status: 'frozen',
createdAt: '2024-09-28T14:00:00',
updatedAt: '2024-10-10T16:00:00',
},
];
localStorage.setItem('smart_agriculture_employees', JSON.stringify(mockEmployees));
setEmployees(mockEmployees);
const loadEmployees = async () => {
setLoading(true);
try {
const queryParams: EmployeesQueryParams = {
page: pagination.page,
size: pagination.size,
sort_order: 'desc'
};
// 如果有搜索关键词,添加到查询参数
if (filters.searchKeyword) {
queryParams.search = filters.searchKeyword;
}
// 如果有状态筛选,添加到查询参数
if (filters.statusFilter !== 'all') {
// 注意API可能不支持直接的状态筛选这里暂时在客户端过滤
}
const response = await fetchEmployees(queryParams);
// 转换数据格式
const transformedEmployees = transformEmployeesList(response.data);
// 应用状态筛选如果API不支持
const filteredEmployees = filters.statusFilter === 'all'
? transformedEmployees
: transformedEmployees.filter(emp => {
const status = emp.isActive ? 'active' : 'frozen';
return status === filters.statusFilter;
});
setEmployees(filteredEmployees);
setPagination({
page: response.page,
size: response.size,
total: response.total,
totalPages: response.total_pages,
hasNext: response.has_next,
hasPrev: response.has_prev,
});
} catch (error) {
console.error('Failed to load employees:', error);
toast.error('加载员工数据失败');
// 如果API失败使用localStorage中的数据
const data = localStorage.getItem('smart_agriculture_employees');
if (data) {
setEmployees(JSON.parse(data));
}
} finally {
setLoading(false);
}
};
const filteredEmployees = employees.filter(emp => {
const matchKeyword = !filters.searchKeyword ||
emp.name.includes(filters.searchKeyword) ||
emp.username.includes(filters.searchKeyword) ||
emp.phone.includes(filters.searchKeyword) ||
(emp.department && emp.department.includes(filters.searchKeyword));
// 搜索处理函数
const handleSearch = (searchKeyword: string) => {
setFilters(prev => ({ ...prev, searchKeyword }));
// 重置到第一页
setPagination(prev => ({ ...prev, page: 1 }));
};
const matchStatus = filters.statusFilter === 'all' || emp.status === filters.statusFilter;
// 状态筛选处理函数
const handleStatusFilter = (statusFilter: string) => {
setFilters(prev => ({ ...prev, statusFilter }));
// 重置到第一页
setPagination(prev => ({ ...prev, page: 1 }));
};
return matchKeyword && matchStatus;
});
// 分页处理函数
const handlePageChange = (page: number) => {
setPagination(prev => ({ ...prev, page }));
};
const handlePageSizeChange = (size: number) => {
setPagination(prev => ({ ...prev, size, page: 1 }));
};
const handleAddEmployee = () => {
setEditingEmployee(null);
@@ -121,7 +143,10 @@ export default function EmployeeManagementPage() {
enterpriseId: 'ent-2',
enterpriseName: '丰收现代农业集团',
status: 'active',
auditStatus: 'pending',
roleIds: [],
idCard: '',
address: '',
});
setShowForm(true);
};
@@ -169,6 +194,7 @@ export default function EmployeeManagementPage() {
id: `emp-${Date.now()}`,
...formData as Employee,
roles: roleNames,
auditStatus: 'pending',
createdAt: new Date().toISOString(),
updatedAt: new Date().toISOString(),
};
@@ -212,6 +238,44 @@ export default function EmployeeManagementPage() {
setShowDetailDialog(true);
};
const handleAudit = (employee: Employee, action: 'approve' | 'reject') => {
if (action === 'approve') {
const updated = employees.map(emp =>
emp.id === employee.id
? {
...emp,
auditStatus: 'approved' as const,
auditTime: new Date().toISOString(),
auditor: '当前用户',
updatedAt: new Date().toISOString(),
}
: emp
);
setEmployees(updated);
localStorage.setItem('smart_agriculture_employees', JSON.stringify(updated));
toast.success('审核通过');
} else {
const reason = prompt('请输入驳回原因:');
if (reason) {
const updated = employees.map(emp =>
emp.id === employee.id
? {
...emp,
auditStatus: 'rejected' as const,
auditReason: reason,
auditTime: new Date().toISOString(),
auditor: '当前用户',
updatedAt: new Date().toISOString(),
}
: emp
);
setEmployees(updated);
localStorage.setItem('smart_agriculture_employees', JSON.stringify(updated));
toast.success('已驳回');
}
}
};
return (
<div className="space-y-6">
<EmployeeManagementHeader
@@ -224,17 +288,23 @@ export default function EmployeeManagementPage() {
{/* 搜索和筛选 */}
<EmployeeManagementFilters
filters={filters}
onFiltersChange={setFilters}
onSearchChange={handleSearch}
onStatusFilterChange={handleStatusFilter}
/>
{/* 员工列表 */}
<EmployeeList
employees={filteredEmployees}
employees={employees}
loading={loading}
pagination={pagination}
onPageChange={handlePageChange}
onPageSizeChange={handlePageSizeChange}
onViewDetail={handleViewDetail}
onEdit={handleEdit}
onResetPassword={handleResetPassword}
onToggleStatus={handleToggleStatus}
onDelete={handleDelete}
onAudit={handleAudit}
/>
{/* 添加/编辑表单 */}