工作流Activiti初体验—流程撤回【二】

2024-06-24 13:32

本文主要是介绍工作流Activiti初体验—流程撤回【二】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

已经玩工作流了,打算还是研究一下撤回的功能。但是流程图里面并不带撤回的组件,所以需要自己动态改造一下,还是延续上一个流程继续试验撤回功能。《工作流Activiti初体验【一】》

完整流程图
完整流程图

我们研究一下分发任务撤回到发起任务,其他环节的撤回类似
撤回的原理大概如下:

清空方向

将分发任务后面的方向清空,把发起任务拼接到原来的判断网关,然后结束分发任务,这样流程就到发起任务了
新流程
此时的流程如上图,并且当前节点是发起任务,而后再将分发任务后面的方向清空,并还原为最初的方向,如下图:
还原

撤回代码

	/*** 撤回流程*/private void recall() {List<String> roleCodeList = new ArrayList<>();roleCodeList.add("user1");// 取得已提交的任务HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery().taskCandidateGroupIn(roleCodeList).singleResult();// HistoricTaskInstance historicTaskInstance =// historyService.createHistoricTaskInstanceQuery().taskAssignee(assignee).singleResult();// HistoricTaskInstance historicTaskInstance =// historyService.createHistoricTaskInstanceQuery().taskCandidateUser(assignee).singleResult();System.out.println(historicTaskInstance.getId());// 取得流程实例ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(historicTaskInstance.getProcessInstanceId()).singleResult();System.out.println(processInstance.getId());Map<String, Object> variables = runtimeService.getVariables(historicTaskInstance.getExecutionId());System.out.println(variables);// 取得流程定义ProcessDefinitionEntity definitionEntity = (ProcessDefinitionEntity) repositoryService.getProcessDefinition(historicTaskInstance.getProcessDefinitionId());System.out.println(definitionEntity);// 取得上一步活动ActivityImpl hisActivity = definitionEntity.findActivity(historicTaskInstance.getTaskDefinitionKey());System.out.println(hisActivity);// 取得当前活动List<PvmTransition> currTransitionList = hisActivity.getOutgoingTransitions();System.out.println(currTransitionList);for (PvmTransition currTransition : currTransitionList) {PvmActivity currActivity = currTransition.getDestination();List<Task> currTasks = taskService.createTaskQuery().processInstanceId(processInstance.getId()).taskDefinitionKey(currActivity.getId()).list();for (Task currTask : currTasks) {ArrayList<PvmTransition> oriPvmTransitionList = new ArrayList<>();List<PvmTransition> pvmTransitionList = currActivity.getOutgoingTransitions();System.out.println(pvmTransitionList);for (PvmTransition pvmTransition : pvmTransitionList) {oriPvmTransitionList.add(pvmTransition);}System.out.println(oriPvmTransitionList);pvmTransitionList.clear();// 建立新方向ActivityImpl nextActivityImpl = ((ProcessDefinitionImpl) definitionEntity).findActivity(currActivity.getId());TransitionImpl newTransition = nextActivityImpl.createOutgoingTransition();newTransition.setDestination(hisActivity);taskService.claim(currTask.getId(), null);taskService.complete(currTask.getId(), variables);historyService.deleteHistoricTaskInstance(currTask.getId());// 恢复方向hisActivity.getIncomingTransitions().remove(newTransition);List<PvmTransition> pvmTList = currActivity.getOutgoingTransitions();pvmTList.clear();for (PvmTransition pvmTransition : oriPvmTransitionList) {pvmTransitionList.add(pvmTransition);}System.out.println(pvmTransitionList);}}historyService.deleteHistoricTaskInstance(historicTaskInstance.getId());}

项目地址 Activiti-Test

这篇关于工作流Activiti初体验—流程撤回【二】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1090287

相关文章

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

redis-sentinel基础概念及部署流程

《redis-sentinel基础概念及部署流程》RedisSentinel是Redis的高可用解决方案,通过监控主从节点、自动故障转移、通知机制及配置提供,实现集群故障恢复与服务持续可用,核心组件包... 目录一. 引言二. 核心功能三. 核心组件四. 故障转移流程五. 服务部署六. sentinel部署

SpringBoot集成XXL-JOB实现任务管理全流程

《SpringBoot集成XXL-JOB实现任务管理全流程》XXL-JOB是一款轻量级分布式任务调度平台,功能丰富、界面简洁、易于扩展,本文介绍如何通过SpringBoot项目,使用RestTempl... 目录一、前言二、项目结构简述三、Maven 依赖四、Controller 代码详解五、Service

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N

MySQL 临时表与复制表操作全流程案例

《MySQL临时表与复制表操作全流程案例》本文介绍MySQL临时表与复制表的区别与使用,涵盖生命周期、存储机制、操作限制、创建方法及常见问题,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小... 目录一、mysql 临时表(一)核心特性拓展(二)操作全流程案例1. 复杂查询中的临时表应用2. 临时

MySQL 升级到8.4版本的完整流程及操作方法

《MySQL升级到8.4版本的完整流程及操作方法》本文详细说明了MySQL升级至8.4的完整流程,涵盖升级前准备(备份、兼容性检查)、支持路径(原地、逻辑导出、复制)、关键变更(空间索引、保留关键字... 目录一、升级前准备 (3.1 Before You Begin)二、升级路径 (3.2 Upgrade

setsid 命令工作原理和使用案例介绍

《setsid命令工作原理和使用案例介绍》setsid命令在Linux中创建独立会话,使进程脱离终端运行,适用于守护进程和后台任务,通过重定向输出和确保权限,可有效管理长时间运行的进程,本文给大家介... 目录setsid 命令介绍和使用案例基本介绍基本语法主要特点命令参数使用案例1. 在后台运行命令2.

Spring Boot 中的默认异常处理机制及执行流程

《SpringBoot中的默认异常处理机制及执行流程》SpringBoot内置BasicErrorController,自动处理异常并生成HTML/JSON响应,支持自定义错误路径、配置及扩展,如... 目录Spring Boot 异常处理机制详解默认错误页面功能自动异常转换机制错误属性配置选项默认错误处理

Spring Boot从main方法到内嵌Tomcat的全过程(自动化流程)

《SpringBoot从main方法到内嵌Tomcat的全过程(自动化流程)》SpringBoot启动始于main方法,创建SpringApplication实例,初始化上下文,准备环境,刷新容器并... 目录1. 入口:main方法2. SpringApplication初始化2.1 构造阶段3. 运行阶

Java中的xxl-job调度器线程池工作机制

《Java中的xxl-job调度器线程池工作机制》xxl-job通过快慢线程池分离短时与长时任务,动态降级超时任务至慢池,结合异步触发和资源隔离机制,提升高频调度的性能与稳定性,支撑高并发场景下的可靠... 目录⚙️ 一、调度器线程池的核心设计 二、线程池的工作流程 三、线程池配置参数与优化 四、总结:线程