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 "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; int hora = data.Hour + 1;
string mes = data.ToString("yyMM"); string mes = data.ToString("yyMM");
int diaSemana = (int)data.DayOfWeek == 0 ? 7 : (int)data.DayOfWeek; 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; 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")); 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); 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); using var conn = new OleDbConnection(_connectionString);
conn.Open(); 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) " + string query = "INSERT INTO PLD_comp (Data, Hora, Submercado, Valor, Mes_ref, Dia_da_semana) " +
"VALUES (@Data, @Hora, @Submercado, @Valor, @MesRef, @DiaSemana)"; "VALUES (@Data, @Hora, @Submercado, @Valor, @MesRef, @DiaSemana)";

View File

@ -3,5 +3,5 @@
public interface IDataRepository public interface IDataRepository
{ {
DateTime ObterDataInicial(); 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); : DateTime.Now.AddYears(-2);
} }
public void SalvarPLDs(List<PLDModel> plds) public void SalvarPLDs(List<PLDModel> plds, DateTime ultimaData)
{ {
using var conn = new NpgsqlConnection(_connectionString); using var conn = new NpgsqlConnection(_connectionString);
conn.Open(); 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(); using var transaction = conn.BeginTransaction();
string query = "INSERT INTO pld (dia_num, hora, submercado, valor, mes_ref, dia_da_semana) " + 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); using var cmd = new NpgsqlCommand(query, conn, transaction);
foreach (var pld in plds) foreach (var pld in novosPLDs)
{ {
cmd.Parameters.Clear(); 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("@Hora", pld.Hora);
cmd.Parameters.AddWithValue("@Submercado", pld.Submercado); cmd.Parameters.AddWithValue("@Submercado", pld.Submercado);
cmd.Parameters.AddWithValue("@Valor", pld.Valor); cmd.Parameters.AddWithValue("@Valor", pld.Valor);

View File

@ -18,13 +18,11 @@ public class PLDService
public async Task SincronizarPLDsAsync() public async Task SincronizarPLDsAsync()
{ {
List<DateTime> datasIniciais = _repositories.ConvertAll(repo => repo.ObterDataInicial()); Dictionary<IDataRepository, DateTime> datasIniciais = _repositories
DateTime dataInicial = DateTime.MinValue; .ToDictionary(repo => repo, repo => repo.ObterDataInicial());
foreach (var data in datasIniciais)
{ DateTime dataFinal = DateTime.Now.Date.AddDays(1);
if (data > dataInicial) dataInicial = data; DateTime dataInicial = datasIniciais.Values.Min();
}
DateTime dataFinal = DateTime.Now.AddDays(1);
// Criar um timer que reseta a cada segundo 00 // Criar um timer que reseta a cada segundo 00
_ = Task.Run(() => ResetarLimitePorMinuto()); _ = Task.Run(() => ResetarLimitePorMinuto());
@ -43,7 +41,14 @@ public class PLDService
// Atualiza ambos os bancos apenas se houver novos dados // Atualiza ambos os bancos apenas se houver novos dados
if (plds.Count > 0) 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."); Console.WriteLine("PLDs salvos com sucesso.");
} }
} }
@ -66,10 +71,4 @@ public class PLDService
.Replace("DATA_FIM", fim.ToString("yyyy-MM-ddT00:00:00")) .Replace("DATA_FIM", fim.ToString("yyyy-MM-ddT00:00:00"))
.Replace("PAG_NUM", "1"); .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) };
}
} }