Activiti6驳回上一节点

主要是通过获取,通过遍历节点集合,通过上级节点对象的信息来判断上级节点是什么节点(网关、用户、开始、结束),来对不同的节点做不同的操作,目前只做一个互斥网关,用户,开始,和结束,其他的网关还没做,目前没用到。

我目前是SpringBoot整合的activiti6+Activiti Modeler在线流程编辑


注意:在进行驳回的时候要注意节点的上级活下级是不是起点或终点,如果是的话,是无法驳回的。
主要代码:

/*** 节点驳回操作*/@Overridepublic Result nodeReject(String taskId, String processInstanceId) {//获取仓库服务RepositoryService repositoryService = processEngine.getRepositoryService();//获取任务服务TaskService taskService = processEngine.getTaskService();ManagementService managementService = processEngine.getManagementService();//获取当前任务对象Task currentTask = taskService.createTaskQuery().taskId(taskId).singleResult();if (currentTask == null) {throw new ActivitiException("当前任务不存在或已被办理完成,回退失败!");}//获取流程定义idString processDefinitionId = currentTask.getProcessDefinitionId();//获取bpmn模板BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId);//获取当前任务信息Task task = taskService.createTaskQuery().processInstanceId(processInstanceId).singleResult();//获取目标节点定义FlowNode flowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(task.getTaskDefinitionKey());//获取输入节点集合List<SequenceFlow> incomingFlows = flowNode.getIncomingFlows();//遍历输入节点集合for (SequenceFlow incomingFlow : incomingFlows) {//上级节点的sourceRef-(sid)String sourceRef = incomingFlow.getSourceRef();//通过上级节点对象的信息来判断上级节点是什么节点(网关、用户、开始、结束)FlowNode flowElement = (FlowNode) bpmnModel.getMainProcess().getFlowElement(sourceRef);//上级节点判断,用户节点if (flowElement instanceof UserTask) {//返回上一个节点信息(可以删除)Result result = lastNodeMessage(processInstanceId);//删除当前运行任务String executionEntityId = managementService.executeCommand(new ActivitiNodeUtil.DeleteTaskCmd(currentTask.getId()));//流程执行到目标节点managementService.executeCommand(new ActivitiNodeUtil.setFLowNodeAndGoCmd(flowElement, executionEntityId));return result; //(可以删除)//上级节点判断,互斥网关节点} else if (flowElement instanceof ExclusiveGateway) {//获取输入节点集合List<SequenceFlow> incomingFlows1 = flowElement.getIncomingFlows();//遍历输入节点集合,找到输入的上级节点idfor (SequenceFlow sequenceFlow : incomingFlows1) {//上级节点的sourceRef-(sid)String flowSourceRef = sequenceFlow.getSourceRef();//通过上级节点的sid获取节点对象信息FlowNode flowNodeUser = (FlowNode) bpmnModel.getFlowElement(flowSourceRef);//通过上级节点对象的信息来判断上级节点是什么节点(网关、用户、开始、结束)if (flowNodeUser instanceof UserTask) {Result result = lastNodeMessage(processInstanceId);//删除当前运行任务String executionEntityId = managementService.executeCommand(new ActivitiNodeUtil.DeleteTaskCmd(currentTask.getId()));//流程执行到目标节点managementService.executeCommand(new ActivitiNodeUtil.setFLowNodeAndGoCmd(flowNodeUser, executionEntityId));//返回上一个节点信息return result;//上级节点判断,流程起点节点} else if (flowElement instanceof StartEvent) {throw new ActivitiException("上级节点是流程开始节点无法驳回,驳回失败!");}}//上级节点判断,流程起点节点} else if (flowElement instanceof StartEvent) {throw new ActivitiException("上级节点是流程开始节点无法驳回,驳回失败!");}}return null;}
/*** 删除当前运行时任务命令,并返回当前任务的执行对象id* 这里继承了NeedsActiveTaskCmd,主要时很多跳转业务场景下,要求不能是挂起任务。可以直接继承Command即可*/public static class DeleteTaskCmd extends NeedsActiveTaskCmd<String> {public DeleteTaskCmd(String taskId) {super(taskId);}@Overridepublic String execute(CommandContext commandContext, TaskEntity currentTask) {//获取所需服务TaskEntityManagerImpl taskEntityManager = (TaskEntityManagerImpl) commandContext.getTaskEntityManager();//获取当前任务的来源任务及来源节点信息ExecutionEntity executionEntity = currentTask.getExecution();//删除当前任务,来源任务taskEntityManager.deleteTask(currentTask, "jumpReason", false, false);return executionEntity.getId();}@Overridepublic String getSuspendedTaskException() {return "挂起的任务不能跳转";}}/*** 根据提供节点和执行对象id,进行跳转命令*/public static class setFLowNodeAndGoCmd implements Command<Void> {private FlowNode flowElement;private String executionId;public setFLowNodeAndGoCmd(FlowNode flowElement, String executionId) {this.flowElement = flowElement;this.executionId = executionId;}@Overridepublic Void execute(CommandContext commandContext) {//获取目标节点的来源连线List<SequenceFlow> flows = flowElement.getIncomingFlows();if (flows == null || flows.size() < 1) {throw new ActivitiException("回退错误,目标节点没有来源连线");}//随便选一条连线来执行,当前执行计划为,从连线流转到目标节点,实现跳转ExecutionEntity executionEntity = commandContext.getExecutionEntityManager().findById(executionId);executionEntity.setCurrentFlowElement(flows.get(0));commandContext.getAgenda().planTakeOutgoingSequenceFlowsOperation(executionEntity, true);return null;}}

主要需要两个参数一个任务Id一个流程Id,

Activiti6驳回上一节点相关推荐

  1. Camunda流程驳回至上一节点

    文章目录 前言 一.版本 二.实现 1.回退至上一节点 2.回退至开始节点 3.测试方法 前言 Camunda驳回至上一节点,网上大多都是回退至开始节点,这样逻辑比较简单清晰.但实际使用中,往往需要驳 ...

  2. 求二叉树中的第一条最长路径长度,并输出最长路径上的节点

    #include <stdio.h> #define MaxSize 1000typedef struct BiTNode {int data;struct BiTNode *lchild ...

  3. ansys选择一个面上所有节点_利用APDL命令选择椭球面上的节点

    微信公众号:CAE技术分享 问题的背景:笔者在利用Workbench的二次开发功能实现某模型的参数化建模.分网.加载时,由于workbench开发接口的限制,需要结合DM模块.MAPDL模块.Mesh ...

  4. Datawhale 6月学习——图神经网络:超大图上的节点表征学习

    前情回顾 图神经网络:图数据表示及应用 图神经网络:消息传递图神经网络 图神经网络:基于GNN的节点表征学习 图神经网络:基于GNN的节点预测任务及边预测任务 1 超大图上的节点表征学习 1.1 简述 ...

  5. 管理节点连接不上sql节点_华为云IEF智能边缘平台十万边缘节点管理技术深度解读学习笔记...

    华为云智能边缘平台IEF首席架构师张琦在3月27-28日举办的华为开发者大会2020(Cloud)上,深度解读了十万边缘节点的管理技术,以及如何通过云原生技术和边缘计算结合,构建边缘计算实战场景中所需 ...

  6. java dom添加节点_java用dom更新xml的有关问题,如何在子节点上添加节点

    java用dom更新xml的问题,怎么在子节点下添加节点? 有原始xml如下: 我想要得到修改后的结果为: 我的代码为: public static void main(String[] args)  ...

  7. 管理节点连接不上sql节点_质量成本管理:成本控制、成本分析、费用使用流程与节点说明...

    关注[本头条号]更多关于制度.流程.体系.岗位.模板.方案.工具.案例.故事.图书.文案.报告.技能.职场等内容,弗布克15年积累免费与您分享! 阅读导航→ 01 质量成本控制流程与节点 02 质量成 ...

  8. 超大图上的节点表征学习

    一.Cluster-GCN 论文 Cluster-GCN: An Efficient Algorithm for Training Deep and Large Graph Convolutional ...

  9. Linux上zk节点在哪存着,Kafka在Zookeeper上的节点信息和查看方式

    Kafka启动:(根据自身路径更改) /usr/local/kafka/bin/kafka-server-start.sh -daemon /usr/local/kafka/config/server ...

  10. 管理节点连接不上sql节点_连接大运会主场馆和双机场 成都东西向“天府大道”迎来重要节点开工...

    封面新闻记者 朱珠 当前,成都启动复工复产"快进键",建筑业全面复工复产,各大项目有序施工.3月25日,记者从成都市住建局获悉,随着工程进度加快,成都东西城市轴线又迎来重要工程进展 ...

最新文章

  1. springboot整合swagger2之最佳实践
  2. Laravel 中简约而不简单的 Macroable 宏指令
  3. 【IT基础】常见的开发文档
  4. 低质量的勤奋,比懒惰更可怕
  5. 把接口作为函数的参数,那么任何实现了接口的类的实例都可以作为此函数的参数传递...
  6. python框架之Django(2)-简单的CRUD
  7. HTML/XHTML/HTML5/CSS学习链接
  8. ubuntu16.04编译boost for Android(boost 1.65)
  9. 飞秋-程序的找工作之苦
  10. 电子工程师名片——FAT16文件系统(转)
  11. .html(),.text()和.val()的差异总结:
  12. 6.gloox 之 MessageHandler
  13. 第五章 线性回归 学习笔记上
  14. 局域网聊天 java_java实现简易局域网聊天功能
  15. 亚马逊产品该如何定价?这9种定价策略你一定要了解哦!
  16. java基于ssh的旅游系统
  17. # 学号12 2016-2017-2 《程序设计与数据结构》第9周学习总结
  18. java微信红包_Java模拟微信发红包(普通红包、拼手气红包)
  19. 万能种子搜索器p2p官方版
  20. Amihud非流动性指标计算

热门文章

  1. 魔兽登录后 服务器那显示不兼容,魔兽世界服务器不兼容什么意思?魔兽世界服务器不兼容解决方法...
  2. OpenGL--纹理贴图基础
  3. 语法分析:自下而上分析
  4. Vue解决无数据图片闪现的问题
  5. DeepL Pro(deepl翻译器)官方中文版V2.2.0 | 翻译软件哪个好用 | 翻译软件排行榜前十的神器
  6. spss因子分析结果解读_SPSS进行问卷量表信度检验(详细操作过程及结果分析)——【杏花开生物医药统计】...
  7. php bi系统,bi系统是什么系统
  8. 不用无限手套,人人都能开发BI系统
  9. NVMe驱动解析-DMA传输
  10. jquery-validate验证身份证