Esempio n. 1
0
        /// <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;
                    });
                }
            }
        }