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 和 结点javascript
/** * 查询 高亮节点和 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.jshtml
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 java
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.htmlspring
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=?" };