activiti 流程跟踪图 flow 显示

1.定义全局变量 

package com.thinkgem.jeesite.act;
import java.util.HashMap;  
import java.util.Map;  
import org.activiti.engine.delegate.event.ActivitiEvent;  
import org.activiti.engine.delegate.event.ActivitiEventListener;  
import org.activiti.engine.delegate.event.impl.ActivitiSequenceFlowTakenEventImpl;
import org.apache.commons.logging.Log;  
import org.apache.commons.logging.LogFactory;  
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class GlobalEventListener implements  ActivitiEventListener {	 
	 /**
	  *    <entry key="TASK_CREATED" value="taskCreateListener"/>  
		   <entry key="TASK_COMPLETED" value="taskCompleteListener"/>  
		   <entry key="TASK_ASSIGNED" value="taskAssignedListener"/>  
		   <entry key="PROCESS_COMPLETED" value="processCompleteListener"/>  
		   <entry key="ACTIVITY_STARTED" value="activityStartedListener"/>  
		   <entry key="ACTIVITY_COMPLETED" value="activityCompletedListener"/>  
		   <entry key="ACTIVITY_SIGNALED" value="activitySignaledListener"/>  
	  */
	 @Override  
	 public void onEvent(ActivitiEvent event) {
		 
	  String eventType=event.getType().name();  
	 // System.out.println("typeName=" + eventType);
	  
	  if("SEQUENCEFLOW_TAKEN".equals(eventType)){
		  ActivitiSequenceFlowTakenEventImpl  flow= (ActivitiSequenceFlowTakenEventImpl) event ;
		  System.out.println("流程实例Id--"+flow.getProcessInstanceId());
		  System.out.println(flow.getId());
          // 把   流程实例id,和 flow.getId存入数据库即可
          // 这里sleep 几秒钟

	  }
	  System.out.print("");
	 }  
	  
	 @Override  
	 public boolean isFailOnException() {  
	  return false;  
	 }  
}
	<!-- Activiti begin -->
	<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
		<property name="dataSource" ref="dataSource" />
		<property name="transactionManager" ref="transactionManager" />
		<property name="deploymentResources" value="classpath*:/act/deployments/**/*.bar"/><!-- 自动部署 -->
		<property name="databaseSchemaUpdate" value="true" /><!-- 自动建表,自动更新表结构 -->
		<property name="jobExecutorActivate" value="true" /><!-- 该参数将启用定时相关的功能 -->
		<property name="history" value="full" /><!-- 历史记录保存模式 -->

		<!-- UUID作为主键生成策略 -->
		<property name="idGenerator" ref="idGen" />
		
		<!-- 生成流程图的字体 -->
		<property name="activityFontName" value="${activiti.diagram.activityFontName}"/>
		<property name="labelFontName" value="${activiti.diagram.labelFontName}"/>
		<property name="annotationFontName" value="${activiti.diagram.annotationFontName}"/><!-- 5.21.0 新增参数 -->
		
		<!-- 自定义用户权限 ,必须重新实现用户和组的相应方法-->
		<property name="customSessionFactories"> 
			<list>
				<bean class="com.thinkgem.jeesite.modules.act.service.ext.ActUserEntityServiceFactory"/>
				<bean class="com.thinkgem.jeesite.modules.act.service.ext.ActGroupEntityServiceFactory"/>
			</list>
		</property>
		
		<!-- 全局监听器  -->
        <property name="eventListeners">
	        <list>
	            <ref bean="globalEventListener"/>
	        </list>
        </property>
	</bean>
		<!--流程全局事件处理器  -->
	<bean id="globalEventListener" class="com.thinkgem.jeesite.act.GlobalEventListener">  
		<!--    <property name="handlers">   -->
		<!--   <map>   -->
		<!--    <entry key="TASK_CREATED" value="taskCreateListener"/>   -->
		<!--    <entry key="TASK_COMPLETED" value="taskCompleteListener"/>   -->
		<!--    <entry key="TASK_ASSIGNED" value="taskAssignedListener"/>   -->
		<!--    <entry key="PROCESS_COMPLETED" value="processCompleteListener"/>   -->
		<!--    <entry key="ACTIVITY_STARTED" value="activityStartedListener"/>   -->
		<!--    <entry key="ACTIVITY_COMPLETED" value="activityCompletedListener"/>   -->
		<!--    <entry key="ACTIVITY_SIGNALED" value="activitySignaledListener"/>   -->
		<!--   </map>   -->
		<!--  </property>   -->
	</bean>

 

1,  生成 flow 和   结点

