PI_Assync_PLD/Services/PLDService.cs
Adriano Serighelli d3536ef422 Requisições realizadas por dia.
Dados inseridos no Postgres em Bulk.
2025-03-24 11:36:42 -03:00

91 lines
3.1 KiB
C#

using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using PI_Assync_PLD.Models;
public class PLDService
{
private readonly HttpClientService _httpClient;
private readonly List<IDataRepository> _repositories;
private readonly SemaphoreSlim _requestLimiter = new SemaphoreSlim(5); // Limite de 5 requisições simultâneas
public PLDService(HttpClientService httpClient, List<IDataRepository> repositories)
{
_httpClient = httpClient;
_repositories = repositories;
}
public async Task SincronizarPLDsAsync()
{
Dictionary<IDataRepository, DateTime> datasIniciais = _repositories
.ToDictionary(repo => repo, repo => repo.ObterDataInicial());
DateTime dataFinal = DateTime.Now.Date.AddDays(1);
DateTime menorDataInicial = datasIniciais.Values.Min();
// Criar um timer que reseta a cada minuto no segundo 00
_ = Task.Run(() => ResetarLimitePorMinuto());
Console.WriteLine($"Buscando dados de {menorDataInicial} até {dataFinal} em períodos de 1 dia...");
List<Task<string>> tarefasRequisicoes = new List<Task<string>>();
for (DateTime data = menorDataInicial; data < dataFinal; data = data.AddDays(1))
{
DateTime dataInicio = data;
tarefasRequisicoes.Add(Task.Run(async () =>
{
await _requestLimiter.WaitAsync();
string xmlResponse = await _httpClient.EnviarRequisicaoAsync(PrepararXML(dataInicio));
_requestLimiter.Release();
return xmlResponse;
}));
}
// Aguarda todas as requisições finalizarem e junta os resultados
string[] respostasXML = await Task.WhenAll(tarefasRequisicoes);
// Criar processador e consolidar todos os PLDs
var processor = new PLDProcessor();
List<PLDModel> todosPLDs = new List<PLDModel>();
foreach (string xml in respostasXML)
{
todosPLDs.AddRange(processor.ProcessarXML(xml));
}
// Atualiza ambos os bancos apenas se houver novos dados
if (todosPLDs.Count > 0)
{
Parallel.ForEach(datasIniciais, kvp =>
{
var repo = kvp.Key;
var ultimaData = kvp.Value;
repo.SalvarPLDs(todosPLDs, ultimaData);
});
Console.WriteLine($"PLDs de {menorDataInicial} a {dataFinal} salvos com sucesso.");
}
}
private void ResetarLimitePorMinuto()
{
while (true)
{
DateTime now = DateTime.Now;
int delay = (60 - now.Second) * 1000;
Thread.Sleep(delay);
_requestLimiter.Release(5);
}
}
private string PrepararXML(DateTime inicio)
{
string xmlTemplate = System.IO.File.ReadAllText(@"X:\Back\PLD Horário\listarPLD.txt");
return xmlTemplate.Replace("DATA_INI", inicio.ToString("yyyy-MM-ddT00:00:00"))
.Replace("DATA_FIM", inicio.ToString("yyyy-MM-ddT00:00:00"))
.Replace("PAG_NUM", "1");
}
}