本文中提到的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);