flowable 6.4 完美实现多实例任务加签减签
网上一直没有flowable的文章介绍加签减签的操作,实际flowable早比activiti先一步实现了加签减签的功能,并不需要自定义,实现方法也非常简单,下面详细说明。
项目需要在多实例会签的时候要求实现加签减签的功能。此功能其实有很多地方都会用到,比如误操作多加或少加人会签了,临时做个补救,如果以重发的方式实现,则需要保存其他已签的数据,十分影响效率且容易出错。
加签减签即a动态指定b、c、d完成任务。在未全完成的时候临时再加个e是加签,即b、c、d、e进行会签。把d给踢出去剩b、c两人会签即为减签。
网上看到的多实例加签都是基于activiti的前加签后加签。所谓前加签后加签即是需要加签的时候动态修改流程部署即热部署。
参考文章:https://blog.csdn.net/simplemurrina/article/details/78347248
这种方式一是不够美观,二是存在当前多实例完成后流程走向发生变化,理论上同时动态修改部署会造成流程走向错误、全局变量有误等并发问题。并且当多次加签之后流程图会有遮挡其他任务节点显示的问题。
这个问题其实困扰了我许久,后来看到分享牛上对比flowable和activiti的区别,发现有一条写着:
flowable支持多实例加签、减签,activiti没有。
让我想到flowable应该已经支持了这个操作,但是搜遍全网未发现有相关文章,在flowable提供的api里也没有找到,即一般的接口没有涉及。后来翻了翻源码想起来可能存在于flowable的命令模式。果不其然,乖乖的躺在命令接口里,加签减签分别对应的是:AddMultiInstanceExecutionCmd(activityDefId, processId, variables)以及DeleteMultiInstanceExecutionCmd(currentChildExecutionId, false)。命令的具体实现之后我再详细补充,现在先大概分别说一下参数。
首先加签的第一个参数,源码中写的是activityId ,实际阅读完逻辑发现是活动的定义ID,即为任务的定义ID(task是activity的子类),也就是流程部署文件中需要加签的多实例任务的定义ID。processId既为流程实例ID不多说。variables为需要添加到任务中的变量,应该是全局不是local的,暂时没细研究。这里如果需要定义处理人的话,则在variable中put进去key为流程部署文件中flowable:elementVariable对应的值,value即为想要加签的处理人。
接着说减签,第一个参数为需要减签的那一个childExecutionId。多实例任务开始前一条总线为rootExecution,之后为每一个实例任务即每一个处理人接到的任务都分配了一个childExecution,每个childExecution都对应着每一个处理人自己的任务。所以此处传入需要减签的那个处理人任务对应的childExecutionId。后面的boolean值应为此处理人是否已完成他自己的任务,这个尚未测试true的情况。
最后调用的方法熟悉命令模式的小伙伴应该清楚了,
managementService.executeCommand(new DeleteMultiInstanceExecutionCmd(currentChildExecutionId, false));
managementService.executeCommand(new AddMultiInstanceExecutionCmd(activityDefId, procId, variables));
比起activiti的加减签是不是简单了许多!而且看完源码会发现处理的十分完美,源码解析以后有时间再继续补充。这次也体验到了阅读源码的好处,提供了解决问题的新思路。之后我准备详细阅读已有的命令源码,为之后的流程引擎开发提供更多的支持。那么就先到这里,希望能给你带来帮助,有问题请随时提问,撰文不易,希望大家多支持。