flowable實戰(五)flowable駁回/退回上一步/退回到

1、駁回/退回上一步/退回到(歷史某一個節點)html

        咱們常常須要工做流中退回上一步,或者退回歷史某一個節點。但因爲流程的場景是很複雜的,回退有如下一些場景:ui

1.串行路線上的退回:流程中沒有任何網關(排他網關/並行網關)和會籤多實例。3d

2.退回到並行網關分支中的某一個節點上:code

3.並行網關中的某一個分支節點上發起退回,退回到並行網關前面的某一個節點上htm

4.子流程中退回到主幹流程中某一個節點/主幹流程退回到子流程中某一個節點。blog

以下圖:get

 

 

2、flowable實現:工作流

1.普通串行路線上的退回(此流程中沒有並行網關的退回時),此方法支持普通串行節點/會籤多實例節點/排他網關節點:it

runtimeService.createChangeActivityStateBuilder()
        .processInstanceId(proInstanceId)
        .moveActivityIdsToSingleActivityId(curTaskKeys, targetTaskKey)
        .changeState();

或者io

moveActivityIdTo(String currentActivityId,String newActivityId);

2.並行網關中發起退回(即撤銷當前的網關),這個地方不能用moveActivityIdTo(String currentActivityId,String newActivityId);是由於當某一個分支完成,它的is_active爲0,另外一條分支沒有完成時。這時候這個方法是取不到所的分支的key的,它只有is_active爲1的key能取到,否則就會形成多一條垃圾數據,同時再走並行時,任何一個分支不會等另外一個分支就完走到分支的合併節點上,這就是bug,因此要改成如下方法:

// 並行網關的退回
List<String > currentExecutionIds = new ArrayList<>();
List<Execution> executions = runtimeService.createExecutionQuery().parentId(proInstanceId).list();
for (Execution execution : executions) {
    System.out.println("並行網關節點數:"+execution.getActivityId());
    currentExecutionIds.add(execution.getId());
}
runtimeService.createChangeActivityStateBuilder()
        .moveExecutionsToSingleActivityId(currentExecutionIds, targetTaskKey)
        .changeState();

3.退回到並行網關中的某一個節點:經試驗退回時必須同時退回並行網關中的全部分支。

List<String > targetTaskKeys = new ArrayList<>();
targetTaskKeys.add("sid-CA74ADED-7E70-451D-951C-95988BFC3F07");
targetTaskKeys.add("sid-7922C598-74FD-4848-95AC-D9790AF68432");

runtimeService.createChangeActivityStateBuilder()
        .processInstanceId(proInstanceId)
        .moveSingleActivityIdToActivityIds("sid-CAD50E6F-7E0C-437D-816B-DDBA1A976A79", targetTaskKeys)
        .changeState();

4.主幹流程和子流程的退回(沒有試驗過),官方提供瞭如下方法:


moveActivityIdToParentActivityId(String currentActivityId, String newActivityId)

moveActivityIdToSubProcessInstanceActivityId(String currentActivityId, String newActivityId, String callActivityId)

moveActivityIdToSubProcessInstanceActivityId(String currentActivityId,  String newActivityId, String callActivityId,Integer subProcessDefinitionVersion)