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;
}
posted @ 2020-05-21 10:22  李兵~  阅读(6319)  评论(3编辑  收藏  举报