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

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

 



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

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

 

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

 

 

动态创建:

 

	 /**
	  * 动态创建连接当前任务节点至名称为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();

		 }
	 }

  动态删除:

 

 

	 /**
	  * 动态删除连接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();
		 }
	 }

 

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

 

指定至相关人员:

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值