天天看點

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);   
           

繼續閱讀