Motor de roteirização de frota
Peso, cubagem, limite de paradas e janela de entrega resolvidos por um solver, em vez de uma manhã inteira montando romaneio na mão.
O problema
Montar o romaneio era trabalho manual e caro. Cada veículo tem limite de peso e de volume, cada motorista aguenta um número de paradas, e metade dos endereços de destinatário chega sem coordenada ou com cubagem faltando. Quando o roteiro saía errado, o erro só aparecia com o caminhão já carregado. E cada consulta a API externa de rota entrava na fatura.
O que eu construí
Assumi e evoluí o motor. Antes de tentar resolver qualquer coisa ele valida: data de partida no passado, roteiro sem destino, destinatários demais para a frota disponível, base de partida sem coordenada, peso total acima da capacidade somada dos veículos. Completa a cubagem que falta, geocodifica endereço sem coordenada, agrupa documentos por destinatário, monta a matriz de distâncias e manda para o solver em Python. Tudo em fila, porque resolver a frota inteira não cabe no tempo de uma requisição. Terminado o cálculo, ele cria o romaneio sozinho e devolve para a operação.
O que mudou
O roteiro deixou de ser uma manhã de trabalho e passou a rodar em segundo plano. O erro passou a aparecer na validação, e não com o caminhão carregado. E a conta das APIs externas de rota caiu, porque distância já calculada passou a ser reaproveitada em vez de comprada de novo.
Como funciona
Stack
- Laravel
- PHP 8
- Python
- Filas
- MySQL
- Google Geocoding
- Maplink
Emissão fiscal sob regra de governo