Desktop POS — Phase 5A KDS
Что сделано
Domain
packages/domain/src/types/kitchenStation.ts(new) —KitchenStation { id, name, description, is_default, product_count?, ... }packages/domain/src/types/product.ts— добавленоkitchen_station_id?: string | null
API client + Store
packages/api-client/src/endpoints/kitchenStations.ts(new) —list()apps/desktop/src/stores/kitchenStationsStore.ts(new) — кэш на сессию, lazyload(),byId(id)
screens/KitchenQueueScreen.tsx — extended
Логика разделения по станциям:
- Подгружаем
kitchenStationsStore.load()+ читаемuseMenuStore.products - Строим
productById: Map<string, Product>для O(1) lookup - Если
stations.length > 1— показываем табы (Все + по name каждой станции) filteredOrdersфильтрует список заказов: оставляет только те, у которых есть item сproduct.kitchen_station_id == activeStationfilterItemsForStation(order)фильтрует items внутри карточки — кухарь Горячей не видит позиции Холодной даже если они в одном order
Fallback: если у ТТ ≤1 станция — табы скрыты, поведение как раньше (single list, BR 2.5 совместимо).
Wiring
api/client.ts—getKitchenStationsEndpoints()factoryapi/mockEndpoints.ts:MOCK_STATION_HOT/COLD/BARконстанты (объявлены наверху, до MENU)mockKitchenStations— 3 seed (Горячая, Холодная, Бар)createMockKitchenStationsEndpoints— list returns delay()- 3 mock products получили
kitchen_station_id: sandwich/croissant=COLD, shawarma=HOT
Файлы
Created (3):
packages/domain/src/types/kitchenStation.tspackages/api-client/src/endpoints/kitchenStations.tsapps/desktop/src/stores/kitchenStationsStore.ts
Modified (5):
packages/domain/src/types/index.tspackages/domain/src/types/product.tspackages/api-client/src/index.tsapps/desktop/src/api/client.tsapps/desktop/src/api/mockEndpoints.tsapps/desktop/src/screens/KitchenQueueScreen.tsx
Тесты
pnpm typecheck— zero errorspnpm exec vite build— passing (204 modules, +3 от Phase 4)- Mock-mode E2E:
- Открыть /kitchen → видим 3 таба «Все / Горячая / Холодная / Бар» (если seed добавит ≥2 станции)
- Tab «Горячая» → виден только заказ с шаурмой; sandwich/croissant скрыты
- Tab «Все» → как раньше
- У ТТ с одной станцией → табы скрыты автоматически