Чаты

Демо · эпик batele-microservices#481 · issue batele-turbo#18
Все Непрочитанные
Поиск: собеседник, доставка, заказ
Бакыт Т. · курьер14:31
Клиент не отвечает 10 минут, что делать?2
послед. D-7301 · история: D-7288, D-7295
Нургиза Б. · курьер12:40
Клиент спорит по адресу, что делать?1
послед. D-7298
Тандыр · вендор14:11
✓✓ Курьер задерживается?
послед. D-7301 · история: D-7288
Айгерим А. · клиент
Нет сообщений — начните переписку
виртуальная пара · чат ещё не создан
Плов-Центр · вендор12:22
✓✓ Отдали заказ курьеру, спасибо
послед. D-7298
Данияр К. · курьервчера
✓✓ Доставил, всё ок 👍
послед. D-7295 · завершена
Бакыт Т. канал · вся история
курьер · онлайн
Соединение потеряно. Пытаемся переподключиться… Сообщения отправятся автоматически.
5 июля
Бакыт Т.
D-7295
Доставил на Асанбай, клиент доволен 👍
5 июл · 13:40
D-7295
Отлично, спасибо за смену!
Нурлан · 13:41 ✓✓
Вчера
Бакыт Т.
D-7288
На Ибраимова оставил у консьержа, фото приложил в приложении.
Вчера · 20:14
Сегодня
Курьеру назначена новая доставка · D-7301 · заказ #4821 · 14:12
Бакыт Т.
D-7301#4821
Забрал заказ в «Тандыр», выехал к клиенту.
14:20
Бакыт Т.
D-7301
Подъехал к дому. Клиент не отвечает 10 минут, что делать?
14:31
D-7301
Жди 5 минут и звони ещё раз. Если не откроет — вези обратно в ресторан.
Нурлан · 14:32 ✓✓
D-7301
И отметь в приложении статус «клиент недоступен».
Нурлан · 14:33 · не отправлено
Бакыт печатает
Отвечаете как Boomerang Go · Нурлан · новое сообщение отметится D-7301
Все Непрочитанные
Поиск: собеседник, доставка, заказ
Бакыт Т. · курьер14:31
Клиент не отвечает 10 минут, что делать?2
D-7301 · фильтр включён
Нургиза Б. · курьер12:40
Клиент спорит по адресу, что делать?1
послед. D-7298
Тандыр · вендор14:11
✓✓ Курьер задерживается?
D-7301 · тот же собеседник-фильтр
Айгерим А. · клиент
Нет сообщений — начните переписку
виртуальная пара · чат ещё не создан
Доставка D-7301 опциональный вид
chatId(собеседник) AND deliveryId=D-7301 · по умолчанию канал открыт со всей историей; здесь переключайте собеседника табами
Курьер
Вендор
Клиент
Сегодня
Курьеру назначена доставка · D-7301 · заказ #4821 · 14:12
Бакыт Т. · онлайн
Забрал заказ в «Тандыр», выехал к клиенту.
14:20
Бакыт Т.
Подъехал к дому. Клиент не отвечает 10 минут, что делать?
14:31
Жди 5 минут и звони ещё раз. Если не откроет — вези обратно в ресторан.
Нурлан · 14:32 ✓✓
Другие доставки курьера (D-7288, D-7295) скрыты фильтром
Отвечаете как Boomerang Go · Нурлан → Бакыт Т.
D-7301
Сегодня
Тандыр · Айзада
Здравствуйте! Заказ #4821 приняли в работу.
14:08
Добрый день! Когда будет готов? Курьер уже едет к вам.
Нурлан · 14:09 ✓✓
Тандыр · Айзада
Заказ будет готов к 14:10, упакуем горячим 🔥
14:10
Тандыр · Айзада
Курьер задерживается? Заказ остывает.
14:11
Отвечаете как Boomerang Go · Нурлан → Тандыр · Айзада
D-7301
Чат с клиентом ещё не создан

Пара виртуальная. Первое сообщение материализует канал — оно уйдёт клиенту с меткой D-7301.

Отвечаете как Boomerang Go · Нурлан → Айгерим А.
D-7301
Все каналы С завершёнными
Поиск: собеседник, доставка, заказ
Данияр К. · курьервчера
Доставил, всё ок 👍
послед. D-7295 · завершена · история: D-7280
Фаиза · вендор08.07
Спасибо за заказ!
послед. D-7288 · завершена
Азиз М. · курьер08.07
Клиент забрал у подъезда
послед. D-7285 · завершена
Марат О. · клиент08.07
Оставьте на ресепшене
послед. D-7285 · завершена
Данияр К. канал · вся история
курьер · не в сети · последняя доставка завершена
08 июля
Данияр К.
D-7280
Смену закончил, всё сдал.
08 июл · 21:10
Вчера
D-7295
Данияр, клиент просит оставить у подъезда. Подтверди фото после доставки.
Нурлан · 20:02 ✓✓
Данияр К.
D-7295
Доставил, всё ок 👍 Фото приложил в приложении.
20:14
Доставка D-7295 завершена · 20:14 · канал остаётся открытым
Отвечаете как Boomerang Go · Нурлан · канал не закрывается

Инциденты по нам

Тикеты платформы (контур platform_incident), привязанные к нашим доставкам. Открывают админы города/страны или система; служба — сторона-участник, отвечает в беседе тикета.
Открытые
1
требует ответа
За неделю
3
по нашим доставкам
Ср. время решения
1ч 40м
от создания до resolved
Просрочка SLA
1
INC-311 · +22 мин
Инциденты открывают админы города/страны (SuperAdmin) или система автоматически (напр. просрочка доставки). Вы не создаёте и не закрываете их — участвуете в беседе как сторона. Беседа инцидента — это тот же канал, отфильтрованный по ticketId: сообщения тикета несут метку INC-…, как обычные сообщения несут deliveryId.
IDТемаSeverityСвязкаСтатусАгент платформыSLAСоздан
Severity задаёт платформа. high — красный, medium — оранжевый, low — серый. Приоритет и статус меняют только агенты; служба видит их как есть и отвечает по SLA.

