Пример #1
0
        public async Task <CreateOrderResponse> Handle(CreateOrderRequest request, CancellationToken cancellationToken = default)
        {
            try
            {
                var orderNumber = request.OrderNumber;
                var productItemsFromRepository = await _productItemRepository
                                                 .GetListByProductNumberAsync(request.Items.Select(x => x.ItemNumber), cancellationToken);

                var orderItems = new List <OrderItem>();
                foreach (var item in request.Items)
                {
                    var productItem = productItemsFromRepository.FirstOrDefault(x => x.ProductNumber == item.ItemNumber);
                    orderItems.Add(new OrderItem(productItem.Id, item.Quantity));
                }

                var order = new Order(orderNumber, orderItems);

                await _orderRepository.AddAsync(order);

                var requiredBinWidth = await _packageService.CalculateRequiredBinWidthByOrderAsync(order, cancellationToken);

                return(new CreateOrderResponse(requiredBinWidth));
            }
            catch (OrderNumberAlreadyExistRepositoryException ex)
            {
                throw new OrderNumberAlreadyExistServiceException($"Order {request.OrderNumber} already exist.");
            }
            catch (ProductItemFoundRepositoryException ex)
            {
                throw new EntityNotFoundServiceException(ex.Message, ex);
            }
        }
Пример #2
0
        public async Task <GetOrderDetailsResponse> Handle(GetOrderDetailsRequest request, CancellationToken cancellationToken = default)
        {
            try
            {
                var orderNumber = request.OrderNumber;
                var order       = await _orderRepository.GetByOrderNumberAsync(orderNumber, cancellationToken);

                var requiredBinWidth = await _packageService.CalculateRequiredBinWidthByOrderAsync(order, cancellationToken);

                var productItemsFromRepository = await _productItemRepository.GetListByIdsAsync(order.OrderItems.Select(x => x.ProductId), cancellationToken);

                var productItems = new List <ProductItemDetailsResponse>();
                foreach (var item in order.GetOrderItemsGroupedByProductId())
                {
                    var productItem      = productItemsFromRepository.FirstOrDefault(x => x.Id == item.ProductId);
                    var productNumber    = productItem.ProductNumber;
                    var width            = productItem.ProductType.Width;
                    var maxStackQuantity = productItem.ProductType.MaxStackQuantity;
                    var type             = productItem.ProductType.Type;
                    var quantity         = item.Quantity;
                    productItems.Add(new ProductItemDetailsResponse(productNumber, width, maxStackQuantity, quantity, type));
                }

                return(new GetOrderDetailsResponse(requiredBinWidth, orderNumber, productItems));
            }
            catch (OrderNotFoundRepositoryException ex)
            {
                throw new EntityNotFoundServiceException($"Order {request.OrderNumber} not found");
            }
        }