在前面我们介绍过了QLExpress的宏,也给大家介绍过使用宏在生产环境非常多,所以这里做一个案例,就以电商场景来看,新老用户的打折。
背景:
如果是新用户,没有购买过,则打88折 如果是新用户,已经购买过,则打9折 如果是老用户,直接打9.5折
基于此逻辑我们来画一个逻辑图:
这种场景就是一个典型的可以直接使用到规则引擎的场景,在此我们是用宏命令来编写规则的话,具体代码如下:
@Test public void test9() throws Exception { // 定义规则引擎执行器,qlexpress中的规则引擎执行的时候都是在这个ExpressRunner里面执行的 ExpressRunner runner = new ExpressRunner(); runner.addMacro("最终折扣", "if(是否是新用户){新用户价格}else{老用户价格}"); runner.addMacro("是否是新用户", "if(用户 > 5){ return true} else { return false}"); runner.addMacro("新用户价格", "if(是否购买过){ return 价格*0.9}else{return 价格*0.88}"); runner.addMacro("是否购买过", "if(购买过){return true}else{return false}"); runner.addMacro("老用户价格", "return 价格* 0.95"); IExpressContext<String, Object> context = new DefaultContext<String, Object>(); context.put("价格", 100); context.put("用户", 10); Object result = runner.execute("最终折扣", context, null, true, true); log.info("本次规则执行的结果是:{}", result); }
这里的宏我们就以每一个if-else来构建一个整体的规则逻辑,里面具体的action的话,我们直接可以使用宏定义即可。运行一下看下效果
在线上的生产环境我们一般都可以这些,每一个模块定义一个宏逻辑,然后通过嵌套组装,最后再context里面替换到占位符的代码。就完整的写出了一个规则逻辑判断。
备注:
1、上诉案例我们使用了宏
2、切记每一个if-else编写一个宏
3、每一个if-else里面的逻辑我们可以直接再定义子集。
4、记得补全占位符的信息。
还没有评论,来说两句吧...