Пример #1
0
        internal void Reserve(ReserveProduct cmd)
        {
            var productId = cmd.AggregateId;
            var quantity  = cmd.Quantity;

            if (AvailableQuantity < quantity)
            {
                RaiseEvent(new ProductReservationFailed(productId, quantity, ProductReservationFailed.NotAvailable));
            }
            else
            {
                RaiseEvent(new ProductReserved(productId, quantity));
            }
        }
Пример #2
0
        public void When_ReserveProductLessThanAvailable_ThrowQuantityChangeException()
        {
            Given(InitialEvents);

            var command = new ReserveProduct(id, 10);

            command.Metadata.CausationId   = command.Metadata.CommandId;
            command.Metadata.CorrelationId = causationAndCorrelationId;

            When(command);

            var expectedEvent = new ProductReservationFailed(id, 10, ProductReservationFailed.NotAvailable);

            expectedEvent.Metadata.CausationId   = command.Metadata.CommandId;
            expectedEvent.Metadata.CorrelationId = causationAndCorrelationId;
            expectedEvent.Metadata.ProcessId     = command.Metadata.ProcessId;

            Then(expectedEvent);
        }
Пример #3
0
        public void When_ReserveProduct_NewProductHasNewQuantity()
        {
            Given(InitialEvents);

            var command = new ReserveProduct(id, 3);

            command.Metadata.CausationId   = command.Metadata.CommandId;
            command.Metadata.CorrelationId = causationAndCorrelationId;

            When(command);

            var expectedEvent = new ProductReserved(id, 3);

            expectedEvent.Metadata.CausationId   = command.Metadata.CommandId;
            expectedEvent.Metadata.CorrelationId = causationAndCorrelationId;
            expectedEvent.Metadata.ProcessId     = command.Metadata.ProcessId;

            Then(expectedEvent);
        }
Пример #4
0
        // TODO выделить минифункци reserve, код станет чище
        public async Task <ReserveProduct[]> ReserveProductsAsync(ReserveProduct[] products, string orderNumber)
        {
            var reserveProductsList = new List <ReserveProduct>();

            using (var scope = new TransactionScope(TransactionScopeOption.Required, TransactionScopeAsyncFlowOption.Enabled))
            {
                DateTime reserveDate = DateTime.UtcNow;
                foreach (var product in products)
                {
                    var remainProductCounter = await _warehouseContext.Counters.FirstOrDefaultAsync(g => g.ProductId == product.ProductId);

                    if (remainProductCounter == null)
                    {
                        reserveProductsList.Add(new ReserveProduct
                        {
                            Count       = -1,
                            OrderNumber = orderNumber,
                            ProductId   = product.ProductId,
                            ReserveDate = reserveDate,
                        });
                        continue;
                    }
                    var existReserve = await _warehouseContext.Reserves.FirstOrDefaultAsync(g => g.OrderNumber == orderNumber && g.ProductId == product.ProductId);

                    if (remainProductCounter.RemainCount < product.Count)
                    {
                        // нет достаточного количества товаров
                        reserveProductsList.Add(new ReserveProduct
                        {
                            Count       = -1,
                            OrderNumber = orderNumber,
                            ProductId   = product.ProductId,
                            ReserveDate = reserveDate,
                        });
                        continue;
                    }
                    var reserveProduct = new ReserveProduct
                    {
                        Count       = product.Count,
                        OrderNumber = orderNumber,
                        ProductId   = product.ProductId,
                        ReserveDate = reserveDate,
                    };
                    reserveProductsList.Add(reserveProduct);
                    if (existReserve != null)
                    {
                        existReserve.Count       = product.Count;
                        existReserve.ReserveDate = reserveDate;
                    }
                    else
                    {
                        _warehouseContext.Reserves.Add(reserveProduct);
                    }
                }

                // посылаем информацию о резервировании товаров
                await _mqSender.SendMessageAsync(new UpdateProductCounterByReserveRequest(orderNumber)
                {
                    Products = reserveProductsList.Where(g => g.Count > 0).Select(g => new UpdateProductCounterByReserveRequest.ReserveProduct
                    {
                        Count     = g.Count,
                        ProductId = g.ProductId
                    }).ToList()
                }, _mqOptions.Value.WarehouseRouteKey);

                await _warehouseContext.SaveChangesAsync();

                scope.Complete();
            }
            return(reserveProductsList.ToArray());
        }
Пример #5
0
        private void lazyinit()
        {
            repositoy = new ServiceRepository();
            IService entity = null;

            entity = new GetUserInfo();
            repositoy.storeServiceEntity(service_type.GET_USER_INFO, entity);

            entity = new RegistUser();
            repositoy.storeServiceEntity(service_type.REGIST_USER, entity);

            entity = new UserLogin();
            repositoy.storeServiceEntity(service_type.USER_LOGIN, entity);

            entity = new DeleteTravelDiary();
            repositoy.storeServiceEntity(service_type.DELETE_TRAVEL_DIARY, entity);

            entity = new UpdateTravelDiary();
            repositoy.storeServiceEntity(service_type.UPDATE_TRAVEL_DIARY, entity);

            entity = new PublishTravelDiary();
            repositoy.storeServiceEntity(service_type.PUBLISH_TRAVEL_DIARY, entity);

            entity = new GetTravelDiariesList();
            repositoy.storeServiceEntity(service_type.GET_TRAVEL_DIARYLIST, entity);

            entity = new GetTravelDiaryDetailInfo();
            repositoy.storeServiceEntity(service_type.GET_TRAVEL_DIARY_DETAIL, entity);

            entity = new GetTravelComments();
            repositoy.storeServiceEntity(service_type.GET_TRAVEL_COMMENT, entity);

            entity = new GetAssociatedProductsInfo();
            repositoy.storeServiceEntity(service_type.GET_ASSOCIATED_PRODUCT, entity);

            entity = new GetCategory();
            repositoy.storeServiceEntity(service_type.GET_DISPLAY_CATEGORY, entity);

            entity = new CollectTravelDiary();
            repositoy.storeServiceEntity(service_type.COLLECT_TRAVEL_DIARY, entity);

            entity = new ReserveProduct();
            repositoy.storeServiceEntity(service_type.RESERVE_PRODUCT, entity);

            return;
        }