最近在做动态工作流的东西,感觉有不少心得体会,拿出来和大家交流一下。
我们做动态工作流,主要是为了支持OA的加签、会签和动态的跳转。
1概述
(1)会签对应着动态的增加参与者:
如上图中,活动A本来有参与者001,但是001觉得他一个人来做这个审批不完全够,因此,他可能要求002也加入到审批活动A中。
(2)加签对应着动态增加节点
在活动A时,流程管理者或活动A的参与者觉得审批的内容特殊或重大,必须让某些人来了解并审批,所以需要动态的增加一个活动。目前,我们只是实现了中间的一种加签的方式。
(3)活动动态跳转
跳转的应用场景主要有:回退和跳过一些活动。
比如:下面活动的领导,可能觉得上面办事人所做的工作不合适,需要重做,就会要求流程回退到上面的节点;可能某参与者出差无法审批,需要跳过这一层的审批,也需要动态的跳转。
2设计思路
动态流程只是在特殊情况下运行的,所以不能把它直接加入到流程定义中(如果经常需要增加某个节点,就不是每次都动态增加,而应该重新设计新的流程模版了)。基于这个考虑,必须把流程定义和动态流程定义分开存储,而在runtime时做动态的merge。
我们可以理解以往获取流程定义的时候,我们只需要提供流程定义的id就可以了,而加入了动态流程定义之后,我们就必须提供流程定义的id和流程实例的id(因为动态流程是对应于特定的流程实例的)。这样我们就可以在返回流程定义的时候做一些手脚了,如果特定的流程实例没有相关的动态流程定义,我们直接返回原始的流程定义,而发现了动态流程定,则需要做merge。这里的做法是获取原流程的副本,按照动态流程的类型,做必要的合并,返回合并后的流程定义。这样就完全可以屏蔽动态流程对工作流引擎的影响。
还有一个没有解决的问题,什么时候不再加载动态流程。这个问题再跳转的时候最为明显,我们让流程回退的时候,如果每次查找流程定义的时候都会加载动态流程,那么流程就会进入死循环(不断的进入下个节点之后再回退)。为了解决这个问题,在定义动态流程的时候必须定义最大执行次数和已执行的次数,每次转移在转移或活动结束的时候,更新已执行的次数,当达到最大执行次数的时候,就不再加载动态流程。
当然还有很多细节问题,在这就不多说了,希望对同行们有一些帮助。