1. 程式人生 > >activiti工作流獲取下一節點例項

activiti工作流獲取下一節點例項

第一個方法getTaskDefinitionList用於包裝下面兩個方法:

/**
	 * 
	 * @author: Longjun
	 * @Description: 根據例項編號獲取下一個任務節點例項集合
	 * @date:2016年3月18日 下午4:33:36
	 * @param sessionId是執行緒的sessionId;isNeedTransaction表示是否需要事務;procInstId流程例項ID
	 */
	public List<TaskDefinition> getTaskDefinitionList(String procInstId,String sessionId,boolean isNeedTransaction){
		ProcessEngine processEngine = WorkFlowService.getProcessEngine(sessionId, isNeedTransaction);
		HistoryService historyService = processEngine.getHistoryService();
		RepositoryService repositoryService = processEngine.getRepositoryService();
		RuntimeService runtimeService = processEngine.getRuntimeService();
		List<TaskDefinition> taskDefinitionList = new ArrayList<TaskDefinition>();
		//流程標示
		String processDefinitionId = historyService.createHistoricProcessInstanceQuery().processInstanceId(procInstId).singleResult().getProcessDefinitionId();
		ProcessDefinitionEntity pde = (ProcessDefinitionEntity) repositoryService.getProcessDefinition(processDefinitionId);
		//ProcessDefinitionEntity def = (ProcessDefinitionEntity) ((RepositoryServiceImpl)repositoryService).getDeployedProcessDefinition(processDefinitionId);
		//執行例項
		ExecutionEntity execution = (ExecutionEntity) runtimeService.createProcessInstanceQuery().processInstanceId(procInstId).singleResult();
		//當前例項的執行到哪個節點
		String activitiId = execution.getActivityId();
		//獲得當前任務的所有節點
		List<ActivityImpl> activitiList = pde.getActivities();
		String id = null;
		for(ActivityImpl activityImpl:activitiList){  
			id = activityImpl.getId(); 
			if(activitiId.equals(id)){
				logger.debug("當前任務:"+activityImpl.getProperty("name"));
				taskDefinitionList = nextTaskDefinition(activityImpl, activityImpl.getId());
			}
		}
		return taskDefinitionList;
	}

第二個方法nextTaskDefinition獲取所有下一節點集合:

/**
	 * 
	 * @author: Longjun
	 * @Description: 獲取所有下一節點
	 * @date:2016年3月18日 下午4:33:24
	 */
	private List<TaskDefinition> nextTaskDefinition(ActivityImpl activityImpl, String activityId){
		List<TaskDefinition> taskDefinitionList = new ArrayList<TaskDefinition>();//所有的任務例項
		List<TaskDefinition> nextTaskDefinition = new ArrayList<TaskDefinition>();//逐個獲取的任務例項
		TaskDefinition taskDefinition = null;
		if("userTask".equals(activityImpl.getProperty("type")) && !activityId.equals(activityImpl.getId())){
			taskDefinition = ((UserTaskActivityBehavior)activityImpl.getActivityBehavior()).getTaskDefinition();
			taskDefinitionList.add(taskDefinition);
		}else{
			List<PvmTransition> outTransitions = activityImpl.getOutgoingTransitions();
			List<PvmTransition> outTransitionsTemp = null;
			for(PvmTransition tr:outTransitions){  
				PvmActivity ac = tr.getDestination(); //獲取線路的終點節點  
				//如果是互斥閘道器或者是並行閘道器
				if("exclusiveGateway".equals(ac.getProperty("type"))||"parallelGateway".equals(ac.getProperty("type"))){
					outTransitionsTemp = ac.getOutgoingTransitions();
					if(outTransitionsTemp.size() == 1){							
						nextTaskDefinition = nextTaskDefinition((ActivityImpl)outTransitionsTemp.get(0).getDestination(), activityId);
						taskDefinitionList.addAll(nextTaskDefinition);
					}else if(outTransitionsTemp.size() > 1){
						for(PvmTransition tr1 : outTransitionsTemp){
							nextTaskDefinition = nextTaskDefinition((ActivityImpl)tr1.getDestination(), activityId);
							taskDefinitionList.addAll(nextTaskDefinition);
						}							
					}
				}else if("userTask".equals(ac.getProperty("type"))){
					taskDefinition = ((UserTaskActivityBehavior)((ActivityImpl)ac).getActivityBehavior()).getTaskDefinition();
					taskDefinitionList.add(taskDefinition);
				}else{
					logger.debug((String) ac.getProperty("type"));
				}
			} 		
		}
		return taskDefinitionList;
	}

第三個方法nextTaskDefinition根據連線條件conditionText(類似${iscorrect==1})獲取下一個節點:
/**
	 * 
	 * @author: Longjun
	 * @Description: 根據連線條件conditionText(類似${iscorrect==1})獲取下一個節點,此方法以後會用
	 * @date:2016年3月18日 下午4:33:24
	 * @param elString是類似${iscorrect==1}的連線條件
	 */
	@SuppressWarnings("unused")
	private List<TaskDefinition> nextTaskDefinition(ActivityImpl activityImpl, String activityId, String elString){
		List<TaskDefinition> taskDefinitionList = new ArrayList<TaskDefinition>();//所有的任務例項
		List<TaskDefinition> nextTaskDefinition = new ArrayList<TaskDefinition>();//逐個獲取的任務例項
		TaskDefinition taskDefinition = null;
		if("userTask".equals(activityImpl.getProperty("type")) && !activityId.equals(activityImpl.getId())){
			taskDefinition = ((UserTaskActivityBehavior)activityImpl.getActivityBehavior()).getTaskDefinition();
			taskDefinitionList.add(taskDefinition);
		}else{
			List<PvmTransition> outTransitions = activityImpl.getOutgoingTransitions();
			List<PvmTransition> outTransitionsTemp = null;
			for(PvmTransition tr:outTransitions){  
				PvmActivity ac = tr.getDestination(); //獲取線路的終點節點  
				//如果是互斥閘道器或者是並行閘道器
				if("exclusiveGateway".equals(ac.getProperty("type"))||"parallelGateway".equals(ac.getProperty("type"))){
					outTransitionsTemp = ac.getOutgoingTransitions();
					if(outTransitionsTemp.size() == 1){
						nextTaskDefinition = nextTaskDefinition((ActivityImpl)outTransitionsTemp.get(0).getDestination(), activityId,elString);
						taskDefinitionList.addAll(nextTaskDefinition);
					}else if(outTransitionsTemp.size() > 1){
						for(PvmTransition tr1 : outTransitionsTemp){
							Object s = tr1.getProperty("conditionText");
							if(elString.equals(StringUtils.trim(s.toString()))){
								nextTaskDefinition = nextTaskDefinition((ActivityImpl)tr1.getDestination(), activityId,elString);
								taskDefinitionList.addAll(nextTaskDefinition);
							}
						}
					}
				}else if("userTask".equals(ac.getProperty("type"))){
					taskDefinition = ((UserTaskActivityBehavior)((ActivityImpl)ac).getActivityBehavior()).getTaskDefinition();
					taskDefinitionList.add(taskDefinition);
				}else{
					logger.debug((String) ac.getProperty("type"));
				}
			} 
		}
		return taskDefinitionList;
	}