Декомпозиция BR 2.5 — Статусная модель заказа Фаза 1

Источник

Затронутые сервисы / репозитории

СервисПортРепоЗадачи
Catalog Service:3004erp-catalog-serviceCatalog Service
Order Service:3005erp-order-serviceOrder Service
Aggregator Service:3013erp-aggregator-serviceAggregator Service
Admin BFF:3020erp-admin (bff/)Admin BFF
Admin Franchise web:3020erp-admin (web/)Admin Franchise
Warehouse Service:3008erp-warehouse-service— возможные правки (открытый вопрос §10.1 BR)

POS (наш и KOALa) — не трогаем (user-directive).

Последовательность выполнения

  1. Catalog Service — добавить таблицу kitchen_stations + поля в products. API для stations. Развёртывается первым, т.к. Order Service на checkout’е будет читать requires_kitchen из товара.
  2. Order Service — state-machine + новые endpoints + новые события. Зависит от Catalog Service для расчёта orders.requires_kitchen.
  3. Aggregator Servicewebhook_subscriptions таблица + webhook dispatcher. Подписчик Kafka-событий Order Service. Может деплоиться параллельно с Order Service.
  4. Admin BFF + Admin Franchise web — проксирование новых endpoints + UI для kitchen_stations, бейджи новых статусов. Зависит от Catalog + Order.

Риски / открытые вопросы на реализацию

См. BR 2.5 §10. Критично решить до начала:

  • Warehouse списание — на order.paid или order.closed? (Открытый вопрос, требует согласования с Warehouse разработкой)
  • /checkout endpoint — ломать (возвращать 409 для dine-in/delivery) или сохранять обратную совместимость (внутренне делать pay+close)? Решение: сохраняем обратную совместимость — если старый клиент зовёт /checkout на dine_in, внутренне делаем pay+close сразу. Логируем deprecation.
  • Retry-политика webhook (10s..24h) — как дефолт, после первых недель можно корректировать

Прогресс

  • Catalog Service — миграция 025 + kitchen_stations CRUD + поля requires_kitchen/kitchen_station_id + GET /internal/products/require-kitchen
  • Order Service — миграция 008 (расширение CHECK-constraint + 8 новых колонок) + state machine BR 2.5 + transitions (start-delivery, confirm-delivery) + события (order.closed, order.cooking_started, order.ready, order.handed_over, order.in_delivery, order.delivered) + CatalogServiceClient для requires_kitchen на checkout
  • Aggregator Service — миграция 002 + webhook_subscriptions + webhook_delivery_attempts + HmacSigner + WebhookSubscriptionService (CRUD, secret MVP plaintext) + WebhookDispatcher (Kafka-подписчик на order.*) + WebhookDeliveryWorker (scheduled retry с backoff [10s, 30s, 2m, 10m, 1h, 6h, 24h], max_attempts=7) + internal controllers (CRUD + retry manual)
  • Admin BFF — прокси для /kitchen-stations CRUD, /orders/:id/{accept,ready,hand-over,start-delivery,confirm-delivery,complete,cancel}; обновлены shared types (OrderStatus +in_delivery/delivered, Order + 8 timestamps, KitchenStation, Product.requires_kitchen/kitchen_station_id)
  • Admin Franchise web — KitchenStationsPage (CRUD-список + модалки) + меню в Layout, секция «Кухонный flow» в ProductCreatePage/ProductEditPage (toggle + select station), бейджи in_delivery/delivered в ActiveOrdersPage/OrderHistoryPage/OrderDetailPage

Ссылки