From 94e2d1a19c1affaedee52b553f866df954002df6 Mon Sep 17 00:00:00 2001 From: Andrey Date: Thu, 9 Jul 2026 15:05:37 +0300 Subject: [PATCH] feat(departments): add AI agent count to department cards MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit В состав отдела (card meta) вернул AI-агентов, как в исходной sales-карточке: «N сотрудник(ов) · M операторов · K AI-агент(ов)». - Backend: _department_payload отдаёт agentCount — реальное число AIAgent на каналах отдела (channel.department, ADR-HUB-0019). - Frontend: тип Department.agentCount; обе карточки (sales + support). --- apps/backend/hub_platform/identity/company_views.py | 5 +++++ .../internal-ui/src/features/departments/DepartmentsPage.tsx | 4 ++-- apps/internal-ui/src/types.ts | 1 + 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/apps/backend/hub_platform/identity/company_views.py b/apps/backend/hub_platform/identity/company_views.py index b5dbecf..bdc8d94 100644 --- a/apps/backend/hub_platform/identity/company_views.py +++ b/apps/backend/hub_platform/identity/company_views.py @@ -3,6 +3,7 @@ from rest_framework.request import Request from rest_framework.response import Response from rest_framework.views import APIView +from hub_platform.ai.models import AIAgent from hub_platform.identity.models import Department, EmployeeRole @@ -10,6 +11,9 @@ def _department_payload(department: Department) -> dict[str, object]: employees = list(department.employees.select_related("user").all()) operators = [employee for employee in employees if employee.role == EmployeeRole.OPERATOR] products = [link.product for link in department.product_links.select_related("product").order_by("product__name")] + # AI-агенты отдела: AIAgent живёт на канале обработки (ADR-HUB-0019), + # канал принадлежит отделу. Считаем активных агентов каналов этого отдела. + agent_count = AIAgent.objects.filter(channel__department=department).count() return { "id": department.id, "code": department.code, @@ -20,6 +24,7 @@ def _department_payload(department: Department) -> dict[str, object]: "activeOperatorCount": len( [employee for employee in operators if employee.user.is_active and not employee.is_blocked] ), + "agentCount": agent_count, "products": [{"code": product.code, "name": product.name} for product in products], } diff --git a/apps/internal-ui/src/features/departments/DepartmentsPage.tsx b/apps/internal-ui/src/features/departments/DepartmentsPage.tsx index 451090c..058ddb3 100644 --- a/apps/internal-ui/src/features/departments/DepartmentsPage.tsx +++ b/apps/internal-ui/src/features/departments/DepartmentsPage.tsx @@ -42,7 +42,7 @@ export function DepartmentsPage({ data, setRoute }: { data: AppData; setRoute: (
Состав - {sales.memberCount} сотрудник(ов) · {sales.operatorCount} операторов + {sales.memberCount} сотрудник(ов) · {sales.operatorCount} операторов · {sales.agentCount} AI-агент(ов)
Связанные продукты @@ -82,7 +82,7 @@ export function DepartmentsPage({ data, setRoute }: { data: AppData; setRoute: (
Состав - {support.memberCount} сотрудник(ов) · {support.operatorCount} операторов + {support.memberCount} сотрудник(ов) · {support.operatorCount} операторов · {support.agentCount} AI-агент(ов)
Связанные продукты diff --git a/apps/internal-ui/src/types.ts b/apps/internal-ui/src/types.ts index 3441348..b060a2a 100644 --- a/apps/internal-ui/src/types.ts +++ b/apps/internal-ui/src/types.ts @@ -48,6 +48,7 @@ export type Department = { memberCount: number; operatorCount: number; activeOperatorCount: number; + agentCount: number; products: Array<{ code: string; name: string }>; };