之前的项目里面大约有十个左右的审核流程,是非常简单的审核流程,两级-三级的审批,通过到下一节点,拒绝结束审批。
当时设计的流程是第一版本的流程,五个表:流程、流程节点、流程实例、流程节点实例、流程操作日志。
流程表主要字段包括流程code、名字以及配置流程节点走向的json串;
流程节点主要字段包括节点code、名字、关联流程、初始化、通过、拒绝、终止操作对应的api(方法)、此节点跳转的页面(待办页面)、处理完之后跳转的页面(已办页面);
流程实例主要字段包括名字、对应的流程、关联的业务Id、实例状态;
流程节点实例主要字段包括名字、关联的流程实例、对应的节点、节点实例状态;
流程操作日志主要负责记录操作相关,暂略不表。
在这个版本设计基础上的实现步骤如下:
1. 初始化流程:根据流程的code获得节点的json,得到第一个节点,并创建流程实例和第一个节点实例;
2. 完成节点操作:根据节点实例的Id获得当前处理的节点,同时得到关联的其他信息:流程、节点、流程实例;根据操作(通过、拒绝、回退)找到对应的api,反射调用api的方法;修改操作状态(通过、拒绝、终止);同时得到下一个节点的信息,如果有创建实例,如果没有结束流程。
这个版本设计的主要问题:
1 流程比较重,关联的信息太多,比如实现的api,页面跳转的配置等,不够灵活。像在这个项目中,前端和后端都有过一次比较大的变动,很多配置就失效了,但是不能修改,最后只能增加新的字段来拓展;
2 通过json配置的节点流程只能用在单线处理的流程上,遇到复杂的会非常麻烦,而且配置过程中非常容易出错。
鉴于上面的问题,在新的项目中流程的设计做了轻量级的删减,设计如图:
主要的变动如下:
1. 删除了流程节点中反射和页面的配置,通过业务去处理;
2. 流程节点的走向通过流程节点来实现:
IS_FIRST字段表示是否是这个流程的第一个节点;
ADOPT_NODE是通过后走向的节点;
BACK_NODE是回退(非拒绝)后走向的节点;
同时增加了一个IS_WAIT字段,考虑的是处理比较简单的并行的流程,比如下面的例子:
A执行完之后同时启动B和C节点,B执行完之后到D节点,C和D节点都执行完之后才能到E节点,E节点执行完之后结束。
给C和D节点的配置上IS_WAIT都是指成true,这样在执行C和D节点的时候判断下当前流程是否还有未执行的节点,如果有就等待;否则到下一个节点。
其余的设计跟第一个版本的流程基本相同。
这个轻量级的版本设计问题如下:
1)只能处理比较简单的流程,如果流程过于复杂,还是需要基于成熟的流程插件来实现(比如workflow, JBPM, activity5等)
2)另外一个是代码实现上的问题,对于并行的流程处理还有一些缺陷,但目前项目并没有用到,所以没有进行优化。