我们经常需要工作流中退回上一步,或者退回历史某一个节点。但由于流程的场景是很复杂的,回退有以下一些场景:
1.串行路线上的退回:流程中没有任何网关(排他网关/并行网关)和会签多实例。
2.退回到并行网关分支中的某一个节点上。
3.并行网关中的某一个分支节点上发起退回,退回到并行网关前面的某一个节点上。
4.子流程中退回到主干流程中某一个节点/主干流程退回到子流程中某一个节点。
flowable版本:6.6.0
我们都知道驳回的api:
runtimeService.createChangeActivityStateBuilder().processInstanceId(proInstanceId)
.moveActivityIdTo(currentActivityId, newActivityId).changeState();
或者
runtimeService.createChangeActivityStateBuilder().moveExecutionsToSingleActivityId(
currentExecutionIds, newActivityId).changeState();
但是其实不好处理的是如何获取可驳回节点信息,task任务是没有驳回需要的activityId的,言归正传,下面提供下我的实现方案:
/**
* 获取可驳回节点,排序规则-最近的节点在前面
*
* @param taskId 任务id
* @param processInstanceId 流程实例id
* @return
*/
public List<FlowNodeDto> getCanRejectedFlowNode(String taskId, String processInstanceId) {
List<FlowNodeDto> backNodes = new ArrayList<>();
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
String currActId = task.getTaskDefinitionKey();
//获取运行节点表中usertask
String sql = "select t.* from ACT_RU_ACTINST t where t.ACT_TYPE_ = 'userTask' " +
" and t.PROC_INST_ID_=#{processInstanceId} and t.END_TIME_ is not null ";
List<ActivityInstance> activityInstances = runtimeService.createNativeActivityInstanceQuery().sql(sql)
.parameter("processInstanceId", processInstanceId)
.list();
//获取运行节点表的parallelGateway节点并出重
sql = "SELECT t.ID_, t.REV_,t.PROC_DEF_ID_,t.PROC_INST_ID_,t.EXECUTION_ID_,t2.ACT_ID_, t.TASK_ID_, t.CALL_PROC_INST_ID_, t.ACT_NAME_, t.ACT_TYPE_, " +
" t.ASSIGNEE_, t.START_TIME_, t2.END_TIME_, t.DURATION_, t.DELETE_REASON_, t.TENANT_ID_" +
" FROM ACT_RU_ACTINST t JOIN (SELECT

本文详细介绍了在Flowable 6.6.0版本中处理工作流退回操作的复杂场景,包括串行路线、并行网关等不同情况。通过查询运行节点表获取可驳回节点信息,并提供了获取审批人的方法。文章提供了具体的代码实现,展示了如何构造和排序可驳回节点列表,为后续的驳回操作提供了基础。
最低0.47元/天 解锁文章
3913

被折叠的 条评论
为什么被折叠?



