兩種方法對activiti運行過的節點高亮顯示

方法一:使用activiti自帶的image畫

此種方法好像使用activiti中5.16以後的版本:

1、controller層編輯

<span style="white-space:pre">	</span>@RequestMapping(value="/queryActivityMap", produces = MediaType.IMAGE_PNG_VALUE)
	@ResponseBody
	public byte[] queryActivityMap(String processInstanceId, Model model, HttpServletResponse response) {
		try {
			return orderService.traceProcessImage(processInstanceId);
		} catch (Exception e) {
			System.err.println("獲取圖片流錯誤!!");
			e.printStackTrace();
			return null;
		}
	}

2、service層編輯

<span style="white-space:pre">	</span>/**
	 * 得到帶有高亮節點的流程圖
	 * @param processInstanceId	流程實例id
	 * @return
	 */
	public byte[] traceProcessImage(String processInstanceId) {
		String taskId = taskService.createTaskQuery().processInstanceId(processInstanceId).singleResult().getId();
		if (StringUtils.isBlank(taskId))
            throw new IllegalArgumentException("任務ID不能爲空!");
        // 當前任務節點
        Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
        if (task == null)
            throw new IllegalArgumentException("任務不存在!");

        BpmnModel bpmnModel = repositoryService.getBpmnModel(task.getProcessDefinitionId());
        // List<String> activeActivityIds = runtimeService.getActiveActivityIds(task.getExecutionId());

        // 必須添加此行才能取到配置文件中的字體,待根本解決問題後刪除
        // Context.setProcessEngineConfiguration(processEngineConfiguration);
        // return ProcessDiagramGenerator.generateDiagram(bpmnModel, "PNG", activeActivityIds);

        // 經過的節點
        List<String> activeActivityIds = new ArrayList<>();
        List<String> finishedActiveActivityIds = new ArrayList<>();

        // 已執行完的任務節點
        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());
        List<String> highLightedFlows = new ArrayList<>();
        getHighLightedFlows(processDefinitionEntity.getActivities(), highLightedFlows, activeActivityIds);

        ProcessDiagramGenerator pdg = processEngineConfiguration.getProcessDiagramGenerator();
        InputStream inputStream = pdg.generateDiagram(bpmnModel, "PNG", finishedActiveActivityIds, highLightedFlows,
                processEngineConfiguration.getProcessEngineConfiguration().getActivityFontName(),
                processEngineConfiguration.getProcessEngineConfiguration().getLabelFontName(),
                processEngineConfiguration.getProcessEngineConfiguration().getProcessEngineConfiguration().getClassLoader(), 1.0);
       try {
           return IOUtils.toByteArray(inputStream);
        } catch (Exception e) {
            throw new RuntimeException("生成流程圖異常!", e);
        } finally {
            IOUtils.closeQuietly(inputStream);
        }
	}
	/*
     * 遞歸查詢經過的流
     */
    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());
                    }
                }
            }
        }
    }

3、顯示結果:

4、activit中所需要的jar包


方法二:定義一個遮罩層在流程圖上

1、查詢每個流程實例的流程圖,流程圖屬於流程定義的內容,根據流程實例id找到流程定義idprocessDefinitionId)

ProcessInstance processInstance = runtimeService
				.createProcessInstanceQuery()
				.processInstanceId(processInstanceId).singleResult();
String processDefinitionId = processInstance
					.getProcessDefinitionId();

2、據流程實例id找到當前運行活動標識activityId
// 當前任務id
String activityId = processInstance.getActivityId();

3、根據流程定義id得到流程定義實體對象ProcessDefinitionEntity,此對象中包括了bpmn定義的信息。
ProcessDefinitionEntity processDefinitionEntity = (ProcessDefinitionEntity) repositoryService
					.getProcessDefinition(processDefinitionId);

4、從流程定義對象中根據上邊找到的當前活動標識activityId找到當前活動定義對象ActivityImpl
ActivityImpl activityImpl = processDefinitionEntity
					.findActivity(activityId);

5、從ActivityImpl中取出座標信息.
Map<String, Object> map = new HashMap<String, Object>();
			// 使用map存放結點座標
			map.put("x", activityImpl.getX());
			map.put("y", activityImpl.getY());
			map.put("width", activityImpl.getWidth());
			map.put("height", activityImpl.getHeight());

6、將座標信息傳到jsp頁面,使用div顯示紅色邊框效果
<span style="white-space:pre">	</span><!-- 流程圖 -->
	<img style="position: absolute; top: 0px; left: 0px;"
		src="${baseurl}flow/queryResource.action?processDefinitionId=${processDefinitionId}&resourceType=png">

	<!-- 流程圖中當前活動框 -->
	<div style="position: absolute;border:1px solid red;width: ${map.width }px;height:${map.height }px;top:${map.y }px;left: ${map.x }px;"></div>












發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章