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)); }
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"))); }
public override bool Support(OrderModel order, SectionStocksModel sectionStocks) { /**========================================= * 参数检查 * =========================================*/ SplitOrderUtils.CheckArgument(order, sectionStocks); /**========================================= * 需要判断订单中的商品价格和是否库存充足 * =========================================*/ return(SplitOrderUtils.AllSkuHasStockForOrderPrice(order, sectionStocks)); }
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"); } }
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); }
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)); }
public abstract bool Support(OrderModel order, SectionStocksModel sectionStocks);
public SpliltResultModel Split(OrderModel order, SectionStocksModel sectionStocks) { return(new SpliltResultModel(null, new StockShortageException("订单库存不足,订单中的价格商品库存不足!"))); }