/// <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); } }
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)); }