流程/规则引擎-ice举例

由于之前讲的有点乱,例子举的也不是特别好,现重新举例整理分享一下

0.代码地址

https://github.com/zjn-zjn/ice

1.举例

充值送礼 (10.1-10.7)

100元 送5元余额 (10.1-10.7)
50元 送10积分 (10.5-10.7)
充值送礼
如图,当用户充值成功后,会产生对应充值场景的参数包裹Pack(类Activiti/Drools的Fact),包裹里会有充值用户的uid,充值金额spend,充值的时间requestTime

目前项目也做好了一些简单抽象
ScoreFlow 需要配置key 和value 有明确的true和false返回,如图中配置的ScoreFlow-100 当充值金额大于等于100时返回true,小于时返回false

AmountResult 需要配置key 和value 有追随业务返回的true和false,如发放奖励成功返回true,发放失败(非Error如余额存在库存,库存不足时,业务认定发放失败)返回false

PointResult 同AmountResult

一个简单的充值活动,就是通过业务规则将上述节点组装并控制流转,那要怎么配置化的组装呢?怎么组装最爽呢?

1.1流程图解决方案

第一个想到的自然是流程图(类Activiti/Flowable实现)
流程图
如图,组装好的流程图看起来很清晰,如果像Activiti/Flowable将指向结束的流程的线去掉,也会清晰并简洁许多,但是因为本活动拥有时间属性,改造一下?
流程图-引入时间
如图,看起来其实也挺清晰的,但是好像不是那么的舒服,因为增加时间判断节点的时候,不得不考虑到时间判断通过和不通过两种流转,这种方式是有优化方式的,但是节点不能够复用(如另一个活动也是需要判断充值金额是否大于100元,这里实例化出来的ScoreFlow-100是不可以复用的,必须重新实例化一个)

1.2 ice是怎么做的
1.2.1 引入关系节点

AND
所有子节点中,有一个返回FALSE 该节点也将是FALSE,全部是TRUE才是TRUE,在执行到FALSE的地方终止执行,类似于Java的&&

ANY
所有子节点中,有一个返回TRUE 该节点也将是TRUE,全部FALSE则FALSE,在执行到true的地方终止执行,类似于Java的||

ALL
所有子节点都会执行,有任意一个返回TRUE该节点也是TRUE,没有TRUE有一个节点是FALSE则FALSE,没有TRUE也没有FALSE则返回NONE,所有子节点执行完毕终止

NONE
所有子节点都会执行,无论子节点返回什么,自己都返回NONE,任何没有子节点的关系节点将自动返回NONE

TRUE
所有子节点都会执行,无论子节点返回什么,自己都返回TRUE,任何没有子节点的关系节点将自动返回NONE

有了以上节点,我们要怎么组装呢?

ice组装
如图,使用树形结构(对传统树做了镜像和旋转),执行顺序还是类似于中序遍历,从root执行,root是个关系节点,从上到下执行子节点,若用户充值金额是70元,执行流程:

ScoreFlow-100:F
AND:F
ScoreFlow-50:T
PointResult:T
AND:T
ANY:T

这个时候可以看到,之前需要剥离出的时间,已经可以融合到各个节点上了,把时间配置还给节点,如果没到执行时间,如发放积分的节点10.5日之后才生效,那么在10.5之前,可以理解为这条调用链不存在(可以理解为这个节点还没有上班)

回到最开始的问题,我现在在10.1之前,我要怎么测试?

引入TimeChangeNone节点,节点需要配置一个time,节点的作用是将requestTime更改成配置的time(该节点线上不能对时间做更改)

在这里插入图片描述
这样改了时间之后,后面的节点都是基于改完之后的时间进行判断,测试过程中也顺便验证了一下时间配置正确性,这是时间静止,也可以开发出时间加快等等,多人测试只需要各自测试更改自己的时间线即可实现。

说到这里,不知道有没有发现,这里的节点执行,是不需要指定后续执行的,刚才是参与活动的逻辑,如果现在还有个H5页面需要做呈现,不同的呈现也与时间相关,怎么办?
在这里插入图片描述
如图,他们使用同一个实例即可

1.2.2 引入forward

例子中可以看到,AmountResult的奖励是和S100绑定的,PointResult是和S50绑定的,这种绑定关系比较密切,是否可以简化?
在这里插入图片描述
如图,将S100作为AmountResult的前置节点,前置节点即当且仅当前置节点返回非False才会执行(逻辑依然是AND节点连接的两个子节点)

2.实践展示

https://github.com/zjn-zjn/ice 的 ice-test模块

