相同功能的循环节点(jbpm应用)

在企业应用中,会有很多这样的情况,一个人起草之后,会需要他的上级一级一级的签,直到签到符合要求的那个主管等级,然后结束。这种情况,有不过不固定,因为每个人的上级不一样,所以如果要把这个图都画出来的话及其复杂,这样就有了以下的构思。通过同一个node的循环,来实现这种需要上级签合的情况。

下面是一个我们公司的资讯申请单流程

xml 代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <process-definition xmlns="urn:jbpm.org:jpdl-3.1"  
  4.     name="IT_InformationRequisition">  
  5.   
  6.     <swimlane name="user" />  
  7.        
  8.     <swimlane name="userHandler">  
  9.         <assignment class="com.ivo.engine.wf.swinlane.UserSwimlane" />  
  10.     </swimlane>  
  11.     <swimlane name="handler">  
  12.         <assignment class="com.ivo.engine.wf.swinlane.HandlerSwimlane" />  
  13.     </swimlane>  
  14.     <swimlane name="handlerClose">  
  15.         <assignment class="com.ivo.engine.wf.swinlane.HandlerCloseSwimlane" />  
  16.     </swimlane>  
  17.     <swimlane name="leader">  
  18.         <assignment class="com.ivo.engine.wf.swinlane.DomainLeaderSwimlane" />  
  19.     </swimlane>  
  20.     <swimlane name="userManager">  
  21.         <assignment class="com.ivo.engine.wf.swinlane.UserManagerSwimlane" />  
  22.     </swimlane>  
  23.        
  24.     <start-state name="start">  
  25.         <task swimlane="user">      </task>  
  26.         <transition name="draft" to="Drafting"></transition>  
  27.       <transition name="accept" to="HandlerAcceptance"></transition>  
  28.     </start-state>  
  29.   
  30.     <end-state name="end"></end-state>  
  31.   
  32.     <task-node name="HandlerAcceptance"  create-tasks="false">  
  33.         <task name="HandlerAcceptance"></task>  
  34.         <event type="node-enter">     
  35.             <action name="createInstance" class="com.ivo.engine.wf.action.DynamicTaskAction">     
  36.             </action>     
  37.         </event>    
  38.         <transition name="accept" to="LeaderConfirmation"></transition>  
  39.     </task-node>  
  40.        
  41.     <task-node name="LeaderConfirmation">  
  42.         <task swimlane="leader">        </task>  
  43.         <transition name="accept" to="HandlerClose"></transition>  
  44.         <transition name="reject" to="Drafting"></transition>  
  45.     </task-node>  
  46.        
  47.     <task-node name="Drafting">  
  48.         <task swimlane="userHandler"> </task>  
  49.         <transition name="accept" to="HandlerAcceptance"></transition>  
  50.         <transition name="delete" to="end"></transition>  
  51.     </task-node>  
  52.        
  53.     <task-node name="HandlerClose">  
  54.         <task swimlane="handler"> </task>  
  55.         <transition name="accept" to="UserAcceptance"></transition>  
  56.     </task-node>  
  57.        
  58.     <task-node name="UserAcceptance">  
  59.         <task swimlane="userHandler"> </task>  
  60.         <transition name="accept" to="UserDeptAcceptance"></transition>  
  61.         <transition name="reject" to="HandlerClose"></transition>  
  62.     </task-node>  
  63.        
  64.     <task-node name="UserDeptAcceptance" create-tasks="false">  
  65.         <task name="deptAcceptance"></task>  
  66.         <event type="node-enter">     
  67.             <action name="createInstance" class="com.ivo.engine.wf.action.UserManagerAction">     
  68.             </action>     
  69.         </event>    
  70.         <transition name="loop" to="UserDeptAcceptance"></transition>  
  71.         <transition name="accept" to="DomainLeaderClose"></transition>  
  72.         <transition name="reject" to="HandlerClose"></transition>  
  73.     </task-node>  
  74.        
  75.     <task-node name="DomainLeaderClose">  
  76.         <task swimlane="leader"> </task>  
  77.         <transition name="accept" to="end"></transition>  
  78.         <transition name="reject" to="HandlerClose"></transition>  
  79.     </task-node>  
  80.        
  81. </process-definition>  

