GoldenFavoritesService
src/golden/favorites/GoldenFavoritesService.ts · GoldenFavoritesController.ts
Як RU стають фаворитами TU, коли це оновлюється, що читається на екран Favorites. Перелік ендпоінтів — у Swagger.
Сховище
golden_favorites— одна пара TU↔RU = один запис (ladyId_api×manId_api). Тримає агрегованіprofitіgifts, межі активності (startDate,lastDate,time), мітки (type,contacts+contactDetails,blocked,blockedByTU,name,note).golden_calendar— по одному запису на пару (TU, yearMonth) з масивом днів:uniqueList(усі RU з витратою в цей день) іnewList(ті, кого до цього дня ще не бачили в історії).golden_other_bonuses— бонуси по TU які вона заробила не у нас в компанії.- Нотатки по фавориту — окрема колекція.
Як RU стає фаворитом
Фаворитом стає будь-який RU, що зробив витратну операцію на TU. Перевірка йде по обʼєднаному набору з golden_statistic і golden_other_bonuses за умовами:
- тип операції не в
GoldenIgnoredAggregateTypes(службові/ігноровані типи відкидаються); sum != 0;
Для кожної унікальної пари (TU, RU) рахуємо:
- profit = сума витрат не-подарункового типу;
- gifts = кількість операцій типу з
GoldenGiftsTypes; - startDate = найраніша дата витрати;
- lastDate / time = найпізніша дата + час витрати.
Якщо запису пари ще нема — створюється з дефолтами (type: New, contacts: No, blocked: false, порожні name/note). Якщо є — поля профілю активності перезаписуються, мітки (type, name, note, blocked, contacts) не чіпаються (вони ведуться оператором).
Коли оновлюється
Щодоби в пайплайні статистики
крок #4 downloadMainStatistics (~13:06)
updateFavoritesV2 викликається з statistics після того, як свіжа добова статистика вже лягла у golden_statistic. Тому фаворити «доганяють» статистику з тим самим тимінгом — не свіжіше.
Календар у тому ж циклі
updateCalendarItems — у складі генерації статистики V2
По кожній TU з нової порції бонусів довантажуємо/створюємо місяць у golden_calendar: додаємо manId_api у uniqueList дня (якщо ще нема в дні) і у newList дня (якщо RU взагалі не бачили раніше в історії цієї TU).
Ручний тригер
convertContacts · роль technical_department
Перебудувати фаворитів вручну (повний updateFavoritesV2). Адмінська дія, не для звичайних ролей.
Init (одноразово)
initFavorites · initCalendarItems · роль technical_department
Повна побудова з нуля по всіх TU. Використовується при налаштуванні / після значних змін схеми. У звичайному циклі не потрібні.
Алгоритм оновлення фаворитів
updateFavoritesV2
- Зливаємо
golden_statistic+golden_other_bonusesв один потік. - Фільтруємо: тип не ігнорований,
sum != 0, єladyId_api+manId_api. - Групуємо по
(ladyId_api, manId_api)і рахуємоprofit/gifts/startDate/lastDate/lastTime. - Bulk upsert у
golden_favorites: оновлюємо лишеprofit / gifts / startDate / lastDate / time; решту полів проставляємо тільки при вставці ($setOnInsert). - Тригеримо перерахунок global-favorites (для крос-TU екрану).
Алгоритм оновлення календаря
updateCalendarItems
- Беремо унікальні TU зі свіжої порції бонусів, тягнемо їхні існуючі місяці з
golden_calendar. - Для кожної TU збираємо seed «всі вже бачені RU» (із усіх існуючих днів усіх її місяців).
- По хронології (sort за date+time) проходимо бонуси: для кожного беремо місяць (новий або існуючий) і день; додаємо
manId_apiуuniqueList(якщо ще не в дні) і уnewList(якщо ще не в seed «бачених»). - Записуємо: оновлюємо існуючий запис місяця або створюємо новий.
«New men» = RU, що зʼявився в історії TU уперше в цей день; не «нових за тиждень/місяць».
Нюанси
- Active Favorite (зелений рядок на UI) на golden рахується на фронті з
lastDate(<7 днів). Окремого прапора вgolden_favoritesнема. - Мітки оператора не затираються при оновленні —
type,name,note,blocked,contactsживуть незалежно від агрегатних полів. - Свіжість фаворитів = свіжість статистики. Не відпрацював добовий download — список не оновився.
- «New men» у календарі — означає «вперше зʼявився у цієї TU за всю історію», а не «новий цього місяця/тижня».
Зв’язки
- favorites — UI-екран Favorites (per-family)
- favorites — крос-сервісна фіча
- statistics — пайплайн, з якого тригериться
updateFavoritesV2(крок #4)