@RequestMapping(value = "/getHighlightImg/{id}", method = RequestMethod.GET)
@ApiOperation(value = "获取高亮实时流程图")
public void getHighlightImg(@ApiParam("流程实例id") @PathVariable String id,
HttpServletResponse response){
InputStream inputStream = null;
ProcessInstance pi = null;
String picName = "";
// 查询历史
HistoricProcessInstance hpi = historyService.createHistoricProcessInstanceQuery().processInstanceId(id).singleResult();
if (hpi.getEndTime() != null) {
// 已经结束流程获取原图
ProcessDefinition pd = repositoryService.createProcessDefinitionQuery().processDefinitionId(hpi.getProcessDefinitionId()).singleResult();
picName = pd.getDiagramResourceName();
// inputStream = repositoryService.getResourceAsStream(pd.getDeploymentId(), pd.getDiagramResourceName());
// Start
inputStream = findProcessStatusDiagram(id);
// End
} else {
pi = runtimeService.createProcessInstanceQuery().processInstanceId(id).singleResult();
/*
BpmnModel bpmnModel = repositoryService.getBpmnModel(pi.getProcessDefinitionId());
List<String> highLightedActivities = new ArrayList<String>();
// 高亮任务节点
List<Task> tasks = taskService.createTaskQuery().processInstanceId(id).list();
for (Task task : tasks) {
highLightedActivities.add(task.getTaskDefinitionKey());
}
List<String> highLightedFlows = getHighLightedFlows(id);
ProcessDiagramGenerator diagramGenerator = processEngineConfiguration.getProcessDiagramGenerator();
inputStream = diagramGenerator.generateDiagram(bpmnModel, "png", highLightedActivities, highLightedFlows,
properties.getActivityFontName(), properties.getLabelFontName(), properties.getLabelFontName(),null, 1.0);
*/
inputStream = findProcessStatusDiagram(id);
picName = pi.getName()+".png";
}
try {
response.setContentType("application/octet-stream;charset=UTF-8");
response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(picName, "UTF-8"));
byte[] b = new byte[1024];
int len = -1;
while ((len = inputStream.read(b, 0, 1024)) != -1) {
response.getOutputStream().write(b, 0, len);
}
response.flushBuffer();
} catch (IOException e) {
log.error(e.toString());
throw new ScpfException("读取流程图片失败");
}
}
private InputStream findProcessStatusDiagram(String id) {
InputStream inputStream = null;
HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(id).singleResult();
List<HistoricActivityInstance> list = historyService.createHistoricActivityInstanceQuery().processInstanceId(id).orderByHistoricActivityInstanceId().asc().list();
List<String> executedActivityIds = new ArrayList<>();
for(HistoricActivityInstance activityInstance : list) {
executedActivityIds.add(activityInstance.getActivityId());
}
BpmnModel bpmnModel = repositoryService.getBpmnModel(historicProcessInstance.getProcessDefinitionId());
ProcessDefinitionEntity processDefinitionEntity = (ProcessDefinitionEntity)repositoryService.getProcessDefinition(historicProcessInstance.getProcessDefinitionId());
List<String> highListedFlows = getHighLightedFlows(processDefinitionEntity, list);
ProcessDiagramGenerator diagramGenerator = processEngineConfiguration.getProcessDiagramGenerator();
inputStream = diagramGenerator.generateDiagram(bpmnModel, "png", executedActivityIds, highListedFlows,
properties.getActivityFontName(), properties.getLabelFontName(), properties.getLabelFontName(),null, 1.0);
return inputStream;
}
private List<String> getHighLightedFlows(ProcessDefinitionEntity processDefinitionEntity, List<HistoricActivityInstance> historicActivityInstances) {
List<String> highFlows = new ArrayList<String>(); // 保存需高亮的线flowId
for (int i = 0; i < historicActivityInstances.size() - 1; i++) {
ActivityImpl activityImpl = processDefinitionEntity.findActivity(historicActivityInstances.get(i).getActivityId());
List<ActivityImpl> sameStartTimeNodes = new ArrayList<ActivityImpl>(); // 保存后续开始时间相同的节点
ActivityImpl sameActivityImpl1 = processDefinitionEntity.findActivity(historicActivityInstances.get(i + 1).getActivityId()); // i+1 下一个节点
sameStartTimeNodes.add(sameActivityImpl1);
for (int j = i + 1; j < historicActivityInstances.size() - 1; j++) {
HistoricActivityInstance activityImpl1 = historicActivityInstances.get(j);// 后续第一个节点
HistoricActivityInstance activityImpl2 = historicActivityInstances.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;
}
private List<String> getHighLightedFlows(String id) {
List<HistoricActivityInstance> historicActivityInstances = historyService.createHistoricActivityInstanceQuery().processInstanceId(id).orderByHistoricActivityInstanceId().asc().list();
System.out.println("historicActivityInstances-----" + historicActivityInstances);
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(id).singleResult();
String processDefinitionId = processInstance.getProcessDefinitionId();
ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId);
ProcessDefinitionEntity processDefinitionEntity = (ProcessDefinitionEntity) processDefinition;
System.out.println("processDefinitionEntity-----" + processDefinitionEntity);
List<String> highFlows = new ArrayList<String>(); // 保存需高亮的线flowId
for (int i = 0; i < historicActivityInstances.size() - 1; i++) { // 对历史流程节点进行遍历
System.out.println("i = " + i);
ActivityImpl activityImpl = processDefinitionEntity.findActivity(historicActivityInstances.get(i).getActivityId());
System.out.println("activityImpl-----" + activityImpl);
List<ActivityImpl> sameStartTimeNodes = new ArrayList<ActivityImpl>(); // 保存后续开始时间相同的节点
ActivityImpl sameActivityImpl1 = processDefinitionEntity.findActivity(historicActivityInstances.get(i + 1).getActivityId()); // i+1 下一个节点
System.out.println("sameActivityImpl1-----" + sameActivityImpl1);
sameStartTimeNodes.add(sameActivityImpl1);
for (int j = i + 1; j < historicActivityInstances.size() - 1; j++) {
System.out.println("j = " + j);
HistoricActivityInstance activityImpl1 = historicActivityInstances.get(j);// 后续第一个节点
System.out.println("activityImpl1-----" + activityImpl1.toString());
HistoricActivityInstance activityImpl2 = historicActivityInstances.get(j + 1);// 后续第二个节点
System.out.println("activityImpl2-----" + activityImpl2.toString());
System.out.println(activityImpl1.getStartTime().getTime() + "*****" + activityImpl2.getStartTime().getTime());
if (activityImpl1.getStartTime().equals(activityImpl2.getStartTime())) {
// 如果第一个节点和第二个节点开始时间相同 则保存
ActivityImpl sameActivityImpl2 = processDefinitionEntity.findActivity(activityImpl2.getActivityId());
System.out.println("sameActivityImpl2-----" + sameActivityImpl2);
sameStartTimeNodes.add(sameActivityImpl2);
} else {
// 有不相同跳出循环
break;
}
}
List<PvmTransition> pvmTransitions = activityImpl.getOutgoingTransitions();// 取出节点的所有出去的线
System.out.println("pvmTransitions-----" + pvmTransitions);
for (PvmTransition pvmTransition : pvmTransitions) {
System.out.println("pvmTransition-----" + pvmTransition);
// 对所有的线进行遍历
ActivityImpl pvmActivityImpl = (ActivityImpl) pvmTransition.getDestination();
System.out.println("pvmActivityImpl-----" + pvmActivityImpl);
System.out.println("sameStartTimeNodes-----" + sameStartTimeNodes);
// 如果取出的线的目标节点存在时间相同的节点里,保存该线的id,进行高亮显示
if (sameStartTimeNodes.contains(pvmActivityImpl)) {
highFlows.add(pvmTransition.getId());
System.out.println("highFlows-----" + highFlows);
}
}
}
return highFlows;
}