Skip to content

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ísticaDetalhe
Campo no schemaMenuItem.printZone (string opcional)
Implementação KDSURL param ?zone=bar filtra eventos newOrder
Implementação impressãoPrintJob.printZone direciona para impressora física
Backendbackend/src/kitchen/kitchen.gateway.tsemitNewOrder()

Localização

CamadaArquivo
Schema MenuItembackend/src/menu/schemas/menu-item.schema.ts
KitchenGatewaybackend/src/kitchen/kitchen.gateway.ts
KDS Viewfrontend-react/src/views/kitchen/KitchenDisplayView.tsx
Print Jobbackend/src/printing/schemas/print-job.schema.ts

Zonas Padrão

Zona (printZone)Estação típica
hotCozinha quente (frituras, grelhados, pratos)
coldCozinha fria (saladas, sobremesas, montagem)
barBar (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:

ZonaImpressora
hotEpson TM-T20 (cozinha)
barStar TSP-143 (bar)
coldStar 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' | custom
typescript
// 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,
      });
    }
  }
}

Relacionados

Lançado sob a licença MIT.