热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

activiti拿取当前任务的下一个节点

在实际的工作流业务开发中,当用户完成当前用户任务时,需要指定下一个用户任务的审核人。此时我们需要获取下一个节点的一些信息,来确定下一个用户任务的审核人有哪些。在实际工

  在实际的工作流业务开发中, 当用户完成当前用户任务时, 需要指定下一个用户任务的审核人。此时我们需要获取下一个节点的一些信息, 来确定下一个用户任务的审核人有哪些。

      

      在实际工作流程中, 当前用户任务后的节点可能为用户任务, 也可能为网关。如果下一个节点为网关我们需要判断流程线路。

 

      

Java代码  收藏代码
  1. /** 
  2.      * 获取下一个用户任务用户组信息  
  3.      * @param String taskId     任务Id信息  
  4.      * @return  下一个用户任务用户组信息  
  5.      * @throws Exception 
  6.      */  
  7.     public Set getNextTaskGroup(String taskId) throws Exception {  
  8.           
  9.         ProcessDefinitionEntity processDefinitionEntity = null;  
  10.           
  11.         String id = null;  
  12.           
  13.         TaskDefinition task = null;  
  14.           
  15.         //获取流程实例Id信息   
  16.         String processInstanceId = taskService.createTaskQuery().taskId(taskId).singleResult().getProcessInstanceId();  
  17.           
  18.         //获取流程发布Id信息   
  19.         String definitionId = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult().getProcessDefinitionId();  
  20.           
  21.         processDefinitionEntity = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService)  
  22.                 .getDeployedProcessDefinition(definitionId);  
  23.           
  24.         ExecutionEntity execution = (ExecutionEntity) runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();  
  25.           
  26.         //当前流程节点Id信息   
  27.         String activitiId = execution.getActivityId();    
  28.           
  29.         //获取流程所有节点信息   
  30.         List activitiList = processDefinitionEntity.getActivities();   
  31.           
  32.         //遍历所有节点信息   
  33.         for(ActivityImpl activityImpl : activitiList){      
  34.             id = activityImpl.getId();     
  35.               
  36.             // 找到当前节点信息  
  37.             if (activitiId.equals(id)) {  
  38.                   
  39.                 //获取下一个节点信息   
  40.                 task = nextTaskDefinition(activityImpl, activityImpl.getId(), null, processInstanceId);  
  41.   
  42.                 break;  
  43.             }  
  44.         }  
  45.           
  46.         return task.getCandidateGroupIdExpressions();  
  47.     }  
  48.       
  49.     /**  
  50.      * 下一个任务节点信息,  
  51.      *  
  52.      * 如果下一个节点为用户任务则直接返回,  
  53.      *  
  54.      * 如果下一个节点为排他网关, 获取排他网关Id信息, 根据排他网关Id信息和execution获取流程实例排他网关Id为key的变量值,  
  55.      * 根据变量值分别执行排他网关后线路中的el表达式, 并找到el表达式通过的线路后的用户任务信息  
  56.      * @param ActivityImpl activityImpl     流程节点信息  
  57.      * @param String activityId             当前流程节点Id信息  
  58.      * @param String elString               排他网关顺序流线段判断条件, 例如排他网关顺序留线段判断条件为${money>1000}, 若满足流程启动时设置variables中的money>1000, 则流程流向该顺序流信息  
  59.      * @param String processInstanceId      流程实例Id信息  
  60.      * @return  
  61.      */    
  62.     private TaskDefinition nextTaskDefinition(ActivityImpl activityImpl, String activityId, String elString, String processInstanceId){   
  63.               
  64.         PvmActivity ac = null;  
  65.           
  66.         Object s = null;  
  67.           
  68.         //如果遍历节点为用户任务并且节点不是当前节点信息   
  69.             if("userTask".equals(activityImpl.getProperty("type")) && !activityId.equals(activityImpl.getId())){    
  70.                 //获取该节点下一个节点信息   
  71.                 TaskDefinition taskDefinition = ((UserTaskActivityBehavior)activityImpl.getActivityBehavior()).getTaskDefinition();    
  72.                 return taskDefinition;    
  73.             }else{    
  74.                 //获取节点所有流向线路信息   
  75.                 List outTransitions = activityImpl.getOutgoingTransitions();    
  76.                 List outTransitionsTemp = null;    
  77.                 for(PvmTransition tr : outTransitions){      
  78.                     ac = tr.getDestination(); //获取线路的终点节点      
  79.                     //如果流向线路为排他网关   
  80.                     if("exclusiveGateway".equals(ac.getProperty("type"))){    
  81.                         outTransitionsTemp = ac.getOutgoingTransitions();  
  82.                           
  83.                         //如果网关路线判断条件为空信息   
  84.                         if(StrUtils.isEmpty(elString)) {  
  85.                             //获取流程启动时设置的网关判断条件信息   
  86.                             elString = getGatewayCondition(ac.getId(), processInstanceId);  
  87.                         }  
  88.                           
  89.                         //如果排他网关只有一条线路信息   
  90.                         if(outTransitionsTemp.size() == 1){    
  91.                             return nextTaskDefinition((ActivityImpl)outTransitionsTemp.get(0).getDestination(), activityId, elString, processInstanceId);    
  92.                         }else if(outTransitionsTemp.size() > 1){  //如果排他网关有多条线路信息   
  93.                             for(PvmTransition tr1 : outTransitionsTemp){    
  94.                                 s = tr1.getProperty("conditionText");  //获取排他网关线路判断条件信息   
  95.                                 //判断el表达式是否成立   
  96.                                 if(isCondition(ac.getId(), StrUtils.trim(s.toString()), elString)){    
  97.                                     return nextTaskDefinition((ActivityImpl)tr1.getDestination(), activityId, elString, processInstanceId);    
  98.                                 }    
  99.                             }    
  100.                         }    
  101.                     }else if("userTask".equals(ac.getProperty("type"))){    
  102.                         return ((UserTaskActivityBehavior)((ActivityImpl)ac).getActivityBehavior()).getTaskDefinition();    
  103.                     }else{    
  104.                     }    
  105.                 }     
  106.             return null;    
  107.         }    
  108.     }  
  109.       
  110.     /** 
  111.      * 查询流程启动时设置排他网关判断条件信息  
  112.      * @param String gatewayId          排他网关Id信息, 流程启动时设置网关路线判断条件key为网关Id信息  
  113.      * @param String processInstanceId  流程实例Id信息  
  114.      * @return 
  115.      */  
  116.     public String getGatewayCondition(String gatewayId, String processInstanceId) {  
  117.         Execution execution = runtimeService.createExecutionQuery().processInstanceId(processInstanceId).singleResult();  
  118.         return runtimeService.getVariable(execution.getId(), gatewayId).toString();  
  119.     }  
  120.       
  121.     /** 
  122.      * 根据key和value判断el表达式是否通过信息  
  123.      * @param String key    el表达式key信息  
  124.      * @param String el     el表达式信息  
  125.      * @param String value  el表达式传入值信息  
  126.      * @return 
  127.      */  
  128.     public boolean isCondition(String key, String el, String value) {  
  129.         ExpressionFactory factory = new ExpressionFactoryImpl();    
  130.         SimpleContext context = new SimpleContext();    
  131.         context.setVariable(key, factory.createValueExpression(value, String.class));    
  132.         ValueExpression e = factory.createValueExpression(context, el, boolean.class);    
  133.         return (Boolean) e.getValue(context);  
  134.     }  

