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