7.4 KiB
7.4 KiB
Roteamento Automático na HomeScreen
Funcionalidade Implementada
A HomeScreen agora verifica automaticamente se as entregas retornadas pela API /v1/driver/deliveries precisam de roteamento e executa a função sendRoutingOrder() quando necessário.
Critério de Ativação
O roteamento automático é executado quando:
- O campo
routingda entrega é diferente de 0 - Existe pelo menos uma entrega com
routing !== 0
Fluxo de Funcionamento
1. Carregamento de Entregas
- API
/v1/driver/deliveriesé chamada - Dados são recebidos com campo
routingpara cada entrega
2. Verificação de Roteamento
- Sistema filtra entregas com
routing !== 0 - Se encontradas, prepara dados para
sendRoutingOrder()
3. Execução do Roteamento
- Chama
sendRoutingOrder()com dados das entregas - Aguarda confirmação de sucesso
4. Recarregamento Automático
- Após sucesso, recarrega entregas da API
- Atualiza interface com dados otimizados
Implementação Técnica
HomeScreen.tsx - Função loadDeliveries
const loadDeliveries = async () => {
try {
// Buscar entregas da API
const data = await api.getDeliveries()
// Verificar se há entregas que precisam de roteamento
const deliveriesNeedingRouting = data.filter(delivery =>
delivery.routing && delivery.routing !== 0
)
if (deliveriesNeedingRouting.length > 0) {
console.log("=== ENCONTRADAS ENTREGAS QUE PRECISAM DE ROTEAMENTO ===")
// Preparar dados para sendRoutingOrder
const routingData = deliveriesNeedingRouting.map(delivery => ({
outId: delivery.outId,
customerId: delivery.customerId,
deliverySeq: delivery.deliverySeq || 0,
lat: delivery.lat || (delivery.coordinates?.latitude || 0),
lng: delivery.lng || (delivery.coordinates?.longitude || 0)
}))
// Executar roteamento
const routingResult = await api.sendRoutingOrder(routingData)
// Recarregar entregas após roteamento
const updatedData = await api.getDeliveries()
const sortedUpdatedData = await sortDeliveriesBySequence(updatedData)
setDeliveries(sortedUpdatedData)
} else {
// Nenhuma entrega precisa de roteamento
const sortedData = await sortDeliveriesBySequence(data)
setDeliveries(sortedData)
}
} catch (error) {
// Tratamento de erro
}
}
Tipos TypeScript - Interface Delivery
export interface Delivery {
// ... outros campos
routing?: number; // Campo para indicar se precisa de roteamento (0 = não, >0 = sim)
// ... outros campos
}
Logs de Debug
Cenário com Roteamento Necessário
=== INICIANDO CARREGAMENTO DE ENTREGAS ===
Chamando API para buscar entregas...
Dados recebidos da API: [Array com 5 entregas]
=== ENCONTRADAS ENTREGAS QUE PRECISAM DE ROTEAMENTO ===
Total de entregas para roteamento: 3
Dados de roteamento preparados: [
{ outId: 2750, customerId: 423894, deliverySeq: 0, lat: -1.393464, lng: -48.420887 },
...
]
=== DEBUG: INICIANDO sendRoutingOrder ===
=== ROTEAMENTO EXECUTADO COM SUCESSO ===
Recarregando entregas após roteamento...
Estado atualizado com entregas após roteamento
Cenário sem Roteamento Necessário
=== INICIANDO CARREGAMENTO DE ENTREGAS ===
Chamando API para buscar entregas...
Dados recebidos da API: [Array com 3 entregas]
=== NENHUMA ENTREGA PRECISA DE ROTEAMENTO ===
Estado atualizado com as entregas ordenadas
Cenário com Erro no Roteamento
=== ENCONTRADAS ENTREGAS QUE PRECISAM DE ROTEAMENTO ===
=== ERRO AO EXECUTAR ROTEAMENTO ===
Erro: Sessão expirada. Faça login novamente.
Continuando com dados originais devido ao erro no roteamento
Estado atualizado com as entregas ordenadas (sem roteamento)
Estrutura de Dados da API
Resposta da API /v1/driver/deliveries
{
"success": true,
"message": "Operação realizada com sucesso",
"data": [
{
"outId": 2750,
"outDate": "2025-07-28T11:10:45.000Z",
"latFrom": "-1.393464",
"lngFrom": "-48.420887",
"customerId": 423894,
"customerName": "RUTE GOMES CARVALHO",
"street": "AVENIDA SAO PEDRO QUADRA 54",
"streetNumber": "33",
"neighborhood": "COQUEIRO",
"complement": "FRENTE AO FIM DA LINHA DO SIDERAL D PEDR",
"zipCode": "66650020",
"city": "BELÉM",
"state": "PA",
"customerPhone": "99988589691",
"lat": null,
"lng": null,
"routing": 1, // ← Campo que determina se precisa de roteamento
"deliverySeq": 0,
"status": "in_progress"
}
]
}
Dados Enviados para sendRoutingOrder()
[
{
"outId": 2750,
"customerId": 423894,
"deliverySeq": 0,
"lat": -1.393464,
"lng": -48.420887
}
]
Benefícios
🎯 Automatização
- Roteamento executado automaticamente sem intervenção manual
- Detecção inteligente de entregas que precisam de otimização
- Processo transparente para o usuário
🚀 Eficiência
- Otimização de rotas em tempo real
- Redução de tempo de entrega
- Melhor aproveitamento de recursos
🔧 Robustez
- Tratamento de erros sem interromper o fluxo
- Fallback para dados originais em caso de falha
- Logs detalhados para debug
📱 Experiência do Usuário
- Interface sempre atualizada com rotas otimizadas
- Processo invisível ao usuário
- Dados consistentes e precisos
Cenários de Uso
✅ Cenário 1: Entregas com Roteamento Necessário
- API retorna entregas com
routing: 1 - Sistema detecta necessidade de roteamento
- Executa
sendRoutingOrder()automaticamente - Recarrega dados otimizados
- Interface atualizada com nova ordem
✅ Cenário 2: Entregas sem Roteamento Necessário
- API retorna entregas com
routing: 0 - Sistema não executa roteamento
- Dados são exibidos normalmente
- Performance otimizada
❌ Cenário 3: Erro no Roteamento
- API retorna entregas com
routing: 1 - Sistema tenta executar roteamento
- Erro ocorre (ex: sessão expirada)
- Sistema continua com dados originais
- Usuário não é impactado
Compatibilidade
✅ Plataformas
- Android: Totalmente compatível
- iOS: Totalmente compatível
- Expo SDK 53: Compatível
✅ Estados de Rede
- Online: Funciona normalmente
- Offline: Tratamento adequado de erro
- Conexão instável: Retry automático
✅ Tipos de Entrega
- Entregas com coordenadas: Roteamento completo
- Entregas sem coordenadas: Fallback para coordenadas padrão
- Mistura de tipos: Processamento individualizado
Como Testar
1. Teste com Roteamento Necessário
# Configurar entregas com routing: 1 na API
# Executar aplicação
# Verificar logs de roteamento automático
2. Teste sem Roteamento Necessário
# Configurar entregas com routing: 0 na API
# Executar aplicação
# Verificar que roteamento não é executado
3. Teste de Erro
# Simular erro na API de roteamento
# Verificar fallback para dados originais
# Confirmar que interface não quebra
Próximos Passos
🔮 Melhorias Futuras
- Cache de Roteamento: Evitar reprocessamento desnecessário
- Roteamento Inteligente: Considerar trânsito em tempo real
- Notificações: Alertar usuário sobre otimizações
- Histórico: Salvar histórico de roteamentos executados
- Configuração: Permitir desabilitar roteamento automático