找了好久的得到流程中所有已完成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;
}
分享到:
- 2012-02-03 16:31
- 浏览 2145
- 评论(3)
- 论坛回复 / 浏览 (0 / 2495)
- 查看更多
相关推荐
例如,`太子表`(TaskTable)存储任务信息,`ProcInstTable`记录流程实例,`NodeInstTable`则跟踪流程中的节点实例。 2. **jBPM开发指南**: [jBPM开发指南].高杰.文字版提供了jbpm的开发指导,可能涵盖了如何配置...
JBPM4的数据表结构设计得非常详细和完整,涵盖了流程定义、历史记录、执行信息、任务、Swim Lane、变量、身份验证和权限控制、定时器等方面的信息。这使得JBPM4可以很好地满足复杂的业务流程管理需求。
### JBPM4 常用表结构及其说明 JBPM4是JBPM(Java Business Process Model)的一个版本,主要用于提供业务流程管理的功能。它通过一组数据库表来支持工作流的执行与跟踪。本文将详细介绍JBPM4中的常用表结构及其...
- **历史数据表**:如`JBPM4_HIST_ACTINST`记录活动实例历史,`JBPM4_HIST_DETAIL`记录流程细节变化。 5. **表结构详解** - **JBPM4_DEPLOYMENT**:存储流程部署的信息,如部署ID、时间戳和部署的元数据。 - **...
3. **社区与论坛**:如ITEYE博客中的"obullxl"博主分享的经验,以及JBPM社区,可以获取到实时的问题解答和最佳实践。 总结来说,JBPM4是一款强大的工作流管理系统,它通过灵活的流程定义和丰富的API,为企业提供了...
8. **流程监控**:利用jBPM4提供的监控工具,查看流程实例的状态,如当前节点、历史记录等,帮助优化流程执行。 在"jbpm4.4_ssh2_lib.rar"文件中,包含了SSH框架和jBPM4所需的库文件,这些库文件是构建和运行项目的...
首先,`JBPM4_DEPLOYMENT`表是流程定义表,它存储了所有部署的流程模板的信息。其中,`DBID`是每个流程定义的唯一标识,`NAME`用于记录流程模版的名称,而`TIMESTAMP`表示部署的时间戳,`STATE`字段则用来标记流程的...
**JBPM4项目源码详解** JBPM4(Java Business Process Management 4)是Red Hat公司推出的一款开源工作流管理系统,它提供了业务流程建模、部署、执行和监控的能力。这个简单的JBPM4项目源码提供了一个完整的web...
在JBPM4中,数据库表结构对于系统的正常运行至关重要,它们存储了流程定义、流程实例、活动实例以及历史记录等关键信息。以下是部分核心表结构的详细说明: 1. **JBPM4_DEPLOYMENT**(流程定义表): - DBID:唯一...
9. **JBPM4_ID_GROUP**,**JBPM4_ID_MEMBERSHIP**,**JBPM4_ID_USER**:这些表构成用户和权限管理的基础,JBPM4_ID_GROUP存储组信息,JBPM4_ID_MEMBERSHIP记录用户与组的关系,JBPM4_ID_USER保存用户信息。虽然jbpm4...
- 默认情况下,流程在任务节点处处于等待状态,直到所有任务完成。 - **jpbm_event**(事件表) - **中文名称**:事件表 - **数据表功能作用说明**: - 用于记录流程模型与其他流程交互产生的事件。 ##### 1.2...
3. **持久化**:jbpm4利用JPA(Java Persistence API)进行持久化管理,可以将流程实例、任务信息等数据存储在数据库中,确保数据的安全性和可靠性。 4. **规则集成**:jbpm4集成了Drools规则引擎,可以在流程执行...
jbpm数据库数据是jbpm系统运行过程中产生的各种数据,包括流程定义、任务实例、变量、事件等,这些数据对于系统的正常运行至关重要。 在jbpm中,流程定义(Process Definition)是描述业务流程的蓝图,它定义了流程...
- `pro_definition`:存储流程定义,包括JBPM流程ID,用于记录流程的详细信息。 - `pro_user_assign`:记录流程任务与处理用户的关联,确保流程运行到特定任务时能自动指派给相应的用户或角色。 ### 3. 流程表单...
- **JBPM_TASK**:任务表,记录所有任务的信息。 - **JBPM_TASKACTORPOOL**:任务参与者关系表,记录任务与用户的关联关系。 - **JBPM_TASKINSTANCE**:任务实例表,记录每个任务的具体执行情况。 4. **其他支持...
通过这个示例,开发者可以学习到如何在JBoss JBPM4中实现一个完整的业务流程,理解工作流引擎的工作原理,以及如何将流程与Web应用相结合。同时,对于熟悉BPMN和源码的开发者,还可以深入研究JBoss JBPM4的内部机制...
如JBPM_NODE表示流程中的节点信息,JBPM_TRANSITION表示流程中的转换,JBPM_EVENT表示流程中的事件,JBPM_TASK表示任务,JBPM_MODULEDEFINITION表示模块定义,JBPM_DELEGATION表示委托信息,以及JBPM_...
在JBPM系统中,数据库扮演着至关重要的角色,存储了流程的配置信息以及运行时的状态数据。以下是对JBPM数据库表的详细说明: ### 1. 流程配置类数据库表 #### 1.1 JBPM_PROCESSDEFINITION 这个表存储了流程模板的...
在JBPM数据库中,有多个关键的表来存储流程相关的数据,包括流程定义、节点、迁移、动作和事件等。这些表共同构成了JBPM流程运行的基础。 1. **JBPM_PROCESSDEFINITION**: - 这个表存储流程模板信息,例如ID是...
在描述中提到的“无需指定上一节点”的实现,意味着开发者可能已经创建了一种命令(Command)或者服务任务(Service Task),比如`RegectTaskSingleBackWayCmd.java`,这个类可能是实现该功能的关键。此命令可能会...