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)); } }
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); }
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); }
// 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()); }
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; }