Activiti流程跟踪监控图路径线和节点高亮显示(最新)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
流程图高亮显示
该流程图示基于5.12的基础上改造的,由于涉及未来的升级问题,所以使用继承的方式扩展它的画图类。
闲话少说我们切入正题。
由于这是公司完整项目上的一个小模块,而最近公司不再做进一步的开发,只是优化,所以对于并行还不能支持,但方法有了,不过就是在做更一层次的处理。
希望对大家有所帮助。
1,先晒一下,我做出来的效果。
2,具体实现步骤:
Action
/**
* 通过指定的流程实例id生成流程监控图
*
* @param mapping
* @param form
* @param request
* @param response
* @return
*/
public ActionForward instanceDiagram(ActionMapping mapping,
ActionForm form, HttpServletRequest request,
HttpServletResponse response) {
/** 获取流程实例ID */
String instanceId = StringUtils.trimToEmpty(request .getParameter("instanceId"));
// 设置页面不缓存
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
try {
HistoricProcessInstance historicProcessInstance = historyService
.createHistoricProcessInstanceQuery()
.processInstanceId(instanceId).singleResult();
if (historicProcessInstance == null) {
throw new RuntimeException("获取流程图异常!");
} else {
BpmnModel bpmnModel = repositoryService
.getBpmnModel(historicProcessInstance
.getProcessDefinitionId());
List<HistoricActivityInstance>
activityInstances = historyService
.createHistoricActivityInstanceQuery()
.processInstanceId(instanceId)
.orderByHistoricActivityInstanceId().asc()
.list();//获取流程走过的节点,并按照节点生成先后顺序排序
List<String> activitiIds = new ArrayList<String>();
List<String> flowIds = new ArrayList<String>();
List<String> currentFlowIds = new
ArrayList<String>();
ProcessDefinitionEntity processDefinition = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService)
.getDeployedProcessDefinition(historicProcessInstance
.getProcessDefinitionId());
flowIds = flowMoniService.getHighLightedFlows(
processDefinition, activityInstances);
currentFlowIds =
flowMoniService.getCurrentHighLightedFlows(
processDefinition, activityInstances);
for (HistoricActivityInstance hai : activityInstances) {
activitiIds.add(hai.getActivityId());
}
List<Map<String, Boolean>>
highLightedActivities = flowMoniService
.getHighLightedActivities(processDefinition,
activityInstances);
ProcessEngineImpl defaultProcessEngine = (ProcessEngineImpl) ProcessEngines
.getDefaultProcessEngine();
Context.setProcessEngineConfiguration(defaultProcessEn gine
.getProcessEngineConfiguration());
Context.setProcessEngineConfiguration(processEngineFac toryBean
.getProcessEngineConfiguration());
InputStream imageStream = BlazerProcessDiagramGenerator
.generateDiagram2(bpmnModel, "png",
highLightedActivities, flowIds, currentFlowIds);
response.setContentType("image/png");
OutputStream os = response.getOutputStream();
int bytesRead = 0;
byte[] buffer = new byte[8192];
while((bytesRead = imageStream.read(buffer, 0, 8192)) != -1) {
os.write(buffer, 0, bytesRead);
}
os.close();
imageStream.close();
}
} catch (Exception e) {
logger.error("获取流程图异常!", e);
throw new RuntimeException("获取流程图异常!");
}
return null;
}
Service 获取高亮显示的线的id
注(这里我在代码里想对并发做些处理,但由于时间原因并没解决,希望高手继
续加强)
@Override
public 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());// 将后面第一个节点放
在时间相同节点的集合里
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;
}
@Override
public List<Map<String, Boolean>>
getHighLightedActivities(
ProcessDefinitionEntity processDefinition,
List<HistoricActivityInstance> historicActivityInstances) {
List<Map<String, Boolean>> highLightedActivities = new ArrayList<Map<String, Boolean>>();
int activityCount = historicActivityInstances.size();
Map<String, Boolean> activityMap = new HashMap<String, Boolean>();
activityMap.put(
historicActivityInstances.get(
historicActivityInstances.size() -
1).getActivityId(),
true);
highLightedActivities.add(activityMap);
boolean findCurrActivity = true;// 是否查询并发任务节点
for (int j = activityCount - 2; j >= 0; j--) {// 判断前面节点是否与
Map<String, Boolean> activityMap2 = new
HashMap<String, Boolean>();
HistoricActivityInstance activityImpl1 = historicActivityInstances
.get(j);// 前面第一个节点
if (findCurrActivity) {
HistoricActivityInstance activityImpl2 = historicActivityInstances
.get(j + 1);// 当前节点
if (activityImpl1.getStartTime().equals(
activityImpl2.getStartTime())) {
String type =
activityImpl1.getActivityType();
// 排除系统自动执行节点
if ("userTask".equals(type) || "endEvent".equals(type)) {
activityMap2.put(activityImpl1.getActivityId(), false);
} else {
activityMap2.put(activityImpl1.getActivityId(), false);
}
} else {
activityMap2.put(activityImpl1.getActivityId(), false);
findCurrActivity = false;
}
highLightedActivities.add(activityMap2);
} else {
activityMap2.put(activityImpl1.getActivityId(), false);
highLightedActivities.add(activityMap2);
}
}
return highLightedActivities;
}
画图类,用以高亮显示(这里继承Activiti的两个类)
ProcessDiagramGenerator.java和ProcessDiagramCanvas.java
继承上述两个类,可对你所需要的画的图进行扩展(颜色和节点的所有不同的显示)。
具体就是对于的源码的阅读和扩展,这里就不浪费篇幅。
最后:
如有任何问题可发邮箱到genghongchuang@
或QQ:729912261
MSN:genghongchuang@
真心希望对你有所帮助,由于工作原因代码可能有所冗余,希望你进一步的优化。
谢谢!!!。