上一篇写到关于获取驳回节点信息:activiti&flowable任意驳回-获取可驳回节点信息
从而进行实现任意节点的驳回,正常的业务场景中可能不只是单纯的使用api驳回就可以了,下面就提供部分业务中常用的业务逻辑操作:
flowable版本:6.6.0
public boolean reject(RejectTaskDto rejectTaskDto) {
TaskEntity taskEntity = (TaskEntity) taskService.createTaskQuery().taskId(rejectTaskDto.getTaskId()).singleResult();
//1.把当前的节点设置为空
if (taskEntity != null) {
//2.设置审批人
taskEntity.setAssignee(rejectTaskDto.getUserId());
taskService.saveTask(taskEntity);
//3.添加驳回意见
taskService.addComment(rejectTaskDto.getTaskId(),
rejectTaskDto.getProcessInstanceId(), rejectTaskDto.getMessage());
//4.处理提交人节点
FlowNode distActivity = findFlowNodeByActivityId(taskEntity.getProcessDefinitionId(), rejectTaskDto.getNodeId());
if (distActivity != null) {
if (FlowableConstants.FLOW_SUBMITTER.equals(distActivity.getName())) {
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(taskEntity.getProcessInstanceId()).singleResult();
runtimeService.setVariable(rejectTaskDto.getProcessInstanceId(), FlowableConstants.FLOW_SUBMITTER_VAR, processInstance.getStartUserId());
}
}
List<String> executionIds = new ArrayList<>();
//5.判断节点是不是子流程内部的节点
if (checkActivitySubprocessByActivityId(taskEntity.getProcessDefinitionId(), rejectTaskDto.getNodeId())) {
//5.1 子流程内部驳回
Execution executionTask = runtimeService.createExecutionQuery().executionId(taskEntity.getExecutionId()).singleResult();
String parentId = executionTask.getParentId();
List<Execution> executions = runtimeService.createExecutionQuery().parentId(parentId).list();
executions.forEach(execution -> executionIds.add(execution.getId()));
} else {
//5.2 普通驳回
List<Execution> executions = runtimeService.createExecutionQuery().parentId(taskEntity.getProcessInstanceId()).list();
executions.forEach(execution -> executionIds.add(execution.getId()));
}
moveExecutionsToSingleActivityId(executionIds, rejectTaskDto.getNodeId());
//6.删除节点-保证流程图输出
deleteActivity(rejectTaskDto.getNodeId(), taskEntity.getProcessInstanceId());
return true;
}
return false;
}
/**
* 子流程判断
*/
private boolean checkActivitySubprocessByActivityId(String processDefId, String activityId) {
return CollectionUtils.isNotEmpty(findFlowNodesByActivityId(processDefId, activityId));
}
public List<FlowNode> findFlowNodesByActivityId(String processDefId, String activityId) {
List<FlowNode> activities = new ArrayList<>();
BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefId);
List<Process> processes = bpmnModel.getProcesses();
for (Process process : processes) {
FlowElement flowElement = process.getFlowElement(activityId);
if (flowElement != null) {
FlowNode flowNode = (FlowNode) flowElement;
activities.add(flowNode);
}
}
return activities;
}
/**
* 执行驳回跳转
*/
private void moveExecutionsToSingleActivityId(List<String> executionIds, String activityId) {
runtimeService.createChangeActivityStateBuilder()
.moveExecutionsToSingleActivityId(executionIds, activityId)
.changeState();
}
/**
* 删除跳转的历史节点信息
*
* @param disActivityId 跳转的节点id
* @param processInstanceId 流程实例id
*/
protected void deleteActivity(String disActivityId, String processInstanceId) {
String tableName = managementService.getTableName(ActivityInstanceEntity.class);
String sql = "select t.* from " + tableName + " t where t.PROC_INST_ID_=#{processInstanceId} and t.ACT_ID_ = #{disActivityId} " +
" order by t.END_TIME_ ASC";
List<ActivityInstance> disActivities = runtimeService.createNativeActivityInstanceQuery().sql(sql)
.parameter("processInstanceId", processInstanceId)
.parameter("disActivityId", disActivityId).list();
//删除运行时和历史节点信息
for (ActivityInstance activityInstance : disActivities) {
sql = "select t.* from " + tableName + " t where t.PROC_INST_ID_=#{processInstanceId} and (t.END_TIME_ >= #{endTime} or t.END_TIME_ is null)";
List<ActivityInstance> datas = runtimeService.createNativeActivityInstanceQuery().sql(sql).parameter("processInstanceId", processInstanceId)
.parameter("endTime", activityInstance.getEndTime()).list();
//排除目标节点
datas = datas.stream().filter(data -> !data.getActivityId().equals(disActivityId)).collect(Collectors.toList());
String deleteRuActSql = "delete from ACT_RU_ACTINST where ID_=#{id} ";
if (CollectionUtils.isNotEmpty(datas)) {
datas.forEach(ai ->
runtimeService.createNativeActivityInstanceQuery().sql(deleteRuActSql).parameter("id", ai.getId())
);
datas.forEach(ai ->
historyService.createHistoricActivityInstanceQuery().activityId(ai.getActivityId()).delete()
);
}
}
}
constants:
/**
* 提交人节点名称
*/
String FLOW_SUBMITTER = "提交人";
/**
* 提交人的变量名称
*/
String FLOW_SUBMITTER_VAR = "initiator";
以上,如有疑问欢迎提出交流