/// <summary> /// 计算商品最终售价 /// 原则:取最优客户价格 /// </summary> /// <param name="soInfo"></param> public virtual void CalculateItemPrice(SOInfo soInfo) { //礼品卡订单不获取价格 if (soInfo.BaseInfo.SOType == SOType.ElectronicCard || soInfo.BaseInfo.SOType == SOType.PhysicalCard) { soInfo.Items.ForEach(item => { item.GainAveragePoint = 0; item.PayType = ProductPayType.MoneyOnly; }); return; } //获取商品价格信息 List <int> itemSysNos = soInfo.Items.Where(item => item.ProductType == SOProductType.Accessory || item.ProductType == SOProductType.Award || item.ProductType == SOProductType.Gift || item.ProductType == SOProductType.Product || item.ProductType == SOProductType.SelfGift) .Select <SOItemInfo, int>(item => item.ProductSysNo.Value).ToList <int>(); List <ProductInfo> productInfoList = ExternalDomainBroker.GetProductInfoListByProductSysNoList(itemSysNos); if (productInfoList != null && productInfoList.Count > 0) { foreach (var item in soInfo.Items) { //普通商品处理逻辑 if (item.ProductType == SOProductType.Product) { ProductPriceInfo priceInfo = null; ProductInfo productInfoTemp = productInfoList.Find(x => x.SysNo == item.ProductSysNo); if (productInfoTemp != null) { priceInfo = productInfoTemp.ProductPriceInfo; } if (priceInfo != null) { item.CostPrice = priceInfo.UnitCost; item.PayType = priceInfo.PayType;//Vantal Update 属性名称修改 item.GainAveragePoint = priceInfo.Point; item.OriginalPrice = priceInfo.CurrentPrice; CustomerRank customerRank = ExternalDomainBroker.GetCustomerRank(soInfo.BaseInfo.CustomerSysNo.Value); #warning 批发与手动修改价格逻辑需要再处理, 更新订单逻辑也需要考虑 decimal tempWholeSalePrice = 0.00M; decimal tempMemberPrice = 0.00M; //如果商品支持批发价,商品售价取最优批发价格 if (priceInfo.ProductWholeSalePriceInfo != null && priceInfo.ProductWholeSalePriceInfo.Count > 0) { //取最优批发价 priceInfo.ProductWholeSalePriceInfo.OrderBy(l => l.Level) .ToList() .ForEach(w => { if (item.Quantity >= w.Qty) { tempWholeSalePrice = w.Price.Value; } }); } //优先使用会员价 priceInfo.ProductRankPrice.OrderBy(r => r.Rank) .ToList() .ForEach(r => { if (r.Status.HasValue && r.Status == ProductRankPriceStatus.Active && customerRank >= r.Rank) { tempMemberPrice = r.RankPrice.Value; } }); if (tempWholeSalePrice != 0) { item.OriginalPrice = Math.Min(tempWholeSalePrice, item.OriginalPrice.Value); item.PriceType = SOProductPriceType.WholeSale; } if (tempMemberPrice != 0) { if (tempMemberPrice <= tempWholeSalePrice) { item.OriginalPrice = Math.Min(tempMemberPrice, item.OriginalPrice.Value); item.PriceType = SOProductPriceType.Member; } } if (item.PriceType == SOProductPriceType.WholeSale) { //批发无积分 item.GainAveragePoint = 0; } if (m_isManualPrice) { //重新计算Discount if (item.Price_End > 0) { item.AdjustPrice = item.OriginalPrice.Value - item.Price_End; //初始化调价 item.Price_End = 0; } item.OriginalPrice = item.OriginalPrice - item.AdjustPrice; } //更新状态购物车的单件商品没有修改数量按原始价格计算 if (IsUpdate) { var originalItem = OriginalSOInfo.Items.Find(oitem => oitem.ProductSysNo == item.ProductSysNo); if (originalItem != null && item.Quantity == originalItem.Quantity) { //如果手动改价 if (item.AdjustPrice != originalItem.AdjustPrice) { item.OriginalPrice = (originalItem.OriginalPrice ?? 0) + originalItem.AdjustPrice - item.AdjustPrice; //continue; } } } item.Price = item.OriginalPrice; } } //优惠券和延保不赠积分 else if (item.ProductType == SOProductType.Coupon) { item.GainAveragePoint = 0; item.PayType = ProductPayType.All; } else if (item.ProductType == SOProductType.ExtendWarranty) { item.OriginalPrice = item.Price; item.GainAveragePoint = 0; item.PayType = ProductPayType.All; //数量 var masterProduct = soInfo.Items.First(p => p.ProductSysNo.ToString() == item.MasterProductSysNo); item.Quantity = masterProduct.Quantity; } //是赠品,附件,奖品则价格为0, 积分为0 else { ProductPriceInfo priceInfo = null; ProductInfo productInfoTemp = productInfoList.Find(x => x.SysNo == item.ProductSysNo); if (productInfoTemp != null) { priceInfo = productInfoTemp.ProductPriceInfo; } if (priceInfo != null) { item.CostPrice = priceInfo.UnitCost; } item.OriginalPrice = 0; item.Price = 0; item.PayType = ProductPayType.All; } } } if (m_isManualPrice) { if (IsUpdate) { foreach (var item in soInfo.Items) { SOItemInfo oldSOItem = OriginalSOInfo.Items.Find(oldItem => oldItem.ProductSysNo == item.ProductSysNo); if (oldSOItem != null) { if (!(item.PromotionAmount == 0 && string.IsNullOrEmpty(item.AdjustPriceReason)) && !(item.Price_End != item.Price)) { item.OriginalPrice = item.OriginalPrice + oldSOItem.PromotionAmount - item.PromotionAmount; } } item.Price = item.OriginalPrice; } } else if (soInfo.BaseInfo.SOType == SOType.Gift) { //赠品订单做补偿时使用 soInfo.Items.ForEach(item => { item.PromotionAmount = item.OriginalPrice; item.AdjustPriceReason = "赠品订单自动调整"; item.OriginalPrice = 0; item.Price = 0; }); } } }