KDS — Карточка заказа

Когда показывается: при тапе на карточку в списке заказов.

Источник

BR 5.1 §1.1, §2.3, §2.5, §2.6 Бизнес-спека: Кухонный экран §1 «Карточка заказа», §2.4 «Статусы», §2.5 «Кнопка Готово»

Полноэкранное представление заказа: позиции сгруппированы по станциям, каждая со своим статусом и кнопкой «Готово». Опционально — модалка техкарты при тапе на «?» рядом с блюдом.


Что видит пользователь

Экран занимает 100% планшета. Сверху — заголовок «Заказ 001-234» с типом, временем и кнопкой «Назад». Под ним — блоки по станциям с позициями. Снизу — фиксированная панель действий (если повар выбрал несколько станций).


┌──────────────────────────────────────────────────────────┐
│ ←   Заказ #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]                            │
└──────────────────────────────────────────────────────┘

Без кнопок управления. Это контекст: повар видит что «с другими цехами всё ОК».


Если повар выбрал >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

CodeUX
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)

Связи