Чаты

Демо · эпик batele-microservices#481 · issue batele-turbo#18

Переписки

Чат — это долгоживущий канал пары участников. Одна пара — один чат со сквозной историей через все заказы. Контекст (заказ, доставка, тикет) живёт на каждом сообщении.
ВсеНепрочитанные 3
АА
Айгерим А. · клиент14:32
#4821 Вы уже близко?2
Boomerang Go · служба14:31
D-7301 Уже выехал, будет через 5 мин
Бакыт Т. · курьервиртуальный
Нет сообщений — написать первым
ДМ
Данияр М. · клиент14:18
#4818 Можно без лука, пожалуйста?1
НС
Нурай С. · клиент13:40
#4809 Спасибо, всё получила 🙏1
ТК
Тимур К. · клиент12:15
#4802 Заказ уже в пути
АА
Айгерим А.
в сети · Клиент · сквозной канал
Заказ #4821 опциональный вид показаны сообщения одного заказа Показать всю переписку
Клиент Служба Курьер в контексте #4821
Вчера
Здравствуйте! Можно к заказу добавить пахлаву?
#4700 19:03
Айзада
Добавили, спасибо за заказ! Приятного аппетита.
#4700 19:05
Сегодня
Оформила заказ #4821, когда примерно привезут?
#4821 14:05
Айзада
Курьер уже в пути, будет у вас примерно в 14:35.
#4821 14:22
Непрочитанные
Домофон не работает, позвоните пожалуйста
#4821 14:31
Вы уже близко?
#4821 14:32
Айзада
Уже подъезжаем, буквально 2 минуты!
#4821 14:33
Не отправлено · Повторить
Айгерим печатает…
Отвечаете как Тандыр · Айзада→ #4821
Сообщение…

Переписки

Один канал Вендор ↔ Boomerang Go на все доставки. Включён фильтр по доставке D-7301 — новые сообщения авто-тегируются активным контекстом.
ВсеНепрочитанные 3
АА
Айгерим А. · клиент14:32
#4821 Вы уже близко?2
Boomerang Go · служба14:31
D-7301 Уже выехал, будет через 5 мин
Бакыт Т. · курьервиртуальный
Нет сообщений — написать первым
ДМ
Данияр М. · клиент14:18
#4818 Можно без лука, пожалуйста?1
Нет соединения — переподключение…
Boomerang Go
в сети · Служба доставки · сквозной канал
Доставка D-7301 опциональный вид показаны сообщения одной доставки Показать всю переписку
Клиент Служба Курьер в контексте #4821
Ранее сегодня
Boomerang Go · Нурлан
Заказ #4818 передан курьеру, выехал к клиенту.
D-7288 13:52
Айзада
Спасибо!
D-7288 13:53
Сегодня
Курьер назначен · Бакыт Т.
Boomerang Go · Нурлан
На заказ #4821 назначен курьер Бакыт. Подъедет за заказом к 14:25.
D-7301 14:15
Айзада
Принято. Заказ будет готов к 14:25, упакуем горячим.
D-7301 14:24
Boomerang Go · Нурлан
Курьер на месте, забирает заказ.
D-7301 14:28
Айзада
Курьер задерживается? Клиент спрашивает, где заказ.
D-7301 14:30
Boomerang Go · Нурлан
Уже выехал, будет у клиента через 5 минут.
D-7301 14:31
Отвечаете как Тандыр · Айзада→ D-7301
Сообщение…

Все переписки

Полный список каналов пар, включая давние. Завершение заказа не закрывает канал — с клиентом, службой или курьером можно написать снова в любой момент.
АА
Айгерим А. · клиент14:32
#4821 Вы уже близко?
Boomerang Go · служба14:31
D-7301 Уже выехал, будет через 5 мин
ГС
Гульнара С. · клиент2 июля
#4520 Спасибо, всё вкусно!
ТК
Тимур К. · клиент28 июня
#4705 Оставьте у двери, спасибо
Марат О. · курьер20 июня
D-6980 Заказ забрал, выехал
ГС
Гульнара С.
не в сети · Клиент · канал открыт
2 июля
Здравствуйте, а сегодня работаете до скольки?
#4520 18:20
Айзада
Здравствуйте! До 23:00, ждём вас.
#4520 18:21
Заказ #4520 доставлен · 19:34
Спасибо, всё вкусно!
19:40
Отвечаете как Тандыр · Айзада→ без контекста
Сообщение…

