public WarehouseQuantityChange[] AddressSelected(AddressSelectedCommand command, RWarehouse[] warehouses, RWarehouse_Product_Mapping[] warehouseProductMappings, WorkingTime[] logisticsWorkingTimes, Holiday[] logisticsHolidayTimes) { var quantityChanges = ValidateQuantityInStock(command, warehouses, warehouseProductMappings, logisticsWorkingTimes, logisticsHolidayTimes); CreatePo(); return(quantityChanges); }
private WarehouseQuantityChange[] ValidateQuantityInStock(AddressSelectedCommand command, RWarehouse[] warehouses, RWarehouse_Product_Mapping[] warehouseProductMappings, WorkingTime[] logisticsWorkingTimes, Holiday[] logisticsHolidayTimes) { IList <WarehouseQuantityChange> quantityChanges = new List <WarehouseQuantityChange>(); var cartItemsGroups = CartItems.GroupBy(p => $"ProductId:{p.ProductId}, SellPrice:{p.Price}"); var warehouseProductMappingsGroups = warehouseProductMappings.GroupBy(p => $"ProductId:{p.Id}, SellPrice:{p.SellPrice}").ToDictionary(p => p.Key, p => p.ToArray()); foreach (var cartItemsGroup in cartItemsGroups) { int quantityBuy = cartItemsGroup.Count(); EnumDefine.CartStatusEnum status; RWarehouse_Product_Mapping[] warehouseProductMappingsGroup = null; if (warehouseProductMappingsGroups.ContainsKey(cartItemsGroup.Key)) { warehouseProductMappingsGroup = warehouseProductMappingsGroups[cartItemsGroup.Key]; int quantityInStock = warehouseProductMappingsGroup.Sum(p => p.QuantityCanUse); status = quantityBuy > quantityInStock ? EnumDefine.CartStatusEnum.NotEnoughQuantity : EnumDefine.CartStatusEnum.EnoughInventory; } else { status = EnumDefine.CartStatusEnum.NotInStock; } if (status == EnumDefine.CartStatusEnum.EnoughInventory && warehouseProductMappingsGroup != null) { foreach (var warehouseProductMapping in warehouseProductMappingsGroup) { bool isSetShippingTime = false; foreach (var cartItem in cartItemsGroup) { var warehouseSelected = warehouses.FirstOrDefault(p => p.WarehouseId == warehouseProductMapping.WarehouseId); isSetShippingTime = GetShippingTimes(cartItem, warehouseSelected, warehouseProductMapping, command, logisticsWorkingTimes, logisticsHolidayTimes); if (isSetShippingTime) { cartItem.WarehouseSelected(warehouseSelected); } } if (!isSetShippingTime) { continue; } int quantityChange = 0; if (quantityBuy <= warehouseProductMapping.QuantityCanUse) { quantityChange = quantityBuy; quantityChanges.Add(new WarehouseQuantityChange(warehouseProductMapping.WarehouseId, warehouseProductMapping.ProductId, warehouseProductMapping.SellPrice, quantityChange)); break; } else { quantityChange = warehouseProductMapping.QuantityCanUse; quantityChanges.Add(new WarehouseQuantityChange(warehouseProductMapping.WarehouseId, warehouseProductMapping.ProductId, warehouseProductMapping.SellPrice, quantityChange)); } } } } return(quantityChanges.ToArray()); }
public async Task <ICommandResult> Handle(AddressSelectedCommand mesage) { try { var shard = await _shardingService.GetShardById(ShardGroup, mesage.ShardId); RCart rCart = await _cartService.GetFromDb(shard.ConnectionString, mesage.CartId); if (rCart == null) { throw new MessageException(ResourceKey.Cart_NotFound); } if (rCart.Version != mesage.Version) { throw new MessageException(ResourceKey.Cart_IsChanged); } Cart cart = new Cart(rCart); RWarehouse[] warehouses = new RWarehouse[0]; RWarehouse_Product_Mapping[] warehouseProductMappings = new RWarehouse_Product_Mapping[0]; WorkingTime[] logisticsWorkingTimes = new WorkingTime[0]; Holiday[] logisticsHolidayTimes = new Holiday[0]; //tinh ton kho var quantityChangedsCancel = cart.AddressSelectedCancel(); var quantityChanges = cart.AddressSelected(mesage, warehouses, warehouseProductMappings, logisticsWorkingTimes, logisticsHolidayTimes); await _eventSender.Notify(); ICommandResult result = new CommandResult() { Message = "", ObjectId = string.Empty, Status = CommandResult.StatusEnum.Sucess }; return(result); } catch (MessageException e) { e.Data["Param"] = mesage; ICommandResult result = new CommandResult() { Message = e.Message, Status = CommandResult.StatusEnum.Fail, ResourceName = e.ResourceName }; return(result); } catch (Exception e) { e.Data["Param"] = mesage; ICommandResult result = new CommandResult() { Message = e.Message, Status = CommandResult.StatusEnum.Fail }; return(result); } }
public async Task <CheckoutViewModel> AddressSelected(AddressSelectedViewModel model) { var cart = await _cartService.GetFromCache(_currentContext.ClientId); AddressSelectedCommand command = new AddressSelectedCommand(cart.Version) { CartId = cart.Id, DistrictId = model.DistrictId, ProvinceId = model.ProvinceId, StreetId = model.StreetId, WardId = model.WardId, ShardId = cart.ShardId }; CommandResult result = await _cartService.AddressSelected(command); bool isLogin = await _currentContext.IsAuthenticated(); CheckoutViewModel modelResponse = new CheckoutViewModel(await InitPage()) { IsLogin = isLogin, ClientId = _currentContext.ClientId }; if (result.IsSucess) { cart = await _cartService.GetFromCache(_currentContext.ClientId); if (cart != null) { modelResponse.CheckoutItems = cart.CartItemFulls.Select(p => p.ToCheckout()).ToArray(); } } else { modelResponse.AddMessage(result.ResourceName); } return(modelResponse); }
private bool GetShippingTimes(CartItem cartItem, RWarehouse warehouse, RWarehouse_Product_Mapping warehouseProductMapping, AddressSelectedCommand command, WorkingTime[] logisticsWorkingTimes, Holiday[] logisticsHolidayTimes) { if (warehouseProductMapping.PickupAndShippingTimeByWard.ContainsKey(command.WardId)) { cartItem.SetStatus(EnumDefine.CartStatusEnum.NotShippingSupport); return(false); } DateTime dtNow = Extensions.GetCurrentDateUtc(); DateTime shippingTime = dtNow; int i = -1; while (true) { i++; if (i > 10) { break; } shippingTime = shippingTime.AddDays(i); var dayOfWeek = shippingTime.DayOfWeek; WorkingTime workingTime = warehouse.WorkingTimes.FirstOrDefault(p => p.DayOfWeek == dayOfWeek); if (workingTime == null) { shippingTime = shippingTime.Date; continue; } // ReSharper disable once AccessToModifiedClosure Holiday holidayDay = warehouse.HolidayTimes.FirstOrDefault(p => p.Day.Date == shippingTime.Date); int pickupMinute = 0; var productShippingTimeConfig = warehouseProductMapping.PickupAndShippingTimeByWard[command.WardId]; if (holidayDay != null) { // ReSharper disable once AccessToModifiedClosure var holidayDayWorkingTimes = holidayDay.WorkingTimes.FirstOrDefault(p => shippingTime.Minute + productShippingTimeConfig.Item1 < p.Item2); if (holidayDayWorkingTimes == null) { shippingTime = shippingTime.Date; continue; } pickupMinute = holidayDayWorkingTimes.Item1; } else { pickupMinute = workingTime.Times[0].Item1; } cartItem.SetShippingTime(shippingTime.AddMinutes(pickupMinute), productShippingTimeConfig.Item2, logisticsWorkingTimes, logisticsHolidayTimes); return(true); } cartItem.SetStatus(EnumDefine.CartStatusEnum.IsVenderHoliday); return(false); }
public async Task <CommandResult> AddressSelected(AddressSelectedCommand command) { CommandResult commandResult = await _commandService.SendAndReceiveResult <CommandResult>(command); return(commandResult); }