Logica do SistemaSecao 2
Rotas
Verificacao de Rotas Expirando (VerificarRotasWorker)
Arquivo: cargo_fleet.HttpApi.Host/BackgroundJobs/VerificarRotasWorker.cs
Timer.Period = 1 dia(TimeSpan.FromDays(1).TotalMilliseconds).- Para cada tenant: busca rotas com
PeriodoFinalentre hoje e amanha. - Para cada rota expirada: cria notificacao de alerta e faz dispatch via Firebase.
- Fluxo por rota: 1 query de
DeviceToken+ 1 chamada Firebase por rota, sem rate limiting.
Contadores de Veiculos
Os contadores QuantidadeCarros e CargaAdicionalQuantidadeVeiculos sao gerenciados da seguinte forma:
Decremento: Ocorre em OfertasAceiteResultApplier.AplicarEfeitosAceite apos aceite bem-sucedido na API Galileu.
Restauracao: NAO existe logica de restauracao. Se uma oferta aceita for cancelada ou recusada pela Galileu (RECUSADO_APOS_ACEITE, CANCELADO), o contador permanece decrementado.
Risco de race condition: O decremento e feito em memoria (rota.QuantidadeCarros--) antes de persistir. Dois ciclos concorrentes podem ler o mesmo valor e ambos decrementar para o mesmo resultado, resultando em over-accept.
Incoerencias Identificadas
| ID | Descricao |
|---|---|
| P-08 | QuantidadeCarros e CargaAdicionalQuantidadeVeiculos nao restaurados em cancelamento |
| (escalabilidade) | Decremento nao atomico — race condition com over-accept |
Entidade e Propriedades
Arquivo:
cargo_fleet.Domain/Rotas/Rota.csTenantIdGuid?TipoTipoRotaEnumOperacaoTipoOperacaoEnumCargaTipoCargaEnumVeiculoTipoVeiculoEnumOrigemCidadesEnum?DestinoCidadesEnum?QuantidadeCarrosintPeriodoInicialDateTimePeriodoFinalDateTimePrecodecimal?PontoTNFCidadesEnum?PrecoPerna1decimal?PrecoPerna2decimal?StatusStatusRotaEnumAtivadoouDesativadoAceitaCargaAdicionalbool?CargaAdicionalPeriodoInicioDateTime?CargaAdicionalPeriodoFinalDateTime?CargaAdicionalQuantidadeVeiculosint?AceitaTnfbool?OrigemCidadeIdint?CidadesDestinoCidadeIdint?CidadesAbrangenciaOrigemTipoAbrangenciaGeograficaEnum?AbrangenciaDestinoTipoAbrangenciaGeograficaEnum?