本次介绍主要针对之前的例子解释的模糊不清的情况再解释,至于设计和实现(https://blog.csdn.net/qq_32193151/article/details/80755731)这里就不再赘述,有更好方案或建议的小伙伴十分欢迎交流~~

e:995517265@qq.com

cd C:\Program Files\FlightGear fgfs --fg-root=C:\Program Files\FlightGear\data --aircraft=ufo --in-air --fdm=null --telnet=5501 --telnet=5502 --telnet=5503 --disable-ai-traffic --disable-real-weather-fetch --disable-random-objects --disable-terrasync --disable-clouds --disable-sound --disable-panel --disable-hud --disable-specular-highlight --timeofday=noon --prop:/sim/rendering/multi-sample-buffers=1 --prop:/sim/rendering/multi-samples=2 --prop:/sim/rendering/draw-mask-clouds=false --prop:/sim/rendering/draw-mask-terrain=true --prop:/sim/rendering/draw-mask-objects=true --prop:/sim/rendering/draw-mask-lights=true --prop:/sim/rendering/draw-mask-internal=true --prop:/sim/rendering/draw-mask-cockpit=true --prop:/sim/rendering/draw-mask-effects=true --prop:/sim/rendering/draw-mask-overlay=true --prop:/sim/rendering/draw-mask-world=true --prop:/sim/rendering/draw-mask-panel=true --prop:/sim/rendering/draw-mask-vr=true --prop:/sim/rendering/draw-mask-2d=true --prop:/sim/rendering/draw-mask-3d=true --prop:/sim/rendering/draw-mask-sky=true --prop:/sim/rendering/draw-mask-shadows=true --prop:/sim/rendering/draw-mask-cabin=true --prop:/sim/rendering/draw-mask-weather=true --prop:/sim/rendering/draw-mask-stereo=true --prop:/sim/rendering/draw-mask-internal-cockpit=true --prop:/sim/rendering/draw-mask-internal-windows=true --prop:/sim/rendering/draw-mask-internal-instruments=true --prop:/sim/rendering/draw-mask-internal-overlay=true --prop:/sim/rendering/draw-mask-internal-effects=true --prop:/sim/rendering/draw-mask-internal-lights=true --prop:/sim/rendering/draw-mask-internal-world=true --prop:/sim/rendering/draw-mask-internal-panel=true --prop:/sim/rendering/draw-mask-internal-3d=true --prop:/sim/rendering/draw-mask-internal-sky=true --prop:/sim/rendering/draw-mask-internal-cabin=true --prop:/sim/rendering/draw-mask-internal-weather=true --prop:/sim/rendering/draw-mask-internal-stereo=true --prop:/sim/rendering/draw-mask-internal-shadow=true --prop:/sim/rendering/draw-mask-internal-stall=true --prop:/sim/rendering/draw-mask-internal-aoa=true --prop:/sim/rendering/draw-mask-internal-thermal=false --prop:/sim/rendering/draw-mask-internal-ice=false --prop:/sim/rendering/draw-mask-internal-glass=true --prop:/sim/rendering/draw-mask-internal-dead=true --prop:/sim/rendering/draw-mask-internal-reflection=true程序显示错误unknown command-line option: enable-hud-2d怎么解决
05-10
你可以尝试将启用2D HUD的选项从命令行中移除,改为在游戏内部手动启用。可以尝试修改命令行参数为: ``` cd C:\Program Files\FlightGear fgfs --fg-root=C:\Program Files\FlightGear\data --aircraft=ufo --in-air --fdm=null --telnet=5501 --telnet=5502 --telnet=5503 --disable-ai-traffic --disable-real-weather-fetch --disable-random-objects --disable-terrasync --disable-clouds --disable-sound --disable-panel --timeofday=noon --prop:/sim/rendering/multi-sample-buffers=1 --prop:/sim/rendering/multi-samples=2 --prop:/sim/rendering/draw-mask-clouds=false --prop:/sim/rendering/draw-mask-terrain=true --prop:/sim/rendering/draw-mask-objects=true --prop:/sim/rendering/draw-mask-lights=true --prop:/sim/rendering/draw-mask-internal=true --prop:/sim/rendering/draw-mask-cockpit=true --prop:/sim/rendering/draw-mask-effects=true --prop:/sim/rendering/draw-mask-overlay=true --prop:/sim/rendering/draw-mask-world=true --prop:/sim/rendering/draw-mask-panel=true --prop:/sim/rendering/draw-mask-vr=true --prop:/sim/rendering/draw-mask-3d=true --prop:/sim/rendering/draw-mask-sky=true --prop:/sim/rendering/draw-mask-shadows=true --prop:/sim/rendering/draw-mask-cabin=true --prop:/sim/rendering/draw-mask-weather=true --prop:/sim/rendering/draw-mask-stereo=true --prop:/sim/rendering/draw-mask-internal-cockpit=true --prop:/sim/rendering/draw-mask-internal-windows=true --prop:/sim/rendering/draw-mask-internal-instruments=true --prop:/sim/rendering/draw-mask-internal-overlay=true --prop:/sim/rendering/draw-mask-internal-effects=true --prop:/sim/rendering/draw-mask-internal-lights=true --prop:/sim/rendering/draw-mask-internal-world=true --prop:/sim/rendering/draw-mask-internal-panel=true --prop:/sim/rendering/draw-mask-internal-3d=true --prop:/sim/rendering/draw-mask-internal-sky=true --prop:/sim/rendering/draw-mask-internal-cabin=true --prop:/sim/rendering/draw-mask-internal-weather=true --prop:/sim/rendering/draw-mask-internal-stereo=true --prop:/sim/rendering/draw-mask-internal-shadow=true --prop:/sim/rendering/draw-mask-internal-stall=true --prop:/sim/rendering/draw-mask-internal-aoa=true --prop:/sim/rendering/draw-mask-internal-thermal=false --prop:/sim/rendering/draw-mask-internal-ice=false --prop:/sim/rendering/draw-mask-internal-glass=true --prop:/sim/rendering/draw-mask-internal-dead=true --prop:/sim/rendering/draw-mask-internal-reflection=true ``` 然后在游戏内部手动启用2D HUD。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值