From e4a60a985e7c884338665369d53e8a9b6b834498 Mon Sep 17 00:00:00 2001 From: selfrelease Date: Wed, 29 Jul 2026 12:31:09 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20Dashboard=20=E5=90=88=E5=90=8C=E5=8D=A1?= =?UTF-8?q?=E7=89=87=E6=98=BE=E7=A4=BA=E6=9C=89=E6=95=88=E5=90=88=E5=90=8C?= =?UTF-8?q?=E6=95=B0=20+=20=E6=80=BB=E5=90=88=E5=90=8C=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/src/routes/platform.routes.ts | 12 +++++++++++- frontend/src/pages/platform/PlatformDashboard.tsx | 4 +++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/backend/src/routes/platform.routes.ts b/backend/src/routes/platform.routes.ts index 31ef391..310aa28 100644 --- a/backend/src/routes/platform.routes.ts +++ b/backend/src/routes/platform.routes.ts @@ -20,11 +20,20 @@ router.use(authMiddleware, platformAdminMiddleware) */ router.get('/dashboard', async (_req: AuthRequest, res, next) => { try { - const [orgs, users, employees, contracts, payslips] = await Promise.all([ + const now = new Date() + const [orgs, users, employees, contracts, activeContracts, payslips] = await Promise.all([ prisma.organization.count(), prisma.user.count({ where: { role: { not: 'SUPER_ADMIN' } } }), prisma.employee.count(), prisma.laborContract.count(), + prisma.laborContract.count({ + where: { + OR: [ + { endDate: null }, + { endDate: { gte: now } }, + ], + }, + }), prisma.payslip.count(), ]) @@ -52,6 +61,7 @@ router.get('/dashboard', async (_req: AuthRequest, res, next) => { totalUsers: users, totalEmployees: employees, totalContracts: contracts, + activeContracts, totalPayslips: payslips, orgsByPlan: orgsByPlan.map((g: any) => ({ plan: g.plan, count: g._count })), recentOrgs: recentOrgs.map((o: any) => ({ diff --git a/frontend/src/pages/platform/PlatformDashboard.tsx b/frontend/src/pages/platform/PlatformDashboard.tsx index 6d42456..952a007 100644 --- a/frontend/src/pages/platform/PlatformDashboard.tsx +++ b/frontend/src/pages/platform/PlatformDashboard.tsx @@ -11,6 +11,7 @@ interface DashboardData { totalUsers: number totalEmployees: number totalContracts: number + activeContracts: number totalPayslips: number orgsByPlan: { plan: string; count: number }[] recentOrgs: { @@ -38,7 +39,7 @@ export default function PlatformDashboard() { { label: '企业总数', value: data.totalOrgs, icon: Building2, color: 'text-primary' }, { label: '用户总数', value: data.totalUsers, icon: Users, color: 'text-blue-600' }, { label: '员工总数', value: data.totalEmployees, icon: Users, color: 'text-emerald-600' }, - { label: '合同总数', value: data.totalContracts, icon: FileText, color: 'text-purple-600' }, + { label: '有效合同', value: data.activeContracts, sub: `共 ${data.totalContracts} 份`, icon: FileText, color: 'text-purple-600' }, { label: '工资条总数', value: data.totalPayslips, icon: Calculator, color: 'text-rose-600' }, ] @@ -60,6 +61,7 @@ export default function PlatformDashboard() {
{s.value.toLocaleString()}
+ {(s as any).sub &&
{(s as any).sub}
} ) })}