private void CalcProductPrice(ProductPriceRequestInfo requestInfo) { if (requestInfo == null) { return; } if (requestInfo.SysNo == null) { return; } CalcMargin(requestInfo); CalcMarginAmount(requestInfo); var productSysNo = GetProductSysNoByAuditProductPriceSysNo(requestInfo.SysNo.Value); var source = ExternalDomainBroker.GetProductPromotionDiscountInfoList(productSysNo); requestInfo.NewMargin = requestInfo.Margin; requestInfo.OldPrice.NewMargin = requestInfo.OldPrice.Margin; requestInfo.NewMarginAmount = requestInfo.MarginAmount; requestInfo.OldPrice.NewMarginAmount = requestInfo.OldPrice.NewMarginAmount; if (source == null || source.Count == 0) { return; } var targetSource = source.Where(e => PromotionTypeList.Contains(e.PromotionType)).ToList(); if (targetSource.Count == 0) { return; } var targetSources = (from p in targetSource group p by p.PromotionType into g let maxPrice = g.Max(p => p.Discount) select g.Where(p => p.Discount == maxPrice).First()).ToList(); var amount = targetSources.Sum(p => p.Discount); amount = requestInfo.CurrentPrice ?? 0 - amount; var oldAmount = requestInfo.OldPrice.CurrentPrice ?? 0 - amount; var margin = ObjectFactory <ProductPriceProcessor> .Instance.GetMargin(amount, requestInfo.Point ?? 0, requestInfo.UnitCost); var oldMargin = ObjectFactory <ProductPriceProcessor> .Instance.GetMargin(oldAmount, requestInfo.OldPrice.Point ?? 0, requestInfo.OldPrice.UnitCost); var marginAmount = ObjectFactory <ProductPriceProcessor> .Instance.GetMarginAmount(amount, requestInfo.Point ?? 0, requestInfo.UnitCost); var oldMarginAmount = ObjectFactory <ProductPriceProcessor> .Instance.GetMarginAmount(oldAmount, requestInfo.OldPrice.Point ?? 0, requestInfo.OldPrice.UnitCost); margin = Math.Round(margin, 4); oldMargin = Math.Round(oldMargin, 4); marginAmount = Math.Round(marginAmount, 4); oldMarginAmount = Math.Round(oldMarginAmount, 4); requestInfo.NewMargin = margin; requestInfo.OldPrice.NewMargin = oldMargin; requestInfo.MarginAmount = marginAmount; requestInfo.OldPrice.MarginAmount = oldMarginAmount; }
private string CheckMargin(decimal checkPrice, ProductInfo productInfo, CategoryInfo categoryInfo, string priceName, ref ProductPriceRequestAuditType auditType) { var message = new StringBuilder(); if (categoryInfo.SysNo.HasValue) { var setting = ObjectFactory <CategorySettingProcessor> .Instance.GetCategorySettingBySysNo(categoryInfo.SysNo.Value, productInfo.SysNo); var priceInfo = productInfo.ProductPriceRequest; if (priceInfo.UnitCost != 0) { var margin = GetMargin(checkPrice, priceInfo.Point.HasValue ? priceInfo.Point.Value : 0, priceInfo.UnitCost); if (margin < setting.PrimaryMargin && margin > setting.SeniorMargin) { message.AppendLine(ResouceManager.GetMessageString("IM.ProductPrice", "CheckMarginResult1") + priceName + ResouceManager.GetMessageString("IM.ProductPrice", "CheckMarginResult2")); } if (margin < setting.SeniorMargin) { message.AppendLine(priceName + ResouceManager.GetMessageString("IM.ProductPrice", "CheckMarginResult3")); auditType = ProductPriceRequestAuditType.SeniorAudit; } var productPromotionDiscountInfoList = ExternalDomainBroker.GetProductPromotionDiscountInfoList(productInfo.SysNo); if (productPromotionDiscountInfoList.Any()) { productPromotionDiscountInfoList.ForEach(promotionDiscountInfo => { var promotionMargin = GetMargin(checkPrice, priceInfo.Point.HasValue ? priceInfo.Point.Value : 0, priceInfo.UnitCost, promotionDiscountInfo.Discount); var enumName = EnumHelper.GetEnumDesc(promotionDiscountInfo.PromotionType); var promotionMarginPercent = (promotionMargin * 100).TruncateDecimal(2) + "%"; if (promotionMargin < setting.PrimaryMargin) { message.AppendLine(ResouceManager.GetMessageString("IM.ProductPrice", "CheckMarginResult4") + priceName + ResouceManager.GetMessageString("IM.ProductPrice", "CheckMarginResult5") + enumName + promotionDiscountInfo.ReferenceSysNo + ResouceManager.GetMessageString("IM.ProductPrice", "CheckMarginResult6") + promotionMarginPercent + ResouceManager.GetMessageString("IM.ProductPrice", "CheckMarginResult7")); } }); } } } else { throw new BizException(ResouceManager.GetMessageString("IM.ProductPrice", "CheckMarginResult8")); } return(message.ToString()); }
public void UpdateProductPriceInfo(ProductInfo productInfo) { var product = _productDA.GetProductInfoBySysNo(productInfo.SysNo); if (product.ProductStatus == ProductStatus.Active) { throw new BizException(ResouceManager.GetMessageString("IM.ProductPrice", "CheckProductPriceActiveProductCannotSave")); } var promotionList = ExternalDomainBroker.GetProductPromotionDiscountInfoList(productInfo.SysNo); CheckNoPromotion(promotionList); product.ProductBasicInfo.Note = productInfo.ProductBasicInfo.Note; ProcessNoRequestPrice(productInfo.ProductPriceRequest, product.ProductPriceInfo); DoubleCheckProductPrice(productInfo.ProductPriceRequest); /* * var auditType = ProductPriceRequestAuditType.Audit; * * var auditMessage = CheckProductPriceRequest(productInfo, product.ProductPriceInfo, product.ProductBasicInfo.ProductCategoryInfo, * ref auditType); * * if (auditMessage.Length > 0) * { * throw new BizException(auditMessage); * } */ _productPriceDA.UpdateProductBasicPrice(productInfo.SysNo, productInfo.ProductPriceRequest); if (productInfo.ProductPriceRequest.VirtualPrice != product.ProductPriceInfo.VirtualPrice) { _productPriceDA.UpdateProductVirtualPrice(productInfo.SysNo, product.ProductPriceInfo.VirtualPrice, productInfo.ProductPriceRequest.VirtualPrice); } if (productInfo.ProductPriceInfo.IsSyncShopPrice != product.ProductPriceInfo.IsSyncShopPrice) { _productPriceDA.UpdateProductSyncShopPrice(productInfo.SysNo, productInfo.ProductPriceInfo.IsSyncShopPrice); } _productPriceDA.UpdateProductPrice(productInfo.SysNo, productInfo.ProductPriceRequest); #region Check当前商品调价后所在销售规则中差价 ExternalDomainBroker.CheckComboPriceAndSetStatus(productInfo.SysNo); #endregion _productCommonInfoDA.UpdateProductCommonInfoNote(product, productInfo.OperateUser); }
/// <summary> /// Check商品本身及促销活动中毛利率,供外部访问 /// </summary> /// <param name="productPriceReqInfo">价格信息,必须参数包括:CurrentPrice,Point,UnitCost,CategorySysNo</param> /// <param name="productSysNo">商品Sysno</param> /// <param name="priceName">所修改价格的名称</param> /// <param name="productMarginReturnMsg">返回商品本身的毛利率Check结果</param> /// <returns></returns> public List <ProductPromotionMarginInfo> CheckMargin(ProductPriceRequestInfo productPriceReqInfo, int productSysNo, string priceName, decimal discount, ref string productMarginReturnMsg) { List <ProductPromotionMarginInfo> returnList = new List <ProductPromotionMarginInfo>(); var categoryInfo = productPriceReqInfo.Category; if (categoryInfo.SysNo.HasValue) { var setting = ObjectFactory <CategorySettingProcessor> .Instance.GetCategorySettingBySysNo(categoryInfo.SysNo.Value, productSysNo); var priceInfo = productPriceReqInfo; if (priceInfo.UnitCost >= 0) { var margin = GetMargin(priceInfo.CurrentPrice.Value, priceInfo.Point.HasValue ? priceInfo.Point.Value : 0, priceInfo.UnitCost, discount); if (margin < setting.PrimaryMargin && margin > setting.SeniorMargin) { productMarginReturnMsg = ResouceManager.GetMessageString("IM.ProductPrice", "CheckMarginResult1") + priceName + ResouceManager.GetMessageString("IM.ProductPrice", "CheckMarginResult2"); } if (margin < setting.SeniorMargin) { productMarginReturnMsg = priceName + ResouceManager.GetMessageString("IM.ProductPrice", "CheckMarginResult3"); //auditType = ProductPriceRequestAuditType.SeniorAudit; } var productPromotionDiscountInfoList = ExternalDomainBroker.GetProductPromotionDiscountInfoList(productSysNo); if (productPromotionDiscountInfoList.Any()) { string msgTmp = string.Empty; productPromotionDiscountInfoList.ForEach(promotionDiscountInfo => { var promotionMargin = GetMargin(priceInfo.CurrentPrice.Value, priceInfo.Point.HasValue ? priceInfo.Point.Value : 0, priceInfo.UnitCost, promotionDiscountInfo.Discount); var enumName = EnumHelper.GetEnumDesc(promotionDiscountInfo.PromotionType); var promotionMarginPercent = (promotionMargin * 100).TruncateDecimal(2) + "%"; if (promotionMargin < setting.PrimaryMargin) { msgTmp = ResouceManager.GetMessageString("IM.ProductPrice", "CheckMarginResult4") + priceName + ResouceManager.GetMessageString("IM.ProductPrice", "CheckMarginResult5") + enumName + promotionDiscountInfo.ReferenceSysNo + ResouceManager.GetMessageString("IM.ProductPrice", "CheckMarginResult6") + promotionMarginPercent + ResouceManager.GetMessageString("IM.ProductPrice", "CheckMarginResult7"); } returnList.Add(new ProductPromotionMarginInfo() { PromotionType = promotionDiscountInfo.PromotionType, ReferenceSysNo = promotionDiscountInfo.ReferenceSysNo, Margin = promotionMargin, ReturnMsg = msgTmp }); }); } } } else { throw new BizException(ResouceManager.GetMessageString("IM.ProductPrice", "CheckMarginResult8")); } return(returnList); }