import org.activiti.engine.ProcessEngine; import org.activiti.engine.TaskService; import org.activiti.engine.impl.RepositoryServiceImpl; import org.activiti.engine.impl.RuntimeServiceImpl; 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.ProcessDefinitionEntity; import org.activiti.engine.impl.persistence.entity.TaskEntity; import org.activiti.engine.impl.pvm.process.ActivityImpl; /** * Created by Administrator on 2016/11/11. */ public class TaskFlowControlService { ProcessEngine _processEngine; private String _processId; public TaskFlowControlService(ProcessEngine processEngine, String processId) { this._processEngine = processEngine; this._processId = processId; } /** * 跳轉至指定活動節點 * @param targetTaskDefinitionKey */ public void jump(String targetTaskDefinitionKey){ TaskEntity currentTask = (TaskEntity)_processEngine.getTaskService() .createTaskQuery() .processInstanceId(_processId).singleResult(); jump(currentTask,targetTaskDefinitionKey); } /** * @param currentTaskEntity 當前任務節點 * @param targetTaskDefinitionKey 目標任務節點(在模型定義里面的節點名稱) */ private void jump(final TaskEntity currentTaskEntity, String targetTaskDefinitionKey){ final ActivityImpl activity = getActivity(_processEngine, currentTaskEntity.getProcessDefinitionId(),targetTaskDefinitionKey); final ExecutionEntity execution = (ExecutionEntity)_processEngine.getRuntimeService() .createExecutionQuery().executionId(currentTaskEntity.getExecutionId()).singleResult(); final TaskService taskService = _processEngine.getTaskService(); ((RuntimeServiceImpl)_processEngine.getRuntimeService()).getCommandExecutor() .execute(new Command<java.lang.Void>() { public Void execute(CommandContext commandContext) { //創建新任務 execution.setActivity(activity); execution.executeActivity(activity); //刪除當前的任務 //不能刪除當前正在執行的任務,所以要先清除掉關聯 currentTaskEntity.setExecutionId(null); taskService.saveTask(currentTaskEntity); taskService.deleteTask(currentTaskEntity.getId(),true); return null; } }); } private ActivityImpl getActivity(ProcessEngine processEngine, String processDefId, String activityId) { ProcessDefinitionEntity pde = getProcessDefinition(processEngine, processDefId); return pde.findActivity(activityId); } private ProcessDefinitionEntity getProcessDefinition(ProcessEngine processEngine, String processDefId) { return (ProcessDefinitionEntity) ((RepositoryServiceImpl) processEngine.getRepositoryService()) .getDeployedProcessDefinition(processDefId); } }