entity tasks

Tasks

Таски

src/main/lady/task.service.ts · src/main/lady/task-factory.ts · src/shared/interfaces/task.interface.ts

Таски — сигнали для оператора що треба зробити. Прив’язані до пари TU + RU. UI — Tasks Column.


Типи тасків

ТипСлотКолірТаймер UIТригер
ActiveChatчат🟡 yellow50 секPaid chat розпочато
UnansweredMessageчат🟡 yellow50 секRU написав повідомлення
NeedToWriteMessageчат🟢 green2 хвTU написала, RU мовчить 10+ хв
Likeчат🔵 blue50 секRU лайкнув анкету
UnansweredMailпошта🟡 yellow15 хвRU надіслав листа
NeedToWriteMailпошта🟢 green15 хвTU написала листа, відповіді немає
UnansweredEmailemail🟡 yellow1 годВхідний email від RU (підключений email)

Генератори: TaskChatService, TaskMailService, EmailService.


Два незалежні слоти на пару TU+RU

СлотТипи тасків
ЧатUnansweredMessage, NeedToWriteMessage, Like, ActiveChat
ПоштаUnansweredMail, NeedToWriteMail
EmailUnansweredEmail

У кожному слоті — максимум один активний таск.


ActiveChat — 4 підтипи (title)

ActiveChat — єдиний тип що мутує всередині себе. Підтип зберігається в config.title:

TitleОписКолір
Chat: activePaid chat активний, повідомлень від RU немає🟡 yellow
Chat: active-unansweredPaid chat активний, RU написав — оператор не відповів🟡 yellow
Chat: finished-unansweredPaid chat завершено, є непрочитане від RU🟡 yellow
Chat: finished-write-againPaid chat завершено, повідомлень від RU не було🟡 yellow

Мутації чат-слоту

Прийшло повідомлення від RU

Поточний таскДія
НемаєСтворити UnansweredMessage
UnansweredMessageНічого не робити
ChatActiveЗмінити title → Chat: active-unanswered
NeedToWriteMessageЗакрити → створити UnansweredMessage
LikeЗакрити → створити UnansweredMessage
Поточний таскДія
НемаєСтворити ChatActive
ChatFinishedUnansweredЗмінити title → ChatActiveUnanswered
ChatFinishedWriteAgainЗмінити title → ChatActive
UnansweredMessageВидалити → створити ChatActiveUnanswered (зберегти timer)
NeedToWriteMessageЗакрити → створити ChatActive
Поточний таскДія
ChatActiveUnansweredЗмінити title → ChatFinishedUnanswered
ChatActiveЗмінити title → ChatFinishedWriteAgain

TU написала першою, RU мовчить (NeedToWriteMessage)

Поточний таскДія
НемаєСтворити (тільки якщо попередній NeedToWriteMessage був відповіданий >60 сек тому)
Будь-який чат-таскНічого не робити

Лайк від RU

Поточний таскДія
НемаєСтворити Like
Будь-який чат-таскНічого не робити

Мутації пошта-слоту

RU надіслав листа

Поточний таскДія
НемаєСтворити UnansweredMail
UnansweredMailНічого не робити
NeedToWriteMailЗакрити → створити UnansweredMail

TU написала, відповіді немає

Поточний таскДія
НемаєСтворити NeedToWriteMail
Будь-який поштовий таскНічого не робити

UnansweredEmail

Генерується EmailService (оператор-рівень, інтервал ~60 сек).

Умови: фаворит має contactDetails.email + clientEmail.status === connected + останнє повідомлення — вхідне.

Не більше 1 активного UnansweredEmail в будь-який момент.


Пріоритети при конфліктах

Чат-слот:

  1. UnansweredMessage / ActiveChat — найвищий (витісняють Like і NeedToWriteMessage)
  2. Like — витісняється будь-яким чат-таском
  3. NeedToWriteMessage — тільки якщо слот порожній

Пошта-слот:

  1. UnansweredMail — витісняє NeedToWriteMail
  2. NeedToWriteMail — тільки якщо слот порожній

Відповідь на таск

answer({ id, length }) — оператор відповів:

  • Таск видаляється зі списку, зберігається answer: { type, timestamp, length }
  • Якщо ChatActive / ChatActiveUnanswered → автоматично створюється новий ActiveChat
  • NeedToWriteMail / NeedToWriteMessage — зберігаються в closedTasks

Автозакриття — checkCloseTasksOnOfflineMen

ТипУмова закриття
NeedToWriteMailRU офлайн + таймер прострочений
NeedToWriteMessageRU офлайн (незалежно від таймера)
UnansweredMessage, Like, ActiveChatОфлайн + таймер прострочений

Скасування (CanceledStatus)

СтатусКоли
not_active_by_timerТаймер вичерпався, RU офлайн

Mutex на кожен manId_api

Операції з API ставляться в чергу через Mutex. Retry 5 разів з factor 3, мінімальний timeout 500 мс.


Зв’язки