diff --git a/Application/ProcessarMedicoesUseCase.cs b/Application/ProcessarMedicoesUseCase.cs index ba41507..63f4b0c 100644 --- a/Application/ProcessarMedicoesUseCase.cs +++ b/Application/ProcessarMedicoesUseCase.cs @@ -225,12 +225,7 @@ namespace Application reat_g ); }) - .GroupBy(x => new { x.Ponto, x.DiaNum, x.Minuto }) - .Select(g => - { - var logica = g.FirstOrDefault(x => x.Origem == "Inspeção Lógica"); - return logica ?? g.First(); - }).ToList(); + .ToList(); var minutosEsperados = new[] { 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60 }; @@ -243,13 +238,26 @@ namespace Application { var grupoHora = medidasPorHora.Where(h => h.Key.Hora == hora).ToList(); var lista = grupoHora.SelectMany(g => g).OrderBy(m => m.Minuto).ToList(); - var minutosPresentes = lista.Select(m => m.Minuto).ToHashSet(); + + // Separar por origem + var logicas = lista.Where(m => m.Origem == "Inspeção Lógica").ToList(); + var diarias = lista.Where(m => m.Origem == "Coleta Diária").ToList(); + + // Regra de prioridade + List selecionados; + if (logicas.Count > diarias.Count) + { + selecionados = logicas; + } + else + { + selecionados = diarias; + } + + var minutosPresentes = selecionados.Select(m => m.Minuto).ToHashSet(); var minutosEsperadosAbsolutos = minutosEsperados.Select(m => m + (60 * hora)).ToList(); var faltantes = minutosEsperadosAbsolutos.Except(minutosPresentes).OrderBy(m => m).ToList(); - // Use apenas valores reais para interpolação - var reais = lista.ToDictionary(m => m.Minuto, m => m); - var estimadas = new List(); foreach (var faltante in faltantes) @@ -272,15 +280,10 @@ namespace Application } else { - // Busca anterior real - var anterior = reais.Values.Where(m => m.Minuto < faltante).OrderByDescending(m => m.Minuto).FirstOrDefault(); - // Busca posterior real - var posterior = reais.Values.Where(m => m.Minuto > faltante).OrderBy(m => m.Minuto).FirstOrDefault(); - - var ativaConsumo = Interpolar(anterior?.Minuto, anterior?.AtivaConsumo, posterior?.Minuto, posterior?.AtivaConsumo, faltante) ?? 0; - var ativaGeracao = Interpolar(anterior?.Minuto, anterior?.AtivaGeracao, posterior?.Minuto, posterior?.AtivaGeracao, faltante) ?? 0; - var reativaConsumo = Interpolar(anterior?.Minuto, anterior?.ReativaConsumo, posterior?.Minuto, posterior?.ReativaConsumo, faltante) ?? 0; - var reativaGeracao = Interpolar(anterior?.Minuto, anterior?.ReativaGeracao, posterior?.Minuto, posterior?.ReativaGeracao, faltante) ?? 0; + var ativaConsumo = selecionados.Average(m => m.AtivaConsumo); + var ativaGeracao = selecionados.Average(m => m.AtivaGeracao); + var reativaConsumo = selecionados.Average(m => m.ReativaConsumo); + var reativaGeracao = selecionados.Average(m => m.ReativaGeracao); var estimada = new Medicao( grupoHora.First().Key.Ponto, @@ -297,7 +300,7 @@ namespace Application } // Adiciona todos (originais + estimados) ao resultado final - medidasComEstimativa.AddRange(lista); + medidasComEstimativa.AddRange(selecionados); medidasComEstimativa.AddRange(estimadas); } diff --git a/Infrastructure/AccessRepository.cs b/Infrastructure/AccessRepository.cs index 0865961..c28f4d1 100644 --- a/Infrastructure/AccessRepository.cs +++ b/Infrastructure/AccessRepository.cs @@ -23,6 +23,7 @@ namespace Infrastructure //string sql = "SELECT Cod_5min, Codigo_SCDE, Data_de_Migracao FROM Dados_cadastrais WHERE LEN(Codigo_SCDE) > 5 and (Cliente = 'RMC ALIMENTOS' OR Cliente = 'FERREIRA SUPERMERCADO' OR Cliente = 'VANGUARDA ALIMENTOS') AND Unidade_gerenciada ORDER BY PerfilCCEE"; //string sql = "SELECT Cod_5min, Codigo_SCDE, Data_de_Migracao FROM Dados_cadastrais WHERE LEN(Codigo_SCDE) > 5 and Cliente = 'ABEVÊ' and Unidade = 'ABV LOJA 29 - COXIM' AND Unidade_gerenciada ORDER BY PerfilCCEE"; //string sql = "SELECT Cod_5min, Codigo_SCDE, Data_de_Migracao FROM Dados_cadastrais WHERE LEN(Codigo_SCDE) > 5 and Cliente = 'calvi granitos' AND Unidade_gerenciada ORDER BY PerfilCCEE"; + //string sql = "SELECT Cod_5min, Codigo_SCDE, Data_de_Migracao FROM Dados_cadastrais WHERE LEN(Codigo_SCDE) > 5 and Codigo_SCDE = 'DFLBCEENTR101'"; using var command = new OleDbCommand(sql, connection); using var reader = await command.ExecuteReaderAsync(ct); diff --git a/Presentation/Program.cs b/Presentation/Program.cs index 63555ac..09405bc 100644 --- a/Presentation/Program.cs +++ b/Presentation/Program.cs @@ -7,13 +7,13 @@ class Program static async Task Main() { DateTime inicio = DateTime.Now; - string PG_CONN_STRING_PROD = "Server = smart-energia-dev-pgsql.cykff7tj7mik.us-east-1.rds.amazonaws.com; Port = 5432; Database = smartenergiaprod; Username = postgres; Password = VfHml#Z78!%kvvNM; Timeout = 60; CommandTimeout = 60; ApplicationName = new_med_5_min; Connection Lifetime = 120; Minimum Pool Size = 2; Maximum Pool Size = 2;"; + string PG_CONN_STRING_PROD = "Server = smart-energia-dev-pgsql.cykff7tj7mik.us-east-1.rds.amazonaws.com; Port = 5432; Database = smartenergiaprod; Username = postgres; Password = VfHml#Z78!%kvvNM; Timeout = 60; CommandTimeout = 60; ApplicationName = new_med_5_min; Connection Lifetime = 120; Minimum Pool Size = 2; Maximum Pool Size = 4;"; string ACCESS_CONN_STRING = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\\srv-dados\documentos\Middle\Informativo Setorial\Modelo Word\BD1_dados cadastrais e faturas.accdb;Jet OLEDB:Database Password=gds21"; string caminhoLog = $@"\\srv-dados\documentos\Back\Carteira x.x\Codigo\Erros\log_erros_{inicio:MM_dd_HH_mm}.csv"; //DateTime dataIni = new DateTime(inicio.Year, inicio.Month, 1); //DateTime dataFim = new DateTime(inicio.Year, inicio.Month, inicio.Day); - DateTime dataIni = new DateTime(inicio.Year, 10, 1); - DateTime dataFim = new DateTime(inicio.Year, 10, 14); + DateTime dataIni = new DateTime(inicio.Year, 01, 01); + DateTime dataFim = new DateTime(inicio.Year, 02, 01); // Configuração de dependências (pode usar um container DI depois) var postgresRepo = new PostgresRepository(PG_CONN_STRING_PROD);