驳回操作, 如果任务配置了驳回的话,正常完成任务就行。 没配置的话,驳回到第一个任务节点。
public void submitTask() {
if (processService.taskIsConfigReject(processInstanceId, taskId)) {//任务是否配置驳回
processService.taskComplete(user.getUsername(), taskId, formData);
} else {
processService.reject(processInstanceId, taskId);
}
}
通过连线名称判断是否配置驳回,如果连线的节点是排它网关,继续判断连线。
/**
* 任务是否配置驳回
*
* @param processInstanceId
* @return
*/
@Override
public boolean taskIsConfigReject(String processInstanceId, String taskId) {
HistoricProcessInstance hisProIns = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
List<HistoricActivityInstance> unfinishedList = historyService.createHistoricActivityInstanceQuery().processInstanceId(processInstanceId).unfinished().list();
//获取流程定义的bpmn模型
BpmnModelInstance bpmn = repositoryService.getBpmnModelInstance(hisProIns.getProcessDefinitionId());
for (HistoricActivityInstance instance : unfinishedList) {
if (StringUtils.isNotBlank(instance.getTaskId()) && instance.getTaskId().equals(taskId)) {
ModelElementInstance domElement = bpmn.getModelElementById(instance.getActivityId());
FlowNode act = (FlowNode) domElement;
Collection<SequenceFlow> outgoing = act.getOutgoing();
if (outgoing.size() == 1) {
FlowNode target = null;
Iterator<SequenceFlow> iterator = outgoing.stream().iterator();
while (iterator.hasNext()) {
SequenceFlow flow = iterator.next();
target = flow.getTarget();
break;
}
//如果是排他网关
if ("exclusiveGateway".equals(target.getElementType().getTypeName())) {
return isContainReject(target.getOutgoing());
} else {
return false;
}
} else {
return isContainReject(outgoing);
}
}
}
return false;
}
/**
* 是否包含驳回
*
* @param outgoing
* @return
*/
public boolean isContainReject(Collection<SequenceFlow> outgoing) {
return outgoing.stream().filter(o -> StringUtils.isNotBlank(o.getAttributeValue("name"))
&& o.getAttributeValue("name").equals("驳回")).count() > 0 ? true : false;
}
/**
* 完成任务
*
* @return
*/
@Override
public void taskComplete(String auditor, String taskId, Map<String, Object> vars) {
taskService.claim(taskId, auditor);
taskService.complete(taskId, vars);
}
/**
* 驳回到第一个任务节点
*/
@Override
public void reject(String processInstanceId, String taskId) {
Task task = taskService.createTaskQuery().taskId(taskId).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();
runtimeService.createProcessInstanceModification(processInstanceId)
.cancelActivityInstance(getInstanceIdForActivity(tree, task.getTaskDefinitionKey()))//关闭相关任务
.setAnnotation("进行了驳回到第一个任务节点操作")
.startBeforeActivity(toActId)//启动目标活动节点
.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;
}