Dados de medição agrupados por hora antes de escolher entre Inspeção lógica e coleta diária. Após escolha realizada são feitas as estimativas com base na média dos dados consolidados.

This commit is contained in:
Adriano Serighelli 2025-10-15 14:11:46 -03:00
parent a8d87addad
commit 654d363d12
3 changed files with 27 additions and 23 deletions

View File

@ -225,12 +225,7 @@ namespace Application
reat_g reat_g
); );
}) })
.GroupBy(x => new { x.Ponto, x.DiaNum, x.Minuto }) .ToList();
.Select(g =>
{
var logica = g.FirstOrDefault(x => x.Origem == "Inspeção Lógica");
return logica ?? g.First();
}).ToList();
var minutosEsperados = new[] { 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60 }; 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 grupoHora = medidasPorHora.Where(h => h.Key.Hora == hora).ToList();
var lista = grupoHora.SelectMany(g => g).OrderBy(m => m.Minuto).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<Medicao> 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 minutosEsperadosAbsolutos = minutosEsperados.Select(m => m + (60 * hora)).ToList();
var faltantes = minutosEsperadosAbsolutos.Except(minutosPresentes).OrderBy(m => m).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<Medicao>(); var estimadas = new List<Medicao>();
foreach (var faltante in faltantes) foreach (var faltante in faltantes)
@ -272,15 +280,10 @@ namespace Application
} }
else else
{ {
// Busca anterior real var ativaConsumo = selecionados.Average(m => m.AtivaConsumo);
var anterior = reais.Values.Where(m => m.Minuto < faltante).OrderByDescending(m => m.Minuto).FirstOrDefault(); var ativaGeracao = selecionados.Average(m => m.AtivaGeracao);
// Busca posterior real var reativaConsumo = selecionados.Average(m => m.ReativaConsumo);
var posterior = reais.Values.Where(m => m.Minuto > faltante).OrderBy(m => m.Minuto).FirstOrDefault(); var reativaGeracao = selecionados.Average(m => m.ReativaGeracao);
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 estimada = new Medicao( var estimada = new Medicao(
grupoHora.First().Key.Ponto, grupoHora.First().Key.Ponto,
@ -297,7 +300,7 @@ namespace Application
} }
// Adiciona todos (originais + estimados) ao resultado final // Adiciona todos (originais + estimados) ao resultado final
medidasComEstimativa.AddRange(lista); medidasComEstimativa.AddRange(selecionados);
medidasComEstimativa.AddRange(estimadas); medidasComEstimativa.AddRange(estimadas);
} }

View File

@ -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 = '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 = '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 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 command = new OleDbCommand(sql, connection);
using var reader = await command.ExecuteReaderAsync(ct); using var reader = await command.ExecuteReaderAsync(ct);

View File

@ -7,13 +7,13 @@ class Program
static async Task Main() static async Task Main()
{ {
DateTime inicio = DateTime.Now; 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 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"; 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 dataIni = new DateTime(inicio.Year, inicio.Month, 1);
//DateTime dataFim = new DateTime(inicio.Year, inicio.Month, inicio.Day); //DateTime dataFim = new DateTime(inicio.Year, inicio.Month, inicio.Day);
DateTime dataIni = new DateTime(inicio.Year, 10, 1); DateTime dataIni = new DateTime(inicio.Year, 01, 01);
DateTime dataFim = new DateTime(inicio.Year, 10, 14); DateTime dataFim = new DateTime(inicio.Year, 02, 01);
// Configuração de dependências (pode usar um container DI depois) // Configuração de dependências (pode usar um container DI depois)
var postgresRepo = new PostgresRepository(PG_CONN_STRING_PROD); var postgresRepo = new PostgresRepository(PG_CONN_STRING_PROD);