由于之前讲的有点乱,例子举的也不是特别好,现重新举例整理分享一下
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
有了以上节点,我们要怎么组装呢?
如图,使用树形结构(对传统树做了镜像和旋转),执行顺序还是类似于中序遍历,从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