推荐阅读
  • 本文将探讨从ASP.NET 1.1到2.0期间编译系统的重要变革。通过对比两个版本的即时编译模型,我们将揭示2.0版本中引入的新特性和改进之处。 ... [详细]
  • Java 架构:深入理解 JDK 动态代理机制
    代理模式是 Java 中常用的设计模式之一,其核心在于代理类与委托类共享相同的接口。代理类主要用于为委托类提供预处理、过滤、转发及后处理等功能,以增强或改变原有功能的行为。 ... [详细]
  • 前文|功能型_品读鸿蒙HDF架构
    前文|功能型_品读鸿蒙HDF架构 ... [详细]
  • 本文提供了在 Kali Linux 2020.01 x64 版本上安装 Docker 的详细步骤,包括环境准备、使用清华大学镜像源、配置 APT 仓库以及安装过程中的常见问题处理。 ... [详细]
  • 深入解析Android中的SQLite数据库使用
    本文详细介绍了如何在Android应用中使用SQLite数据库进行数据存储。通过自定义类继承SQLiteOpenHelper,实现数据库的创建与版本管理,并提供了具体的学生信息管理示例代码。 ... [详细]
  • 本文探讨如何利用Java反射技术来模拟Webwork框架中的URL解析过程。通过这一实践,读者可以更好地理解Webwork及其后续版本Struts2的工作原理,尤其是它们在MVC架构下的角色。 ... [详细]
  • 本文探讨了一个特定于 Spring 4.2.5 的问题,即在应用上下文刷新事件(ContextRefreshedEvent)触发时,带有 @Transactional 注解的 Bean 未能正确代理事务。该问题在 Spring 4.1.9 版本中正常运行,但在升级至 4.2.5 后出现异常。 ... [详细]
  • 本文详细介绍了如何在现有的Android Studio项目中集成JNI(Java Native Interface),包括下载必要的NDK和构建工具,配置CMakeLists.txt文件,以及编写和调用JNI函数的具体步骤。 ... [详细]
  • 当面临数据库清理任务时,若无删除或重建数据库的权限,可以通过编写SQL脚本来实现批量删除用户自定义的数据表和存储过程。本文将详细介绍如何构造这样的SQL脚本。 ... [详细]
  • 本文针对Android 6.0平台的输入子系统进行了详细探讨,特别关注了智能电视开发中常见的KeyEvent事件处理机制。通过分析InputManagerService的启动过程、应用程序如何注册键盘消息监听、InputReader读取键盘消息的方式、InputDispatcher分发键盘消息的过程以及Java层的键盘消息分发机制,为开发者提供了一个全面的视角。 ... [详细]
  • 本文介绍了在Android项目中实现时间轴效果的方法,通过自定义ListView的Item布局和适配器逻辑,实现了动态显示和隐藏时间标签的功能。文中详细描述了布局文件、适配器代码以及时间格式化工具类的具体实现。 ... [详细]
  • 任务,栈, ... [详细]
  • MainActivityimportandroid.app.Activity;importandroid.os.Bundle;importandroid.os.Handler;im ... [详细]
  • 本文探讨了随着并发需求的增长,MySQL数据库架构如何从简单的单一实例发展到复杂的分布式系统,以及每一步演进背后的原理和技术解决方案。 ... [详细]
  • 本文介绍如何创建一个专门用于处理浮点数的JSON处理器,并将其注册到JSON配置器中,以实现对浮点数的精确控制和格式化输出。 ... [详细]
author-avatar
mobiledu2502897083
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有