package com.act.service.cmd;
import java.util.List;
import java.util.Map;
import org.activiti.engine.TaskService;
import org.activiti.engine.delegate.ExecutionListener;
import org.activiti.engine.impl.context.Context;
import org.activiti.engine.impl.interceptor.Command;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.persistence.entity.ExecutionEntity;
import org.activiti.engine.impl.persistence.entity.ExecutionEntityManager;
import org.activiti.engine.impl.persistence.entity.TaskEntity;
import org.activiti.engine.impl.pvm.PvmException;
import org.activiti.engine.impl.pvm.process.ActivityImpl;
import org.activiti.engine.impl.pvm.process.ScopeImpl;
import org.activiti.engine.impl.pvm.runtime.InterpretableExecution;
import org.apache.commons.lang3.StringUtils;
/**
* @description: 自由跳转命令
* @create: 2020年04月20日18:38:23
* @author wanyy
**/
public class FreeJumpTaskCmd implements Command<Void> {
private TaskService taskService;
/**
* 任务id
*/
protected String taskId;
/**
* 执行实例id
*/
protected String executionId;
/**
* 流程实例id
*/
protected String procInsId;
/**
* 目标节点
*/
protected ActivityImpl desActivity;
/**
* 变量
*/
protected Map<String, Object> paramVar;
/**
* 当前的节点
*/
protected ActivityImpl currentActivity;
@Override
public Void execute(CommandContext commandContext) {
ExecutionEntityManager executionEntityManager = Context.getCommandContext().getExecutionEntityManager();
ExecutionEntity executionEntity = executionEntityManager.findExecutionById(executionId);
//设置相关变量
executionEntity.setVariables(paramVar);
executionEntity.setEventSource(this.currentActivity);
executionEntity.setActivity(this.currentActivity);
// 根据executionId 获取Task,
//删除无用的工作项
for (TaskEntity taskEntity : Context.getCommandContext().getTaskEntityManager().findTasksByProcessInstanceId(procInsId)) {
//如果是当前实例,那么完成。
if (taskId.equals(taskEntity.getId())) {
// 触发任务监听
taskEntity.fireEvent("complete");
//对转向的动作进行设定 仅设定退的动作 其余为提交
if (paramVar.containsKey("processDiversion") && StringUtils.startsWith(paramVar.get("processDiversion") + "", "退")) {
taskService.setVariableLocal(taskId, "processDiversion", paramVar.get("processDiversion"));
paramVar.remove("processDiversion");
}
taskService.addComment(taskEntity.getId(), taskEntity.getProcessInstanceId(), (String) paramVar.get("currComment"));
// 删除任务的原因
Context.getCommandContext().getTaskEntityManager().deleteTask(taskEntity, "completed", false);
//如果不是当前实例,那么直接删除掉。
} else {
// 删除任务的原因
taskEntity.fireEvent("complete");
Context.getCommandContext().getTaskEntityManager().deleteTask(taskEntity, "deleted", false);
}
}
//删除相关执行子路径,只保留根执行路径
List<ExecutionEntity> list = executionEntityManager.findChildExecutionsByParentExecutionId(executionId);
for (ExecutionEntity executionEntity2 : list) {
List<ExecutionEntity> parent = executionEntityManager.findChildExecutionsByParentExecutionId(executionEntity2.getId());
for (ExecutionEntity executionEntity3 : parent) {
executionEntity3.remove();
executionEntity3.signal(null, null);
Context.getCommandContext().getHistoryManager().recordActivityEnd(executionEntity3);
}
executionEntity2.remove();
executionEntity2.signal(null, null);
Context.getCommandContext().getHistoryManager().recordActivityEnd(executionEntity2);
}
commandContext.getIdentityLinkEntityManager().deleteIdentityLinksByProcInstance(procInsId);
//设置相关变量,
//要激活交路径
executionEntity.setActive(true);
//去掉无用的变量,不去掉,会导致很多莫名奇妙的问题
// executionEntity.removeVariable("loopCounter");
//去掉多实例的变量,如果变量不知道是啥,自己从节点定义里查
// executionEntity.removeVariable("cdp_atuser");
//触发事件监听器
this.execute(executionEntity);
InterpretableExecution propagatingExecution = null;
if (this.desActivity.isScope()) {
propagatingExecution = executionEntity.createExecution();
executionEntity.setTransition(null);
executionEntity.setActivity(null);
executionEntity.setActive(false);
propagatingExecution.initialize();
} else {
propagatingExecution = executionEntity;
}
propagatingExecution.executeActivity(this.desActivity);
return null;
}
protected ScopeImpl getScope(InterpretableExecution execution) {
return (ScopeImpl) execution.getActivity();
}
/**
触发事件监听器
*/
public void execute(InterpretableExecution execution) {
ScopeImpl scope = getScope(execution);
List<ExecutionListener> exectionListeners = scope.getExecutionListeners(getEventName());
for (ExecutionListener listener : exectionListeners) {
execution.setEventName(getEventName());
execution.setEventSource(scope);
try {
listener.notify(execution);
} catch (RuntimeException e) {
throw e;
} catch (Exception e) {
throw new PvmException("couldn't execute event listener : " + e.getMessage(), e);
}
}
}
protected String getEventName() {
return org.activiti.engine.impl.pvm.PvmEvent.EVENTNAME_END;
}
/**
* 构造参数 可以根据自己的业务需要添加更多的字段
*
* @param taskId
* @param executionId
* @param desActivity
* @param paramVar
* @param currentActivity
*/
public FreeJumpTaskCmd(String taskId, String executionId, TaskService taskService,String procInsId, ActivityImpl desActivity, Map<String, Object> paramVar, ActivityImpl currentActivity) {
this.taskId = taskId;
this.executionId = executionId;
this.taskService = taskService;
this.procInsId = procInsId;
this.desActivity = desActivity;
this.paramVar = paramVar;
this.currentActivity = currentActivity;
}
}
直接上代码,不说废话