SWITCH - Múltiplas Condições
O que é este Node?
O SWITCH é o node responsável por criar múltiplos caminhos baseados no valor de uma variável (equivalente ao switch/case da programação), permitindo direcionar o flow para diferentes destinos dependendo do valor.
Por que este Node existe?
Quando você tem mais de 2 opções, usar múltiplos IF fica complexo. O SWITCH existe para:
- Múltiplas opções: Direcionar para N caminhos diferentes
- Menu de opções: Usuário escolhe 1, 2, 3 → diferentes ações
- Status diferentes: Pedido pode ser: pendente, aprovado, cancelado, enviado
- Categorias: Produto pode ser: eletrônico, roupa, alimento
- Código limpo: Mais legível que múltiplos IFs encadeados
Como funciona internamente?
Quando o SWITCH é executado, o sistema:
- Pega valor da variável
- Compara com cada case
- Encontra match: Vai para targetNode do case correspondente
- Sem match: Vai para defaultCase
Código interno (logic-control-executor.service.ts:88-109):
private async executeSwitch(parameters: any, context: any): Promise<any> {
const { variable, cases, defaultCase, variables } = parameters;
const currentVariables = variables || context.variables || {};
const value = currentVariables[variable];
// Find matching case
const matchingCase = cases?.find(c => c.value === value);
const nextAction = matchingCase ? matchingCase.targetNode : defaultCase;
return {
success: true,
action: 'switch_evaluated',
variable: variable,
value: value,
matchingCase: matchingCase?.value || null,
nextAction: nextAction,
timestamp: new Date().toISOString()
};
}
Quando você DEVE usar este Node?
Use SWITCH quando tiver 3 ou mais opções baseadas em 1 variável:
Casos de uso:
- Menu numérico: 1=Vendas, 2=Suporte, 3=Financeiro
- Status de pedido: pendente/aprovado/cancelado/enviado
- Tipo de produto: eletrônico/roupa/alimento/livro
- Plano escolhido: básico/pro/enterprise
- Departamento: RH/TI/Marketing/Vendas
Parâmetros
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| variable | string | Sim | Nome da variável a avaliar |
| cases | array | Sim | Array de |
| defaultCase | string | Sim | Node ID para ir se nenhum case match |
| variables | object | Não | Variáveis (context.variables padrão) |
Estrutura de Cases
{
"cases": [
{ "value": "1", "targetNode": "node_vendas" },
{ "value": "2", "targetNode": "node_suporte" },
{ "value": "3", "targetNode": "node_financeiro" }
],
"defaultCase": "node_opcao_invalida"
}
Exemplo 1: Menu de Atendimento
{
"name": "Menu de Atendimento",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 200 },
"data": { "label": "Início" }
},
{
"id": "message_1",
"type": "message",
"position": { "x": 300, "y": 200 },
"data": {
"label": "Menu",
"parameters": {
"message": "Bem-vindo! Escolha uma opção:\\n\\n1️⃣ Vendas\\n2️⃣ Suporte\\n3️⃣ Financeiro"
}
}
},
{
"id": "input_1",
"type": "input",
"position": { "x": 500, "y": 200 },
"data": {
"label": "Capturar Escolha",
"parameters": {
"message": "Digite o número da opção:",
"variable": "opcao"
}
}
},
{
"id": "switch_1",
"type": "switch",
"position": { "x": 700, "y": 200 },
"data": {
"label": "Direcionar",
"parameters": {
"variable": "opcao",
"cases": [
{ "value": "1", "targetNode": "message_vendas" },
{ "value": "2", "targetNode": "message_suporte" },
{ "value": "3", "targetNode": "message_financeiro" }
],
"defaultCase": "message_invalido"
}
}
},
{
"id": "message_vendas",
"type": "message",
"position": { "x": 900, "y": 50 },
"data": {
"label": "Vendas",
"parameters": {
"message": "💼 Você foi direcionado para Vendas!"
}
}
},
{
"id": "message_suporte",
"type": "message",
"position": { "x": 900, "y": 150 },
"data": {
"label": "Suporte",
"parameters": {
"message": "🛠️ Você foi direcionado para Suporte!"
}
}
},
{
"id": "message_financeiro",
"type": "message",
"position": { "x": 900, "y": 250 },
"data": {
"label": "Financeiro",
"parameters": {
"message": "💰 Você foi direcionado para Financeiro!"
}
}
},
{
"id": "message_invalido",
"type": "message",
"position": { "x": 900, "y": 350 },
"data": {
"label": "Opção Inválida",
"parameters": {
"message": "❌ Opção inválida. Tente novamente."
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 1100, "y": 200 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "message_1" },
{ "source": "message_1", "target": "input_1" },
{ "source": "input_1", "target": "switch_1" },
{ "source": "switch_1", "target": "message_vendas", "case": "1" },
{ "source": "switch_1", "target": "message_suporte", "case": "2" },
{ "source": "switch_1", "target": "message_financeiro", "case": "3" },
{ "source": "switch_1", "target": "message_invalido", "case": "default" },
{ "source": "message_vendas", "target": "end_1" },
{ "source": "message_suporte", "target": "end_1" },
{ "source": "message_financeiro", "target": "end_1" },
{ "source": "message_invalido", "target": "end_1" }
]
}
Resposta do Node
{
"success": true,
"action": "switch_evaluated",
"variable": "opcao",
"value": "2",
"matchingCase": "2",
"nextAction": "message_suporte",
"timestamp": "2025-01-15T10:30:00.000Z"
}
Diferença: SWITCH vs CONDITION
| Feature | CONDITION | SWITCH |
|---|---|---|
| Opções | 2 (true/false) | N opções |
| Comparações | Expressões complexas | Igualdade simples |
| Uso | idade >= 18 | opcao == "1" |
| Quando usar | Lógica booleana | Menu de opções |
Boas Práticas
✅ SIM: - Sempre defina defaultCase - Use valores simples nos cases (strings ou números) - Organize cases logicamente
❌ NÃO: - Não use SWITCH para apenas 2 opções (use CONDITION) - Não esqueça defaultCase
Dicas
💡 Valores: Cases comparam com igualdade estrita (===) 💡 Strings: "1" !== 1 (são diferentes!) 💡 Default: Sempre captura opções inválidas 💡 Debug: Use MESSAGE antes para ver valor da variável