1、 先上效果。效果如下图
2、 代码如下
/**
* 方法一:生成流程图;带进度:<br>
* 得到带有高亮节点的流程图
*
* @param processInstanceId
* 流程实例id
* @return
*/
public InputStream traceProcessImage(String bussinessKey,
String processDefinitionId) {
// 经过的节点
BpmnModel bpmnModel = null;
InputStream is = null;
List<String> activeActivityIds = new ArrayList<>(); // 已完成的节点+当前节点
List<String> finishedActiveActivityIds = new ArrayList<>(); // 已完成的节点
List<String> highLightedFlows = new ArrayList<>();
List<Task> tasks = taskService.createTaskQuery()
.processInstanceBusinessKey(bussinessKey).list();
// .processInstanceId(processInstanceId).list();
for (Task task : tasks) {
if (task == null)
throw new IllegalArgumentException("任务不存在!");
String taskId = task.getId();
if (StringUtils.isBlank(taskId))
throw new IllegalArgumentException("任务ID不能为空!");
// 当前任务节点
// Task task =
// taskService.createTaskQuery().taskId(taskId).singleResult();
// List<String> activeActivityIds =
// runtimeService.getActiveActivityIds(task.getExecutionId());
// 必须添加此行才能取到配置文件中的字体,待根本解决问题后删除
// Context.setProcessEngineConfiguration(processEngineConfiguration);
// return ProcessDiagramGenerator.generateDiagram(bpmnModel, "PNG",
// activeActivityIds);
bpmnModel = repositoryService.getBpmnModel(task
.getProcessDefinitionId());
// 已执行完的任务节点
List<HistoricActivityInstance> finishedInstances = historyService
.createHistoricActivityInstanceQuery()
.processInstanceId(task.getProcessInstanceId()).finished()
.list();
for (HistoricActivityInstance hai : finishedInstances) {
finishedActiveActivityIds.add(hai.getActivityId());
}
// 已完成的节点+当前节点
activeActivityIds.addAll(finishedActiveActivityIds);
activeActivityIds.addAll(runtimeService.getActiveActivityIds(task
.getProcessInstanceId()));
// 经过的流
ProcessDefinitionEntity processDefinitionEntity = (ProcessDefinitionEntity) repositoryService
.getProcessDefinition(task.getProcessDefinitionId());
getHighLightedFlows(processDefinitionEntity.getActivities(),
highLightedFlows, activeActivityIds);
}
ProcessDiagramGenerator pdg = new DefaultProcessDiagramGenerator();
// 参数activeActivityIds为已完成的节点+当前节点,已完成节点+当前节点都有红色框;
// finishedActiveActivityIds为已完成的节点,如果输入finishedActiveActivityIds,则当前节点无红色边框
if (bpmnModel != null) {
is = pdg.generateDiagram(bpmnModel, "PNG",
finishedActiveActivityIds, highLightedFlows,
processEngineConfiguration.getActivityFontName(),
processEngineConfiguration.getLabelFontName(),
processEngineConfiguration.getClassLoader(), 1.0);
} else {
// 经过的流
ProcessDefinitionEntity processDefinitionEntity = (ProcessDefinitionEntity) repositoryService
.getProcessDefinition(processDefinitionId);
List<HistoricProcessInstance> hProcessInstances = historyService
.createHistoricProcessInstanceQuery()
.processInstanceBusinessKey(bussinessKey).list();
if (hProcessInstances != null && hProcessInstances.size() > 0) {
List<HistoricActivityInstance> finishedInstances = historyService
.createHistoricActivityInstanceQuery()
.processInstanceId(hProcessInstances.get(0).getId())
.finished().list();
for (HistoricActivityInstance hai : finishedInstances) {
finishedActiveActivityIds.add(hai.getActivityId());
}
getHighLightedFlows(processDefinitionEntity.getActivities(),
highLightedFlows, finishedActiveActivityIds);
}
bpmnModel = repositoryService.getBpmnModel(processDefinitionId);
is = pdg.generateDiagram(bpmnModel, "PNG",
finishedActiveActivityIds, highLightedFlows,
processEngineConfiguration.getActivityFontName(),
processEngineConfiguration.getLabelFontName(),
processEngineConfiguration.getClassLoader(), 1.0);
}
try {
return is;
} catch (Exception e) {
throw new RuntimeException("生成流程图异常!", e);
} finally {
}
}
/*
* 递归查询经过的流
*/
private void getHighLightedFlows(List<ActivityImpl> activityList,
List<String> highLightedFlows,
List<String> historicActivityInstanceList) {
for (ActivityImpl activity : activityList) {
if (activity.getProperty("type").equals("subProcess")) {
// get flows for the subProcess
getHighLightedFlows(activity.getActivities(), highLightedFlows,
historicActivityInstanceList);
}
if (historicActivityInstanceList.contains(activity.getId())) {
List<PvmTransition> pvmTransitionList = activity
.getOutgoingTransitions();
for (PvmTransition pvmTransition : pvmTransitionList) {
String destinationFlowId = pvmTransition.getDestination()
.getId();
if (historicActivityInstanceList
.contains(destinationFlowId)) {
highLightedFlows.add(pvmTransition.getId());
}
}
}
}
}