示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#5
0
        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);
        }
示例#6
0
        public async Task <CommandResult> AddressSelected(AddressSelectedCommand command)
        {
            CommandResult commandResult = await _commandService.SendAndReceiveResult <CommandResult>(command);

            return(commandResult);
        }