camunda驳回到第一个任务节点示例
时间:2020-05-21
本文章向大家介绍camunda驳回到第一个任务节点示例,主要包括camunda驳回到第一个任务节点示例使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
@Test
public void reject() {
String processInstanceId="";
String message="项目的金额款项结算不正确";
Task task = taskService.createTaskQuery()
.taskAssignee("admin") //当前登录用户的id
.processInstanceId(processInstanceId)
.singleResult();
ActivityInstance tree = runtimeService.getActivityInstance(processInstanceId);
List<HistoricActivityInstance> resultList = historyService
.createHistoricActivityInstanceQuery()
.processInstanceId(processInstanceId)
.activityType("userTask")
.finished()
.orderByHistoricActivityInstanceEndTime()
.asc()
.list();
//得到第一个任务节点的id
HistoricActivityInstance historicActivityInstance = resultList.get(0);
String toActId = historicActivityInstance.getActivityId();
String assignee = historicActivityInstance.getAssignee();
//设置流程中的可变参数
Map<String, Object> taskVariable = new HashMap<>(2);
taskVariable.put("user", assignee);
taskVariable.put("formName", "项目建设");
taskService.createComment(task.getId(), processInstanceId, "驳回原因:" + message);
runtimeService.createProcessInstanceModification(processInstanceId)
.cancelActivityInstance(getInstanceIdForActivity(tree, task.getTaskDefinitionKey()))//关闭相关任务
.setAnnotation("进行了驳回到第一个任务节点操作")
.startBeforeActivity(toActId)//启动目标活动节点
.setVariables(taskVariable)//流程的可变参数赋值
.execute();
}
private String getInstanceIdForActivity(ActivityInstance activityInstance, String activityId) {
ActivityInstance instance = getChildInstanceForActivity(activityInstance, activityId);
if (instance != null) {
return instance.getId();
}
return null;
}
private ActivityInstance getChildInstanceForActivity(ActivityInstance activityInstance, String activityId) {
if (activityId.equals(activityInstance.getActivityId())) {
return activityInstance;
}
for (ActivityInstance childInstance : activityInstance.getChildActivityInstances()) {
ActivityInstance instance = getChildInstanceForActivity(childInstance, activityId);
if (instance != null) {
return instance;
}
}
return null;
}
原文地址:https://www.cnblogs.com/libing-/p/12928949.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 通过JSch运行远程linux主机上的shell脚本
- 精讲RestTemplate第5篇-DELETE、PUT等请求方法使用详解
- 一个小小的签到功能,到底用MySQL还是Redis?
- 在IntelliJ IDEA中多线程并发代码的调试方法
- 使用java API进行zip递归压缩文件夹以及解压
- C#刷剑指Offer | 从上到下打印二叉树
- Java自动化测试(web自动化测试框架2 29)
- 精讲RestTemplate第9篇-如何通过HTTP Basic Auth认证
- 【Rust日报】2020-09-14 测试数据表明, Rust 可以帮你省钱!
- 【43期】盘点那些必问的数据结构算法题之二叉树基础
- 精讲RestTemplate第8篇-请求失败自动重试机制
- 精讲RestTemplate第7篇-自定义请求失败异常处理
- 精讲RestTemplate第10篇-使用代理作为跳板发送请求
- 精讲响应式WebClient第5篇-请求超时设置与异常处理
- 精讲响应式WebClient第4篇-文件上传与下载