DashboardService
src/golden/Dashboard/DashboardService.ts · task-dashboard.service.ts
Генерує дані для UI-дашборда Dashboard (golden-частина крос-сервісної фічі dashboard). Перелік ендпоінтів — у Swagger.
Суть
Дашборд нічого не рахує з сирих даних на кожен запит. Він читає пре-агреговані стори, які наповнюють добові/тижневі воркери, і на запит лише: ріже по періоду + ролі, групує в тижні, фільтрує онлайн по сесіях закріплення і нулить неактивні тижні. Тому сторінка швидка, але залежна від свіжості воркерів.
Джерела даних (стори)
| Стор | Хто наповнює | Що дає на дашборд |
|---|---|---|
golden_statistics_relations | statistics | Balance, Types of balance, Ladies avg balance, Unique men |
golden_online_time + golden_operators_activity | online-цикл pipeline | Online per week (час онлайн оператора) |
golden_weekly_online_users | online-analysis (онлайн-аналіз) | Total/Average users online + 24-год розклад |
golden_task_dashboards | generate-dashboard (щопн 09:00 UTC) | Tasks per week, % processing, speed, sending |
golden_lady (historyLevel) | — | рівень TU (NEW/LOW/MID/TOP) для розбивки levels |
golden_agensy_list | statistics pipeline | seed «бачених» RU для розрахунку new платників |
Імена/блокування юзерів для дропдаунів і періоди закріплення тімлідів/операторів — через RMQ у stack.
Алгоритм info-endpoint
Чотири ендпоінти (по ролі: director / supervisor / operator / top-manager) працюють на одному ядрі — відрізняється лише обсяг даних, який бачить роль.
- Перевірка межі. Якщо запитувана дата раніше старту історичних даних (1 липня 2024) — одразу повертаємо порожньо.
- Розбивка на тижні. Будуємо список тижнів за пів-року назад від вибраної дати, кожен з датою початку і кінця.
- Вибірка балансів під роль. Дістаємо денні записи балансів за період, звужені під роль:
- director — уся Family (опційно один тімлід);
- supervisor — свій тімлід (опційно один оператор);
- operator — лише себе;
- top-manager — спершу питаємо у
stack, за які тімліди й у які періоди він відповідав, і вже по цих періодах тягнемо баланси.
- Онлайн оператора. Збираємо час онлайн операторів за період. Є історичний розкол: до певної дати онлайн зберігався одним способом (сесіями), після — іншим (інтервалами активності); обидва джерела зливаємо в один потік.
- Періоди закріплення. Для зрізів з тімлідом/топом окремо рахуємо, коли кожен оператор був закріплений за цим тімлідом — щоб не зарахувати онлайн за час, коли оператор у нього ще або вже не працював.
- Онлайн TU/RU. Лише для зрізу всієї Family (без конкретного тімліда) додатково підтягуємо пре-пораховану тижневу статистику онлайну користувачів — скільки TU/RU було онлайн.
- Збірка графіків по тижнях. Для кожного тижня з денних записів рахуємо:
- заробіток — сума всіх бонусів;
- платники — унікальні RU тижня (
all) і ті, кого не бачили раніше (new); - середній баланс по рівнях TU — бонуси розкладаються по рівню анкети (NEW / LOW / MID / TOP), який анкета мала на кінець тижня, і діляться на кількість анкет цього рівня;
- типи балансу — сирі типи операцій зводяться у великі категорії (текст-чат, відео-чат, надсилання/читання листів, інше) і переводяться у відсотки;
- онлайн — сумарний час, відфільтрований по періодах закріплення; поруч із загальним часом — розбивка за sleep-режимом (
onlineSleepSec/onlineNonSleepSec), щоб UI міг показати відсоток часу в sleep. Якщо для тижня є статистика онлайну користувачів — дописуємо total і average онлайн.
- Обрив у майбутньому. Тижні пізніше останнього наявного дня даних віддаються порожніми — графік обривається, а не малює нулі.
- Обнулення неактивних тижнів. Для зрізу по конкретному юзеру піднімаємо його лог за пів-року і обнуляємо тижні, коли він був заблокований або не закріплений — щоб не показувати чужі чи неактивні періоди.
Алгоритм tasks
Таски на дашборд не рахуються на льоту — читаються вже зведені по тижнях (їх готує окремий воркер, generate-dashboard).
- Та сама розбивка на тижні.
- Вибірка зведень під роль і фільтри: вся система / по тімліду / по тімліду+оператору / по топу та його розрізах.
- На кожен тиждень — або знайдене зведення, або порожнє.
- Те саме обнулення неактивних тижнів.
Що зі зведення йде на графіки:
- кількість тасків по типах → Tasks per week;
- % опрацювання (вчасно / не вчасно / закрито системою) → % of task processing;
- середня швидкість (середній час від створення таска до відповіді) → Average tasks processing speed;
- відправки (мануальні / автоматичні) → Quantity of sending messages.
Як саме рахуються ці зведення — у generate-dashboard. Тут лише читання з нарізкою по тижнях і обнуленням.
Решта ендпоінтів
- 24-год розклад (drill-down з графіка онлайну) — показує, скільки користувачів було онлайн у яку годину доби (RU, усі TU, наші TU), погодинно. Береться з тієї самої колекції онлайну користувачів (
golden_weekly_online_users). - Списки тімлідів і операторів за період (для дропдаунів) — унікальні id з балансів за період, імена підтягуємо з
stack, стан «заблокований» рахуємо з логів; у кінець списку додається службовий пунктFree Profiles.
Нюанси
- Дашборд — читач пре-агрегатів. Не відпрацював воркер — дані порожні/застарілі. Свіжість: баланси — добовий цикл (~13:06), таски — щопонеділка 09:00 UTC, онлайн користувачів — у складі добового pipeline.
newплатники рахуються від історії. «Бачені» RU підтягуються з agency-списку до початку періоду — тому перший тиждень не роздуваєnew.- Розкол онлайну по даті. До певної дати онлайн зберігався сесіями (старий стор), після — інтервалами активності (новий); на дашборді вони зливаються прозоро. Сесії старого стору та інтервали до появи sleep-режиму (червень 2026) не мають
sleepMode— вони входять у загальний онлайн, але не входять ні вonlineSleepSec, ні вonlineNonSleepSec. - Зріз top-manager доступний лише самому топ-менеджеру (або вище — director передає id топа явно через дропдаун).
- Рівні TU (NEW / LOW / MID / TOP) — це присвоєна анкеті категорія на кінець тижня.
Зв’язки
- dashboard — крос-сервісна фіча, UI-частина
- statistics — наповнює
golden_statistics_relations(головне джерело) - generate-dashboard — наповнює
golden_task_dashboards