activiti - 流程跟踪图

本文介绍了一种基于业务流程实例和历史记录生成带有高亮显示的流程图的方法。该方法能够展示流程中的活动节点及其流转路径,并区分已完成节点与当前节点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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());
					}
				}
			}
		}
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值