KDS — Карточка заказа
Когда показывается: при тапе на карточку в списке заказов.
Источник
BR 5.1 §1.1, §2.3, §2.5, §2.6 Бизнес-спека: Кухонный экран §1 «Карточка заказа», §2.4 «Статусы», §2.5 «Кнопка Готово»
Полноэкранное представление заказа: позиции сгруппированы по станциям, каждая со своим статусом и кнопкой «Готово». Опционально — модалка техкарты при тапе на «?» рядом с блюдом.
Что видит пользователь
Экран занимает 100% планшета. Сверху — заголовок «Заказ 001-234» с типом, временем и кнопкой «Назад». Под ним — блоки по станциям с позициями. Снизу — фиксированная панель действий (если повар выбрал несколько станций).
Header
┌──────────────────────────────────────────────────────────┐
│ ← Заказ #001-234 🍽 Стол 5 ⏱ 14:35 (через 4 мин) │
└──────────────────────────────────────────────────────────┘
| Элемент | Описание |
|---|---|
| ← Назад | Возврат на список (тап или swipe) |
| Номер | #001-234 (где 234 — order_number) |
| Тип + детали | 🍽 Стол 5 / 🛵 Доставка курьер: Иван / 🥡 Самовывоз |
| Время до готовности | Текущее время до expected_ready_at, цвет по тем же правилам что в списке |
Цвет фона header — синхронизирован с цветом карточки в списке (зелёный/жёлтый/красный).
Группировка по станциям
Если повар выбрал N станций — N блоков. Если только одна — один блок (без явного заголовка).
Блок станции
┌── 🔥 Горячий цех ──────────────────────────────────┐
│ │
│ ┌─ Карбонара (1) ────────── [📋 техкарта] ─────┐ │
│ │ Без перца, без пармезана │ │
│ │ + Соус карбонара │ │
│ │ [pending] → [▶ В работе] │ │
│ └────────────────────────────────────────────────┘ │
│ │
│ ┌─ Цезарь (1) ─────────────────────────────────┐ │
│ │ [preparing] → [✓ Готово] │ │
│ └────────────────────────────────────────────────┘ │
│ │
│ ┌────────── ✓ Готово по станции ───────────────┐ │
│ │ (disabled — есть позиции в pending/preparing) │ │
│ └────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────┘
Заголовок блока
- Иконка станции (🔥 / 🍹 / ❄️ / 🥩 — по типу из админки)
- Название станции
- Прогресс-индикатор: «1 / 3 готово»
Карточка позиции
| Элемент | Описание |
|---|---|
| Имя продукта | product_name жирным 16px |
| Количество | (N) если > 1 |
| Кнопка «📋 техкарта» | Справа в header карточки. Только если у позиции есть techcard |
| Модификаторы | Зелёным мелким: «+ Соус карбонара» |
| Комментарий гостя | Жёлтым: «Без перца, без пармезана» (отдельный visual для notes) |
| Статус-чип | Слева внизу: pending (серый) / preparing (синий) / ready (зелёный с галочкой) |
| Кнопка действия | Справа внизу — зависит от статуса (см. ниже) |
Кнопки действия per-позиция
| Текущий статус | Кнопка | API |
|---|---|---|
pending | «▶ В работе» (синяя) | PATCH /orders/{id}/items/{itemId}/kitchen-status body {"kitchen_status": "preparing"} |
preparing | «✓ Готово» (зелёная) | то же body {"kitchen_status": "ready"} |
ready | без кнопки (только бейдж «✓ Готово»). Откат запрещён | — |
Опт. подтверждение для «Готово»
Если включено в Settings (confirm_ready: true) — показать диалог: «Подтвердите: позиция готова?» (Yes/No). По умолчанию выключено для скорости.
Кнопка «✓ Готово по станции»
Большая нижняя кнопка в блоке станции:
- Disabled пока хотя бы одна позиция этой станции в
pending/preparing - Enabled (зелёная, заметная) когда все позиции этой станции уже в
ready— это финальный жест повара «всё готово, можно нести»
Тап → PATCH /orders/{id}/kitchen-status?station_id=... body {"kitchen_status": "ready"} (idempotent — все позиции уже ready, просто закрывает блок и публикует событие).
После успеха — анимация сворачивания блока, если были другие выбранные станции — остаются. Если все блоки выбранных станций закрыты — заказ уезжает с экрана (fade-out 300ms) и возврат к списку заказов.
Невыбранные станции
Если в заказе есть позиции других станций (не из selected_station_ids) — отображаются последним блоком серым цветом с заголовком:
┌── 🍹 Бар (вы не работаете на этой станции) ────────┐
│ • Кола (1) [preparing] │
│ • Эспрессо (1) [pending] │
└──────────────────────────────────────────────────────┘
Без кнопок управления. Это контекст: повар видит что «с другими цехами всё ОК».
Footer-панель (опционально, при multi-station)
Если повар выбрал >1 станций — внизу sticky-bar с прогрессом:
┌──────────────────────────────────────────────────────┐
│ Кухня: 1/2 • Бар: 0/1 │
│ [✓ Готово на всех моих станциях] │
└──────────────────────────────────────────────────────┘
Кнопка «Готово на всех моих» — disabled пока не все позиции выбранных станций в ready. Тап → последовательно PATCH /orders/{id}/kitchen-status для каждой выбранной станции.
При single-station — этот footer не показывается (хватает кнопки «Готово по станции» в одном блоке).
Модалка техкарты
При тапе «📋 техкарта» рядом с позицией:
┌──────────────────────────────────────────┐
│ Техкарта: Карбонара │
│ │
│ Ингредиенты: │
│ • Спагетти 100 г │
│ • Бекон 50 г │
│ • Желток 1 шт │
│ • Пармезан 30 г │
│ ... │
│ │
│ Приготовление: │
│ 1. Сварить пасту al dente │
│ 2. Обжарить бекон до хруста │
│ 3. Смешать желтки с пармезаном │
│ ... │
│ │
│ [📷 фото блюда — если есть] │
│ │
│ [Закрыть] │
└──────────────────────────────────────────┘
API: GET /api/v1/pos/products/{product_id}/recipe (proxy в Warehouse Service GET /tech-cards?product_id=...).
Обработка ошибок:
- 404
RECIPE_NOT_FOUND— «Для этой позиции техкарта не настроена» - Сетевая — «Не удалось загрузить, повторить?»
Поведение
При открытии карточки
- Звук уведомления для этого заказа перестаёт повторяться (если был активен)
last_activity_atобновляется (для anti-auto-logout)- WS уже открыт на уровне приложения, отдельный subscribe не нужен
Live-обновления внутри карточки
WS-события order.item.kitchen_status_changed для этого заказа применяются мгновенно (другой повар обновил статус на другом устройстве). Это полезно при multi-device kitchens.
Закрытие карточки
- Тап «← Назад» или swipe слева
- Возврат на «Список заказов»
- Если все позиции заказа закрыты на текущей станции — карточка автоматически уезжает с возвратом на список
Ошибки при PATCH
| Code | UX |
|---|---|
KITCHEN_STATUS_BACKWARD (422) | «Откат запрещён. Если ошибка — позвоните кассиру.» (toast) |
STATION_NOT_READY (422) | «Не все позиции готовы. Сначала отметьте каждую как готовую.» (только для batch endpoint) |
ORDER_NOT_IN_KITCHEN_FLOW (422) | «Заказ уже не на кухне. Возможно, отменён.» + auto-возврат на список |
ORDER_NOT_FOUND / ITEM_NOT_FOUND (404) | «Заказ удалён» + auto-возврат на список |
FORBIDDEN (403) | «Нет прав на изменение» (повар без kds.access — но это catch-all, обычно не должно случаться) |
| Network | Локальный optimistic update + queue для повтора при reconnect |
Анимации и UX
- Tap-feedback — короткая ripple-анимация (Material) на кнопках
- Status-change — 150ms цветовая трансляция чипа
- Заказ уезжает с экрана — fade-out 300ms
- Звуки — sync с visual-state (статус сменился → клик звук)
Что НЕ входит в P0
- Возврат заказа с кухни (refund flow)
- Отмена позиции с кухни
- Печать этикетки на позицию
- Заметки повара к позиции (free text)
- Время-срочность per-item (только per-order)
Связи
- Список заказов — exit point
- Настройки —
confirm_readyопция - Order Service API
- Warehouse Service — техкарты
- Бизнес-спека §2.4-2.6