Jbpm 一个简单的会签实例

作者:tomkoo

以下例子中 采用了jbpm console 的几个实例用户

项目提交人 : ernie .

主管审批 : bert

会签 : ernie , bert , grover

老板审批 : grover

 

正常流程: 项目金额 >= 500W RMB

提交项目 --> 主管审批 --> 会签 --> 老板审批 --> 审批通过(结束)

正常流程: 项目金额 < 500W RMB

提交项目 --> 主管审批 --> 会签 --> 审批通过(结束)

其中主管审批, 会签, 老板审批 , 不通过, 全部退回给项目提交人修改.

会签中: 所有人全通过, 则通过. 任何一人不通过, 停止其他会签任务.退回给提交人.

流程定义如下:

 


<? xml version="1.0" encoding="UTF-8" ?>    
   
< process-definition  xmlns ="urn:jbpm.org:jpdl-3.1"    
    name
="tc_prj_approval" >    
   
    
< swimlane  name ="initiator"   />    
   
    
<! 项目提交人  >    
    
< swimlane  name ="requester" >    
        
< assignment  expression ="user(ernie)"   />    
    
</ swimlane >    
   
    
<!  主管  >    
    
< swimlane  name ="chief" >    
        
< assignment  expression ="user(bert)"   />    
    
</ swimlane >    
   
    
<! 老板  >    
    
< swimlane  name ="boss" >    
        
< assignment  expression ="user(grover)"   />    
    
</ swimlane >    
   
    
<! 会签人  >    
    
< swimlane  name ="cosinger" >    
        
< assignment  class ="net.chenj.jbpm.sample.CosingerAssiHandler" >    
        
</ assignment >    
    
</ swimlane >    
    
< start-state  name ="start" >    
        
< task  name ="tc_prj_newprj"  swimlane ="initiator" ></ task >    
        
< transition  name ="to_submit"  to ="tc_prj_submit" ></ transition >    
    
</ start-state >    
    
< task-node  name ="tc_prj_submit" >    
        
< task  name ="tc_prj_submit" ></ task >    
        
< transition  name ="to_chiefapprove"  to ="tc_prj_chiefapprove" ></ transition >    
    
</ task-node >    
    
< task-node  name ="tc_prj_chiefapprove" >    
        
< task  name ="tc_prj_chiefapprove" ></ task >    
        
< transition  name ="approve"  to ="tc_prj_countersign" ></ transition >    
        
< transition  name ="disapprove"  to ="tc_prj_submit" ></ transition >    
    
</ task-node >    
    
< task-node  name ="tc_prj_countersign"  signal ="last-wait"    
        create-tasks
="false" >    
        
< task  name ="tc_prj_countersign" >    
            
< event  type ="task-end" >    
                
< action   
                    
class ="net.chenj.jbpm.sample.TaskEndCountersign" >    
                
</ action >    
            
</ event >    
   
        
</ task >    
   
        
< event  type ="node-enter" >    
            
< action  name ="createInstance"    
                class
="net.chenj.jbpm.sample.CreateTaskInstanceCountersign" >    
            
</ action >    
        
</ event >    
   
        
< transition  name ="approve"  to ="amount_decision" ></ transition >    
        
< transition  name ="disapprove"  to ="tc_prj_submit" ></ transition >    
    
</ task-node >    
    
< decision  name ="amount_decision" >    
        
< transition  name ="to_bossapprove"  to ="tc_prj_bossapprove" ></ transition >    
        
< transition  name ="to_end"  to ="end1" ></ transition >    
    
</ decision >    
    
< task-node  name ="tc_prj_bossapprove" >    
        
< task  name ="tc_prj_bossapprove" ></ task >    
        
< transition  name ="approve"  to ="end1" ></ transition >    
        
< transition  name ="disapprove"  to ="tc_prj_submit" >    
            
< condition > #{amount >= 500} </ condition >    
        
</ transition >    
    
</ task-node >    
    
< end-state  name ="end1" ></ end-state >    
</ process-definition >    
   

 

 



// 会签swimlane class


package  net.chenj.jbpm.sample;    
   
import  org.jbpm.graph.exe. * ;    
import  org.jbpm.taskmgmt.def. * ;    
import  org.jbpm.taskmgmt.exe.Assignable;    
   
public   class  CosingerAssiHandler  implements  AssignmentHandler  {    
   
    
private static final long serialVersionUID = 1L;    
   
    
public void assign(Assignable assignable, ExecutionContext executionContext) {    
        
// 从数据库或者ldap 读取会签人设置    
        String[] a = "ernie""bert""grover" };    
        assignable.setPooledActors(a);    
    }
    
   
}
    
   

创建会签任务实现类 
 

  

package  net.chenj.jbpm.sample;    
   
import  org.jbpm.graph.def.ActionHandler;    
import  org.jbpm.graph.exe.ExecutionContext;    
import  org.jbpm.graph.exe.Token;    
import  org.jbpm.graph.node.TaskNode;    
import  org.jbpm.taskmgmt.def.Task;    
import  org.jbpm.taskmgmt.exe.TaskMgmtInstance;    
   
public   class  CreateTaskInstanceCountersign  implements  ActionHandler  {    
   
    
private static final long serialVersionUID = 1L;    
   
    
public void execute(ExecutionContext executionContext) throws Exception {    
   
        Token token 
= executionContext.getToken();    
        TaskMgmtInstance tmi 
= executionContext.getTaskMgmtInstance();    
        TaskNode taskNode 
= (TaskNode) executionContext.getNode();    
        Task task 
= taskNode.getTask("tc_prj_countersign");    
        
// 从数据库或者ldap 读取会签人设置创建任务实例    
        tmi.createTaskInstance(task, token).setActorId("ernie");    
        tmi.createTaskInstance(task, token).setActorId(
"bert");    
        tmi.createTaskInstance(task, token).setActorId(
"grover");    
   
    }
    
   
}
    
 

结束不通过时结束其他会签任务实现 


package  net.chenj.jbpm.sample;    
   
import  java.util.Collection;    
import  java.util.Iterator;    
import  org.jbpm.graph.def.ActionHandler;    
import  org.jbpm.graph.exe.ExecutionContext;    
import  org.jbpm.taskmgmt.exe.TaskInstance;    
import  org.jbpm.taskmgmt.exe.TaskMgmtInstance;    
   
public   class  TaskEndCountersign  implements  ActionHandler  {    
   
    
private static final long serialVersionUID = 1L;    
   
    
public void execute(ExecutionContext executionContext) throws Exception {    
   
        
        
boolean isDisapprove = Boolean.valueOf((String) executionContext    
                .getVariable(
"isDisapprove"));    
        
// 如果有一个任务实例拒绝通过则结束除当前任务实例外其他任务实例    
        if (isDisapprove) {    
            TaskMgmtInstance tmi 
= executionContext.getTaskMgmtInstance();    
            TaskInstance ti 
= executionContext.getTaskInstance();    
            
final String actorId = ti.getActorId();    
            Collection c 
= tmi.getSignallingTasks(executionContext);    
            
for (Iterator it = c.iterator(); it.hasNext();) {    
                TaskInstance task 
= (TaskInstance) it.next();    
                
if (!(actorId.equals(task.getActorId())) && (!task.hasEnded())) {    
                    task.end(
"disapprove");    
                }
    
            }
    
        }
    
   
    }
    
   
}
    


 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值