上面这种是显示当前活动节点,下面我将贴出 显示所有已完成过的节点,第二种显示有问题,如图像不清晰,中文乱码,而且流程图感觉失真!
由于第二种方法代码量比较多,所以给出代码
/*----------------------------------------- 显示实现 ----------------------------------------*/
/**
* 测试 高亮显示所有走过的 节点和线
* @throws Exception
*/
public void showAllFinishView(String processInstanceId,HttpServletResponse response) throws Exception{
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
if(processInstance == null){
throw new RuntimeException("获取流程图异常");
}else{
BpmnModel bpmnModel = repositoryService.getBpmnModel(processInstance.getProcessDefinitionId());
List<HistoricActivityInstance> activityInstances = historyService.createHistoricActivityInstanceQuery().processInstanceId(processInstanceId).orderByHistoricActivityInstanceStartTime().asc().list();
List<String> activityIds = new ArrayList<String>();
List<String> flowIds = new ArrayList<String>();
ProcessDefinitionEntity processDefinition = (ProcessDefinitionEntity)((RepositoryServiceImpl)repositoryService).getDeployedProcessDefinition(processInstance.getProcessDefinitionId());
//获取流程走过的线
flowIds = getHighLightedFlows(processDefinition,activityInstances);
for(HistoricActivityInstance hai:activityInstances){
//获取流程走过的节点
activityIds.add(hai.getActivityId());
}
InputStream inputStream = new DefaultProcessDiagramGenerator().generateDiagram(bpmnModel, "png", activityIds, flowIds,"宋体","宋体",null,1.0);
OutputStream out = response.getOutputStream();
for(int b = -1;(b=inputStream.read())!=-1;){
out.write(b);
}
out.close();
inputStream.close();
}
}
//获取流程走过的线
public static List<String> getHighLightedFlows(ProcessDefinitionEntity processDefinitionEntity,List<HistoricActivityInstance> haiList) throws Exception{
//用来保存高亮的线 flowId
List<String> highFlows = new ArrayList<String>();
for (int i = 0; i < haiList.size() - 1; i++) {
//对历史流程节点进行遍历
//得到节点定义的详细信息
ActivityImpl activityImpl = processDefinitionEntity.findActivity(haiList.get(i).getActivityId());
//用以保存后需要开始时间相同的节点
List<ActivityImpl> sameStartTimeNodes = new ArrayList<ActivityImpl>();
ActivityImpl sameActivityImpl1 = processDefinitionEntity.findActivity(haiList.get(i + 1).getActivityId());
//讲后面第一个节点放在时间相同节点的集合里
sameStartTimeNodes.add(sameActivityImpl1);
for (int j = i + 1; j < haiList.size() - 1; j++) {
HistoricActivityInstance activityImpl1 = haiList.get(j);//后续第一个节点
HistoricActivityInstance activityImpl2 = haiList.get(j + 1);//后续第而个节点
if(activityImpl1.getStartTime().equals(activityImpl2.getStartTime())){
//如果第一个节点和第二个节点开始时间相同保存
ActivityImpl sameActivityImpl2 = processDefinitionEntity.findActivity(activityImpl2.getActivityId());
sameStartTimeNodes.add(sameActivityImpl2);
}else{
//不同就调查循环
break;
}
}
//取出节点的所有出去的线
List<PvmTransition> pvmTransitions = activityImpl.getOutgoingTransitions();
for(PvmTransition pvmTransition : pvmTransitions){
//对所有的线进行遍历
ActivityImpl pvmActivityImpl = (ActivityImpl) pvmTransition.getDestination();
//如果取出的线的目标节点存在时间相同的节点里,保存该线的id,进行高亮显示
if(sameStartTimeNodes.contains(pvmActivityImpl)){
highFlows.add(pvmTransition.getId());
}
}
}
return highFlows;
}
/*----------------------------------------- 显示实现 ----------------------------------------*/
第一种效果图
第二种效果图