工作流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初体验—流程撤回【二】相关推荐
- 5步带你掌握工作流Activiti框架的使用
摘要:本文通过一个工作流Activiti框架的具体使用示例,具体详尽的介绍了工作流Activiti框架的使用方式. 本文分享自华为云社区<一个使用示例,五个操作步骤!从此轻松掌握项目中工作流的开 ...
- 《Activiti/Flowable 深入BPM工作流》-什么是流程变量?
<Activiti/Flowable 深入BPM工作流>-什么是流程变量? 一. 问题: 1. 什么是流程变量? 2. 什么是glob ...
- 美国行记(二):东部小镇移动通信初体验
美国行记(二):东部小镇移动通信初体验 文 | 宁宇 太太出国访学,我作为家属陪同前往,到了当地之后,自然要买张当地的电话卡换上,于是有了亲身体验美国运营商服务的经历. 我们在美国东部的北卡罗来纳州, ...
- Flutter初体验(二)—— 创建第一个Flutter APP
Flutter初体验(二)--- 创建第一个Flutter APP 在第一篇文章 Flutter初体验(一)---Mac 安装配置,学习了配置 Flutter 开发环境,并运行了Demo项目,本篇根据 ...
- Java8初体验(二)Stream语法详解(转)
本文转自http://ifeve.com/stream/ Java8初体验(二)Stream语法详解 感谢同事[天锦]的投稿.投稿请联系 tengfei@ifeve.com 上篇文章Java8初体验( ...
- Windows Embedded CE 6.0开发初体验(二)CE开发环境 收藏
上一篇<Windows Embedded CE 6.0开发初体验>之"嵌入式开发流程": http://blog.csdn.net/aawolf/archive/200 ...
- Online开发初体验——Jeecg-Boot 在线设计流程
Online开发--初体验(在线设计流程) 01 在线设计流程 02 在线设计流程和表单对接 03 表单业务申请 演示在线设计流程 演示在线设计流程与表单对接 演示业务OA申请
- 【Activity学习五】--基于SSM整合Activiti之请假流程实现(二)
[Activity学习五]--基于SSM整合Activiti之请假流程实现(二) 1.部署流程资源 2.查询流程定义信息 3.发布请假流程 4.查询用户任务 5.提出请假 6.老板查看请假任务 7.老 ...
- Windows Embedded Standard开发初体验(二)
支持Silverlight的Windows Embedded Standard 好了,完成安装之后,我们就可以来做Windows Embedded Standard的第一个操作系统镜像了.在开始菜单中 ...
最新文章
- HRBUST 2011【简单dp】
- 程序员到底需要什么样的需求文档?
- 完全备份指的是对整个计算机系统,网络安全管理实践题库:在备份技术中,差分备份就是对整个系统所有文件进行完全备份,包括所有系统和数据。()...
- jpa query oracle 参数int为空_撸一个预言机(Oracle)服务,真香!—中篇
- boost::geometry::model::multi_polygon用法的测试程序
- Hadoop集群规划
- gradle maven_Gradle – Maven的观点
- BugkuCTF-MISC题有黑白棋的棋盘
- NOIP2003普及组第1题 乒乓球(Table.cpp)-- python3实现
- DreamFacotry 第4章 如何保护REST API
- CAVLC编解码原理与流程
- 5G版iPhone更多细节曝光:骁龙X55基带+A14处理器
- (1)什么是socket(套接字)
- 基于DEAP库的python进化算法-4.遗传算法求解TSP问题
- 克隆的仓库 设置全局https协议转换成git协议,加快拉取速度(git)
- 砂岩浮雕让雕刻更加美观
- O2OO是一个汽车故障诊断工具
- 企业邮箱登录入口和界面如何设置
- 《SolidCAM+SolidWorks 2014中文版数控加工从入门到精通》——第1章 SolidCAM基础 1.1 CAD/CAM基础...
- 单周期CPU实验之学习之旅