diff --git a/Business/PLDProcessor.cs b/Business/PLDProcessor.cs index 2292f64..e337c90 100644 --- a/Business/PLDProcessor.cs +++ b/Business/PLDProcessor.cs @@ -26,7 +26,7 @@ public class PLDProcessor "yyyy-MM-dd'T'HH:mm:ss'-03:00'", null ); - double dia = data.ToOADate() - data.ToOADate() % 1; + DateTime dia = data.Date; int hora = data.Hour + 1; string mes = data.ToString("yyMM"); int diaSemana = (int)data.DayOfWeek == 0 ? 7 : (int)data.DayOfWeek; @@ -35,7 +35,7 @@ public class PLDProcessor { string submercado = valorNode.SelectSingleNode("bo:submercado//bo:nome", nsmgr).InnerText; double valor = double.Parse(valorNode.SelectSingleNode("bo:valor//bo:valor", nsmgr).InnerText, new CultureInfo("en-US")); - pldList.Add(new PLDModel(data, hora, submercado, valor, mes, diaSemana)); + pldList.Add(new PLDModel(dia, hora, submercado, valor, mes, diaSemana)); } } diff --git a/Data/AccessRepository.cs b/Data/AccessRepository.cs index 1f3b6f0..f7ed105 100644 --- a/Data/AccessRepository.cs +++ b/Data/AccessRepository.cs @@ -19,11 +19,16 @@ public class AccessRepository : IDataRepository return cmd.ExecuteScalar() is DateTime data ? data.AddDays(1) : new DateTime(2022, 01, 01); } - public void SalvarPLDs(List plds) + public void SalvarPLDs(List plds, DateTime ultimaData) { using var conn = new OleDbConnection(_connectionString); conn.Open(); - foreach (var pld in plds) + + // Filtrar apenas os PLDs mais recentes + var novosPLDs = plds.FindAll(pld => pld.Dia >= ultimaData); + if (novosPLDs.Count == 0) return; // Nenhum dado novo, então sair da função + + foreach (var pld in novosPLDs) { string query = "INSERT INTO PLD_comp (Data, Hora, Submercado, Valor, Mes_ref, Dia_da_semana) " + "VALUES (@Data, @Hora, @Submercado, @Valor, @MesRef, @DiaSemana)"; diff --git a/Data/IDataRepository.cs b/Data/IDataRepository.cs index 76e2bfe..f9a291f 100644 --- a/Data/IDataRepository.cs +++ b/Data/IDataRepository.cs @@ -3,5 +3,5 @@ public interface IDataRepository { DateTime ObterDataInicial(); - void SalvarPLDs(List plds); + void SalvarPLDs(List plds, DateTime ultimaData); } diff --git a/Data/PostgresRepository.cs b/Data/PostgresRepository.cs index a8d126a..58f66c3 100644 --- a/Data/PostgresRepository.cs +++ b/Data/PostgresRepository.cs @@ -28,11 +28,15 @@ using PI_Assync_PLD.Models; : DateTime.Now.AddYears(-2); } - public void SalvarPLDs(List plds) + public void SalvarPLDs(List plds, DateTime ultimaData) { using var conn = new NpgsqlConnection(_connectionString); conn.Open(); + // Filtrar apenas os PLDs mais recentes + var novosPLDs = plds.FindAll(pld => pld.Dia >= ultimaData); + if (novosPLDs.Count == 0) return; // Nenhum dado novo, então sair da função + using var transaction = conn.BeginTransaction(); string query = "INSERT INTO pld (dia_num, hora, submercado, valor, mes_ref, dia_da_semana) " + @@ -40,10 +44,10 @@ using PI_Assync_PLD.Models; using var cmd = new NpgsqlCommand(query, conn, transaction); - foreach (var pld in plds) + foreach (var pld in novosPLDs) { cmd.Parameters.Clear(); - cmd.Parameters.AddWithValue("@Dia", pld.Dia); + cmd.Parameters.AddWithValue("@Dia", pld.Dia.ToOADate()); cmd.Parameters.AddWithValue("@Hora", pld.Hora); cmd.Parameters.AddWithValue("@Submercado", pld.Submercado); cmd.Parameters.AddWithValue("@Valor", pld.Valor); diff --git a/Services/PLDService.cs b/Services/PLDService.cs index 2d6c78f..af152de 100644 --- a/Services/PLDService.cs +++ b/Services/PLDService.cs @@ -18,13 +18,11 @@ public class PLDService public async Task SincronizarPLDsAsync() { - List datasIniciais = _repositories.ConvertAll(repo => repo.ObterDataInicial()); - DateTime dataInicial = DateTime.MinValue; - foreach (var data in datasIniciais) - { - if (data > dataInicial) dataInicial = data; - } - DateTime dataFinal = DateTime.Now.AddDays(1); + Dictionary datasIniciais = _repositories + .ToDictionary(repo => repo, repo => repo.ObterDataInicial()); + + DateTime dataFinal = DateTime.Now.Date.AddDays(1); + DateTime dataInicial = datasIniciais.Values.Min(); // Criar um timer que reseta a cada segundo 00 _ = Task.Run(() => ResetarLimitePorMinuto()); @@ -43,7 +41,14 @@ public class PLDService // Atualiza ambos os bancos apenas se houver novos dados if (plds.Count > 0) { - Parallel.ForEach(_repositories, repo => repo.SalvarPLDs(plds)); + // Para cada repositório, passar a data inicial correta + Parallel.ForEach(datasIniciais, kvp => + { + var repo = kvp.Key; + var ultimaData = kvp.Value; + repo.SalvarPLDs(plds, ultimaData); + }); + Console.WriteLine("PLDs salvos com sucesso."); } } @@ -66,10 +71,4 @@ public class PLDService .Replace("DATA_FIM", fim.ToString("yyyy-MM-ddT00:00:00")) .Replace("PAG_NUM", "1"); } - - private List ProcessarXML(string xml) - { - // Simulação de parser XML (substituir pela lógica real) - return new List { new PLDModel(DateTime.Now, 1, "Sul", 123.45, "2403", 3) }; - } }