JBPM4中的任务回退、补签、自由流程实现

最近在实施政府办公项目的时候,经常有客户在问,公文的流程能否自由流转,如我在拟稿完成后,直接归档,不需要再经过核稿与审批流程。同样,我可以在任何一个任务上,直接把任务回退到以上任何一个环节,如,在审批的过程中,若不合适,可以直接回退至拟稿任务。如下图所示:

 

JBPM4中的任务回退、补签、自由流程实现



    非常幸运,JBPM4也提供了给我们动态创建Transition的接口。即在当前的节点中,动态创建出当前节点所有的跳转的Transition,问题是如果你给你的活动节点创建了连接后,下一次进入该任务时,不能显示这些动态创建的连接。否则当前任务的跳转连接会越来越多。

      所以对于那些在两个节点间不存在的连接,而又想实现这两个节点的跳转的话,就需要动态创建连接,然后再实现任务跳转,跳转后再进行删除连接。相当于现实中我们所说的过河拆桥模式。

 

     有了这种思想,Jbpm实现任务回退、补签等操作都是相当容易。

 

 

动态创建:

 

Java代码  
  1. /**  
  2.  * 动态创建连接当前任务节点至名称为destName的节点的Transition  
  3.  * @param taskId 任务节点ID  
  4.  * @param sourceName 源节点名称  
  5.  * @param destName  目标节点名称  
  6.  */  
  7. public void addOutTransition(ProcessDefinitionImpl pd,String sourceName,String destName){   
  8.   
  9.  EnvironmentFactory environmentFactory = (EnvironmentFactory) processEngine;   
  10.  Environment env=null;   
  11.  try {   
  12.      env = environmentFactory.openEnvironment();   
  13.      //取得当前流程的活动定义   
  14.      ActivityImpl sourceActivity = pd.findActivity(sourceName);   
  15.      //取得目标的活动定义   
  16.      ActivityImpl destActivity=pd.findActivity(destName);   
  17.   
  18.      //为两个节点创建连接   
  19.   
  20.      TransitionImpl transition = sourceActivity.createOutgoingTransition();   
  21.   
  22.      transition.setName("to" + destName);   
  23.   
  24.      transition.setDestination(destActivity);   
  25.   
  26.      sourceActivity.addOutgoingTransition(transition);   
  27.   
  28.  }catch(Exception ex){   
  29.      logger.error(ex.getMessage());   
  30.   
  31.  }finally{   
  32.      if(env!=null)env.close();   
  33.   
  34.  }   
  35. }  
/**
	  * 动态创建连接当前任务节点至名称为destName的节点的Transition
	  * @param taskId 任务节点ID
	  * @param sourceName 源节点名称
	  * @param destName  目标节点名称
	  */
	 public void addOutTransition(ProcessDefinitionImpl pd,String sourceName,String destName){

		 EnvironmentFactory environmentFactory = (EnvironmentFactory) processEngine;
		 Environment env=null;
		 try {
			 env = environmentFactory.openEnvironment();
			 //取得当前流程的活动定义
			 ActivityImpl sourceActivity = pd.findActivity(sourceName);
			 //取得目标的活动定义
			 ActivityImpl destActivity=pd.findActivity(destName);

			 //为两个节点创建连接

			 TransitionImpl transition = sourceActivity.createOutgoingTransition();

			 transition.setName("to" + destName);

			 transition.setDestination(destActivity);

			 sourceActivity.addOutgoingTransition(transition);

		 }catch(Exception ex){
			 logger.error(ex.getMessage());

		 }finally{
			 if(env!=null)env.close();

		 }
	 }

  动态删除:

 

 

Java代码  
  1. /**  
  2.  * 动态删除连接sourceName与destName的Transition  
  3.  * @param taskId  
  4.  * @param sourceName  
  5.  * @param destName  
  6.  */  
  7. public void removeOutTransition(ProcessDefinitionImpl pd,String sourceName,String destName){   
  8.  EnvironmentFactory environmentFactory = (EnvironmentFactory) processEngine;   
  9.  Environment env=null;   
  10.  try {   
  11.      env = environmentFactory.openEnvironment();   
  12.      //取得当前流程的活动定义   
  13.      ActivityImpl sourceActivity = pd.findActivity(sourceName);   
  14.         
  15.      //若存在这个连接,则需要把该连接删除   
  16.      List<Transition> trans=sourceActivity.getOutgoingTransitions();   
  17.      for(Transition tran:trans){   
  18.         if(destName.equals(tran.getDestination().getName())){//删除该连接   
  19.             trans.remove(tran);   
  20.             break;   
  21.         }   
  22.      }   
  23.  }catch(Exception ex){   
  24.      logger.error(ex.getMessage());   
  25.  }finally{   
  26.      if(env!=null)env.close();   
  27.  }   
  28. }  
/**
	  * 动态删除连接sourceName与destName的Transition
	  * @param taskId
	  * @param sourceName
	  * @param destName
	  */
	 public void removeOutTransition(ProcessDefinitionImpl pd,String sourceName,String destName){
		 EnvironmentFactory environmentFactory = (EnvironmentFactory) processEngine;
		 Environment env=null;
		 try {
			 env = environmentFactory.openEnvironment();
			 //取得当前流程的活动定义
			 ActivityImpl sourceActivity = pd.findActivity(sourceName);
			 
			 //若存在这个连接,则需要把该连接删除
			 List<Transition> trans=sourceActivity.getOutgoingTransitions();
			 for(Transition tran:trans){
				if(destName.equals(tran.getDestination().getName())){//删除该连接
					trans.remove(tran);
					break;
				}
			 }
		 }catch(Exception ex){
			 logger.error(ex.getMessage());
		 }finally{
			 if(env!=null)env.close();
		 }
	 }

 

其实现效果如下所示,可以跳至任何节点,并且可以指派给任何人。

JBPM4中的任务回退、补签、自由流程实现

 

指定至相关人员:

JBPM4中的任务回退、补签、自由流程实现

 

 

JBPM4中的任务回退、补签、自由流程实现

 

你可能感兴趣的:(JBPM4中的任务回退、补签、自由流程实现)