Logica do SistemaSecao 10
Metricas e Dashboard
OfertasDashboardQueryService (Tenant)
Arquivo: cargo_fleet.Application/Ofertas/Dashboard/OfertasDashboardQueryService.cs
Calcula para os ultimos 5 meses (por tenant):
- Totais globais (aceitas = status
ACEITA/EMBARQUE EMITIDO; recusadas =RECUSA LEILAO). - Series mensais por tipo (Spot/Contrato): total e aceitas.
- Valores Spot por mes:
ValorTotaleValorGanho. - Oportunidades perdidas por mes:
CouldNotBeAcceptedByRoute == true.
Problemas: .Count() sincrono (P-13), .ToList() materializando tudo em memoria, sem cache.
Incoerencias Identificadas
| ID | Descricao |
|---|---|
| P-13 | .Count() sincrono e materializacao in-memory sem cache no dashboard |
| SCALE-H6 | N+1 em MetricasAppService — uma query por tenant |
MetricasAppService (Host)
Arquivo:
cargo_fleet.Application/Metricas/MetricasAppService.csDados calculados (escopo host — todos os tenants):
NumeroTenantAtivo: conta tenants ativos via loop +IsActiveAsync(N+1 por tenant — ver SCALE-H6).TotalRotas:GetCountAsync()sem filtro (inclui inativas).TotalCargasAceitas: count ondeTryAceite == true AND status IN ("ACEITA", "EMBARQUE EMITIDO").TotalCotacoesSpot: mesmo filtro +Tipo == Spot.ValorTotalSpot: somaValor + PrecoAdicionalde Spot aceitas.Cache distribuido: TTL de 5 minutos, chave
"metricas:dashboard:host".[DisableAuditing]— acesso cross-tenant sem trilha de auditoria.IDataFilter.Disable<IMultiTenant>()— legitimo para endpoint host-only, mas sem auditoria.