diff --git a/src/building blocks/JSE.Core/Messages/Integration/PedidoAutorizadoIntegrationEvent.cs b/src/building blocks/JSE.Core/Messages/Integration/PedidoAutorizadoIntegrationEvent.cs new file mode 100644 index 0000000..fbeea69 --- /dev/null +++ b/src/building blocks/JSE.Core/Messages/Integration/PedidoAutorizadoIntegrationEvent.cs @@ -0,0 +1,16 @@ +namespace JSE.Core.Messages.Integration +{ + public class PedidoAutorizadoIntegrationEvent : IntegrationEvent + { + public Guid ClienteId { get; private set; } + public Guid PedidoId { get; private set; } + public IDictionary Itens { get; private set; } + + public PedidoAutorizadoIntegrationEvent(Guid clienteId, Guid pedidoId, IDictionary itens) + { + ClienteId = clienteId; + PedidoId = pedidoId; + Itens = itens; + } + } +} \ No newline at end of file diff --git a/src/services/JSE.Pedido.API/Application/DTO/PedidoDTO.cs b/src/services/JSE.Pedido.API/Application/DTO/PedidoDTO.cs index 44e8a44..b445cd2 100644 --- a/src/services/JSE.Pedido.API/Application/DTO/PedidoDTO.cs +++ b/src/services/JSE.Pedido.API/Application/DTO/PedidoDTO.cs @@ -6,7 +6,7 @@ public class PedidoDTO { public Guid Id { get; set; } public int Codigo { get; set; } - + public Guid ClienteId { get; set; } public int Status { get; set; } public DateTime Data { get; set; } public decimal ValorTotal { get; set; } diff --git a/src/services/JSE.Pedido.API/Application/Queries/IPedidoQueries.cs b/src/services/JSE.Pedido.API/Application/Queries/IPedidoQueries.cs index cdd01b7..f8303ca 100644 --- a/src/services/JSE.Pedido.API/Application/Queries/IPedidoQueries.cs +++ b/src/services/JSE.Pedido.API/Application/Queries/IPedidoQueries.cs @@ -6,6 +6,6 @@ public interface IPedidoQueries { Task ObterUltimoPedido(Guid clienteId); Task> ObterListaPorClienteId(Guid clienteId); + Task ObterPedidosAutorizados(); } - } \ No newline at end of file diff --git a/src/services/JSE.Pedido.API/Application/Queries/PedidoQueries.cs b/src/services/JSE.Pedido.API/Application/Queries/PedidoQueries.cs index 273929f..a2c73aa 100644 --- a/src/services/JSE.Pedido.API/Application/Queries/PedidoQueries.cs +++ b/src/services/JSE.Pedido.API/Application/Queries/PedidoQueries.cs @@ -40,6 +40,37 @@ public async Task> ObterListaPorClienteId(Guid clienteId) return pedidos.Select(PedidoDTO.ParaPedidoDTO); } + public async Task ObterPedidosAutorizados() + { + // Correção para pegar todos os itens do pedido e ordernar pelo pedido mais antigo + const string sql = @"SELECT + P.ID as 'PedidoId', P.ID, P.CLIENTEID, + PI.ID as 'PedidoItemId', PI.ID, PI.PRODUTOID, PI.QUANTIDADE + FROM PEDIDOS P + INNER JOIN PEDIDOITEMS PI ON P.ID = PI.PEDIDOID + WHERE P.PEDIDOSTATUS = 1 + ORDER BY P.DATACADASTRO"; + + // Utilizacao do lookup para manter o estado a cada ciclo de registro retornado + var lookup = new Dictionary(); + + await _pedidoRepository.ObterConexao().QueryAsync(sql, + (p, pi) => + { + if (!lookup.TryGetValue(p.Id, out var pedidoDTO)) + lookup.Add(p.Id, pedidoDTO = p); + + pedidoDTO.PedidoItems ??= new List(); + pedidoDTO.PedidoItems.Add(pi); + + return pedidoDTO; + + }, splitOn: "PedidoId,PedidoItemId"); + + // Obtendo dados o lookup + return lookup.Values.OrderBy(p => p.Data).FirstOrDefault(); + } + private PedidoDTO MapearPedido(dynamic result) { var pedido = new PedidoDTO diff --git a/src/services/JSE.Pedido.API/Services/PedidoOrquestradorIntegrationHandler.cs b/src/services/JSE.Pedido.API/Services/PedidoOrquestradorIntegrationHandler.cs index bc69ac7..8e1d681 100644 --- a/src/services/JSE.Pedido.API/Services/PedidoOrquestradorIntegrationHandler.cs +++ b/src/services/JSE.Pedido.API/Services/PedidoOrquestradorIntegrationHandler.cs @@ -1,14 +1,21 @@  +using JSE.Core.Messages.Integration; +using JSE.MessageBus; +using JSE.Pedidos.API.Application.Queries; + namespace JSE.Pedidos.API.Services { public class PedidoOrquestradorIntegrationHandler : IHostedService, IDisposable { + + private readonly IServiceProvider _serviceProvider; private readonly ILogger _logger; private Timer _timer; - public PedidoOrquestradorIntegrationHandler(ILogger logger) + public PedidoOrquestradorIntegrationHandler(ILogger logger, IServiceProvider serviceProvider) { _logger = logger; + _serviceProvider = serviceProvider; } public Task StartAsync(CancellationToken cancellationToken) @@ -23,7 +30,22 @@ public Task StartAsync(CancellationToken cancellationToken) private async void ProcessarPedidos(object state) { - _logger.LogInformation("Processando Pedidos"); + using (var scope = _serviceProvider.CreateScope()) + { + var pedidoQueries = scope.ServiceProvider.GetRequiredService(); + var pedido = await pedidoQueries.ObterPedidosAutorizados(); + + if (pedido == null) return; + + var bus = scope.ServiceProvider.GetRequiredService(); + + var pedidoAutorizado = new PedidoAutorizadoIntegrationEvent(pedido.ClienteId, pedido.Id, + pedido.PedidoItems.ToDictionary(p => p.ProdutoId, p => p.Quantidade)); + + await bus.PublishAsync(pedidoAutorizado); + + _logger.LogInformation($"Pedido ID: {pedido.Id} foi encaminhado para baixa no estoque."); + } } public Task StopAsync(CancellationToken cancellationToken)