PI_Assync_PLD/Services/PLDService.cs
Adriano Serighelli d656f07613 19/03/2025
2025-03-19 10:39:34 -03:00

76 lines
2.6 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()
{
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);
// Criar um timer que reseta a cada segundo 00
_ = Task.Run(() => ResetarLimitePorMinuto());
Console.WriteLine($"Buscando dados de {dataInicial} até {dataFinal}...");
string xmlRequest = PrepararXML(dataInicial, dataFinal);
await _requestLimiter.WaitAsync();
string resposta = await _httpClient.EnviarRequisicaoAsync(xmlRequest);
_requestLimiter.Release();
// Criar processador e processar XML
var processor = new PLDProcessor();
var plds = processor.ProcessarXML(resposta);
// Atualiza ambos os bancos apenas se houver novos dados
if (plds.Count > 0)
{
Parallel.ForEach(_repositories, repo => repo.SalvarPLDs(plds));
Console.WriteLine("PLDs 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, DateTime fim)
{
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", 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) };
}
}