Тикеты поддержки

Вендор — служба поддержки своих клиентов. Тикет опирается на канал с клиентом: лента тикета — это фильтр того же чата по ticketId.
Открытые
2
требуют ответа
Первый ответ · ср.
9 мин
SLA цель — 15 мин
Просрочено SLA
1
нужен ответ сейчас
Решено за неделю
14
+3 к прошлой
ВсеОткрытыеВ работеРешённыеЗакрытые
IDТемаКлиентСтатусПриоритетАгентSLA · первый ответСоздан
Тикет — это фильтр канала. Клиент Айгерим — тот же чат, что и в заказных переписках. Лента тикета показывает только сообщения с его ticketId (чип «TS-102»). Чат один, тикет — представление поверх него со статусом, приоритетом и SLA.

TS-102 · Не начислился кешбек открыт

Клиент: Айгерим А. · категория «Лояльность» · создан сегодня 14:05. Это тот же канал, что и заказные чаты с клиентом — лента отфильтрована по тикету.
АА
Айгерим А.
в сети · Клиент · сквозной канал
Тикет TS-102 Показаны сообщения тикета · фильтр по ticketId Открыть весь канал клиента
Тикет создан · 14:05
Здравствуйте! Я оплатила заказ #4821, но кешбек так и не начислился на баланс. Помогите, пожалуйста.
TS-102 14:05
Айзада
Здравствуйте, Айгерим! Уже проверяю ваш заказ, вернусь с ответом в течение нескольких минут.
TS-102 14:07
Спасибо! Жду.
TS-102 14:08
Отвечаете как Тандыр · Айзада→ TS-102
Ответ клиенту…

Как это работает

Модель чатов v3: чат — это долгоживущий канал пары участников. Контекст (заказ, доставка, тикет) живёт на каждом сообщении, а не на чате.

Утверждённые решения (v3)

