已经玩工作流了,打算还是研究一下撤回的功能。但是流程图里面并不带撤回的组件,所以需要自己动态改造一下,还是延续上一个流程继续试验撤回功能。《工作流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初体验—流程撤回【二】相关推荐

  1. 5步带你掌握工作流Activiti框架的使用

    摘要:本文通过一个工作流Activiti框架的具体使用示例,具体详尽的介绍了工作流Activiti框架的使用方式. 本文分享自华为云社区<一个使用示例,五个操作步骤!从此轻松掌握项目中工作流的开 ...

  2. 《Activiti/Flowable  深入BPM工作流》-什么是流程变量?

               <Activiti/Flowable  深入BPM工作流>-什么是流程变量? 一. 问题:         1. 什么是流程变量?        2. 什么是glob ...

  3. 美国行记(二):东部小镇移动通信初体验

    美国行记(二):东部小镇移动通信初体验 文 | 宁宇 太太出国访学,我作为家属陪同前往,到了当地之后,自然要买张当地的电话卡换上,于是有了亲身体验美国运营商服务的经历. 我们在美国东部的北卡罗来纳州, ...

  4. Flutter初体验(二)—— 创建第一个Flutter APP

    Flutter初体验(二)--- 创建第一个Flutter APP 在第一篇文章 Flutter初体验(一)---Mac 安装配置,学习了配置 Flutter 开发环境,并运行了Demo项目,本篇根据 ...

  5. Java8初体验(二)Stream语法详解(转)

    本文转自http://ifeve.com/stream/ Java8初体验(二)Stream语法详解 感谢同事[天锦]的投稿.投稿请联系 tengfei@ifeve.com 上篇文章Java8初体验( ...

  6. Windows Embedded CE 6.0开发初体验(二)CE开发环境 收藏

    上一篇<Windows Embedded CE 6.0开发初体验>之"嵌入式开发流程": http://blog.csdn.net/aawolf/archive/200 ...

  7. Online开发初体验——Jeecg-Boot 在线设计流程

    Online开发--初体验(在线设计流程) 01 在线设计流程 02 在线设计流程和表单对接 03 表单业务申请 演示在线设计流程 演示在线设计流程与表单对接 演示业务OA申请

  8. 【Activity学习五】--基于SSM整合Activiti之请假流程实现(二)

    [Activity学习五]--基于SSM整合Activiti之请假流程实现(二) 1.部署流程资源 2.查询流程定义信息 3.发布请假流程 4.查询用户任务 5.提出请假 6.老板查看请假任务 7.老 ...

  9. Windows Embedded Standard开发初体验(二)

    支持Silverlight的Windows Embedded Standard 好了,完成安装之后,我们就可以来做Windows Embedded Standard的第一个操作系统镜像了.在开始菜单中 ...

最新文章

  1. HRBUST 2011【简单dp】
  2. 程序员到底需要什么样的需求文档?
  3. 完全备份指的是对整个计算机系统,网络安全管理实践题库:在备份技术中,差分备份就是对整个系统所有文件进行完全备份,包括所有系统和数据。()...
  4. jpa query oracle 参数int为空_撸一个预言机(Oracle)服务,真香!—中篇
  5. boost::geometry::model::multi_polygon用法的测试程序
  6. Hadoop集群规划
  7. gradle maven_Gradle – Maven的观点
  8. BugkuCTF-MISC题有黑白棋的棋盘
  9. NOIP2003普及组第1题 乒乓球(Table.cpp)-- python3实现
  10. DreamFacotry 第4章 如何保护REST API
  11. CAVLC编解码原理与流程
  12. 5G版iPhone更多细节曝光:骁龙X55基带+A14处理器
  13. (1)什么是socket(套接字)
  14. 基于DEAP库的python进化算法-4.遗传算法求解TSP问题
  15. 克隆的仓库 设置全局https协议转换成git协议,加快拉取速度(git)
  16. 砂岩浮雕让雕刻更加美观
  17. O2OO是一个汽车故障诊断工具
  18. 企业邮箱登录入口和界面如何设置
  19. 《SolidCAM+SolidWorks 2014中文版数控加工从入门到精通》——第1章 SolidCAM基础 1.1 CAD/CAM基础...
  20. 单周期CPU实验之学习之旅

热门文章

  1. 优秀录屏工具:Screenium 3 for Mac
  2. 软件测试周刊(第71期):大悲时不发言,大怒时不争辩,大喜时不许诺。
  3. 记事本不能显示“联通”二字的原因
  4. MySQL —— 14、触发器
  5. 把你的阿里巴巴图标库转成你自己的@ant-design/icons
  6. MySQL+Mybatis
  7. 最新版去水印小程序搭建教程
  8. ICCV 2021 | 视觉Transformer中的相对位置编码
  9. 用python语言绘制美丽图形
  10. 【玩转ESP32】17、PWM调光