91 lines
3.1 KiB
C#
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");
|
|
}
|
|
}
|