activiti工作流项目中显示流程进度(流程图高亮显示)

1.flowList.jsp页面使用img标签,processInstanceId为后台传来的值

<img src="testController.do?queryProPlan&ProcessInstanceId=${processInstanceId}"/>

2.后台代码(ProcessDiagramGenerator的获取根据activiti版本的不同有两种方式)

package com.hdkj.test.controller;


import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import org.jeecgframework.core.common.controller.BaseController;
import org.jeecgframework.web.system.service.SystemService;

import java.io.InputStream;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.engine.HistoryService;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.history.HistoricActivityInstance;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl;
import org.activiti.engine.impl.context.Context;
import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
import org.activiti.engine.impl.pvm.PvmTransition;
import org.activiti.engine.impl.pvm.process.ActivityImpl;
import org.activiti.image.ProcessDiagramGenerator;
import org.activiti.image.impl.DefaultProcessDiagramGenerator;
import org.activiti.spring.ProcessEngineFactoryBean;
import java.io.IOException;

import com.hdkj.test.service.TestServiceI;

/**
 * @Title: Controller
 * @Description: test
 * @author onlineGenerator
 * @date 2019-11-15 14:27:21
 * @version V1.0
 * 
 */
@Controller
@RequestMapping("/testController")
public class CopyOfTestController1 extends BaseController {
	private static final Logger logger = LoggerFactory
			.getLogger(CopyOfTestController1.class);

	@Autowired
	private TestServiceI testService;
	@Autowired
	private SystemService systemService;

	@Autowired
	RepositoryService repositoryService;
	@Autowired
	protected RuntimeService runtimeService;
	@Autowired
	ProcessEngineConfiguration processEngineConfiguration;
	@Autowired
	ProcessEngineFactoryBean processEngine;
	@Autowired
	HistoryService historyService;
	@Autowired
	TaskService taskService;

	/**
	 * test列表 页面跳转
	 * 
	 * @return
	 */
	@RequestMapping(params = "list")
	public ModelAndView list(HttpServletRequest request) {
		return new ModelAndView("com/hdkj/test/testList");
	}

	/**
	 * 流程列表 页面跳转
	 * 
	 * @return
	 */
	@RequestMapping(params = "flowList")
	public ModelAndView flowList(HttpServletRequest request) {
		String id = request.getParameter("id");
		String processInstanceId = this.testService
				.getProcessInstanceIdById(id);
		request.setAttribute("businesskey", id);
		request.setAttribute("processInstanceId", processInstanceId);
		return new ModelAndView("com/hdkj/test/flowList");
	}

	@RequestMapping(params = "queryProPlan")
	public void queryProPlan(HttpServletRequest request,
			HttpServletResponse response) throws IOException {
		String processInstanceId = request.getParameter("ProcessInstanceId");
		// 获取历史流程实例
		HistoricProcessInstance processInstance = historyService
				.createHistoricProcessInstanceQuery()
				.processInstanceId(processInstanceId).singleResult();
		// 获取流程图
		BpmnModel bpmnModel = repositoryService.getBpmnModel(processInstance
				.getProcessDefinitionId());
		processEngineConfiguration = processEngine
				.getProcessEngineConfiguration();
		Context.setProcessEngineConfiguration((ProcessEngineConfigurationImpl) processEngineConfiguration);
		//activiti-engine-5.15.jar版本获取diagramGenerator方式
		ProcessDiagramGenerator diagramGenerator = new DefaultProcessDiagramGenerator();
		//activiti-engine-5.22.0.jar版本获取diagramGenerator方式
		//ProcessDiagramGenerator diagramGenerator = processEngineConfiguration
		//		.getProcessDiagramGenerator();
		ProcessDefinitionEntity definitionEntity = (ProcessDefinitionEntity) repositoryService
				.getProcessDefinition(processInstance.getProcessDefinitionId());
		/*第一种.高亮目前走过的节点*/
		List<HistoricActivityInstance> highLightedActivitList =  historyService.createHistoricActivityInstanceQuery().processInstanceId(processInstanceId).list();
		
		/*第二种,高亮最后走过的那个节点*/
		/*List<HistoricActivityInstance> highLightedActivitList1 = historyService
				.createHistoricActivityInstanceQuery()
				.processInstanceId(processInstanceId).orderByHistoricActivityInstanceStartTime().desc().list();
		List<HistoricActivityInstance> highLightedActivitList=new ArrayList<HistoricActivityInstance>();
		highLightedActivitList.add(highLightedActivitList1.get(0));
		*/
		// 高亮环节id集合
		List<String> highLightedActivitis = new ArrayList<String>();
 
		// 高亮线路id集合
		List<String> highLightedFlows = getHighLightedFlows(definitionEntity,
				highLightedActivitList);
 
		for (HistoricActivityInstance tempActivity : highLightedActivitList) {
			String activityId = tempActivity.getActivityId();
			highLightedActivitis.add(activityId);
		}
		// 中文显示的是口口口,设置字体就好了
		InputStream imageStream = diagramGenerator.generateDiagram(bpmnModel,
				"png", highLightedActivitis, highLightedFlows, "宋体", "宋体",
				null, null, 1.0);
		// 单独返回流程图,不高亮显示
		// InputStream imageStream =
		// diagramGenerator.generatePngDiagram(bpmnModel);
		// 输出资源内容到相应对象
		byte[] b = new byte[1024];
		int len;
		while ((len = imageStream.read(b, 0, 1024)) != -1) {
			response.getOutputStream().write(b, 0, len);
		}


	}

	/**
	 * 获取需要高亮的线
	 * 
	 * @param processDefinitionEntity
	 * @param historicActivityInstances
	 * @return
	 */
	private 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;
	}

}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
EasyUI是一个基于jQuery的UI库,它提供了一组易于使用的UI组件和工具,可以帮助开发人员在前端快速构建简洁美观的界面。Activiti是一个开源的业务流程管理(BPM)框架,它提供了完整的工作流引擎,可以用于管理和执行各种类型的工作流程。 EasyUI结合Activiti可以实现一个Web版的流程设计器,通过这个设计器,用户可以在前端界面上进行工作流程的设计和配置。具体实现步骤如下: 1. 引入EasyUI和Activiti的相关库文件,确保开发环境能够正常加载这些资源。 2. 创建一个Web页面,使用EasyUI提供的布局和组件进行界面的搭建。可以使用EasyUI提供的面板(Panel)、标签页(Tabs)等组件来实现一个分区域的界面布局,方便用户进行操作。 3. 在页面添加流程设计器所需的元素,例如画布(Canvas)、工具栏(Toolbar)等。可以使用EasyUI提供的拖拽功能来实现元素的可拖拽和放置。 4. 通过EasyUI的事件机制,添加相关事件处理函数。例如,当用户在工具栏选择了某个任务节点的图标后,可以通过事件处理函数在画布上创建该任务节点的图形表示。 5. 使用EasyUI提供的交互功能,实现一些操作的响应效果。例如,当用户在画布上选择了某个已有的任务节点图形后,可以使用EasyUI提供的高亮效果来标识用户的选择。 6. 结合Activiti的API,将用户的设计配置保存到数据库,以便后续的流程执行。可以使用EasyUI提供的表单组件和验证规则来方便地收集和验证用户的输入。 通过以上步骤,就可以使用EasyUI实现一个基于Activiti的Web版流程设计器。用户可以通过页面上的操作,设计和配置工作流程,并将其保存到数据库。在实际的应用,可以将该设计器嵌入到公司的内部系统,方便各个部门的员工进行流程的设计和管理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值