package com.norteksoft.wf.engine.core; import java.util.List; import org.jbpm.api.Execution; import org.jbpm.api.ProcessEngine; import org.jbpm.api.cmd.Command; import org.jbpm.api.cmd.Environment; import org.jbpm.api.model.Activity; import org.jbpm.api.task.Task; import org.jbpm.pvm.internal.model.ActivityImpl; import org.jbpm.pvm.internal.model.ExecutionImpl; import org.jbpm.pvm.internal.model.ProcessDefinitionImpl; import org.jbpm.pvm.internal.model.TransitionImpl; public class GetBackCommand implements Command<Activity> { private static final long serialVersionUID = 1L; private static final String DYNAMIC_TRANSITION_NAME = "dynamic_transition_name"; private String executionId; //待取回任务的execution private String preTaskName; //待取回任务的任务名 public GetBackCommand(String executionId, String preTaskName) { this.executionId = executionId; this.preTaskName = preTaskName; } public Activity execute(Environment environment) throws Exception { ProcessEngine engine = environment.get(ProcessEngine.class); ExecutionImpl execution = (ExecutionImpl) engine.getExecutionService().findExecutionById(executionId); ProcessDefinitionImpl definition = (ProcessDefinitionImpl) engine.getRepositoryService().createProcessDefinitionQuery() .processDefinitionId(execution.getProcessDefinitionId()).uniqueResult(); //需要取回的任务 ActivityImpl activity = definition.getActivity(preTaskName); if(Execution.STATE_INACTIVE_CONCURRENT_ROOT.equals(execution.getState())){ //不支持并发取回 return null; }else{ //直流 ActivityImpl fromActivity = execution.getActivity(); TransitionImpl transition = fromActivity.createOutgoingTransition(); transition.setDestination(activity); transition.setName(DYNAMIC_TRANSITION_NAME); //添加transition //添加transition List<TransitionImpl> transitionImpls=(List<TransitionImpl>)activity.getIncomingTransitions(); transitionImpls.add(transition); // activity.getIncomingTransitions().add(transition); //查询execution中的当前任务并完成它 Task task = engine.getTaskService().createTaskQuery().processInstanceId(execution.getProcessInstance().getId()) .activityName(execution.getActivityName()).uniqueResult(); if(task==null){ Execution tempExecution = execution.findActiveExecutionIn(execution.getActivityName()); if(tempExecution==null)return null;//并发时返回null engine.getExecutionService().signalExecutionById(tempExecution.getId(),DYNAMIC_TRANSITION_NAME); }else{ engine.getTaskService().completeTask(task.getId(), DYNAMIC_TRANSITION_NAME); } //移除transition activity.getIncomingTransitions().remove(transition); fromActivity.getOutgoingTransitions().remove(transition); //用下面方式直接移除,将会有空指针异常 //activity.removeIncomingTransition(transition); } return activity; } }