`
CHEEN
  • 浏览: 134505 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

工作流引擎activiti 获取下一节点

阅读更多
最近公司需要使用工作流引擎,选用了activiti。需求中提到的流程比较简单,也就3级审核,送审时需要选择下一节点的用户,所以必须在流程中需要获取当前节点的下一个节点。代码如下:
      
/**
	 * 根据实例编号查找下一个任务节点
	 * @param String procInstId :实例编号
	 * @return
	 */
	public TaskDefinition nextTaskDefinition(String procInstId){
		//流程标示
		String processDefinitionId = historyService.createHistoricProcessInstanceQuery().processInstanceId(procInstId).singleResult().getProcessDefinitionId();
		
		ProcessDefinitionEntity def = (ProcessDefinitionEntity) ((RepositoryServiceImpl)repositoryService).getDeployedProcessDefinition(processDefinitionId);
		//执行实例
		ExecutionEntity execution = (ExecutionEntity) runtimeService.createProcessInstanceQuery().processInstanceId(procInstId).singleResult();
		//当前实例的执行到哪个节点
		String activitiId = execution.getActivityId();
		//获得当前任务的所有节点
		List<ActivityImpl> activitiList = def.getActivities();
		String id = null;
		for(ActivityImpl activityImpl:activitiList){  
			id = activityImpl.getId(); 
			if(activitiId.equals(id)){
				System.out.println("当前任务:"+activityImpl.getProperty("name"));
				return nextTaskDefinition(activityImpl, activityImpl.getId(),"${iscorrect==1}");
//				System.out.println(taskDefinition.getCandidateGroupIdExpressions().toArray()[0]);
//				return taskDefinition;
			}
		}
		return null;
	}
	
	/**
	 * 下一个任务节点
	 * @param activityImpl
	 * @param activityId
	 * @param elString
	 * @return
	 */
	private TaskDefinition nextTaskDefinition(ActivityImpl activityImpl, String activityId, String elString){
			if("userTask".equals(activityImpl.getProperty("type")) && !activityId.equals(activityImpl.getId())){
				TaskDefinition taskDefinition = ((UserTaskActivityBehavior)activityImpl.getActivityBehavior()).getTaskDefinition();
//				taskDefinition.getCandidateGroupIdExpressions().toArray();
				return taskDefinition;
			}else{
				List<PvmTransition> outTransitions = activityImpl.getOutgoingTransitions();
				List<PvmTransition> outTransitionsTemp = null;
				for(PvmTransition tr:outTransitions){  
					PvmActivity ac = tr.getDestination(); //获取线路的终点节点  
					if("exclusiveGateway".equals(ac.getProperty("type"))){
						outTransitionsTemp = ac.getOutgoingTransitions();
						if(outTransitionsTemp.size() == 1){
							return nextTaskDefinition((ActivityImpl)outTransitionsTemp.get(0).getDestination(), activityId, elString);
						}else if(outTransitionsTemp.size() > 1){
							for(PvmTransition tr1 : outTransitionsTemp){
								Object s = tr1.getProperty("conditionText");
								if(elString.equals(StrUtils.trim(s.toString()))){
									return nextTaskDefinition((ActivityImpl)tr1.getDestination(), activityId, elString);
								}
							}
						}
					}else if("userTask".equals(ac.getProperty("type"))){
						return ((UserTaskActivityBehavior)((ActivityImpl)ac).getActivityBehavior()).getTaskDefinition();
					}else{
						logger.debug(ac.getProperty("type"));
					}
				} 
			return null;
		}
	}

思路是通过实例ID获取当前节点,然后查找当前节点后后面所有的活动,主要查找的活动是exclusiveGateway和userTask,如果exclusiveGateway中的条件符合${iscorrect==1}就直接查找exclusiveGateway后的活动,直到找到userTask为止。如果当前节点后的活动是userTask,说明这个userTask就是你想要的。


代码中${iscorrect==1}表达式是流程中定义,表示审核通过。当时对于在java中解析表达式遇到困难,所以使用字符串来比较,代码
if(elString.equals(StrUtils.trim(s.toString())))
就是用于判断表达式。后来发现可以通说juel来解析,以下是解析的代码:
ExpressionFactory factory = new ExpressionFactoryImpl();
		SimpleContext context = new SimpleContext();
		context.setVariable("count", factory.createValueExpression(10000, String.class));
		ValueExpression e = factory.createValueExpression(context, "${count>=1000}", boolean.class);
		System.out.println(e.getValue(context));
分享到:
评论
5 楼 di1984HIT 2016-08-31  
学习了,学习了~
4 楼 wang_kejian 2016-04-27  
其实可以用迭代循环去做
3 楼 wang_kejian 2016-04-27  
其实你只是针对网关进行了判断,没有针对子流程进行判断,如果存在子流程 你要从上一个USERTASK 找到子流程中的USERTASK
2 楼 CHEEN 2013-04-15  
jackyrong 写道
HI,想请教下,比如在bpmn表达式子中已经设置了某个结点usertask的candidategroup,
或candidatuser为${bumen}这样,要为某个审批结点的这个角色,在运行的时候动态增加这个角色下的用户的话,那么要如何实现呢?


可以使用ACTIVITI的组,首先查询下一节点的groupId,然后可以查询组里面的用户。
1 楼 jackyrong 2012-11-15  
HI,想请教下,比如在bpmn表达式子中已经设置了某个结点usertask的candidategroup,
或candidatuser为${bumen}这样,要为某个审批结点的这个角色,在运行的时候动态增加这个角色下的用户的话,那么要如何实现呢?

相关推荐

    activiti工作流动态表单,外置表单,普通表单demo

    activiti三种表单的demo实现 运行方式: 1,修改连接的数据库 2,sql文件在resources\sql下 3,访问地址http://localhost:8080/activiti-demo/main/index

    Activiti6.0教程例子下载

    Activiti是一个开源的工作流引擎,它实现了BPMN 2.0规范,可以发布设计好的流程定义,并通过api进行流程调度。 Activiti 作为一个遵从 Apache 许可的工作流和业务流程管理开源平台,其核心是基于 Java 的超快速、超...

    Activiti工作流笔记.chm

    3.1:工作流引擎 2 3.2:BPMN 2 3.3:数据库(先学后看) 2 3.4:activiti.cfg.xml(activiti的配置文件) 4 3.5:logging.properties(日志处理) 5 4:准备环境 6 4.1:activiti5 软件环境 6 4.2:相关资源下载 6 ...

    Flowable-6.3.1

    Flowable是Activiti原班主创人员从Activiti分离出来的一套工作流引擎,是一个业务流程管理(BPM)和工作流系统,适用于开发人员和系统管理员。其核心是超快速、稳定的BPMN2流程引擎,易于与 Spring集成使用。 Flowable...

    JAVA上百实例源码以及开源项目

     数字证书:从文件中读取数字证书,生成文件输入流,输入文件为c:/mycert.cer,获取一个处理X.509证书的证书工厂…… Java+ajax写的登录实例 1个目标文件 内容索引:Java源码,初学实例,ajax,登录  一个Java+ajax写...

    java开源包1

    Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...

    java开源包11

    Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...

    java开源包2

    Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...

    java开源包3

    Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...

    java开源包6

    Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...

    java开源包5

    Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...

    java开源包10

    Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...

    java开源包4

    Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...

    java开源包8

    Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...

    java开源包7

    Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...

    java开源包9

    Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...

    java开源包101

    Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...

    Java资源包01

    Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...

    JAVA上百实例源码以及开源项目源代码

     数字证书:从文件中读取数字证书,生成文件输入流,输入文件为c:/mycert.cer,获取一个处理X.509证书的证书工厂…… Java+ajax写的登录实例 1个目标文件 内容索引:Java源码,初学实例,ajax,登录  一个Java+ajax写...

Global site tag (gtag.js) - Google Analytics