public void NotSupportForVendorIsNotAllHasStock()
        {
            // 构建数据
            var items = new List <OrderItemModel>()
            {
                new OrderItemModel()
                {
                    SkuId    = 10001,
                    Quantity = 10
                },
                new OrderItemModel()
                {
                    SkuId    = 10002,
                    Quantity = 10
                }
            };
            var orderInfo = new OrderModel(items);

            var vendors = new SectionStocksModel
            {
                {
                    10001, new List <OPC_Stock>()
                    {
                        new OPC_Stock()
                        {
                            Count = 10
                        }
                    }
                }
            };

            Assert.IsFalse(_splitStrategy.Support(orderInfo, vendors));
        }
        public void NotSupport()
        {
            var splitStrategy = new DefaultSplitStrategy();

            // 构建数据
            var items = new List <OrderItemModel>()
            {
                new OrderItemModel()
                {
                    SkuId    = 10001,
                    Quantity = 10
                }
            };
            var orderInfo = new OrderModel(items);

            var vendors = new SectionStocksModel
            {
                {
                    10001, new List <OPC_Stock>()
                    {
                        new OPC_Stock()
                        {
                            Count = 9
                        }
                    }
                }
            };

            Assert.IsFalse(splitStrategy.Support(orderInfo, vendors));
        }
Exemple #3
0
        private SpliltResultModel Spit(OrderModel order, SectionStocksModel stocks)
        {
            foreach (var splitStrategy in _splitStrategies)
            {
                if (splitStrategy.Support(order, stocks))
                {
                    return(splitStrategy.Split(order, stocks));
                }
            }

            return(new SpliltResultModel(null, new NotSupportedException("splitStrategy")));
        }
Exemple #4
0
        public override bool Support(OrderModel order, SectionStocksModel sectionStocks)
        {
            /**=========================================
             * 参数检查
             * =========================================*/

            SplitOrderUtils.CheckArgument(order, sectionStocks);

            /**=========================================
             * 需要判断订单中的商品价格和是否库存充足
             * =========================================*/
            return(SplitOrderUtils.AllSkuHasStockForOrderPrice(order, sectionStocks));
        }
Exemple #5
0
        public static void CheckArgument(OrderModel order, SectionStocksModel sectionStocks)
        {
            if (order == null)
            {
                throw new ArgumentNullException("order");
            }

            if (sectionStocks == null)
            {
                throw new ArgumentNullException("sectionStocks");
            }

            if (order.Items == null)
            {
                throw new ArgumentNullException("items");
            }
        }
Exemple #6
0
        public static bool AllSkuHasStockForOrderPrice(OrderModel order, SectionStocksModel stocks)
        {
            // 没有库存信息,订单中的所有商品库存不足,不支持
            if (stocks.Count == 0)
            {
                return(false);
            }


            /**
             * 遍历所有的商品检查库存是否充足
             */
            foreach (var item in order.Items)
            {
                /**
                 * 根据skuId获取所有的商品供应商
                 */
                if (!stocks.ContainsKey(item.SkuId))
                {
                    return(false);
                }

                var skuStocks = stocks[item.SkuId];

                /**
                 * 如果某个商品所有的专柜都没有提供,返回false
                 */
                if (skuStocks.Count == 0)
                {
                    return(false);
                }

                /**
                 * 判断当前商品在所有的专柜是否存在
                 * 如果价格为订单中的价格的商品小于默认专柜的库存数量,返回false
                 */
                var allStock = stocks[item.SkuId].Where(p => p.Price == item.ItemPrice).Sum(c => c.Count);

                if (allStock < item.Quantity)
                {
                    return(false);
                }
            }

            return(true);
        }
Exemple #7
0
        public virtual SpliltResultModel Split(OrderModel order,
                                               SectionStocksModel sectionStocks)
        {
            /**
             * sectionId和SaleDetail的对照表
             */
            var sectionId2SaleDetails = new Dictionary <int, List <OPC_SaleDetail> >();

            foreach (var item in order.Items)
            {
                /**
                 * 进行销售单详情处理
                 */
                //var saleDetails = ProcessOrderItem2SectionSaleDetail(item, sectionStocks[item.SkuId]);
                var saleDetails = ProcessOrderItem2SectionSaleDetail(item, sectionStocks[item.SkuId].Where(x => x.Price == item.ItemPrice));

                if (saleDetails == null)
                {
                    throw new NullReferenceException("detailInfo");
                }

                //if (saleDetails.Count == 0)
                //{
                //    throw new ApplicationException("saleDetails length is 0");
                //}

                /**
                 * 遍历添加拆分后的销售清单项
                 */
                foreach (var saleDetail in saleDetails)
                {
                    if (sectionId2SaleDetails.ContainsKey(saleDetail.SectionId))
                    {
                        sectionId2SaleDetails[saleDetail.SectionId].Add(saleDetail.SaleDetail);
                    }
                    else
                    {
                        sectionId2SaleDetails[saleDetail.SectionId] = new List <OPC_SaleDetail> {
                            saleDetail.SaleDetail
                        };
                    }
                }
            }

            // 处理订单的结果
            var result = new List <SaleOrderModel>();

            var index = 1;

            foreach (var sectionId in sectionId2SaleDetails.Keys)
            {
                var saleOrderInfo = ProcessSaleOrder(index, order, sectionId, sectionId2SaleDetails[sectionId]);

                if (saleOrderInfo == null)
                {
                    throw new NullReferenceException("saleOrderInfo");
                }

                result.Add(saleOrderInfo);

                index += 1;
            }

            return(new SpliltResultModel(result));
        }
Exemple #8
0
 public abstract bool Support(OrderModel order, SectionStocksModel sectionStocks);
 public SpliltResultModel Split(OrderModel order, SectionStocksModel sectionStocks)
 {
     return(new SpliltResultModel(null, new StockShortageException("订单库存不足,订单中的价格商品库存不足!")));
 }