From fcf8511ac7254c2a8eb2af4ab20168922e984ad5 Mon Sep 17 00:00:00 2001 From: Oleg Date: Sat, 8 Aug 2026 12:16:58 +0000 Subject: [PATCH] Count agent workload stats across all statuses, sorted by count The "agent workload" chart on the stats page only counted non-closed tickets. Now it counts every ticket regardless of status and sorts agents descending by count, so the busiest agent (by total ticket volume, not just currently-open) shows first. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_012o9j9RezxbZVKQMrB7oRLY --- src/app/(admin)/stats/page.tsx | 6 +++--- src/lib/tickets/service.ts | 18 +++++++++--------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/app/(admin)/stats/page.tsx b/src/app/(admin)/stats/page.tsx index 71daef4..82e3b38 100644 --- a/src/app/(admin)/stats/page.tsx +++ b/src/app/(admin)/stats/page.tsx @@ -28,7 +28,7 @@ export default async function StatsPage() { const stats = await getStatsOverview(); const maxChannelCount = Math.max(...Object.values(stats.channelCounts), 1); - const maxAgentWorkload = Math.max(...stats.agentWorkload.map((a) => a.openCount), 1); + const maxAgentWorkload = Math.max(...stats.agentWorkload.map((a) => a.ticketCount), 1); return (
@@ -89,7 +89,7 @@ export default async function StatsPage() {
-

Загрузка агентов (открытые заявки)

+

Заявки по агентам (все статусы)

{stats.agentWorkload.length === 0 ? (

Пока нет данных.

) : ( @@ -98,7 +98,7 @@ export default async function StatsPage() { diff --git a/src/lib/tickets/service.ts b/src/lib/tickets/service.ts index 0474d37..19a0054 100644 --- a/src/lib/tickets/service.ts +++ b/src/lib/tickets/service.ts @@ -705,7 +705,7 @@ export interface StatsOverview { statusCounts: Record; channelCounts: Record; ticketsPerDay: { label: string; count: number }[]; - agentWorkload: { name: string; openCount: number }[]; + agentWorkload: { name: string; ticketCount: number }[]; } /** @@ -771,20 +771,20 @@ export async function getStatsOverview(): Promise { : null; const agents = await listAgents(); - const openCountByAgent = new Map(); - let unassignedOpen = 0; + const ticketCountByAgent = new Map(); + let unassignedCount = 0; for (const t of allTickets) { - if (t.status === "closed") continue; if (t.assigneeId) { - openCountByAgent.set(t.assigneeId, (openCountByAgent.get(t.assigneeId) ?? 0) + 1); + ticketCountByAgent.set(t.assigneeId, (ticketCountByAgent.get(t.assigneeId) ?? 0) + 1); } else { - unassignedOpen += 1; + unassignedCount += 1; } } - const agentWorkload = agents.map((a) => ({ name: a.name, openCount: openCountByAgent.get(a.id) ?? 0 })); - if (unassignedOpen > 0) { - agentWorkload.push({ name: "Не назначено", openCount: unassignedOpen }); + const agentWorkload = agents.map((a) => ({ name: a.name, ticketCount: ticketCountByAgent.get(a.id) ?? 0 })); + if (unassignedCount > 0) { + agentWorkload.push({ name: "Не назначено", ticketCount: unassignedCount }); } + agentWorkload.sort((a, b) => b.ticketCount - a.ticketCount); return { totalTickets: allTickets.length,