Таски
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 | чат | 🟡 yellow | 50 сек | Paid chat розпочато |
UnansweredMessage | чат | 🟡 yellow | 50 сек | RU написав повідомлення |
NeedToWriteMessage | чат | 🟢 green | 2 хв | TU написала, RU мовчить 10+ хв |
Like | чат | 🔵 blue | 50 сек | RU лайкнув анкету |
UnansweredMail | пошта | 🟡 yellow | 15 хв | RU надіслав листа |
NeedToWriteMail | пошта | 🟢 green | 15 хв | TU написала листа, відповіді немає |
UnansweredEmail | 🟡 yellow | 1 год | Вхідний email від RU (підключений email) |
Генератори: TaskChatService, TaskMailService, EmailService.
Два незалежні слоти на пару TU+RU
| Слот | Типи тасків |
|---|---|
| Чат | UnansweredMessage, NeedToWriteMessage, Like, ActiveChat |
| Пошта | UnansweredMail, NeedToWriteMail |
UnansweredEmail |
У кожному слоті — максимум один активний таск.
ActiveChat — 4 підтипи (title)
ActiveChat — єдиний тип що мутує всередині себе. Підтип зберігається в config.title:
| Title | Опис | Колір |
|---|---|---|
Chat: active | Paid chat активний, повідомлень від RU немає | 🟡 yellow |
Chat: active-unanswered | Paid chat активний, RU написав — оператор не відповів | 🟡 yellow |
Chat: finished-unanswered | Paid chat завершено, є непрочитане від RU | 🟡 yellow |
Chat: finished-write-again | Paid chat завершено, повідомлень від RU не було | 🟡 yellow |
Мутації чат-слоту
Прийшло повідомлення від RU
| Поточний таск | Дія |
|---|---|
| Немає | Створити UnansweredMessage |
UnansweredMessage | Нічого не робити |
ChatActive | Змінити title → Chat: active-unanswered |
NeedToWriteMessage | Закрити → створити UnansweredMessage |
Like | Закрити → створити UnansweredMessage |
Paid chat розпочато
| Поточний таск | Дія |
|---|---|
| Немає | Створити ChatActive |
ChatFinishedUnanswered | Змінити title → ChatActiveUnanswered |
ChatFinishedWriteAgain | Змінити title → ChatActive |
UnansweredMessage | Видалити → створити ChatActiveUnanswered (зберегти timer) |
NeedToWriteMessage | Закрити → створити ChatActive |
Paid chat завершено
| Поточний таск | Дія |
|---|---|
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 в будь-який момент.
Пріоритети при конфліктах
Чат-слот:
UnansweredMessage/ActiveChat— найвищий (витісняютьLikeіNeedToWriteMessage)Like— витісняється будь-яким чат-таскомNeedToWriteMessage— тільки якщо слот порожній
Пошта-слот:
UnansweredMail— витісняєNeedToWriteMailNeedToWriteMail— тільки якщо слот порожній
Відповідь на таск
answer({ id, length }) — оператор відповів:
- Таск видаляється зі списку, зберігається
answer: { type, timestamp, length } - Якщо
ChatActive/ChatActiveUnanswered→ автоматично створюється новийActiveChat NeedToWriteMail/NeedToWriteMessage— зберігаються вclosedTasks
Автозакриття — checkCloseTasksOnOfflineMen
| Тип | Умова закриття |
|---|---|
NeedToWriteMail | RU офлайн + таймер прострочений |
NeedToWriteMessage | RU офлайн (незалежно від таймера) |
UnansweredMessage, Like, ActiveChat | Офлайн + таймер прострочений |
Скасування (CanceledStatus)
| Статус | Коли |
|---|---|
not_active_by_timer | Таймер вичерпався, RU офлайн |
Mutex на кожен manId_api
Операції з API ставляться в чергу через Mutex. Retry 5 разів з factor 3, мінімальний timeout 500 мс.
Зв’язки
- Генератори: TaskChatService, TaskMailService, EmailService
- UI-колонка: Tasks Column