这里应用到循环节点的是UserDeptAcceptance,需要签上级,直到处级主管。

通过UserManagerAction,来动态创建taskInstance,jbpm好像有一个特性,一个node的task第一次创建之后,如果重新回到这个node,这个taskInstance的actorId还是原来的那个,所以我就用动态创建taskInstance,这样可以在每次进入这个node的时候给这个赋予不同的actorId。

java 代码
  1. package com.ivo.engine.wf.action;   
  2.   
  3. import org.jbpm.graph.def.ActionHandler;   
  4. import org.jbpm.graph.exe.ExecutionContext;   
  5. import org.jbpm.graph.exe.Token;   
  6. import org.jbpm.graph.node.TaskNode;   
  7. import org.jbpm.taskmgmt.def.Task;   
  8. import org.jbpm.taskmgmt.exe.TaskMgmtInstance;   
  9.   
  10. import com.ivo.engine.dao.HRDao;   
  11. import com.ivo.engine.model.Employee;   
  12.      
  13. public class UserManagerAction implements ActionHandler {      
  14.      
  15.     private static final long serialVersionUID = 1L;      
  16.      
  17.     public void execute(ExecutionContext executionContext) throws Exception {      
  18.            
  19.         String actorId = "";   
  20.            
  21.         String currDeptLevel = null;   
  22.         String loopActorId = (String)executionContext.getVariable("LoopActorId");   
  23.         String startActorId = (String)executionContext.getVariable("StartActorId");   
  24.            
  25.         String emp = null;   
  26.         Employee manager = null;   
  27.            
  28.         if ( loopActorId == null ){   
  29.             emp = startActorId;   
  30.         } else {   
  31.             emp = loopActorId;   
  32.         }   
  33.            
  34.         manager = HRDao.getManager(emp);   
  35.         actorId = manager.getDeptManager_FK();   
  36.         currDeptLevel = manager.getDeptLevel();   
  37.            
  38.         // set variables   
  39.         executionContext.setVariable("LoopActorId", actorId.trim());   
  40.         executionContext.setVariable("CurrDeptLevel", currDeptLevel);   
  41.         executionContext.setVariable("LoopTag""loop");   
  42.            
  43.         // create task   
  44.            
  45.         Token token = executionContext.getToken();      
  46.         TaskMgmtInstance tmi = executionContext.getTaskMgmtInstance();      
  47.      
  48.         TaskNode taskNode = (TaskNode) executionContext.getNode();      
  49.         Task task = (Task)taskNode.getTasks().iterator().next();      
  50.      
  51.         tmi.createTaskInstance(task, token).setActorId(actorId.trim());      
  52.     }      
  53.      
  54. }   

通过两个variable,来控制这个loop是否继续。

在taskInstance end的时候判断两个variable。

下面是end的方法实现。

java 代码
  1. ContextInstance contextInstance = taskInstance.getTaskMgmtInstance().getProcessInstance().getContextInstance();   
  2.             String loopTag = (String)contextInstance.getVariable("LoopTag");   
  3.                
  4.             if (loopTag != null && loopTag.equals("loop")) {   
  5.                    
  6.                 Integer deptLevel = Integer.valueOf((String)contextInstance.getVariable("DeptLevel"));   
  7.                 if ( deptLevel == null )   
  8.                     throw new WorkflowException("in loop node , variable(DeptLevel)  is null, pls set at start node");   
  9.                    
  10.                 Integer currDeptLevel = Integer.valueOf((String)contextInstance.getVariable("CurrDeptLevel"));   
  11.                 if ( currDeptLevel == null)   
  12.                     throw new WorkflowException("in loop node , variable(CurrDeptLevel)  is null, pls set at swimlane");   
  13.                    
  14.                 if (currDeptLevel <=deptLevel) {   
  15.                     taskInstance.end("accept");   
  16.                     contextInstance.setVariable("LoopTag"null);   
  17.                 }   
  18.                 else taskInstance.end("loop");   
  19.             }else {   
  20.                 taskInstance.end("accept");   
  21.             }   
  22.             jbpmContext.save(taskInstance);  
对比DeptLevel和CurrDeptLevel两个变量,就可以判断是继续loop,还是从accept结束这个loop。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值