使用 RulesEngine 实现积分翻倍

上一篇文章中我们已经实现了最基本的购买获得的积分,但就如在第一篇文章中提到的,积分规则会常常用于引导用户的消费行为,实现方式一般是指在满足特定条件时,用户的购买行为会获得的额外的积分。

今天我们将实现一个简单的积分翻倍的规则,其中会有两种特殊规则,用户行为只要满足其中一个,便可以触发积分翻倍。

代码前置修改

之前为了演示购买积分比率,我们设定每消费 1 元得到 0.5 积分,现在为了简化处理,我们将比率调整为 1。

Payment workflow 添加新的规则

{
    "WorkflowName": "Payment",
    "Rules": [
        {
            "RuleName": "GivePointsByPayment",
            "SuccessEvent": "Pay success and earn {0} points",
            "RuleExpressionType": "LambdaExpression",
            "Expression": "true",
            "Actions": {
                "OnSuccess": {
                    "Name": "OutputExpression",
                    "Context": {
                        "Expression": "subtotal"
                    }
                }
            }
        },
        {
            "RuleName": "MultiplyPoints",
            "Operator": "Or",
            "Rules": [
                {
                    "RuleName": "MoreThan200",
                    "RuleExpressionType": "LambdaExpression",
                    "Expression": "subtotal > 200"
                },
                {
                    "RuleName": "DoubleEleven",
                    "RuleExpressionType": "LambdaExpression",
                    "Expression": "month == 11 AND date == 11"
                }
            ],
            "Actions": {
                "OnSuccess": {
                    "Name": "OutputExpression",
                    "Context": {
                        "Expression": "subtotal"
                    }
                }
            }
        }
    ]
}
复制代码

新添加了规则 MultiplyPoints,和之前的规则相比,它有如下特点:

  1. 没有 SuccessEvent。第一条规则的条件是 True,意味着其必然被触发,因此它的 SuccessEvent 会成为规则成功的事件,所以后面的规则无需再添加该字段。
  2. 没有使用 RuleExpressionTypeExpression ,而是使用了 OperatorRules 来设定规则触发条件,其中 Operator 设定了子规则的逻辑关系,可选的值有 AndAndAlsoOrOrElse。这里选择了 Or,表明两条子规则只要能够满足其一,便可再得一份积分,也就是积分翻倍。
  3. Rules 的字段规则和上一级的 Rules 是一样的。
  4. 在例子中的两个子规则中,第一个对一个变量进行了判断,这里引入了变量,这里的变量和之前返回值中的变量的定义个使用的方式是一致的。
  5. 第二个子规则使用了两个条件并用 And 相连,需同时满足才可触发改规则。注意,这里为了方便演示使用了日期判断,真实项目中日期一定是由服务器获取,并且是专门的日期类型,千万不要学这个例子。

使用规则

这里只是简单的对 OnSuccess 函数进行了改造,其余代码就不贴了。

resultList.OnSuccess(message =>
{
    var actionResult = resultList
        .FindAll(ruleResult => ruleResult.ActionResult != null)
        .Select(ruleResult => ruleResult.ActionResult.Output)
        .Sum(Convert.ToDecimal);
    response = new RuleResponse() {Message = string.Format(message, actionResult)};
});
复制代码

因为积分规则可能会被多次满足,所以需要找出所有满足的规则,再将它们获得的积分进行累加。

调用调试

注册获得积分没有改变,而购买获得积分需要传入额外的两个参数 monthdate

获得普通积分

普通购买.png

购买超过 200 获得双倍积分

双倍积分1.png

双十一购物获得双倍积分

双倍积分2.png

至于双十一购物超过 200,在当前规则下,也只能触发一次特殊规则,所以只会获得双倍的积分,不会再多了。

至此,满足特殊条件触发积分翻倍也完成了。

分类:
后端
标签: