JBPM 动态会签

 

今天终于完成了struts+hibernate+spring的一个简单的WF事例, 又看了chenjin同志的BLOG"jbpm 使用日记5 一个简单会签示例",觉得需要记录下来:

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

项目提交人 : ernie .

主管审批 : bert

会签 : ernie , bert , grover

老板审批 : grover

 

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

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

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

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

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

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

流程定义如下:

代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <process-definition xmlns="urn:jbpm.org:jpdl-3.1"  
  4.     name="tc_prj_approval">  
  5.   
  6.     <swimlane name="initiator" />  
  7.   
  8.     <!-- 项目提交人 -->  
  9.     <swimlane name="requester">  
  10.         <assignment expression="user(ernie)" />  
  11.     </swimlane>  
  12.   
  13.     <!-- 主管 -->  
  14.     <swimlane name="chief">  
  15.         <assignment expression="user(bert)" />  
  16.     </swimlane>  
  17.   
  18.     <!-- 老板 -->  
  19.     <swimlane name="boss">  
  20.         <assignment expression="user(grover)" />  
  21.     </swimlane>  
  22.   
  23.     <!-- 会签人 --><!-- 原来可以用这些方式实现用户组,从CosingerAssiHandler  类中去加载用户.-->  
  24.     <swimlane name="cosinger">  
  25.         <assignment class="net.chenj.jbpm.sample.CosingerAssiHandler">  
  26.         </assignment>  
  27.     </swimlane>  
  28.     <start-state name="start">  
  29.         <task name="tc_prj_newprj" swimlane="initiator"></task>  
  30.         <transition name="to_submit" to="tc_prj_submit"></transition>  
  31.     </start-state>  
  32.     <task-node name="tc_prj_submit">  
  33.         <task name="tc_prj_submit"></task>  
  34.         <transition name="to_chiefapprove" to="tc_prj_chiefapprove"></transition>  
  35.     </task-node>  
  36.     <task-node name="tc_prj_chiefapprove">  
  37.         <task name="tc_prj_chiefapprove"></task>  
  38.         <transition name="approve" to="tc_prj_countersign"></transition>  
  39.         <transition name="disapprove" to="tc_prj_submit"></transition>  
  40.     </task-node>  
  41.     <task-node name="tc_prj_countersign" signal="last-wait"  
  42.         create-tasks="false"   <!-- 不让流程创建task,使用event去手工创建task,这里一次创建了三个task -->
  43.         <task name="tc_prj_countersign">  
  44.             <event type="task-end">  
  45.                 <action  
  46.                     class="net.chenj.jbpm.sample.TaskEndCountersign">    <!-- 如果随便哪个会签人拒绝了申请,将停掉其他二个task. -->
  47.                 </action>  
  48.             </event>  
  49.   
  50.         </task>  
  51.   
  52.         <event type="node-enter">  
  53.             <action name="createInstance"  
  54.                 class="net.chenj.jbpm.sample.CreateTaskInstanceCountersign">  
  55.             </action>  
  56.         </event>  
  57.   
  58.         <transition name="approve" to="amount_decision"></transition>  
  59.         <transition name="disapprove" to="tc_prj_submit"></transition>  
  60.     </task-node>  
  61.     <decision name="amount_decision">  
  62.         <transition name="to_bossapprove" to="tc_prj_bossapprove"></transition>  
  63.         <transition name="to_end" to="end1"></transition>  
  64.     </decision>  
  65.     <task-node name="tc_prj_bossapprove">  
  66.         <task name="tc_prj_bossapprove"></task>  
  67.         <transition name="approve" to="end1"></transition>  
  68.         <transition name="disapprove" to="tc_prj_submit">  
  69.             <condition>#{amount >= 500}</condition>  
  70.         </transition>  
  71.     </task-node>  
  72.     <end-state name="end1"></end-state>  
  73. </process-definition>  
  74.   

 

会签swimlane class

代码
  1. package net.chenj.jbpm.sample;   
  2.   
  3. import org.jbpm.graph.exe.*;   
  4. import org.jbpm.taskmgmt.def.*;   
  5. import org.jbpm.taskmgmt.exe.Assignable;   
  6.   
  7. public class CosingerAssiHandler implements AssignmentHandler {   
  8.   
  9.     private static final long serialVersionUID 1L;   
  10.   
  11.     public void assign(Assignable assignable, ExecutionContext executionContext) {   
  12.         // 从数据库或者ldap 读取会签人设置   
  13.         String[] "ernie""bert""grover" };   
  14.         assignable.setPooledActors(a);   
  15.     }   
  16.   
  17. }   
  18.   


创建会签任务实现类

 

代码
  1. package net.chenj.jbpm.sample;   
  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. public class CreateTaskInstanceCountersign implements ActionHandler {   
  11.   
  12.     private static final long serialVersionUID 1L;   
  13.   
  14.     public void execute(ExecutionContext executionContext) throws Exception {   
  15.   
  16.         Token token executionContext.getToken();   
  17.         TaskMgmtInstance tmi executionContext.getTaskMgmtInstance();   
  18.         TaskNode taskNode (TaskNode) executionContext.getNode();   
  19.         Task task taskNode.getTask("tc_prj_countersign");   
  20.         // 从数据库或者ldap 读取会签人设置创建任务实例   
  21.         tmi.createTaskInstance(task, token).setActorId("ernie");   
  22.         tmi.createTaskInstance(task, token).setActorId("bert");   
  23.         tmi.createTaskInstance(task, token).setActorId("grover");   
  24.   
  25.     }   
  26.   
  27. }   

 

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

代码
  1. package net.chenj.jbpm.sample;   
  2.   
  3. import java.util.Collection;   
  4. import java.util.Iterator;   
  5. import org.jbpm.graph.def.ActionHandler;   
  6. import org.jbpm.graph.exe.ExecutionContext;   
  7. import org.jbpm.taskmgmt.exe.TaskInstance;   
  8. import org.jbpm.taskmgmt.exe.TaskMgmtInstance;   
  9.   
  10. public class TaskEndCountersign implements ActionHandler {   
  11.   
  12.     private static final long serialVersionUID 1L;   
  13.   
  14.     public void execute(ExecutionContext executionContext) throws Exception {   
  15.   
  16.        
  17.         boolean isDisapprove Boolean.valueOf((String) executionContext   
  18.                 .getVariable("isDisapprove"));   
  19.         // 如果有一个任务实例拒绝通过则结束除当前任务实例外其他任务实例   
  20.         if (isDisapprove) {   
  21.             TaskMgmtInstance tmi executionContext.getTaskMgmtInstance();   
  22.             TaskInstance ti executionContext.getTaskInstance();   
  23.             final String actorId ti.getActorId();   
  24.             Collection tmi.getSignallingTasks(executionContext);   
  25.             for (Iterator it c.iterator(); it.hasNext();) {   
  26.                 TaskInstance task (TaskInstance) it.next();   
  27.                 if (!(actorId.equals(task.getActorId())) && (!task.hasEnded())) {   
  28.                     task.end("disapprove");   
  29.                 }   
  30.             }   
  31.         }   
  32.   
  33.     }   
  34.   
  35. }   
<!-- Inject Script Filtered -->

 

感谢 tomkoo提供了会签的实现思路.

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值