在上一篇文章中我们已经实现了最基本的购买获得的积分,但就如在第一篇文章中提到的,积分规则会常常用于引导用户的消费行为,实现方式一般是指在满足特定条件时,用户的购买行为会获得的额外的积分。
今天我们将实现一个简单的积分翻倍的规则,其中会有两种特殊规则,用户行为只要满足其中一个,便可以触发积分翻倍。
代码前置修改
之前为了演示购买积分比率,我们设定每消费 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
,和之前的规则相比,它有如下特点:
- 没有
SuccessEvent
。第一条规则的条件是True
,意味着其必然被触发,因此它的SuccessEvent
会成为规则成功的事件,所以后面的规则无需再添加该字段。 - 没有使用
RuleExpressionType
和Expression
,而是使用了Operator
和Rules
来设定规则触发条件,其中Operator
设定了子规则的逻辑关系,可选的值有And
、AndAlso
、Or
和OrElse
。这里选择了Or
,表明两条子规则只要能够满足其一,便可再得一份积分,也就是积分翻倍。 Rules
的字段规则和上一级的Rules
是一样的。- 在例子中的两个子规则中,第一个对一个变量进行了判断,这里引入了变量,这里的变量和之前返回值中的变量的定义个使用的方式是一致的。
- 第二个子规则使用了两个条件并用
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)};
});
复制代码
因为积分规则可能会被多次满足,所以需要找出所有满足的规则,再将它们获得的积分进行累加。
调用调试
注册获得积分没有改变,而购买获得积分需要传入额外的两个参数 month
和 date
获得普通积分
购买超过 200 获得双倍积分
双十一购物获得双倍积分
至于双十一购物超过 200,在当前规则下,也只能触发一次特殊规则,所以只会获得双倍的积分,不会再多了。
至此,满足特殊条件触发积分翻倍也完成了。