Código funcional.

Consulta da data máxima de cada banco de dados realizada individualmente.
Dados sendo inseridos conforme a data máxima de cada banco de dados.
Pendente realizar paginação da requisição http.
This commit is contained in:
Adriano Serighelli 2025-03-22 15:05:14 -03:00
parent d656f07613
commit 751e7da3a6
5 changed files with 30 additions and 22 deletions

View File

@ -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));
}
}

View File

@ -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<PLDModel> plds)
public void SalvarPLDs(List<PLDModel> 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)";

View File

@ -3,5 +3,5 @@
public interface IDataRepository
{
DateTime ObterDataInicial();
void SalvarPLDs(List<PLDModel> plds);
void SalvarPLDs(List<PLDModel> plds, DateTime ultimaData);
}

View File

@ -28,11 +28,15 @@ using PI_Assync_PLD.Models;
: DateTime.Now.AddYears(-2);
}
public void SalvarPLDs(List<PLDModel> plds)
public void SalvarPLDs(List<PLDModel> 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);

View File

@ -18,13 +18,11 @@ public class PLDService
public async Task SincronizarPLDsAsync()
{
List<DateTime> 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<IDataRepository, DateTime> 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<PLDModel> ProcessarXML(string xml)
{
// Simulação de parser XML (substituir pela lógica real)
return new List<PLDModel> { new PLDModel(DateTime.Now, 1, "Sul", 123.45, "2403", 3) };
}
}