Roteamento de Itens por Estação
Visão Geral
O roteamento direciona automaticamente cada item do pedido para a estação de preparação correta, sem que o garçom ou caixa precise tomar nenhuma decisão. Bebidas vão para o bar, pratos quentes para a cozinha principal, sobremesas para a cozinha fria.
| Característica | Detalhe |
|---|---|
| Campo no schema | MenuItem.printZone (string opcional) |
| Implementação KDS | URL param ?zone=bar filtra eventos newOrder |
| Implementação impressão | PrintJob.printZone direciona para impressora física |
| Backend | backend/src/kitchen/kitchen.gateway.ts — emitNewOrder() |
Localização
| Camada | Arquivo |
|---|---|
| Schema MenuItem | backend/src/menu/schemas/menu-item.schema.ts |
| KitchenGateway | backend/src/kitchen/kitchen.gateway.ts |
| KDS View | frontend-react/src/views/kitchen/KitchenDisplayView.tsx |
| Print Job | backend/src/printing/schemas/print-job.schema.ts |
Zonas Padrão
Zona (printZone) | Estação típica |
|---|---|
hot | Cozinha quente (frituras, grelhados, pratos) |
cold | Cozinha fria (saladas, sobremesas, montagem) |
bar | Bar (bebidas, sucos, drinks) |
| (vazio) | Vai para o KDS geral (sem filtro de zona) |
Você pode criar zonas customizadas — pizzas, sushi, padaria — com qualquer string.
Como Configurar
1. Definir zona no item do cardápio
Admin → Cardápio → [Item] → Zona de Impressão (printZone)
Exemplo:
- X-Burguer →
hot - Suco de Laranja →
bar - Brownie de Chocolate →
cold
2. Abrir o KDS filtrado por zona
Cada estação acessa sua URL própria:
/t/:slug/kitchen?zone=hot ← cozinha quente vê só os pratos quentes
/t/:slug/kitchen?zone=bar ← bar vê só as bebidas
/t/:slug/kitchen ← visão geral (todos os itens)O parâmetro zone é lido pelo KitchenDisplayView que ao fazer joinKitchen({ tenantId, zone }) entra na sala específica do gateway.
3. Configurar impressoras físicas por zona
Em Admin → Sistema → Impressão → Regras de Roteamento:
| Zona | Impressora |
|---|---|
hot | Epson TM-T20 (cozinha) |
bar | Star TSP-143 (bar) |
cold | Star TSP-143 (balcão frio) |
Fluxo Técnico
POST /t/:slug/orders (pedido criado)
│
▼
OrdersService.create()
→ coleta zones = [...new Set(items.map(i => i.printZone).filter(Boolean))]
→ KitchenGateway.emitNewOrder(tenantId, order, zones)
│
├── Sala kitchen-{tenantId} → pedido completo (todos os itens)
│
└── Para cada zone:
Sala kitchen-{tenantId}-{zone}
→ pedido filtrado (somente items.printZone === zone)Backend — Schema
typescript
// MenuItem
@Prop()
printZone?: string; // 'hot' | 'cold' | 'bar' | customtypescript
// emitNewOrder em KitchenGateway
emitNewOrder(tenantId: string, order: any, zones: string[] = []) {
this.server.to(`kitchen-${tenantId}`).emit('newOrder', order);
for (const zone of zones) {
const zoneItems = order.items.filter(i => i.printZone === zone);
if (zoneItems.length) {
this.server.to(`kitchen-${tenantId}-${zone}`).emit('newOrder', {
...order, items: zoneItems,
});
}
}
}