转自http://pdd7531.iteye.com/blog/1392305
找了好久的得到流程中所有已完成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;
- }