天天看点

Flowable 节点 驳回/退回 后,节点变量的处理

本文中提到的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出问题了,于是做了如下测试:

Flowable 节点 驳回/退回 后,节点变量的处理

至此,问题已经定位,修改以上代码中 null 为 “” ,即可,如下:

runtimeService.createChangeActivityStateBuilder()
        .processInstanceId(proInstanceId)
        .moveActivityIdsToSingleActivityId(curTaskKeys, targetTaskKey)
        .changeState();
        
Map<String,Object> params = new HashedMap();
params.put("node3","");     
taskService.setVariables(task.getId(),params);   
           

继续阅读