/// <summary>
        /// 计算积分规则
        /// </summary>
        /// <param name="efficientRules">有效积分规则</param>
        /// <param name="scene">场景数据</param>
        /// <returns>规则积分</returns>
        public virtual KeyValuePair <IIntegralRule, decimal> RunExpression(IIntegralRule efficientRule, TScene scene)
        {
            var rule     = (IIntegralRule <TScene>)efficientRule;
            var integral = IntegralRound(rule.IntegralExpression.Compile()(scene), scene, rule);

            return(new KeyValuePair <IIntegralRule, decimal>(rule, integral));
        }
        /// <summary>
        /// 生成场景数据并过滤
        /// </summary>
        /// <param name="channelMessage"></param>
        /// <param name="meteringModes"></param>
        /// <param name="rule"></param>
        /// <returns></returns>

        public override BarcodeScene GetTScene(object channelMessage, IIntegralRule rule, Members member)
        {
            if (!(channelMessage is OrderCompletedEvent))
            {
                return(null);
            }
            var channelDatas = (OrderCompletedEvent)channelMessage;
            IEnumerable <OrderDetail> efficientProducts = null;

            if (!string.IsNullOrEmpty(((CommonIntegralRule <BarcodeScene>)rule).LimitItems))
            {
                var limitItems = "," + ((CommonIntegralRule <BarcodeScene>)rule).LimitItems + ",";
                efficientProducts = channelDatas.OrderDetails.Where(o => limitItems.Contains("," + o.Barcode + ","));
            }
            else
            {
                efficientProducts = channelDatas.OrderDetails;
            }
            return(new BarcodeScene()
            {
                Amount = efficientProducts.Sum(o => o.AveragePrice * o.PurchaseNumber),
                Count = efficientProducts.Sum(o => o.PurchaseNumber),
                Member = member
            });
        }
 /// <summary>
 /// 积分进制
 /// </summary>
 /// <param name="integral">积分</param>
 /// <param name="channelMessage">通道消息</param>
 /// <param name="member">会员信息</param>
 /// <param name="rule">提供程序规则</param>
 /// <returns>进制积分</returns>
 public virtual decimal IntegralRound(decimal integral, IScene scene, IIntegralRule rule)
 {
     if (RuleRound != null)
     {
         return(RuleRound.DoRound(integral, scene, rule));
     }
     else
     {
         throw new IntegralRuleProviderLoadException("积分进制规则加载失败!");
     }
 }
        /// <summary>
        /// 验证规则有效性
        /// </summary>
        /// <param name="providerRules">规则</param>
        /// <param name="scene">场景数据</param>
        /// <returns>有效规则</returns>
        public virtual IIntegralRule VerifyRule(IIntegralRule providerRule, TScene scene)
        {
            var rule = (IIntegralRule <TScene>)providerRule;

            if (rule.VerifyExpression.Compile()(scene))
            {
                return(rule);
            }
            else
            {
                return(null);
            }
        }
Пример #5
0
 public decimal DoRound(decimal integral, IScene scene, IIntegralRule rule)
 {
     return(((int)(integral * 10m)) / 10M);
 }
 /// <summary>
 /// 验证规则有效性
 /// </summary>
 /// <param name="providerRules">规则</param>
 /// <param name="scene">场景数据</param>
 /// <returns>有效规则</returns>
 public virtual IIntegralRule VerifyRule(IIntegralRule providerRule, IScene scene)
 {
     return(VerifyRule(providerRule, (TScene)scene));
 }
 /// <summary>
 /// 初始化场景数据
 /// </summary>
 /// <param name="channelMessage">通道消息</param>
 /// <param name="providerRule">提供程序规则</param>
 /// <param name="member">会员信息</param>
 /// <returns>场景数据</returns>
 public IScene GetScene(object channelMessage, IIntegralRule rule, object member)
 {
     return(GetTScene(channelMessage, rule, (TMember)member));
 }
 /// <summary>
 /// 初始化场景数据
 /// </summary>
 /// <param name="channelMessage">通道消息</param>
 /// <param name="providerRule">提供程序规则</param>
 /// <returns>场景数据</returns>
 public abstract TScene GetTScene(object channelMessage, IIntegralRule rule, TMember member);
 /// <summary>
 /// 计算积分规则
 /// </summary>
 /// <param name="efficientRules">有效积分规则</param>
 /// <param name="scene">场景数据</param>
 /// <returns>规则积分</returns>
 public KeyValuePair <IIntegralRule, decimal> RunExpression(IIntegralRule efficientRule, IScene scene)
 {
     return(RunExpression(efficientRule, (TScene)scene));
 }