JBPM4得到所有已经完成节点的主数据类以及数据记录信息

找了好久的得到流程中所有已完成ActivityInstance信息的实现方式,结果没找到相关的思路,就试着自己实现了下,发现有点复杂,一个下午才搞定。。。诶,啥时候才能达到如丝袜般顺滑的写代码。。。

      为了完成得到流程中所有已经完成的ActivityInstance的信息,主要思路为先寻找所有父流程的所有ActivityInstance的信息,再寻找兄弟节点的ActivityInstance的信息,最后寻找所有子流程的ActivityInstance的信息。

/**
	* <p>Description: 当前节点外键与已经执行完毕的节点自动关联.</p>
	* <p>Author: PanDuanDuan</p>
	* @param relationColumns 所有外键
	* @param piId 当前流程Id
	* @param processInstanceService 流程实例操作Service
	* @param processEngine 流程引擎
	* @param formReader 流程表单控制
	* <p>Date: 2012-2-3</p>
	*/
	public void autoMakeContent(List<Column> relationColumns, String executionId,
			ProcessInstanceService processInstanceService,
			ProcessEngine processEngine, XmlFormReader formReader) {
		Map<String,String> result = new HashMap<String,String>();
		//向上寻找  找到所有父类的节点 信息
		result = getParentTableIdAndDataId(executionId,processInstanceService,processEngine,result);
		//得到流程历史Service
		HistoryService historyService = processEngine.getHistoryService();
		//得到Excution的Service
		ExecutionService executionService = processEngine.getExecutionService();
		//得到已经完成的所有节点
		List<HistoryActivityInstance> historyActivityInstances = historyService.createHistoryActivityInstanceQuery().executionId(executionId).list();
		//得到当前的Execution
		Execution execution = executionService.findExecutionById(executionId);
		//递归寻找父Execution直至主流程
		Execution parentExecution = execution.getParent();
		String tempExecutionId = executionId;
		while(null != parentExecution)
		{
			//找到当前节点的兄弟节点
			Collection<? extends Execution> sons = parentExecution.getExecutions();
			if(sons.size() > 1)
			{
				for(Execution son : sons)
				{
					String sonExecutionId = son.getId();
					if(!tempExecutionId.equals(sonExecutionId))
					{
						historyActivityInstances.addAll(historyService.createHistoryActivityInstanceQuery().executionId(sonExecutionId).list());
					}
				}
			}
			historyActivityInstances.addAll(historyService.createHistoryActivityInstanceQuery().executionId(parentExecution.getId()).list());
			tempExecutionId = parentExecution.getId();
			parentExecution = parentExecution.getParent();
		}
		
		HistoryActivityInstanceImpl haiImpl = null;
		//遍历所有节点  找出tableId  以及  dataId
		for(HistoryActivityInstance historyActivityInstance : historyActivityInstances)
		{
			haiImpl = (HistoryActivityInstanceImpl)historyActivityInstance;
			String type = haiImpl.getType();
			if("task".equals(type))
			{
				String taskName = haiImpl.getActivityName();
				XmlForm xmlForm = formReader.getFormByName(taskName);
				String tableId = xmlForm.getTableid();
				ProcessInstance proIns = (ProcessInstance) executionService.findExecutionById(haiImpl.getExecutionId()).getProcessInstance();
				String dataId = CommonTools.Obj2String(executionService.getVariable(proIns.getId(), tableId));
				if(!result.containsKey(tableId) && !"".equals(dataId))
				{
					result.put(tableId, dataId);
				}
			}else if("sub-process".equals(type))
			{
				String subName = haiImpl.getActivityName();
				String acExecutionId = haiImpl.getExecutionId();
				ProcessInstance proIns = (ProcessInstance) executionService.findExecutionById(acExecutionId).getProcessInstance();
				String subPiId = processInstanceService.getSubPiId(proIns.getId(), subName);
				//向下寻找  找到所有子流程的节点信息
				result = getSubTableIdAndDataId(subPiId,processInstanceService,processEngine,result);
			}
		}
		
	}
	
	/**
	* <p>Description: 得到所有子流程的tableId  以及  dataId.</p>
	* <p>Author: PanDuanDuan</p>
	* @param subPiId
	* @param processInstanceService
	* @param processEngine
	* @param result
	* @return
	* <p>Date: 2012-2-3</p>
	*/
	private Map<String, String> getSubTableIdAndDataId(String subPiId,
			ProcessInstanceService processInstanceService,
			ProcessEngine processEngine, Map<String, String> result) {
		try{
			//得到流程历史Service
			HistoryService historyService = processEngine.getHistoryService();
			//得到executionService
			ExecutionService executionService = processEngine.getExecutionService();
			//得到流程定义ID
			String pdId = executionService.findProcessInstanceById(subPiId).getProcessDefinitionId();
			//得到FormReader
			RepositoryService repositoryService = processEngine.getRepositoryService();
			// 得到流程定义
			ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(pdId)
					.uniqueResult();
			String deploymentId = repositoryService.createProcessDefinitionQuery().processDefinitionId(pdId).list().get(0)
					.getDeploymentId();
			// 通过图片名获得form.xml文件名
			String imageName = processDefinition.getImageResourceName();
			String fileName = imageName.replace(".png", "_form.xml");
			// 得到文件输入流
			InputStream in = repositoryService.getResourceAsStream(deploymentId, fileName);
			// 解析xml文档
			XmlFormReader formReader = new XmlFormReader(in);
			//得到已经完成的所有节点
			List<HistoryActivityInstance> historyActivityInstances = historyService.createHistoryActivityInstanceQuery().processInstanceId((subPiId)).list();
			HistoryActivityInstanceImpl haiImpl = null;
			//遍历所有节点  找出tableId  以及  dataId
			for(HistoryActivityInstance historyActivityInstance : historyActivityInstances)
			{
				haiImpl = (HistoryActivityInstanceImpl)historyActivityInstance;
				String type = haiImpl.getType();
				if("task".equals(type))
				{
					String taskName = haiImpl.getActivityName();
					XmlForm xmlForm = formReader.getFormByName(taskName);
					String tableId = xmlForm.getTableid();
					String dataId = CommonTools.Obj2String(executionService.getVariable(haiImpl.getExecutionId(), tableId));
					if(!result.containsKey(tableId) && !"".equals(dataId))
					{
						result.put(tableId, dataId);
					}
				}else if("sub-process".equals(type))
				{
					String subName = haiImpl.getActivityName();
					String acExecutionId = haiImpl.getExecutionId();
					ProcessInstance proIns = (ProcessInstance) executionService.findExecutionById(acExecutionId).getProcessInstance();
					String subSubPiId = processInstanceService.getSubPiId(proIns.getId(), subName);
					//向下寻找  找到所有子流程的节点信息
					result = getSubTableIdAndDataId(subSubPiId,processInstanceService,processEngine,result);
				}
			}
		}catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}

	/**
	* <p>Description: 得到所有父流程的tableId  以及  dataId.</p>
	* <p>Author: PanDuanDuan</p>
	* @param executionId
	* @param processInstanceService
	* @param processEngine
	* @param result
	* @return
	* <p>Date: 2012-2-3</p>
	*/
	public Map<String,String> getParentTableIdAndDataId(String executionId, ProcessInstanceService processInstanceService, ProcessEngine processEngine, Map<String,String> result)
	{
		//得到Excution的Service
		ExecutionService executionService = processEngine.getExecutionService();
		Execution execution = executionService.findExecutionById(executionId);
		//递归寻找父Execution直至主流程
		Execution parentExecution = execution.getParent();
		while(null != parentExecution)
		{
			if(null != parentExecution.getParent())
			{
				parentExecution = parentExecution.getParent();
			}else
				break;
		}
		//主的执行Id  防止分支
		String mainExecutionId = null==parentExecution?executionId:parentExecution.getId();
		//存放所有父流程
		List<ProcessInstance> fatherProcessInstances = new ArrayList<ProcessInstance>();
		ProcessInstance fatherProcessInstance = processInstanceService.getParentProcessInstance(mainExecutionId);
		//循环查找所有父流程
		while(null != fatherProcessInstance)
		{
			fatherProcessInstances.add(fatherProcessInstance);
			fatherProcessInstance = processInstanceService.getParentProcessInstance(fatherProcessInstance.getId());
		}
		//如果存在父流程
		if(fatherProcessInstances.size()>0)
		{
			for(ProcessInstance processInstance : fatherProcessInstances)
			{
				result.putAll(getTableIdAndDataIdByProcessInstance(processInstance,processInstanceService,processEngine));
			}
		}
		return result;
	}
	
	/**
	* <p>Description: 根据流程实例  得到所有的tableId  以及  dataId.</p>
	* <p>Author: PanDuanDuan</p>
	* @param processInstance
	* @param processInstanceService
	* @param processEngine
	* @return Map<tableId,dataId>
	* <p>Date: 2012-2-3</p>
	*/
	public Map<String,String> getTableIdAndDataIdByProcessInstance(ProcessInstance processInstance, ProcessInstanceService processInstanceService, ProcessEngine processEngine)
	{
		Map<String,String> result = new HashMap<String,String>();
		try{
			String pdId = processInstance.getProcessDefinitionId();
			//得到流程历史Service
			HistoryService historyService = processEngine.getHistoryService();
			//得到Excution的Service
			ExecutionService executionService = processEngine.getExecutionService();
			//得到已经完成的所有节点
			List<HistoryActivityInstance> historyActivityInstances = historyService.createHistoryActivityInstanceQuery().processInstanceId(processInstance.getId()).list();
			//得到FormReader
			RepositoryService repositoryService = processEngine.getRepositoryService();
			// 得到流程定义
			ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(pdId)
					.uniqueResult();
			String deploymentId = repositoryService.createProcessDefinitionQuery().processDefinitionId(pdId).list().get(0)
					.getDeploymentId();
			// 通过图片名获得form.xml文件名
			String imageName = processDefinition.getImageResourceName();
			String fileName = imageName.replace(".png", "_form.xml");
			// 得到文件输入流
			InputStream in = repositoryService.getResourceAsStream(deploymentId, fileName);
			// 解析xml文档
			XmlFormReader formReader = new XmlFormReader(in);
			//遍历所有节点  找出tableId  以及  dataId
			HistoryActivityInstanceImpl haiImpl = null;
			for(HistoryActivityInstance historyActivityInstance : historyActivityInstances)
			{
				haiImpl = (HistoryActivityInstanceImpl)historyActivityInstance;
				String type = haiImpl.getType();
				//只有是任务的节点  才读取tableId  以及  dataId
				if("task".equals(type))
				{
					String taskName = haiImpl.getActivityName();
					XmlForm xmlForm = formReader.getFormByName(taskName);
					String tableId = xmlForm.getTableid();
					ProcessInstance proIns = (ProcessInstance) executionService.findExecutionById(haiImpl.getExecutionId()).getProcessInstance();
					String dataId = CommonTools.Obj2String(executionService.getVariable(proIns.getId(), tableId));
					if(!result.containsKey(tableId))
					{
						result.put(tableId, dataId);
					}
				}
			}
		}catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}



你可能感兴趣的:(jbpm4)