activiti - 流程跟踪图

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


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
activiti-explorer是一个基于Activiti工作流引擎的Web应用程序,用于管理和监控工作流流程。它提供了一个直观的用户界面,允许用户查看和操作工作流程的各个方面。 activiti-explorer具有以下几个主要功能和特点: 1. 流程管理:activiti-explorer允许用户部署、启动、停止和删除工作流程。用户可以通过界面创建和编辑工作流程定义,并将其部署到Activiti引擎中。用户还可以查看流程实例和任务列表,以便监控工作流程的执行状态。 2. 任务管理:activiti-explorer使用户能够处理任务。用户可以接受、拒绝、转接和完成任务,还可以添加和查看任务的备注和附件。任务的执行状态和历史记录也可以通过界面进行查询和跟踪。 3. 用户管理:activiti-explorer允许管理员管理用户和组织角色。管理员可以创建、编辑和删除用户,分配和撤销用户的角色。这样可以确保只有授权的用户能够访问和操作特定的工作流程。 4. 报表和统计:activiti-explorer提供了一些报表和统计功能,用于分析和评估工作流程的性能和效率。用户可以查看工作流程的完成情况、平均处理时间和执行过程中的问题等指标。 总之,activiti-explorer是一个功能强大的工作流管理工具,可以帮助用户有效地管理和监控工作流程。它提供了直观的界面和丰富的功能,使用户能够轻松地创建、部署和处理工作流程,提高工作效率和质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值