/** * 企业租户管理页 — 列表、搜索、查看详情、编辑套餐、删除 */ import { useEffect, useState } from 'react' import { Search, Building2, Eye, Trash2, Edit2 } from 'lucide-react' import api from '../../lib/api' import { Input, Select, Label } from '../../components/ui/Input' import Button from '../../components/ui/Button' interface Org { id: string; name: string; plan: string; maxEmployees: number city: string | null; contactName: string | null; contactPhone: string | null payrollFrequency: number; retirementReminderEnabled: boolean createdAt: string; updatedAt: string employeeCount: number; userCount: number; contractCount: number; payslipCount: number } const PLAN_LABELS: Record = { FREE: '免费版', PRO: '专业版', ENTERPRISE: '企业版' } const PLAN_COLORS: Record = { FREE: 'bg-gray-100 text-gray-700', PRO: 'bg-blue-50 text-blue-700', ENTERPRISE: 'bg-purple-50 text-purple-700' } export default function PlatformOrgs() { const [orgs, setOrgs] = useState([]) const [total, setTotal] = useState(0) const [page, setPage] = useState(1) const [pageSize] = useState(20) const [search, setSearch] = useState('') const [planFilter, setPlanFilter] = useState('') const [loading, setLoading] = useState(true) const [editOrg, setEditOrg] = useState(null) const [deleteOrg, setDeleteOrg] = useState(null) const fetchOrgs = async () => { setLoading(true) try { const params: any = { page, pageSize } if (search) params.search = search if (planFilter) params.plan = planFilter const res = await api.get('/platform/orgs', { params }) as any setOrgs(res.data.list) setTotal(res.data.total) } finally { setLoading(false) } } useEffect(() => { fetchOrgs() }, [page, planFilter]) useEffect(() => { setPage(1) }, [search, planFilter]) const totalPages = Math.ceil(total / pageSize) const handleSaveEdit = async () => { if (!editOrg) return try { await api.put(`/platform/orgs/${editOrg.id}`, { name: editOrg.name, plan: editOrg.plan, maxEmployees: editOrg.maxEmployees, city: editOrg.city, contactName: editOrg.contactName, contactPhone: editOrg.contactPhone, }) setEditOrg(null) fetchOrgs() } catch (err: any) { alert(err.response?.data?.error?.message || '保存失败') } } const handleDelete = async () => { if (!deleteOrg) return try { await api.delete(`/platform/orgs/${deleteOrg.id}`) setDeleteOrg(null) fetchOrgs() } catch (err: any) { alert(err.response?.data?.error?.message || '删除失败') } } return (

企业租户管理

共 {total} 家企业

{/* 搜索栏 */}
setSearch(e.target.value)} onKeyDown={(e) => e.key === 'Enter' && fetchOrgs()} />
{/* 表格 */}
{loading ? ( ) : orgs.length === 0 ? ( ) : orgs.map((org) => ( ))}
企业名称 套餐 城市 员工数 用户数 合同数 注册时间 操作
加载中...
暂无数据
{org.name}
{org.contactName || '-'} {org.contactPhone || ''}
{PLAN_LABELS[org.plan] || org.plan} {org.city || '-'} {org.employeeCount} {org.userCount} {org.contractCount} {new Date(org.createdAt).toLocaleDateString('zh-CN')}
{/* 分页 */} {totalPages > 1 && (
第 {page} / {totalPages} 页,共 {total} 条
)}
{/* 编辑弹窗 */} {editOrg && (
setEditOrg(null)}>
e.stopPropagation()}>

编辑企业

setEditOrg({ ...editOrg, name: e.target.value })} />
setEditOrg({ ...editOrg, maxEmployees: parseInt(e.target.value) || 0 })} />
setEditOrg({ ...editOrg, city: e.target.value })} />
)} {/* 删除确认 */} {deleteOrg && (
setDeleteOrg(null)}>
e.stopPropagation()}>

确认删除

此操作不可撤销,将级联删除所有数据

确定要删除企业「{deleteOrg.name}」吗? 该企业下有 {deleteOrg.employeeCount} 名员工、{deleteOrg.contractCount} 份合同、{deleteOrg.payslipCount} 条工资条,都将被永久删除。

)}
) }