14-16 Mar 2026
Logica do Sistema

Metricas e Dashboard

Secao 10

MetricasAppService (Host)

Arquivo: cargo_fleet.Application/Metricas/MetricasAppService.cs

Dados 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 onde TryAceite == true AND status IN ("ACEITA", "EMBARQUE EMITIDO").
  • TotalCotacoesSpot: mesmo filtro + Tipo == Spot.
  • ValorTotalSpot: soma Valor + PrecoAdicional de 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.


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: ValorTotal e ValorGanho.
  • Oportunidades perdidas por mes: CouldNotBeAcceptedByRoute == true.

Problemas: .Count() sincrono (P-13), .ToList() materializando tudo em memoria, sem cache.


Incoerencias Identificadas

IDDescricao
P-13.Count() sincrono e materializacao in-memory sem cache no dashboard
SCALE-H6N+1 em MetricasAppService — uma query por tenant