日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

怎么获取排他网关下的所有userTask?

發(fā)布時間:2024/10/8 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 怎么获取排他网关下的所有userTask? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前面文正有寫過根據(jù)當(dāng)前節(jié)點(diǎn)獲取下一個UseTask節(jié)點(diǎn),有需要了解的可以去看這篇博客根據(jù)當(dāng)前節(jié)點(diǎn)獲取下一個UseTask節(jié)點(diǎn),,但是現(xiàn)在需求又發(fā)生了該表,如果在一個節(jié)點(diǎn)下需要獲取排他網(wǎng)關(guān)下所有的userTask怎么辦?
這里還需要將需求分成兩種
1、排他網(wǎng)關(guān)后面只有userTask,如下圖所示

這種情況,當(dāng)?shù)竭_(dá)財(cái)務(wù)審批時,需要財(cái)務(wù)選擇需要通過財(cái)務(wù)總監(jiān)還是直接到發(fā)貨,由于財(cái)務(wù)后面的排他網(wǎng)關(guān)后面直接跟著兩個userTask,這時要獲取排他網(wǎng)關(guān)后面的userTask可以通過下面的代碼實(shí)現(xiàn)。

/*** 獲取排他網(wǎng)關(guān)的所有下一個UserTask* * @param activityImpl* @param processInstanceId* @return*/public Map<String, CandidateTaskInfo> getGateWayNextTaskInfo(String processInstanceId) {ProcessDefinitionEntity processDefinitionEntity = null;String id = null;// 獲取流程發(fā)布Id信息String definitionId = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult().getProcessDefinitionId();processDefinitionEntity = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService).getDeployedProcessDefinition(definitionId);ExecutionEntity execution = (ExecutionEntity) runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();// 當(dāng)前流程節(jié)點(diǎn)Id信息String activitiId = execution.getActivityId();// 獲取流程所有節(jié)點(diǎn)信息List<ActivityImpl> activitiList = processDefinitionEntity.getActivities();Map<String, CandidateTaskInfo> map = null;// 遍歷所有節(jié)點(diǎn)信息for (ActivityImpl activityImpl : activitiList) {id = activityImpl.getId();if (activitiId.equals(id)) {map = getGateWay(activityImpl);break;}}return map;}/*** 獲取排他網(wǎng)關(guān)的所有分支信息* @param activityImpl* @return*/public Map<String, CandidateTaskInfo> getGateWay(ActivityImpl activityImpl) {Map<String, CandidateTaskInfo> maps = new HashMap<String, CandidateTaskInfo>();// 獲取節(jié)點(diǎn)所有流向線路信息List<PvmTransition> outTransitions = activityImpl.getOutgoingTransitions();List<PvmTransition> outTransitionsTemp = null;for (PvmTransition tr : outTransitions) {PvmActivity ac = tr.getDestination(); // 獲取線路的終點(diǎn)節(jié)點(diǎn)// 如果流向線路為排他網(wǎng)關(guān)if ("exclusiveGateway".equals(ac.getProperty("type"))) {outTransitionsTemp = ac.getOutgoingTransitions();// 如果排他網(wǎng)關(guān)只有一條線路信息if (outTransitionsTemp.size() == 1) {String s = (String) outTransitions.get(0).getProperty("conditionText");String name = (String) outTransitions.get(0).getDestination().getProperty("name");String taskId = (String) outTransitions.get(0).getDestination().getId();maps.put(s, new CandidateTaskInfo(name, taskId));} else if (outTransitionsTemp.size() > 1) { // 如果排他網(wǎng)關(guān)有多條線路信息for (PvmTransition tr1 : outTransitionsTemp) {String s = (String)tr1.getProperty("conditionText");String name = (String) tr1.getDestination().getProperty("name");String taskId = (String) tr1.getDestination().getId();String str = s.split("==")[1];if(StringUtils.contains(str, "\'")||StringUtils.contains(str, "\"")) {// =='xxxx'或者=="xxxx"maps.put(str.substring(1, str.length()-2), new CandidateTaskInfo(name, taskId));}else {// == true or falsemaps.put(str.substring(0, str.length()-1), new CandidateTaskInfo(name, taskId));}}}}}return maps;}

第一種情形使用這種方法可以解決。
2、排他網(wǎng)關(guān)除了userTask還有排他網(wǎng)關(guān),怎么正確獲取當(dāng)前節(jié)點(diǎn)后面的userTask?如下圖所示:

這種情形就需要在方案一的條件下進(jìn)行修改,當(dāng)遇到排他網(wǎng)關(guān)是,在獲取排他網(wǎng)關(guān)下一個userTask,參考前面的博文。
代碼:

/*** 下一個任務(wù)節(jié)點(diǎn)信息,* * 如果下一個節(jié)點(diǎn)為用戶任務(wù)則直接返回,* * 如果下一個節(jié)點(diǎn)為排他網(wǎng)關(guān), 獲取排他網(wǎng)關(guān)Id信息, 根據(jù)排他網(wǎng)關(guān)Id信息和execution獲取流程實(shí)例排他網(wǎng)關(guān)Id為key的變量值,* 根據(jù)變量值分別執(zhí)行排他網(wǎng)關(guān)后線路中的el表達(dá)式, 并找到el表達(dá)式通過的線路后的用戶任務(wù)* * @param ActivityImpl* activityImpl 流程節(jié)點(diǎn)信息* @param String* activityId 當(dāng)前流程節(jié)點(diǎn)Id信息* @param String* elString 排他網(wǎng)關(guān)順序流線段判斷條件* @param String* processInstanceId 流程實(shí)例Id信息* @return*/public TaskDefinition nextTaskDefinition(ActivityImpl activityImpl, String activityId, String elString,String processInstanceId) {PvmActivity ac = null;Object s = null;// 如果遍歷節(jié)點(diǎn)為用戶任務(wù)并且節(jié)點(diǎn)不是當(dāng)前節(jié)點(diǎn)信息if ("userTask".equals(activityImpl.getProperty("type")) && !activityId.equals(activityImpl.getId())) {// 獲取該節(jié)點(diǎn)下一個節(jié)點(diǎn)信息TaskDefinition taskDefinition = ((UserTaskActivityBehavior) activityImpl.getActivityBehavior()).getTaskDefinition();return taskDefinition;} else if ("exclusiveGateway".equals(activityImpl.getProperty("type"))) {// 當(dāng)前節(jié)點(diǎn)為exclusiveGatewayList<PvmTransition> outTransitions = activityImpl.getOutgoingTransitions();// 獲取流程啟動時設(shè)置的網(wǎng)關(guān)判斷條件信息elString = getGatewayCondition(activityImpl.getId(), processInstanceId);// 如果排他網(wǎng)關(guān)只有一條線路信息if (outTransitions.size() == 1) {return nextTaskDefinition((ActivityImpl) outTransitions.get(0).getDestination(), activityId, elString,processInstanceId);} else if (outTransitions.size() > 1) { // 如果排他網(wǎng)關(guān)有多條線路信息for (PvmTransition tr1 : outTransitions) {s = tr1.getProperty("conditionText"); // 獲取排他網(wǎng)關(guān)線路判斷條件信息// 判斷el表達(dá)式是否成立if (isCondition(activityImpl.getId(), StringUtils.trim(s.toString()), elString)) {return nextTaskDefinition((ActivityImpl) tr1.getDestination(), activityId, elString,processInstanceId);}}}} else {// 獲取節(jié)點(diǎn)所有流向線路信息List<PvmTransition> outTransitions = activityImpl.getOutgoingTransitions();List<PvmTransition> outTransitionsTemp = null;for (PvmTransition tr : outTransitions) {ac = tr.getDestination(); // 獲取線路的終點(diǎn)節(jié)點(diǎn)// 如果流向線路為排他網(wǎng)關(guān)if ("exclusiveGateway".equals(ac.getProperty("type"))) {outTransitionsTemp = ac.getOutgoingTransitions();// 如果網(wǎng)關(guān)路線判斷條件為空信息if (StringUtils.isEmpty(elString)) {// 獲取流程啟動時設(shè)置的網(wǎng)關(guān)判斷條件信息elString = getGatewayCondition(ac.getId(), processInstanceId);}// 如果排他網(wǎng)關(guān)只有一條線路信息if (outTransitionsTemp.size() == 1) {return nextTaskDefinition((ActivityImpl) outTransitionsTemp.get(0).getDestination(), activityId,elString, processInstanceId);} else if (outTransitionsTemp.size() > 1) { // 如果排他網(wǎng)關(guān)有多條線路信息for (PvmTransition tr1 : outTransitionsTemp) {s = tr1.getProperty("conditionText"); // 獲取排他網(wǎng)關(guān)線路判斷條件信息// 判斷el表達(dá)式是否成立if (isCondition(ac.getId(), StringUtils.trim(s.toString()), elString)) {return nextTaskDefinition((ActivityImpl) tr1.getDestination(), activityId, elString,processInstanceId);}}}} else if ("userTask".equals(ac.getProperty("type"))) {try {return ((UserTaskActivityBehavior) ((ActivityImpl) ac).getActivityBehavior()).getTaskDefinition();} catch (Exception e) {return null;}} else {}}return null;}return null;}/*** 查詢流程啟動時設(shè)置排他網(wǎng)關(guān)判斷條件信息* * @param String* gatewayId 排他網(wǎng)關(guān)Id信息, 流程啟動時設(shè)置網(wǎng)關(guān)路線判斷條件key為網(wǎng)關(guān)Id信息* @param String* processInstanceId 流程實(shí)例Id信息* @return*/public String getGatewayCondition(String gatewayId, String processInstanceId) {Execution execution = runtimeService.createExecutionQuery().processInstanceId(processInstanceId).singleResult();Object object = runtimeService.getVariable(execution.getId(), gatewayId);return object == null ? "" : object.toString();}/*** 根據(jù)key和value判斷el表達(dá)式是否通過信息* * @param String* key el表達(dá)式key信息* @param String* el el表達(dá)式信息* @param String* value el表達(dá)式傳入值信息* @return*/public boolean isCondition(String key, String el, String value) {ExpressionFactory factory = new ExpressionFactoryImpl();SimpleContext context = new SimpleContext();context.setVariable(key, factory.createValueExpression(value, String.class));ValueExpression e = factory.createValueExpression(context, el, boolean.class);return (Boolean) e.getValue(context);}/*** 獲取排他網(wǎng)關(guān)的所有下一個UserTask* * @param activityImpl* @param processInstanceId* @return*/public Map<String, CandidateTaskInfo> getGateWayNextTaskInfo(String processInstanceId) {ProcessDefinitionEntity processDefinitionEntity = null;String id = null;// 獲取流程發(fā)布Id信息String definitionId = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult().getProcessDefinitionId();processDefinitionEntity = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService).getDeployedProcessDefinition(definitionId);ExecutionEntity execution = (ExecutionEntity) runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();// 當(dāng)前流程節(jié)點(diǎn)Id信息String activitiId = execution.getActivityId();// 獲取流程所有節(jié)點(diǎn)信息List<ActivityImpl> activitiList = processDefinitionEntity.getActivities();Map<String, CandidateTaskInfo> map = null;// 遍歷所有節(jié)點(diǎn)信息for (ActivityImpl activityImpl : activitiList) {id = activityImpl.getId();if (activitiId.equals(id)) {map = getGateWay(activityImpl,processInstanceId, activitiId);break;}}return map;}/*** 獲取排他網(wǎng)關(guān)的所有分支信息* @param activityImpl* @return*/public Map<String, CandidateTaskInfo> getGateWay(ActivityImpl activityImpl,String processInstanceId,String activityId) {Map<String, CandidateTaskInfo> maps = new HashMap<String, CandidateTaskInfo>();// 獲取節(jié)點(diǎn)所有流向線路信息List<PvmTransition> outTransitions = activityImpl.getOutgoingTransitions();List<PvmTransition> outTransitionsTemp = null;for (PvmTransition tr : outTransitions) {PvmActivity ac = tr.getDestination(); // 獲取線路的終點(diǎn)節(jié)點(diǎn)// 如果流向線路為排他網(wǎng)關(guān)if ("exclusiveGateway".equals(ac.getProperty("type"))) {outTransitionsTemp = ac.getOutgoingTransitions();// 如果排他網(wǎng)關(guān)只有一條線路信息if (outTransitionsTemp.size() == 1) {String s = (String) outTransitions.get(0).getProperty("conditionText");String name = (String) outTransitions.get(0).getDestination().getProperty("name");String taskId = (String) outTransitions.get(0).getDestination().getId();maps.put(s, new CandidateTaskInfo(name, taskId));} else if (outTransitionsTemp.size() > 1) { // 如果排他網(wǎng)關(guān)有多條線路信息for (PvmTransition tr1 : outTransitionsTemp) {String s = (String)tr1.getProperty("conditionText");String str = s.split("==")[1];String name = (String) tr1.getDestination().getProperty("name");String taskId = (String) tr1.getDestination().getId();// 下一個還是排他網(wǎng)關(guān)if("exclusiveGateway".equals(tr1.getDestination().getProperty("type"))){// 獲取下一個UserTaskactivityId = ((ActivityImpl) tr1.getDestination()).getId();TaskDefinition taskDefinition = nextTaskDefinition((ActivityImpl) tr1.getDestination(), activityId, s, processInstanceId);if(null != taskDefinition){name = taskDefinition.getNameExpression().getExpressionText();taskId = taskDefinition.getKey();}else {// 流程后面不存在UserTask節(jié)點(diǎn)了name="結(jié)束";taskId=ActivityUtil.getEndActivitiId(processInstanceId);}}// 這里處理的是el表達(dá)式為=='xxxx'或者=="xxxx",也可以繼續(xù)擴(kuò)展其他方式if(StringUtils.contains(str, "\'")||StringUtils.contains(str, "\"")) {// maps.put(str.substring(1, str.length()-2), new CandidateTaskInfo(name, taskId));}else {// == true or falsemaps.put(str.substring(0, str.length()-1), new CandidateTaskInfo(name, taskId));}}}}}return maps;}

雖然方案一可以解決一部分問題,但是還是推薦使用方案二。

總結(jié)

以上是生活随笔為你收集整理的怎么获取排他网关下的所有userTask?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。