Lógica para atualizar ou inserir somente registros pendentes.

This commit is contained in:
Adriano Serighelli 2025-09-30 13:23:37 -03:00
parent 441a70edaf
commit b340b9ef46

View File

@ -291,21 +291,97 @@ internal class Plat_integ
return logica ?? g.First(); // se não tiver lógica, pega qualquer (coleta diária) return logica ?? g.First(); // se não tiver lógica, pega qualquer (coleta diária)
}); });
var novos = new List<dynamic>();
var alterados = new List<dynamic>();
foreach (var m in medidasProcessadas) foreach (var m in medidasProcessadas)
{ {
// Primeiro tenta UPDATE var chave = (m.Ponto, m.DiaNum, m.Minuto);
string sqlUpdate = @"
if (!existentes.TryGetValue(chave, out var existente))
{
// não existe → inserir
novos.Add(m);
}
else
{
// existe mas mudou → atualizar
if (existente.Origem != m.Origem ||
existente.AtivaC != m.AtivaC ||
existente.AtivaG != m.AtivaG ||
existente.ReatC != m.ReatC ||
existente.ReatG != m.ReatG)
{
alterados.Add(m);
}
}
}
if (novos.Any())
{
await using (var connection = await dataSource.OpenConnectionAsync(ct))
{
using var writer = connection.BeginBinaryImport("COPY med_5min (origem, dia_num, minuto, ativa_consumo, ativa_geracao, reativa_consumo, reativa_geracao, ponto) FROM STDIN (FORMAT BINARY)");
foreach (var m in novos)
{
writer.StartRow();
writer.Write(m.Origem);
writer.Write(m.DiaNum, NpgsqlTypes.NpgsqlDbType.Numeric);
writer.Write(m.Minuto, NpgsqlTypes.NpgsqlDbType.Integer);
writer.Write(m.AtivaC, NpgsqlTypes.NpgsqlDbType.Numeric);
writer.Write(m.AtivaG, NpgsqlTypes.NpgsqlDbType.Numeric);
writer.Write(m.ReatC, NpgsqlTypes.NpgsqlDbType.Numeric);
writer.Write(m.ReatG, NpgsqlTypes.NpgsqlDbType.Numeric);
writer.Write(m.Ponto);
}
await writer.CompleteAsync();
}
Console.WriteLine($"Inserido {novos.Count} registros. Ponto {ponto}. Dia {dia}");
}
if (alterados.Any())
{
await using (var connection = await dataSource.OpenConnectionAsync(ct))
{
using (var batch = new NpgsqlBatch(connection))
{
foreach (var m in alterados)
{
var cmd = new NpgsqlBatchCommand(@"
UPDATE med_5min UPDATE med_5min
SET origem = @origem, SET origem = @origem,
ativa_consumo = @ativa_c, ativa_consumo = @ativa_consumo,
ativa_geracao = @ativa_g, ativa_geracao = @ativa_geracao,
reativa_consumo = @reat_c, reativa_consumo = @reativa_consumo,
reativa_geracao = @reat_g reativa_geracao = @reativa_geracao
WHERE ponto = @ponto WHERE ponto = @ponto
AND dia_num = @dia_num AND dia_num = @dia_num
AND minuto = @minuto;"; AND minuto = @minuto;");
using (var cmdUpdate = new NpgsqlCommand(sqlUpdate, connection)) // Adiciona os parâmetros de forma segura
cmd.Parameters.AddWithValue("origem", m.Origem);
cmd.Parameters.AddWithValue("ativa_consumo", m.AtivaC);
cmd.Parameters.AddWithValue("ativa_geracao", m.AtivaG);
cmd.Parameters.AddWithValue("reativa_consumo", m.ReatC);
cmd.Parameters.AddWithValue("reativa_geracao", m.ReatG);
cmd.Parameters.AddWithValue("ponto", m.Ponto);
cmd.Parameters.AddWithValue("dia_num", m.DiaNum);
cmd.Parameters.AddWithValue("minuto", m.Minuto);
batch.BatchCommands.Add(cmd);
}
// Executa o lote de comandos de uma vez
await batch.ExecuteNonQueryAsync();
Console.WriteLine($"Atualizado {alterados.Count} registros. Ponto {ponto}. Dia {dia}");
}
}
}
return;
}
public class SoapFaultException : Exception
{ {
cmdUpdate.Parameters.AddWithValue("origem", m.Origem); cmdUpdate.Parameters.AddWithValue("origem", m.Origem);
cmdUpdate.Parameters.AddWithValue("ativa_c", m.AtivaC); cmdUpdate.Parameters.AddWithValue("ativa_c", m.AtivaC);