本文中提到的flowable版本为 6.4.0。
最近新增加一个需求:流程需要有驳回操作。需要驳回的节点是会签节点,普通串行节点的情况也类似,本文以串行节点说明问题。
驳回代码参考如下(该内容很多文章都有介绍,不过多描述):
runtimeService.createChangeActivityStateBuilder()
.processInstanceId(proInstanceId)
.moveActivityIdsToSingleActivityId(curTaskKeys, targetTaskKey)
.changeState();
以上代码已经可以满足当前节点的驳回操作。但是,经过测试,发现一个问题,项目代码不方便贴,问题描述如下:
该流程共有4个节点,串行,该4个节点的流程变量分别是 node1,node2,node3,node4。
发起人指定 node1 节点的 userID 为 1001,
node1 指定 node2 节点 userID 为 1002,
node2 指定 node3 节点 userID 为 1003,
node3 暂未指定 node4 节点。
当流程到 node3 时,1003 选择了驳回,此时查看act_ru_task表,流程确实已经回退到node2节点。
用 1002 账号登录,重新分配 node3 节点 userID 为 1005.
重点,重点,重点!!!
重新查看 act_ru_task,发现当前节点是 node3,这个没问题,但是有两条数据,分别是 1003 和 1005。
这就尴尬了,上一次驳回的操作不彻底,变量信息实际上还是存在的。
于是想着在 node3 节点驳回后,把 node3 变量信息给清空,修改如下:
runtimeService.createChangeActivityStateBuilder()
.processInstanceId(proInstanceId)
.moveActivityIdsToSingleActivityId(curTaskKeys, targetTaskKey)
.changeState();
Map<String,Object> params = new HashedMap();
params.put("node3",null);
taskService.setVariables(task.getId(),params);
以上代码执行报错: Active execution could not be found with activity id node3…
仔细看了一下该 api: taskService.setVariables
这样问题就清晰了,有可能是null出问题了,于是做了如下测试:
至此,问题已经定位,修改以上代码中 null 为 “” ,即可,如下:
runtimeService.createChangeActivityStateBuilder()
.processInstanceId(proInstanceId)
.moveActivityIdsToSingleActivityId(curTaskKeys, targetTaskKey)
.changeState();
Map<String,Object> params = new HashedMap();
params.put("node3","");
taskService.setVariables(task.getId(),params);