flowable实现流程回退到上一个节点

该文章介绍了在Flowable中如何实现流程回退到上一个节点的操作。通过获取当前活动ID,查询BpmnModel获取FlowNode和SequenceFlow信息,然后使用runtimeService的changeActivityStateBuilder方法来改变流程状态,使流程回到上一审批节点。
摘要由CSDN通过智能技术生成

flowable实现流程回退到上一个节点

// 获取当前节点的activityId,即xml中每个标签的ID
String currentActivityId = execution.getCurrentActivityId();
List<Task> list1 = taskService.createTaskQuery().processInstanceId(processInstance.getProcessInstanceId()).list();
// taskService.addComment(currentTask.getId(), execution.getProcessInstanceId(), body.get("msg").toString());
BpmnModel bpmnModel = repositoryService.getBpmnModel(execution.getProcessDefinitionId());
FlowNode flowNode = (FlowNode)bpmnModel.getFlowElement(currentActivityId);
SequenceFlow sequenceFlow = flowNode.getIncomingFlows().get(0);
// 获取上一个节点的activityId
String sourceRef = sequenceFlow.getSourceRef();
// 流程回退到上一个节点,审批人继续审批   
runtimeService.createChangeActivityStateBuilder().processInstanceId(processInstance.getProcessInstanceId())
.moveActivityIdTo(currentActivityId,sourceRef).changeState();
回退到指定节点任务,可以使用 Flowable 的历史记录查询 API 来获取指定节点的历史任务记录,然后根据这些记录创建一个新的流程实例。具体步骤如下: 1. 使用 Flowable 的历史记录查询 API 查询指定节点的历史任务记录,可以使用 `HistoricTaskInstanceQuery` 来实现,例如: ```java List<HistoricTaskInstance> historicTaskInstances = historyService.createHistoricTaskInstanceQuery() .processInstanceId(processInstanceId) .taskDefinitionKey(taskDefinitionKey) .list(); ``` 其中,`processInstanceId` 是要回退流程实例 ID,`taskDefinitionKey` 是要回退到的节点 ID。 2. 根据这些历史任务记录创建一个新的流程实例,可以使用 `RuntimeService` 的 `createProcessInstanceBuilder` 方法来实现,例如: ```java ProcessInstanceBuilder processInstanceBuilder = runtimeService.createProcessInstanceBuilder() .processDefinitionKey(processDefinitionKey) .businessKey(businessKey) .variables(variables) .transientVariables(transientVariables) .tenantId(tenantId) .processInstanceName(processInstanceName) .overrideProcessDefinitionVersion(true); for (HistoricTaskInstance historicTaskInstance : historicTaskInstances) { processInstanceBuilder = processInstanceBuilder .transientVariable(historicTaskInstance.getTaskDefinitionKey(), historicTaskInstance.getVariables()); } ProcessInstance processInstance = processInstanceBuilder.start(); ``` 其中,`processDefinitionKey` 是流程定义的 key,`businessKey` 是业务主键,`variables` 是流程变量,`transientVariables` 是瞬时变量,`tenantId` 是租户 ID,`processInstanceName` 是流程实例名称,`overrideProcessDefinitionVersion` 用于指定是否覆盖流程定义版本。在循环中,我们将历史任务记录的变量作为瞬时变量添加到新的流程实例中。 3. 如果要继续执行回退后的流程,需要使用 `TaskService` 完成新的任务,例如: ```java List<Task> tasks = taskService.createTaskQuery() .processInstanceId(processInstance.getId()) .list(); for (Task task : tasks) { taskService.complete(task.getId()); } ``` 其中,`processInstance.getId()` 获取新的流程实例 ID,使用 `complete` 方法完成任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值