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; public class FreeJumpTaskCmd implements Command{ private TaskService taskService; protected String taskId; protected String executionId; protected String procInsId; protected ActivityImpl desActivity; protected Map 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 list = executionEntityManager.findChildExecutionsByParentExecutionId(executionId); for (ExecutionEntity executionEntity2 : list) { List 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 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; } public FreeJumpTaskCmd(String taskId, String executionId, TaskService taskService,String procInsId, ActivityImpl desActivity, Map paramVar, ActivityImpl currentActivity) { this.taskId = taskId; this.executionId = executionId; this.taskService = taskService; this.procInsId = procInsId; this.desActivity = desActivity; this.paramVar = paramVar; this.currentActivity = currentActivity; } }
直接上代码,不说废话