/** 
	   *   查询 高亮节点和 flow
	   *
	   */
		private ObjectNode getHighLighted_CWP(String processDefinitionId,
				String processInstanceId) {
			ProcessDefinitionEntity pde = (ProcessDefinitionEntity) repositoryService.getProcessDefinition(processDefinitionId);
			List<ActivityImpl> activities = pde.getActivities();
			Map<String, ActivityImpl> activityMap = new HashMap<String, ActivityImpl>(activities.size());
			for(ActivityImpl   acti :  activities){
			   activityMap.put(  acti.getId() ,acti);
			}// 生成   流程图的所有节点的map
			
			List<HistoricActivityInstance> onDolist = historyService.createHistoricActivityInstanceQuery().processInstanceId(processInstanceId).unfinished().list();
			List<HistoricActivityInstance>  histAtcilist = historyService.createHistoricActivityInstanceQuery().processInstanceId(processInstanceId).
			orderByHistoricActivityInstanceStartTime().asc()
			.list();
			
			List<List<HistoricActivityInstance>> histActiArrayList=new ArrayList<List<HistoricActivityInstance>>(); // 存放所以得历史数据
			Map<String ,List<HistoricActivityInstance>>  maphistAct=new HashMap<String, List<HistoricActivityInstance>>();
			for(HistoricActivityInstance histActi:histAtcilist){
				String executionId = histActi.getExecutionId();
				List<HistoricActivityInstance> list = maphistAct.get(executionId);
				if(null!=list){
					list.add(histActi);// 添加元素 
				}else{// 第一次生成
					  list=new ArrayList<HistoricActivityInstance>(); // 创建实体
					  list.add(histActi);  //添加元素
					  histActiArrayList.add(list); // 添加到列表
					  maphistAct.put(executionId, list);// 添加到map
				}
			}
			/** histActiArrayList  对这个分析
			 *  第0个组, 一定是 开始事件,   flowId必定在连续的求解当中, 如果中断, 则求出唯一的路径,如果不唯一,暂时缺失留下bug待以后修复
			 *  第1个以后的组,则从唯一中选择,如果不唯一,则缺省留下bug,待以后修复
			 */
			List<String> highLightedFlows =new ArrayList<String>();
			boolean  isDuanKai=true;
			if(histActiArrayList.size()>=0){
				List<HistoricActivityInstance> list = histActiArrayList.get(0);
				for(int i=1; i<list.size();i++){
					isDuanKai=true ; // 断开
					ActivityImpl  pre = activityMap.get(list.get(i-1).getActivityId());
					ActivityImpl  current = activityMap.get(list.get(i).getActivityId());
					List<PvmTransition> incomingTransitions = current.getIncomingTransitions();
					for(PvmTransition  pvts:incomingTransitions){
						if(pvts.getSource().getId().equals(pre.getId())){ //找到了连接,没有断开
							isDuanKai=false;
							highLightedFlows.add(pvts.getId());
						}
					}//  如果找到了,就不往下走
					if(isDuanKai){  // 断开了 ,则取唯一的路径,如果多余2条,暂时不取,待后面修复
						 if(incomingTransitions.size()==1){
							 highLightedFlows.add( incomingTransitions.get(0).getId() );
						 }
					}
				}
			}// 处理第1位后数据 
			if(histActiArrayList.size()>1){//有多个执行id
				for(int i=1;i<histActiArrayList.size();i++){
					List<HistoricActivityInstance> list = histActiArrayList.get(i);
					// 这里处理 第二个以上的执行id
					ActivityImpl  acti0 = activityMap.get( list.get(0).getActivityId()); // 处里第一个元素,
					if(acti0.getIncomingTransitions().size()==1){  //唯一的路口,则
						highLightedFlows.add(acti0.getIncomingTransitions().get(0).getId());// 添加唯一
					}
					
					for(int j=1;j<list.size();j++){
						isDuanKai=true ; // 断开
						ActivityImpl  pre = activityMap.get(list.get(j-1).getActivityId());
						ActivityImpl  current = activityMap.get(list.get(j).getActivityId());
						List<PvmTransition> incomingTransitions = current.getIncomingTransitions();
						for(PvmTransition  pvts:incomingTransitions){
							if(pvts.getSource().getId().equals(pre.getId())){ //找到了连接,没有断开
								isDuanKai=false;
								highLightedFlows.add(pvts.getId());
							}
						}//  如果找到了,就不往下走
						if(isDuanKai){  // 断开了 ,则取唯一的路径,如果多余2天,暂时不取,待后面修复
							 if(incomingTransitions.size()==1){
								 highLightedFlows.add( incomingTransitions.get(0).getId() );
							 }
						}
					}
					
				}
			}
			
			// 生成数据  
			ObjectNode responseJSON = objectMapper.createObjectNode();
			ArrayNode activitiesArray = objectMapper.createArrayNode();
			ArrayNode flowsArray = objectMapper.createArrayNode();
			
			ArrayNode histactivities = objectMapper.createArrayNode();
			
			for( HistoricActivityInstance   hi:  histAtcilist){
				histactivities.add(hi.getActivityId());
			}
			
			for (HistoricActivityInstance  hi: onDolist) {  // 设置 正在执行的
				activitiesArray.add(hi.getActivityId());
			}

			for (String flow : highLightedFlows) {
				flowsArray.add(flow);
			}
			
			responseJSON.put("processInstanceId", processInstanceId);
			responseJSON.put("processDefinitionId",processDefinitionId);
			responseJSON.put("activities", activitiesArray);
			responseJSON.put("histactivities", histactivities);  // 设置 历史
			
			responseJSON.put("flows", flowsArray);
			return responseJSON;
		}

