Kitchen Queue — очередь кухни (KDS)

Отношение к BR 5.1

Этот экран — упрощённый kanban в админке (web). Полноценный KDS на Android-планшете — отдельный продукт, см. KDS Frontend Specs и BR 5.1. Они сосуществуют:

  • Этот экран — для менеджера/владельца, чтобы видеть все заказы со всех станций франшизы (overview)
  • KDS Android — для повара на кухне, фильтр по своим станциям, статусы per-item

Kanban-экран управления заказами на кухне. Реализует базовый KDS-функционал прямо в админке (без отдельного планшета или Android-приложения).

Файл

erp-admin/web/src/pages/kitchen/KitchenQueuePage.tsx

Роут

/kitchen — видимость в Sidebar определяется permission orders.read.

Доступ

РольДоступ
FranchiseВсе ТТ
FranchiseeСвои ТТ
ManagerСвоя ТТ
Cashier403

Layout

Верх страницы:

  • Селектор ТТ (store_id) — обязательный, без выбора заказы не грузятся.

Три колонки kanban (слева направо):

КолонкаСтатус заказаФон
Новыйnewcolors.redSoft (акцент — требует внимания)
Готовитсяacceptedcolors.bgSoft
Готовreadycolors.bgSoft

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

Для каждого заказа в колонке:

  • Номер заказа (#001-234)
  • Тип: 🍽 в зале / 🛵 доставка / 🥡 навынос (иконка в углу карточки)
  • Список позиций с количеством
  • ETA (время готовности) — рассчитывается из assembly_time_seconds × quantity по всем позициям, минус время с kitchen_started_at
  • Цветовая индикация ETA:
    • 🟢 зелёный — remaining ≥ 180s
    • 🟡 жёлтый — 0 ≤ remaining < 180s
    • 🔴 красный — remaining < 0 (просрочен)
    • серый — если ETA не может быть посчитан (нет assembly_time_seconds или не начат)

Поведение

  • Polling каждые 10 секунд — обновление списка заказов.
  • Таймер в UI тикает раз в секунду (setTick) для реактивного пересчёта ETA без сетевого запроса.
  • При смене ТТ — список перезагружается.
  • Клик по карточке — открывает OrderDetailPage (в отдельной вкладке / модалке — зависит от роутинга).

Источник данных

Endpoint Admin-BFF: GET /api/v1/kitchen-queue?store_id=... (проксирует Order Service).

Объект заказа (kitchen_api.KitchenOrder):

{
  id, order_number, order_type, status, kitchen_started_at,
  items: [{ product_name, quantity, assembly_time_seconds, modifiers }]
}

Что НЕ реализовано

  • Смена статуса прямо из kanban (drag&drop) — сейчас возможна только через детальный экран.
  • Звуковые/визуальные нотификации о новых заказах.
  • Группировка по цехам (горячий/холодный/бар) — цеха не реализованы в Catalog.
  • Фильтр по типу заказа (🍽 / 🛵 / 🥡).
  • Печать этикеток на позиции.

Ссылки

  • Order Data Model — поля kitchen_started_at, order_items.assembly_time_seconds
  • Заказы — детальная карточка заказа