import React, { useState, useEffect, useMemo } from 'react'; import { Card, CardHeader, CardTitle, CardContent } from '@/components/ui/card'; import { Table, TableHeader, TableBody, TableRow, TableHead, TableCell } from '@/components/ui/table'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { useToast } from '@/components/ui/use-toast'; import { Loader2, Plus, Edit, Trash2, ChevronRight, ChevronDown, Building2, Network, CheckCircle, XCircle } from 'lucide-react'; import { getDepartmentTree, getUsers } from './service'; import type { DepartmentResponse } from './types'; import type { UserResponse } from '../User/types'; import request from '@/utils/request'; import EditDialog from './components/EditDialog'; import DeleteDialog from './components/DeleteDialog'; /** * 部门管理页面 */ const DepartmentPage: React.FC = () => { const { toast } = useToast(); const [loading, setLoading] = useState(false); const [departmentTree, setDepartmentTree] = useState([]); const [users, setUsers] = useState([]); const [expandedKeys, setExpandedKeys] = useState>(new Set()); const [editDialogOpen, setEditDialogOpen] = useState(false); const [editRecord, setEditRecord] = useState(); const [deleteDialogOpen, setDeleteDialogOpen] = useState(false); const [deleteRecord, setDeleteRecord] = useState(null); // 加载部门树 const loadDepartmentTree = async () => { try { setLoading(true); const data = await getDepartmentTree(); setDepartmentTree(data); // 默认展开所有节点 const allIds = new Set(); const collectIds = (depts: DepartmentResponse[]) => { depts.forEach(dept => { if (dept.children && dept.children.length > 0) { allIds.add(dept.id); collectIds(dept.children); } }); }; collectIds(data); setExpandedKeys(allIds); } catch (error) { console.error('加载部门数据失败:', error); toast({ title: '加载失败', description: error instanceof Error ? error.message : '未知错误', variant: 'destructive' }); } finally { setLoading(false); } }; // 加载用户列表 const loadUsers = async () => { try { const response = await getUsers(); setUsers(response.content || []); } catch (error) { console.error('加载用户列表失败:', error); } }; useEffect(() => { loadDepartmentTree(); loadUsers(); }, []); // 新增 const handleCreate = () => { setEditRecord(undefined); setEditDialogOpen(true); }; // 编辑 const handleEdit = (record: DepartmentResponse) => { setEditRecord(record); setEditDialogOpen(true); }; // 删除 const handleDelete = (record: DepartmentResponse) => { setDeleteRecord(record); setDeleteDialogOpen(true); }; const confirmDelete = async () => { if (!deleteRecord) return; try { await request.delete(`/api/v1/department/${deleteRecord.id}`); toast({ title: '删除成功', description: `部门 "${deleteRecord.name}" 已删除`, }); loadDepartmentTree(); setDeleteDialogOpen(false); setDeleteRecord(null); } catch (error) { console.error('删除失败:', error); toast({ title: '删除失败', description: error instanceof Error ? error.message : '未知错误', variant: 'destructive' }); } }; // 切换展开/收起 const toggleExpand = (id: number) => { setExpandedKeys(prev => { const newSet = new Set(prev); if (newSet.has(id)) { newSet.delete(id); } else { newSet.add(id); } return newSet; }); }; // 获取状态徽章 const getStatusBadge = (enabled: boolean) => { return enabled ? ( 启用 ) : ( 禁用 ); }; // 递归渲染部门行 const renderDepartmentRow = (dept: DepartmentResponse, level: number = 0): React.ReactNode[] => { const hasChildren = dept.children && dept.children.length > 0; const isExpanded = expandedKeys.has(dept.id); const rows: React.ReactNode[] = []; // 当前部门行 rows.push(
{hasChildren ? ( ) : ( )} {dept.name}
{dept.code} {dept.description || '-'} {dept.sort} {dept.leaderName || '-'} {getStatusBadge(dept.enabled)}
); // 递归渲染子部门 if (hasChildren && isExpanded) { dept.children!.forEach(child => { rows.push(...renderDepartmentRow(child, level + 1)); }); } return rows; }; // 统计数据 const stats = useMemo(() => { const countDepartments = (depts: DepartmentResponse[]): { total: number; enabled: number; disabled: number } => { let total = 0; let enabled = 0; let disabled = 0; const traverse = (dept: DepartmentResponse) => { total++; if (dept.enabled) enabled++; else disabled++; if (dept.children) { dept.children.forEach(traverse); } }; depts.forEach(traverse); return { total, enabled, disabled }; }; return countDepartments(departmentTree); }, [departmentTree]); return (

部门管理

管理组织架构,设置部门层级和负责人。

{/* 统计卡片 */}
总部门数
{stats.total}

所有部门

启用部门
{stats.enabled}

正常使用

禁用部门
{stats.disabled}

已停用

部门列表 {/* 表格 */}
部门名称 部门编码 部门描述 排序 负责人 状态 操作 {loading ? (
加载中...
) : departmentTree.length > 0 ? ( departmentTree.map(dept => renderDepartmentRow(dept)) ) : (
暂无部门数据
点击右上角"新增部门"开始创建部门。
)}
{/* 编辑对话框 */} {/* 删除确认对话框 */}
); }; export default DepartmentPage;