ProcessDiagramGenerator.js

	highLightActivity: function(activityId){
		var shape = this.g.getById(activityId);
		if (!shape) {
			console.error("Activity " + activityId + " not found");
			return;
		}
		
		var contextObject = shape.data("contextObject");
		if (contextObject)
			console.log("--> highLightActivity: ["+contextObject.getProperty("type")+"], activityId: " + contextObject.getId());
		else
			console.log("--> highLightActivity: ", shape, shape.data("contextObject"));
		
		shape.attr("stroke-width", THICK_TASK_BORDER_STROKE);
		shape.attr("stroke", HIGHLIGHT_COLOR);
	},
	highLightActivity_ByColor: function(activityId,COLOR){   // 设置   节点  颜色
		var shape = this.g.getById(activityId);
		if (!shape) {
			console.error("Activity " + activityId + " not found");
			return;
		}
		
		var contextObject = shape.data("contextObject");
		if (contextObject)
			console.log("--> highLightActivity: ["+contextObject.getProperty("type")+"], activityId: " + contextObject.getId());
		else
			console.log("--> highLightActivity: ", shape, shape.data("contextObject"));
		
		shape.attr("stroke-width", THICK_TASK_BORDER_STROKE);
		shape.attr("stroke", COLOR);
	},
	
	highLightFlow: function(flowId){
		var shapeFlow = this.g.getById(flowId);
		if (!shapeFlow) {
			console.error("Flow " + flowId + " not found");
			return;
		}
		
		var contextObject = shapeFlow.data("contextObject");
		if (contextObject)
			console.log("--> highLightFlow: ["+contextObject.id+"] " + contextObject.flow);
		//console.log("--> highLightFlow: ", flow.flow, flow.data("set"));
		
		var st = shapeFlow.data("set");
		
		st.attr("stroke-width", SEQUENCEFLOW_HIGHLIGHT_STROKE);
		st.attr("stroke", HIGHLIGHT_COLOR);
		var withArrowHead = shapeFlow.data("withArrowHead");
		if (withArrowHead)
			st[1].attr("fill", HIGHLIGHT_COLOR);
		
		st.forEach(function(el){
			//console.log("---->", el);
			//el.attr("")
		});
	},
	highLightFlow_ByColor: function(flowId,COLOR){  //  设置 flow 颜色
		var shapeFlow = this.g.getById(flowId);
		if (!shapeFlow) {
			console.error("Flow " + flowId + " not found");
			return;
		}
		
		var contextObject = shapeFlow.data("contextObject");
		if (contextObject)
			console.log("--> highLightFlow: ["+contextObject.id+"] " + contextObject.flow);
		//console.log("--> highLightFlow: ", flow.flow, flow.data("set"));
		
		var st = shapeFlow.data("set");
		
		st.attr("stroke-width", SEQUENCEFLOW_HIGHLIGHT_STROKE);
		st.attr("stroke", COLOR);
		var withArrowHead = shapeFlow.data("withArrowHead");
		if (withArrowHead)
			st[1].attr("fill", COLOR);
		
		st.forEach(function(el){
			//console.log("---->", el);
			//el.attr("")
		});
	},

ProcessDiagramCanvas.js 

		for (var i in highLights.histactivities) {  // 设置历史流程节点
			var activityId = highLights.histactivities[i];
			processDiagramCanvas.highLightActivity_ByColor(activityId,Color.LimeGreen); //  
		}
		
		for (var i in highLights.activities) {
			var activityId = highLights.activities[i];
			processDiagramCanvas.highLightActivity_ByColor(activityId,Color.Firebrick1);//  设置任务结点
		}
		
		//   设置  flow线高亮
		for (var i in highLights.flows) {
			var flowId = highLights.flows[i];
			var object = processDiagramCanvas.g.getById(flowId);
			var flow = object.data("contextObject");
			flow.isHighLighted = true;
			processDiagramCanvas.highLightFlow_ByColor(flowId,Color.LimeGreen);
		}

index.html

  ActivitiRest.options = {
	processInstanceHighLightsUrl: baseUrl + "/act/service/process-instance/{processInstanceId}/highlights?processDefinitionId="+processDefinitionId+"&callback=?",
    processDefinitionUrl: baseUrl + "/act/service/process-definition/{processDefinitionId}/diagram-layout?callback=?",
    processDefinitionByKeyUrl: baseUrl + "/act/service/process-definition/{processDefinitionKey}/diagram-layout?callback=?",
    processInstanceUrl: baseUrl + "/act/service/process-instance/{processInstanceId}/diagram-layout?callback=?"
  };

 

转载于:https://my.oschina.net/u/1760858/blog/871770

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值