`
pdd7531
  • 浏览: 4318 次
  • 性别: Icon_minigender_1
  • 来自: 无锡
社区版块
存档分类
最新评论

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

    博客分类:
  • JBPM
阅读更多
找了好久的得到流程中所有已完成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;
	}



分享到:
评论
3 楼 fanl1982 2013-07-05  
同求代码,谢谢,19680460@qq.com
2 楼 sd1992585 2012-03-27  
如丝袜般顺滑的写代码~~ 亮了
1 楼 yuzhousky 2012-03-07  
你好,能将JBPM4.4获取的已经完成的结点的信息的代码发份不?邮箱yuzhousky@gmail.com

相关推荐

    jbpm4jbpm5

    例如,`太子表`(TaskTable)存储任务信息,`ProcInstTable`记录流程实例,`NodeInstTable`则跟踪流程中的节点实例。 2. **jBPM开发指南**: [jBPM开发指南].高杰.文字版提供了jbpm的开发指导,可能涵盖了如何配置...

    jbpm4数据表及字段说明.doc

    JBPM4的数据表结构设计得非常详细和完整,涵盖了流程定义、历史记录、执行信息、任务、Swim Lane、变量、身份验证和权限控制、定时器等方面的信息。这使得JBPM4可以很好地满足复杂的业务流程管理需求。

    JBPM4 常用表结构及其说明

    ### JBPM4 常用表结构及其说明 JBPM4是JBPM(Java Business Process Model)的一个版本,主要用于提供业务流程管理的功能。它通过一组数据库表来支持工作流的执行与跟踪。本文将详细介绍JBPM4中的常用表结构及其...

    JBPM工作原理及表结构详解

    - **历史数据表**:如`JBPM4_HIST_ACTINST`记录活动实例历史,`JBPM4_HIST_DETAIL`记录流程细节变化。 5. **表结构详解** - **JBPM4_DEPLOYMENT**:存储流程部署的信息,如部署ID、时间戳和部署的元数据。 - **...

    JBPM4 学习使用总结

    3. **社区与论坛**:如ITEYE博客中的"obullxl"博主分享的经验,以及JBPM社区,可以获取到实时的问题解答和最佳实践。 总结来说,JBPM4是一款强大的工作流管理系统,它通过灵活的流程定义和丰富的API,为企业提供了...

    jBPM4完整例子

    8. **流程监控**:利用jBPM4提供的监控工具,查看流程实例的状态,如当前节点、历史记录等,帮助优化流程执行。 在"jbpm4.4_ssh2_lib.rar"文件中,包含了SSH框架和jBPM4所需的库文件,这些库文件是构建和运行项目的...

    JBPM4.4工作流数据表结构的详解

    首先,`JBPM4_DEPLOYMENT`表是流程定义表,它存储了所有部署的流程模板的信息。其中,`DBID`是每个流程定义的唯一标识,`NAME`用于记录流程模版的名称,而`TIMESTAMP`表示部署的时间戳,`STATE`字段则用来标记流程的...

    一个简单的Jbpm4项目源码

    **JBPM4项目源码详解** JBPM4(Java Business Process Management 4)是Red Hat公司推出的一款开源工作流管理系统,它提供了业务流程建模、部署、执行和监控的能力。这个简单的JBPM4项目源码提供了一个完整的web...

    JBPM4表结构.doc

    在JBPM4中,数据库表结构对于系统的正常运行至关重要,它们存储了流程定义、流程实例、活动实例以及历史记录等关键信息。以下是部分核心表结构的详细说明: 1. **JBPM4_DEPLOYMENT**(流程定义表): - DBID:唯一...

    jbpm数据库表结构详解

    9. **JBPM4_ID_GROUP**,**JBPM4_ID_MEMBERSHIP**,**JBPM4_ID_USER**:这些表构成用户和权限管理的基础,JBPM4_ID_GROUP存储组信息,JBPM4_ID_MEMBERSHIP记录用户与组的关系,JBPM4_ID_USER保存用户信息。虽然jbpm4...

    jbpm几个重要数据表的详细说明

    - 默认情况下,流程在任务节点处处于等待状态,直到所有任务完成。 - **jpbm_event**(事件表) - **中文名称**:事件表 - **数据表功能作用说明**: - 用于记录流程模型与其他流程交互产生的事件。 ##### 1.2...

    jbpm4源代码 简单实现公文流转

    3. **持久化**:jbpm4利用JPA(Java Persistence API)进行持久化管理,可以将流程实例、任务信息等数据存储在数据库中,确保数据的安全性和可靠性。 4. **规则集成**:jbpm4集成了Drools规则引擎,可以在流程执行...

    jbpm数据库数据,导入即可使用

    jbpm数据库数据是jbpm系统运行过程中产生的各种数据,包括流程定义、任务实例、变量、事件等,这些数据对于系统的正常运行至关重要。 在jbpm中,流程定义(Process Definition)是描述业务流程的蓝图,它定义了流程...

    jbpm4研究-工作流

    - `pro_definition`:存储流程定义,包括JBPM流程ID,用于记录流程的详细信息。 - `pro_user_assign`:记录流程任务与处理用户的关联,确保流程运行到特定任务时能自动指派给相应的用户或角色。 ### 3. 流程表单...

    jbpm数据库表结构

    - **JBPM_TASK**:任务表,记录所有任务的信息。 - **JBPM_TASKACTORPOOL**:任务参与者关系表,记录任务与用户的关联关系。 - **JBPM_TASKINSTANCE**:任务实例表,记录每个任务的具体执行情况。 4. **其他支持...

    JBoss JBPM4请假流程示例

    通过这个示例,开发者可以学习到如何在JBoss JBPM4中实现一个完整的业务流程,理解工作流引擎的工作原理,以及如何将流程与Web应用相结合。同时,对于熟悉BPMN和源码的开发者,还可以深入研究JBoss JBPM4的内部机制...

    JBPM数据表结构.doc

    如JBPM_NODE表示流程中的节点信息,JBPM_TRANSITION表示流程中的转换,JBPM_EVENT表示流程中的事件,JBPM_TASK表示任务,JBPM_MODULEDEFINITION表示模块定义,JBPM_DELEGATION表示委托信息,以及JBPM_...

    JBPM数据库表说明.doc

    在JBPM系统中,数据库扮演着至关重要的角色,存储了流程的配置信息以及运行时的状态数据。以下是对JBPM数据库表的详细说明: ### 1. 流程配置类数据库表 #### 1.1 JBPM_PROCESSDEFINITION 这个表存储了流程模板的...

    JBPM数据库分析文档.pdf

    在JBPM数据库中,有多个关键的表来存储流程相关的数据,包括流程定义、节点、迁移、动作和事件等。这些表共同构成了JBPM流程运行的基础。 1. **JBPM_PROCESSDEFINITION**: - 这个表存储流程模板信息,例如ID是...

    JBPM4.4实现一种无需指定上一节点(previous activity)的流程驳回(回退)

    在描述中提到的“无需指定上一节点”的实现,意味着开发者可能已经创建了一种命令(Command)或者服务任务(Service Task),比如`RegectTaskSingleBackWayCmd.java`,这个类可能是实现该功能的关键。此命令可能会...

Global site tag (gtag.js) - Google Analytics