17.flowable 流程实例撤回

项目地址:https://gitee.com/lwj/flowable.git 分支flowable-base
视频讲解地址
https://www.bilibili.com/video/av78129693/

1、演示在这里插入图片描述

2、代码

public ReturnVo<String> revokeProcess(RevokeVo revokeVo) {
        ReturnVo<String> returnVo = new ReturnVo<>(ReturnCode.FAIL, "撤回失败!");
        if (StringUtils.isNotBlank(revokeVo.getProcessInstanceId())) {
            ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
                    .processInstanceId(revokeVo.getProcessInstanceId()).singleResult();
            if (processInstance != null) {
                //1.添加撤回意见
                this.addComment(revokeVo.getUserCode(), revokeVo.getProcessInstanceId(), CommentTypeEnum.CH.toString(), revokeVo.getMessage());
                //2.设置提交人
                runtimeService.setVariable(revokeVo.getProcessInstanceId(), FlowConstant.FLOW_SUBMITTER_VAR, processInstance.getStartUserId());
                //3.执行撤回
                Activity disActivity = flowableBpmnModelService.findActivityByName(processInstance.getProcessDefinitionId(), FlowConstant.FLOW_SUBMITTER);
                //4.删除运行和历史的节点信息
                this.deleteActivity(disActivity.getId(), revokeVo.getProcessInstanceId());
                //5.执行跳转
                List<Execution> executions = runtimeService.createExecutionQuery().parentId(revokeVo.getProcessInstanceId()).list();
                List<String> executionIds = new ArrayList<>();
                executions.forEach(execution -> executionIds.add(execution.getId()));
                this.moveExecutionsToSingleActivityId(executionIds, disActivity.getId());
                returnVo = new ReturnVo<>(ReturnCode.SUCCESS, "撤回成功!");
            }
        } else {
            returnVo = new ReturnVo<>(ReturnCode.FAIL, "流程实例id不能为空!");
        }
        return returnVo;
    }
### Flowable 中的任务撤回最佳实践 在 Flowable 工作流引擎中,任务撤回可以通过多种方式实现。为了确保操作的安全性和灵活性,通常建议采用以下方法之一: #### 方法一:使用历史数据和自定义服务任务 通过保存流程实例的历史状态,在需要撤回时可以恢复到之前的版本。这涉及到创建一个自定义的服务任务来管理这些历史记录。 ```java // 创建一个新的 Java 类作为自定义 Service Task 来处理任务撤销逻辑 public class TaskRevertServiceTask implements JavaDelegate { @Override public void execute(DelegateExecution execution) throws Exception { String processInstanceId = (String)execution.getVariable("processInstanceId"); // 获取当前活动 ID 和前序活动ID HistoricActivityInstance currentActivity = historyService.createHistoricActivityInstanceQuery() .processInstanceId(processInstanceId).unfinished().singleResult(); List<HistoricActivityInstance> previousActivities = historyService.createHistoricActivityInstanceQuery() .processInstanceId(processInstanceId) .orderByHistoricActivityInstanceEndTime().asc() .listPage(0, 1); if (!previousActivities.isEmpty()) { HistoricActivityInstance prevActInst = previousActivities.get(0); runtimeService.setVariableLocal(execution.getId(), "revertedFrom", currentActivity.getActivityId()); runtimeService.addComment(execution.getId(), null, "Task reverted from "+currentActivity.getActivityName()+" to "+prevActInst.getActivityName()); // 跳转至指定节点 ProcessDefinitionEntity definition = ((RepositoryServiceImpl)repositoryService).getDeployedProcessDefinition(currentActivity.getProcessDefinitionId()); ActivityImpl targetActivity = definition.findActivity(prevActInst.getActivityId()); execution.setCurrentFlowElement(targetActivity); } } } ``` 此代码片段展示了如何编写一个 `JavaDelegate` 接口的具体实现类[^1],用于捕获并存储必要的上下文信息以便后续能够返回至上一步骤。 #### 方法二:利用事件监听器机制 另一种更灵活的方法是借助于 Flowable 提供的事件监听器功能。可以在特定条件下触发相应的动作,比如当某个条件满足时自动跳回到上一步或任意其他步骤。 ```xml <!-- 定义 BPMN 流程中的 User Task --> <userTask id="taskA" name="Step A"> <!-- 添加边界事件监听器 --> <boundaryEvent id="cancelBoundaryEvt" attachedToRef="taskA" cancelActivity="true"> <errorEventDefinition errorRef="ERROR_CANCEL"/> </boundaryEvent> </userTask> <!-- 自定义错误处理器 --> <bpmn:error code="ERROR_CANCEL">Cancel Task Event Triggered.</bpmn:error> ``` 上述 XML 片段说明了如何设置带有取消行为的边界事件监听器[^2]。一旦关联的任务被中断,则会抛出预定义好的异常从而激活对应的补偿措施。 无论采取哪种方案都应充分考虑实际应用场景下的需求特点,并结合项目具体情况做出合理的选择。值得注意的是,以上两种策略并非互斥而是互补关系;实践中可以根据复杂度适当组合运用两者优势达成最优解。
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小学生05101

flowable

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值