intermediate
ordens-servico
rule-engine
automacao

Configuracao do Rule Engine

Escreva regras que criam tasks automaticamente a partir de telemetria ao vivo. Sete tipos de trigger, config em JSON e teste dry-run.

Equipe Levy FleetsMay 18, 20268 min read

Configuracao do Rule Engine

O rule engine e o que diferencia o Levy Service de um CMMS generico. Regras observam telemetria ao vivo e criam tasks automaticamente. Uma frota bem ajustada bate mais de 50% de tasks criadas automaticamente em poucas semanas apos o go-live.

Este artigo cobre os sete tipos de trigger, o formato da config em JSON e como rodar dry-run de uma regra antes de ativar.

Onde as regras vivem

Regras sao gerenciadas em /dashboard/task-rules. Cada linha da tabela mostra:

  • Name (seu rotulo)
  • Trigger type (um dos sete abaixo)
  • Action summary (qual task ela cria)
  • Last run e last match count
  • Um toggle Enabled

Regras ficam na tabela task_rules e respeitam RLS - cada regra pertence a um subaccount.

Os sete tipos de trigger

1. mileage

Dispara quando o hodometro de um veiculo cruza um limite relativo ao ultimo fechamento do mesmo type.

{
  "trigger_type": "mileage",
  "trigger_config": {
    "interval_km": 2000,
    "last_task_type": "scheduled_maintenance"
  },
  "task_type": "scheduled_maintenance",
  "default_priority": "medium"
}

O cron /api/cron/task-rule-mileage avalia isso a cada hora.

2. time

Cadencia de calendario. Roda diariamente as 06:00 UTC.

{
  "trigger_type": "time",
  "trigger_config": { "every_days": 90 },
  "task_type": "inspection",
  "default_priority": "low"
}

Combine com mileage para "a cada 2000 km OU a cada 90 dias, o que vier primeiro" escrevendo duas regras.

3. condition_report

Dispara quando um condition report pos-corrida passa de uma severidade de IA.

{
  "trigger_type": "condition_report",
  "trigger_config": { "min_ai_severity": 4 },
  "task_type": "repair",
  "default_priority": "high"
}

Esse e um trigger por evento: o insert em condition_reports pelo app do rider chama onConditionReportCreated imediatamente, entao a task entra no quadro em segundos apos o fim da corrida.

4. low_battery

Bateria cai abaixo de um limite E o veiculo esta parado por uma janela configuravel. Impede que tasks sejam criadas no meio de uma corrida.

{
  "trigger_type": "low_battery",
  "trigger_config": {
    "battery_threshold": 20,
    "parked_minutes": 360
  },
  "task_type": "battery_swap",
  "default_priority": "medium",
  "action_config": { "assign_by_proximity": true }
}

Avaliado por /api/cron/task-rule-low-battery a cada 30 minutos.

5. rider_issue

Um rider envia um problema pelo fluxo ReportIssue do app movel. Por evento.

{
  "trigger_type": "rider_issue",
  "trigger_config": { "category": "mechanical" },
  "task_type": "repair",
  "default_priority": "high"
}

Se o rider anexa uma foto e a IA classifica como severidade 4+, a priority sobe para critical independente do default da regra.

6. iot_fault

Um codigo de falha cai em iot_events. Cobre flags Queclink, erros W0,4 BMS da OKAI e eventos de queda do acelerometro.

{
  "trigger_type": "iot_fault",
  "trigger_config": { "fault_codes": ["ACCEL_CRASH", "BMS_FAULT"] },
  "task_type": "inspection",
  "default_priority": "critical"
}

Eventos de queda criticos tambem viram o veiculo para maintenance instantaneamente via auto-flip trigger.

7. geofence

Veiculo sai da zona de operacao por mais de N minutos. Cria uma task retrieve.

{
  "trigger_type": "geofence",
  "trigger_config": { "outside_zone_minutes": 30 },
  "task_type": "retrieve",
  "default_priority": "high",
  "action_config": { "assign_by_proximity": true }
}

Avaliado por /api/cron/task-rule-geofence a cada hora.

Action config

action_config fica ao lado de trigger_config e controla atribuicao, notificacoes e efeitos colaterais.

ChaveEfeito
assign_by_proximityEscolhe o tecnico disponivel mais proximo via users.last_lat/last_lng
assign_roleRestringe a proximidade por papel, ex. chargehand para battery_swap
assign_team_idEmpurra para a fila de um time especifico
change_vehicle_statusVira o veiculo para maintenance mesmo com priority abaixo de high
notify_slackDispara webhook do Slack ao match da regra

Dry-run antes de ativar

Toda regra tem um botao Test que chama POST /api/task-rules/[id]/test. O dry-run avalia a regra contra sua frota atual e retorna os veiculos que casam sem criar tasks. Use isso antes de ligar uma regra nova para confirmar que ela nao casa com a frota inteira.

Por exemplo, se low_battery retorna 240 matches em uma frota de 250 veiculos, provavelmente seu parked_minutes esta curto demais.

Loops de regras e deduplicacao

Regras nao podem criar a mesma task duas vezes. O helper createTaskInternal checa por uma task aberta do mesmo task_type contra o mesmo veiculo e retorna skipped_duplicate: true se ja existe. Isso e logado em task_rule_runs para audit mas nao cria nova linha.

Isso impede o loop classico em que a regra dispara, a acao vira o veiculo para maintenance, a mudanca de status redispara a mesma regra e voce tem 10.000 tasks fantasmas antes do almoco.

A tabela de audit

Cada execucao de regra e logada em task_rule_runs com os veiculos que casaram, os IDs das tasks criadas e quaisquer duplicatas puladas. Use isso para debugar uma regra que "nao esta disparando" - ela pode estar rodando e casando zero veiculos, ou casando todos e sendo deduplicada.

Comece com tres regras, nao trinta

O erro mais comum e ativar todas as regras no primeiro dia. Comece com low_battery, uma regra de condition_report e uma de mileage. Adicione mais quando voce ver as primeiras rodando limpas por uma semana.