As we transition to the new Hyland Community, some post links may be temporarily disrupted as we finalize redirects. We apologize for the inconvenience and are working to resolve this as quickly as possible. Details.
<br> /**<br> * 新版本的getHighLightedFlows方法<br> * <br> * @param processDefinition<br> * @param processInstanceId<br> * @return<br> */<br> private List<String> getHighLightedFlows(ProcessDefinitionEntity processDefinition, String processInstanceId) {<br> <br> List<String> highLightedFlows = new ArrayList<String>();<br> <br> List<HistoricActivityInstance> historicActivityInstances = historyService.createHistoricActivityInstanceQuery()<br> .processInstanceId(processInstanceId)<br> //用开始时间升序不准确,直接默认按id升序排是准确的<br> //.orderByHistoricActivityInstanceStartTime().asc()/*.orderByActivityId().asc()*/<br> .list();<br> <br> LinkedList<HistoricActivityInstance> hisActInstList = new LinkedList<HistoricActivityInstance>();<br> hisActInstList.addAll(historicActivityInstances);<br> <br> getHighlightedFlows(processDefinition.getActivities(), hisActInstList, highLightedFlows);<br> <br> return highLightedFlows;<br> }<br> <br> /**<br> * getHighlightedFlows<br> * <br> * <br> * @param activityList<br> * @param hisActInstList<br> * @param highLightedFlows<br> */<br> private void getHighlightedFlows(List<ActivityImpl> activityList, LinkedList<HistoricActivityInstance> hisActInstList, List<String> highLightedFlows){<br> <br> //Activity定义中的startEvent活动<br> List<ActivityImpl> startEventActList = new ArrayList<ActivityImpl>();<br> Map<String, ActivityImpl> activityMap = new HashMap<String, ActivityImpl>(activityList.size());<br> for(ActivityImpl activity : activityList){<br> <br> activityMap.put(activity.getId(), activity);<br> <br> String actType = (String)activity.getProperty("type");<br> if(actType!=null && actType.toLowerCase().indexOf("startevent")>=0){<br> startEventActList.add(activity);<br> }<br> }<br> <br> //检查第一个节点是否是startEvent(如果流程是由别的callActivity节启动的则没有startEvent),<br> //如果不是startEvent节点则要找出startEvent的高亮flow<br> HistoricActivityInstance firstHistActInst = hisActInstList.getFirst();<br> String firstActType = (String)firstHistActInst.getActivityType();<br> if(firstActType!=null && firstActType.toLowerCase().indexOf("startevent")<0){<br> PvmTransition startTrans = getStartTransaction(startEventActList, firstHistActInst);<br> if(startTrans!=null){<br> highLightedFlows.add(startTrans.getId());<br> }<br> }<br> <br> while(hisActInstList.size()>0){<br> HistoricActivityInstance histActInst = hisActInstList.removeFirst();<br> ActivityImpl activity = activityMap.get(histActInst.getActivityId());<br> <br> boolean isParallel = false;<br> String type = histActInst.getActivityType();<br> if("parallelGateway".equals(type) || "inclusiveGateway".equals(type)){<br> isParallel = true;<br> }<br> else if("subProcess".equals(histActInst.getActivityType())){<br> getHighlightedFlows(activity.getActivities(), hisActInstList, highLightedFlows);<br> }<br> <br> List<PvmTransition> outgoingTrans = new ArrayList<PvmTransition>();<br> outgoingTrans.addAll(activity.getOutgoingTransitions());<br> outgoingTrans.addAll(getBoundaryEventOutgoingTransitions(activity));<br> <br> List<String> activityHighLightedFlowIds = getHighlightedFlows(outgoingTrans, hisActInstList, isParallel);<br> <br> highLightedFlows.addAll(activityHighLightedFlowIds);<br> }<br> <br> }<br> <br> /**<br> * 查找startEventActList列表中,谁的outgoing flow连接的是firstActInst<br> * @param startEventActList<br> * @param firstActInst<br> * @return<br> */<br> private PvmTransition getStartTransaction(List<ActivityImpl> startEventActList, HistoricActivityInstance firstActInst){<br> for(ActivityImpl startEventAct: startEventActList){<br> for(PvmTransition trans : startEventAct.getOutgoingTransitions()){<br> if(trans.getDestination().getId().equals(firstActInst.getActivityId())){<br> return trans;<br> }<br> }<br> }<br> return null;<br> }<br> <br> /**<br> * <br> * @param activity<br> * @return<br> */<br> private List<PvmTransition> getBoundaryEventOutgoingTransitions(ActivityImpl activity){<br> List<PvmTransition> boundaryTrans = new ArrayList<PvmTransition>();<br> for(ActivityImpl subActivity : activity.getActivities()){<br> String type = (String)subActivity.getProperty("type");<br> if(type!=null && type.toLowerCase().indexOf("boundary")>=0){<br> boundaryTrans.addAll(subActivity.getOutgoingTransitions());<br> }<br> }<br> return boundaryTrans;<br> }<br> <br> /**<br> * 获取单个activity的高亮flow<br> * <br> * @param activity<br> * @param hisActInstList<br> * @param isExclusive 是否只有单一的outgoing(比如说exclusiveGateway, Task上的BoundaryEvent)<br> * @return<br> */<br> private List<String> getHighlightedFlows(List<PvmTransition> pvmTransitionList, LinkedList<HistoricActivityInstance> hisActInstList, boolean isParallel){<br> <br> List<String> highLightedFlowIds = new ArrayList<String>();<br> <br> PvmTransition earliestTrans = null;<br> HistoricActivityInstance earliestHisActInst = null;<br> <br> for (PvmTransition pvmTransition : pvmTransitionList) {<br> <br> String destActId = pvmTransition.getDestination().getId();<br> HistoricActivityInstance destHisActInst = findHisActInst(hisActInstList, destActId);<br> if(destHisActInst!=null){<br> <br> if(isParallel){<br> highLightedFlowIds.add(pvmTransition.getId());<br> }<br> else{<br> if(earliestHisActInst==null || (earliestHisActInst.getId().compareTo(destHisActInst.getId())>0)){//用开始时间比较不准确,直接默认按id比较是准确的<br> earliestTrans = pvmTransition;<br> earliestHisActInst = destHisActInst;<br> }<br> }<br> }<br> }<br> <br> if((!isParallel) && earliestTrans!=null){<br> highLightedFlowIds.add(earliestTrans.getId());<br> }<br> <br> return highLightedFlowIds;<br> }<br> <br> private HistoricActivityInstance findHisActInst(LinkedList<HistoricActivityInstance> hisActInstList, String actId){<br> for(HistoricActivityInstance hisActInst : hisActInstList){<br> if(hisActInst.getActivityId().equals(actId)){<br> return hisActInst;<br> }<br> }<br> return null;<br> }<br>