dashboard

DashboardService

src/golden/Dashboard/DashboardService.ts · task-dashboard.service.ts

Генерує дані для UI-дашборда Dashboard (golden-частина крос-сервісної фічі dashboard). Перелік ендпоінтів — у Swagger.

Суть

Дашборд нічого не рахує з сирих даних на кожен запит. Він читає пре-агреговані стори, які наповнюють добові/тижневі воркери, і на запит лише: ріже по періоду + ролі, групує в тижні, фільтрує онлайн по сесіях закріплення і нулить неактивні тижні. Тому сторінка швидка, але залежна від свіжості воркерів.

Джерела даних (стори)

СторХто наповнюєЩо дає на дашборд
golden_statistics_relationsstatisticsBalance, Types of balance, Ladies avg balance, Unique men
golden_online_time + golden_operators_activityonline-цикл pipelineOnline per week (час онлайн оператора)
golden_weekly_online_usersonline-analysis (онлайн-аналіз)Total/Average users online + 24-год розклад
golden_task_dashboardsgenerate-dashboard (щопн 09:00 UTC)Tasks per week, % processing, speed, sending
golden_lady (historyLevel)рівень TU (NEW/LOW/MID/TOP) для розбивки levels
golden_agensy_liststatistics pipelineseed «бачених» RU для розрахунку new платників

Імена/блокування юзерів для дропдаунів і періоди закріплення тімлідів/операторів — через RMQ у stack.

Алгоритм info-endpoint

Чотири ендпоінти (по ролі: director / supervisor / operator / top-manager) працюють на одному ядрі — відрізняється лише обсяг даних, який бачить роль.

  1. Перевірка межі. Якщо запитувана дата раніше старту історичних даних (1 липня 2024) — одразу повертаємо порожньо.
  2. Розбивка на тижні. Будуємо список тижнів за пів-року назад від вибраної дати, кожен з датою початку і кінця.
  3. Вибірка балансів під роль. Дістаємо денні записи балансів за період, звужені під роль:
    • director — уся Family (опційно один тімлід);
    • supervisor — свій тімлід (опційно один оператор);
    • operator — лише себе;
    • top-manager — спершу питаємо у stack, за які тімліди й у які періоди він відповідав, і вже по цих періодах тягнемо баланси.
  4. Онлайн оператора. Збираємо час онлайн операторів за період. Є історичний розкол: до певної дати онлайн зберігався одним способом (сесіями), після — іншим (інтервалами активності); обидва джерела зливаємо в один потік.
  5. Періоди закріплення. Для зрізів з тімлідом/топом окремо рахуємо, коли кожен оператор був закріплений за цим тімлідом — щоб не зарахувати онлайн за час, коли оператор у нього ще або вже не працював.
  6. Онлайн TU/RU. Лише для зрізу всієї Family (без конкретного тімліда) додатково підтягуємо пре-пораховану тижневу статистику онлайну користувачів — скільки TU/RU було онлайн.
  7. Збірка графіків по тижнях. Для кожного тижня з денних записів рахуємо:
    • заробіток — сума всіх бонусів;
    • платники — унікальні RU тижня (all) і ті, кого не бачили раніше (new);
    • середній баланс по рівнях TU — бонуси розкладаються по рівню анкети (NEW / LOW / MID / TOP), який анкета мала на кінець тижня, і діляться на кількість анкет цього рівня;
    • типи балансу — сирі типи операцій зводяться у великі категорії (текст-чат, відео-чат, надсилання/читання листів, інше) і переводяться у відсотки;
    • онлайн — сумарний час, відфільтрований по періодах закріплення; поруч із загальним часом — розбивка за sleep-режимом (onlineSleepSec / onlineNonSleepSec), щоб UI міг показати відсоток часу в sleep. Якщо для тижня є статистика онлайну користувачів — дописуємо total і average онлайн.
  8. Обрив у майбутньому. Тижні пізніше останнього наявного дня даних віддаються порожніми — графік обривається, а не малює нулі.
  9. Обнулення неактивних тижнів. Для зрізу по конкретному юзеру піднімаємо його лог за пів-року і обнуляємо тижні, коли він був заблокований або не закріплений — щоб не показувати чужі чи неактивні періоди.

Алгоритм tasks

Таски на дашборд не рахуються на льоту — читаються вже зведені по тижнях (їх готує окремий воркер, generate-dashboard).

  1. Та сама розбивка на тижні.
  2. Вибірка зведень під роль і фільтри: вся система / по тімліду / по тімліду+оператору / по топу та його розрізах.
  3. На кожен тиждень — або знайдене зведення, або порожнє.
  4. Те саме обнулення неактивних тижнів.

Що зі зведення йде на графіки:

  • кількість тасків по типах → 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