Skip to content

Commit 2e20b1c

Browse files
committed
#247 - Obter pedidos autorizados via Dapper - feature/sp7/#247
1 parent 51b1898 commit 2e20b1c

File tree

5 files changed

+73
-4
lines changed

5 files changed

+73
-4
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
namespace JSE.Core.Messages.Integration
2+
{
3+
public class PedidoAutorizadoIntegrationEvent : IntegrationEvent
4+
{
5+
public Guid ClienteId { get; private set; }
6+
public Guid PedidoId { get; private set; }
7+
public IDictionary<Guid, int> Itens { get; private set; }
8+
9+
public PedidoAutorizadoIntegrationEvent(Guid clienteId, Guid pedidoId, IDictionary<Guid, int> itens)
10+
{
11+
ClienteId = clienteId;
12+
PedidoId = pedidoId;
13+
Itens = itens;
14+
}
15+
}
16+
}

src/services/JSE.Pedido.API/Application/DTO/PedidoDTO.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ public class PedidoDTO
66
{
77
public Guid Id { get; set; }
88
public int Codigo { get; set; }
9-
9+
public Guid ClienteId { get; set; }
1010
public int Status { get; set; }
1111
public DateTime Data { get; set; }
1212
public decimal ValorTotal { get; set; }

src/services/JSE.Pedido.API/Application/Queries/IPedidoQueries.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@ public interface IPedidoQueries
66
{
77
Task<PedidoDTO> ObterUltimoPedido(Guid clienteId);
88
Task<IEnumerable<PedidoDTO>> ObterListaPorClienteId(Guid clienteId);
9+
Task<PedidoDTO> ObterPedidosAutorizados();
910
}
10-
1111
}

src/services/JSE.Pedido.API/Application/Queries/PedidoQueries.cs

+31
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,37 @@ public async Task<IEnumerable<PedidoDTO>> ObterListaPorClienteId(Guid clienteId)
4040
return pedidos.Select(PedidoDTO.ParaPedidoDTO);
4141
}
4242

43+
public async Task<PedidoDTO> ObterPedidosAutorizados()
44+
{
45+
// Correção para pegar todos os itens do pedido e ordernar pelo pedido mais antigo
46+
const string sql = @"SELECT
47+
P.ID as 'PedidoId', P.ID, P.CLIENTEID,
48+
PI.ID as 'PedidoItemId', PI.ID, PI.PRODUTOID, PI.QUANTIDADE
49+
FROM PEDIDOS P
50+
INNER JOIN PEDIDOITEMS PI ON P.ID = PI.PEDIDOID
51+
WHERE P.PEDIDOSTATUS = 1
52+
ORDER BY P.DATACADASTRO";
53+
54+
// Utilizacao do lookup para manter o estado a cada ciclo de registro retornado
55+
var lookup = new Dictionary<Guid, PedidoDTO>();
56+
57+
await _pedidoRepository.ObterConexao().QueryAsync<PedidoDTO, PedidoItemDTO, PedidoDTO>(sql,
58+
(p, pi) =>
59+
{
60+
if (!lookup.TryGetValue(p.Id, out var pedidoDTO))
61+
lookup.Add(p.Id, pedidoDTO = p);
62+
63+
pedidoDTO.PedidoItems ??= new List<PedidoItemDTO>();
64+
pedidoDTO.PedidoItems.Add(pi);
65+
66+
return pedidoDTO;
67+
68+
}, splitOn: "PedidoId,PedidoItemId");
69+
70+
// Obtendo dados o lookup
71+
return lookup.Values.OrderBy(p => p.Data).FirstOrDefault();
72+
}
73+
4374
private PedidoDTO MapearPedido(dynamic result)
4475
{
4576
var pedido = new PedidoDTO

src/services/JSE.Pedido.API/Services/PedidoOrquestradorIntegrationHandler.cs

+24-2
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,21 @@
11

2+
using JSE.Core.Messages.Integration;
3+
using JSE.MessageBus;
4+
using JSE.Pedidos.API.Application.Queries;
5+
26
namespace JSE.Pedidos.API.Services
37
{
48
public class PedidoOrquestradorIntegrationHandler : IHostedService, IDisposable
59
{
10+
11+
private readonly IServiceProvider _serviceProvider;
612
private readonly ILogger<PedidoOrquestradorIntegrationHandler> _logger;
713
private Timer _timer;
814

9-
public PedidoOrquestradorIntegrationHandler(ILogger<PedidoOrquestradorIntegrationHandler> logger)
15+
public PedidoOrquestradorIntegrationHandler(ILogger<PedidoOrquestradorIntegrationHandler> logger, IServiceProvider serviceProvider)
1016
{
1117
_logger = logger;
18+
_serviceProvider = serviceProvider;
1219
}
1320

1421
public Task StartAsync(CancellationToken cancellationToken)
@@ -23,7 +30,22 @@ public Task StartAsync(CancellationToken cancellationToken)
2330

2431
private async void ProcessarPedidos(object state)
2532
{
26-
_logger.LogInformation("Processando Pedidos");
33+
using (var scope = _serviceProvider.CreateScope())
34+
{
35+
var pedidoQueries = scope.ServiceProvider.GetRequiredService<IPedidoQueries>();
36+
var pedido = await pedidoQueries.ObterPedidosAutorizados();
37+
38+
if (pedido == null) return;
39+
40+
var bus = scope.ServiceProvider.GetRequiredService<IMessageBus>();
41+
42+
var pedidoAutorizado = new PedidoAutorizadoIntegrationEvent(pedido.ClienteId, pedido.Id,
43+
pedido.PedidoItems.ToDictionary(p => p.ProdutoId, p => p.Quantidade));
44+
45+
await bus.PublishAsync(pedidoAutorizado);
46+
47+
_logger.LogInformation($"Pedido ID: {pedido.Id} foi encaminhado para baixa no estoque.");
48+
}
2749
}
2850

2951
public Task StopAsync(CancellationToken cancellationToken)

0 commit comments

Comments
 (0)