Вход из заказа = вся история. Открывая тред из контекста заказа, вендор видит весь канал пары (сообщения прошлых заказов, напр. #4700, видны). Фильтр «только этот заказ» — опциональный вид, включается тапом по чипу.
Unread — на канал. Непрочитанное считается на канал пары, а не на контекст. В табах собеседников это точка «есть непрочитанные», в списке тредов — число.
Клиент ↔ Курьер — только при активной доставке. Прямой канал клиента с курьером доступен, пока доставка в процессе; по её завершении переписка с курьером не продолжается.
Поддержка — в том же канале. vendor_support живёт внутри канала Клиент ↔ Вендор: тикет не создаёт отдельный чат, а фильтрует существующий по ticketId.

Чат — это канал пары

Одна пара участников — один чат со сквозной историей через все заказы. Чат не привязан к заказу и не закрывается по его завершении. Вендор ведёт до трёх каналов.

ВендорКлиент
Один канал на все заказы клиента. Доступен сразу.
ВендорСлужба
Один канал со службой на все доставки. После назначения.
ВендорКурьер
Канал с конкретным курьером — только при активной доставке.

Прямой канал Клиент ↔ Курьер тоже доступен лишь пока доставка активна. Каналы вендора со службой и курьером открываются после назначения доставки.

Контекст живёт на сообщении

Сообщение несёт свой контекст: message = { chatId, orderId?, orderShortId?, deliveryId?, ticketId? }. На сообщении рисуется чип — «#4821», «D-7301», «TS-102». Клик по чипу включает фильтр-режим.

Можно добавить пахлаву к заказу?
#4700 вчера
Айзада
Добавили!
#4821 сегодня
Курьер уже выехал?
D-7301 14:31
Кешбек не начислился
TS-102 14:05

Один канал — сообщения из разных заказов, доставок и тикетов, каждое со своим чипом.

Два вида чата. (а) дефолт — вся история пары с чипами на сообщениях; (б) опциональный вид — фильтр по заказу/доставке, чип-фильтр в шапке «Заказ #4821 ✕», лента сужена до одного контекста.
Композер авто-тегирует всегда. Даже в полной истории у поля виден чип «→ #4821» — новые сообщения получают контекст того заказа, из которого открыт тред. Фильтр — отдельная опция, авто-тег от него не зависит.

Тикет — это фильтр канала

канал

vendor_support живёт в канале Клиент ↔ Вендор. У Айгерим один чат с вендором — заказные сообщения и обращения в поддержку вместе.

фильтр по ticketId

Лента тикета TS-102 — это тот же канал, суженный до сообщений с его ticketId. Отдельного чата у тикета нет.

надстройка

Статус, приоритет, категория, SLA и назначение — метаданные поверх канала. Ответ уходит в общий чат клиента.

Типы участников

ТипИдентификаторКто это
КлиентuserIdПокупатель из C2C
ВендорorgId + memberIdРесторан; пишет сотрудник от имени организации
Курьерская службаorgId + memberIdНапр. «Boomerang Go»; пишет диспетчер
КурьерcourierIdКонкретный курьер на доставке
SuperAdminuserId · BateleСотрудник поддержки платформы Batele
SuperOrgorgId · BateleПлатформенная организация поддержки

SuperAdmin и SuperOrg — для поддержки платформы: могут подключаться к каналам как отдельная сторона, когда нужно разобрать спор между вендором, службой и клиентом.

Ленивое создание и подпись сотрудника

Пара показывается виртуально

Доступный собеседник виден сразу, даже без переписки — с пометкой «виртуальный · написать первым».

Канал создаётся при первом сообщении

Реальный чат материализуется лениво, когда одна из сторон пишет первой. Дальше это единый канал пары.

Подпись автора · senderMemberId

Со стороны вендора собеседник — организация. Любой сотрудник с правом «Чаты» пишет от имени «Тандыр», но фиксируется реальный автор: исходящее — «Айзада», входящее от службы — «Boomerang Go · Нурлан».

Право «Чаты» в ролях

Роль «Менеджер зала»
Заказы
Меню и каталог
Чаты новое право
Финансы нет в плане
Аналитика нет в плане
Право «Чаты» НЕ бэкфиллится на существующие роли. Право добавляется в каталог, но после релиза его выдают вручную — старые роли не получают доступ к чатам автоматически.
Заглушка «Нет права на чаты». Сотрудник без права видит раздел заблокированным: «У вас нет доступа к чатам. Обратитесь к администратору организации».

Realtime и пограничные состояния

Печатает-индикатор, статусы прочтения (✓✓), presence «в сети» и непрочитанное — по WebSocket. Unread считается на канал (не на контекст сообщения): в табах собеседников это точка, в списке тредов — число. Если получатель офлайн — уходит push.

Нет активных чатов Переписки появятся, когда клиент или служба напишут.
Нет соединения — переподключение…

Баннер поверх треда при потере WebSocket. Сообщения ждут реконнекта.

Уже подъезжаем!
#4821 14:33
Не отправлено · Повторить
Сотрудник офлайн — клиенту всё равно уйдёт push. Доставка сообщения не зависит от того, открыт ли веб-кабинет вендора: получатель на другой стороне получит уведомление, а сообщение дождётся сотрудника в инбоксе.

Отчёт SLA

Соблюдение времени первого ответа и решения по тикетам поддержки. Раздел в проработке.
Первый ответ · ср.
9 мин
цель 15 мин
Соблюдение SLA
92%
за 7 дней
Просрочено
1
из 15 тикетов
Решение · ср.
1 ч 48 мин
цель 4 ч
Графики и выгрузка — скоро Динамика SLA по агентам и категориям, разбивка просрочек и экспорт в CSV появятся после утверждения раздела.