INC-311 · Просрочка доставки D-7301 high open

Автоматически открыт системой по событию «просрочка > 20 мин» · город Бишкек · связка D-7301 · заказ #4821
Лента инцидента = фильтр канала по ticketId=INC-311 · участники: агент платформы и вы как сторона
Сегодня
Инцидент создан автоматически
Просрочка доставки D-7301 > 20 мин · severity high · 14:28
Азамат · админ города · SuperAdmin
INC-311D-7301#4821
Здравствуйте. Что случилось с доставкой D-7301? Клиент жалуется на задержку почти на полчаса.
14:30
INC-311
Курьер Бакыт попал в пробку на Ахунбаева из-за аварии. Клиент 10 минут не отвечал на звонки. Курьер на месте, ETA 14:50.
Нурлан · 14:33 ✓✓
Азамат · админ города · SuperAdmin
INC-311
Принято. Держите клиента в курсе через чат, я отметил причину в тикете. Как доставите — отпишитесь здесь.
14:35
Отвечаете как Boomerang Go · Нурлан · сторона инцидента

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

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

Канал пары — не привязан к доставке

Одна пара участников = один чат. История канала сквозная через все доставки: вчера курьер вёз D-7288, сегодня — D-7301, но переписка одна и та же. Чат создаётся лениво — при первом сообщении.

Канал: Служба ↔ Бакыт Т. → одна лента, много доставок: D-7295 D-7288 D-7301 INC-311

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

Каждое сообщение несёт свой контекст, а не весь чат: { chatId, orderId?, orderShortId?, deliveryId?, ticketId? }. В ленте он виден как чип у сообщения. Клик по чипу включает фильтр канала.

D-7301 #4821 INC-311 — доставка · заказ · тикет
Ленивое создание · виртуальные пары

Пока в паре нет ни одного сообщения, она виртуальная — видна в списке, но чата в базе ещё нет. Первое сообщение материализует канал. Так UI всегда показывает полный набор собеседников без пустых чатов.

Два вида одного канала

Вид (а) · вся история
Канал целиком, с чипами

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

Вид (б) · фильтр по доставке
chatId AND deliveryId

Тот же канал, но показаны только сообщения одной доставки: чип «D-7301 ✕» в шапке, композер авто-тегирует новые этой доставкой. Крестик снимает фильтр. Данные — те же сообщения.

Подпись сотрудника и участники

Подпись сотрудника · senderMemberId

Участник со стороны службы — организация. Пишет диспетчер, платформа фиксирует senderMemberId. Исходящие подписаны автором — «Нурлан»; входящие от ресторана — «Тандыр · Айзада». Контрагент видит «Boomerang Go», команда — кто именно отвечал.

Типы участников
КурьерcourierId
Курьерская службаorgId · memberId
ВендорorgId · memberId
КлиентuserId
SuperAdmin · админ города/страныmemberId
SuperOrg · платформаorgId

Переписки и инциденты

Переписки
Каналы пар — стороны заказа

Служба ↔ курьер / клиент / вендор. Долгоживущие каналы: не закрываются, доступны и после доставки. Сообщения помечены deliveryId.

Инциденты · тикет = фильтр
Фильтр канала по ticketId

Инцидент (platform_incident) открывают SuperAdmin (админы города/страны) или система. Его беседа — это тот же канал, отфильтрованный по ticketId; сообщения несут метку INC-…. Статусом управляет платформа, служба — сторона.

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

Непрочитанные
Считаются на канал

Unread — свойство канала пары, не доставки и не сообщения. В списке каналов показывается число, в табах и карточках собеседников по доставке — точка «есть непрочитанное»: фильтр по доставке не меняет счётчик канала.

Клиент ↔ Курьер
Только при активной доставке

Пара «клиент ↔ курьер» доступна для письма только пока есть активная общая доставка. Вне её канал write-locked: история видна, композер заблокирован. Пары со службой такого ограничения не имеют.

Вход из доставки
Открывает всю историю

Клик по каналу из карточки доставки открывает канал целиком (вся история пары). Фильтр по этой доставке — опциональный вид поверх, включается кнопкой или кликом по чипу.

Курьер офлайн? Сообщение всё равно доставляется: платформа отправляет push на телефон курьера. Realtime-события (печатает / прочитано / онлайн / непрочитанные) работают, пока обе стороны в сети; при разрыве связи сообщения ставятся в очередь и уходят при переподключении.

Состояния интерфейса

Как выглядят пограничные случаи, которые встречаются в работе диспетчера.

Пустой список · нет непрочитанных
Всё прочитано

Нет непрочитанных переписок. Новые сообщения появятся здесь автоматически.

Офлайн · потеря соединения
Соединение потеряно. Переподключаемся…
Позвони клиенту ещё раз.
не отправлено
Ошибка отправки · retry

Сообщение не ушло (нет сети / ошибка сервера) — остаётся в ленте с пометкой не отправлено и кнопкой Повторить. Ничего не теряется, порядок сохраняется.

Курьер не назначен · пара недоступна
Курьер · не назначен
чат появится после назначения
Демо интерфейса · модель v3. Прототип UI/UX для панели курьерской службы Batele Go (эпик поддержки/чатов batele-microservices#481). Чат — канал пары, контекст живёт на сообщении, доставка/тикет — это фильтры канала. Тексты и данные вымышленные.