《JBPM流程通过Aciton动态创建TaskInstance来实现“会签”》2

晨曦之光 发布于 2012/04/11 18:10
阅读 293
收藏 0
前面写过一篇文章《JBPM流程通过Aciton动态创建TaskInstance来实现“会签”》,不过那篇文章可以说是一个大体思路的简单实现,并不完整,也有不少朋友提出了不少的问题。因为做事要善始善终,所以再次贴出这一主题,把会签进行到底。

参考文章:
JBPM流程通过Aciton动态创建TaskInstance来实现“会签”
JBPM通过AssignmentHandler绑定自定义用户模型实现用户授权(1)

第一步还是给出一个新的ProcessDefinition.xml流程定义文件:

Java代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <process-definition xmlns="urn:jbpm.org:jpdl-3.1" name="资金归集">  
  4.   
  5.     <start-state name="启动">  
  6.         <transition name="" to="制单"></transition>  
  7.     </start-state>  
  8.   
  9.     <task-node name="制单">  
  10.         <task name="制单">  
  11.             <assignment actor-id="#{processStarter}"></assignment>  
  12.         </task>  
  13.         <transition name="送复核" to="复核"></transition>  
  14.     </task-node>  
  15.   
  16.     <task-node name="复核">  
  17.         <task name="复核">  
  18.             <assignment class="com.sky.plugin.jbpm.def.ActorsHandel">  
  19.             </assignment>  
  20.         </task>  
  21.         <transition name="拒绝复核" to="制单"></transition>  
  22.         <transition name="提交审批" to="审批"></transition>  
  23.     </task-node>  
  24.   
  25.     <task-node name="审批" signal="last-wait" create-tasks="false" end-tasks="true">  
  26.         <task name="审批">  
  27.   
  28.         </task>  
  29.         <event type="node-enter">  
  30.             <action name="createInstance"  
  31.                 class="com.sky.plugin.jbpm.def.DynamicCreateTaskInstance">  
  32.             </action>  
  33.         </event>  
  34.   
  35.         <event type="task-end">  
  36.             <action name="createInstance"  
  37.                 class="com.sky.plugin.jbpm.def.ConuntersignActionHandler">  
  38.             </action>  
  39.         </event>  
  40.   
  41.         <transition name="同意" to="结束">  
  42.             <action name="createInstance"  
  43.                 class="com.sky.plugin.jbpm.def.TestActionHandel">  
  44.             </action>  
  45.         </transition>  
  46.         <transition name="拒绝到复核人" to="复核"></transition>  
  47.     </task-node>  
  48.   
  49.     <end-state name="结束"></end-state>  
  50.   
  51.   
  52. </process-definition>  


这里除了“文章1”说到要注意的地方外,还要注意的两个地方是:


    1. <event type="node-enter">
       进入流程节点的时候,执行ActionHandler类com.sky.plugin.jbpm.def.DynamicCreateTaskInstance,用来动态生成TaskInstance。
    2. <event type="task-end">
    Task结束的时候调用com.sky.plugin.jbpm.def.ConuntersignActionHandler进行会签处理。判断会签路径来决定会签的执行和走向。


com.sky.plugin.jbpm.def.DynamicCreateTaskInstance
Java代码   收藏代码
  1. public class DynamicCreateTaskInstance implements ActionHandler {  
  2.       
  3.     private static final long serialVersionUID = 1L;  
  4.   
  5.     public void execute(ExecutionContext context) throws Exception {  
  6.           
  7.         ProcessDefinition processDefinition = context.getProcessDefinition();  
  8.   
  9.         TaskNode taskNode = (TaskNode) context.getNode();  
  10.         Task task = (Task)taskNode.getTasks().iterator().next();  
  11.   
  12.         Long processDefinitionId = processDefinition.getId();  
  13.         Long taskId = task.getId();  
  14.           
  15.         Token token = context.getToken();  
  16.         TaskMgmtInstance tmi = context.getTaskMgmtInstance();  
  17.           
  18.         //获取自定义的进行会签的人员  
  19.         ServiceFactory serviceFactory = ServiceFactory.getInstance();  
  20.         ProcessService ps = serviceFactory.getProcessService();  
  21.         String[] actors = ps.loadTaskActors(processDefinitionId, taskId);  
  22.           
  23.         //根据会签人员,每人创建一个TaskInstance  
  24.         for(String actor : actors){  
  25.             tmi.createTaskInstance(task, token).setActorId(actor);  
  26.         }  
  27.     }  
  28. }  


com.sky.plugin.jbpm.def.ConuntersignActionHandler
Java代码   收藏代码
  1. public class ConuntersignActionHandler implements ActionHandler {  
  2.   
  3.     private static final long serialVersionUID = 1L;  
  4.   
  5.     @SuppressWarnings("unchecked")  
  6.     public void execute(ExecutionContext context) throws Exception {  
  7.   
  8.         Token token = context.getToken();  
  9.   
  10.         TaskMgmtInstance tmi = context.getTaskMgmtInstance();  
  11.   
  12.         Collection<TaskInstance> unfinishedTasks = tmi  
  13.                 .getUnfinishedTasks(token);  
  14.   
  15.         Object variable = context.getVariable("selectedTransition");  
  16.         String selectedTransition;  
  17.         if (variable == null) {  
  18.             throw new RuntimeException(  
  19.                     "Jbpm transition error: user selected transition is null!");  
  20.         } else {  
  21.             // 获取当前TaskInstance选择的路径  
  22.             selectedTransition = variable.toString();  
  23.         }  
  24.   
  25.         // 如果用户选择的路径是流程定义中制定的不通过的路径,则自动完成余下所有的会签Task并转到相应路径  
  26.         if (selectedTransition.equals("拒绝到复核人")) {  
  27.             for (TaskInstance unfinishedTaskInstance : unfinishedTasks) {  
  28.                 // 把被结束的没有完成的TaskInstance的ActorId改为automatic complete  
  29.                 if (!unfinishedTaskInstance.hasEnded()) {  
  30.                     unfinishedTaskInstance.setActorId("automatic complete");  
  31.                     unfinishedTaskInstance.end("拒绝到复核人");  
  32.                 }  
  33.             }  
  34.         }  
  35.     }  
  36.   
  37. }  


这个类对于会签是至关重要的,要通过这个Action来判断会签的情况。在这个Action中有这样几句代码:
Java代码   收藏代码
  1. Object variable = context.getVariable("selectedTransition");  
  2.         String selectedTransition;  
  3.         if (variable == null) {  
  4.             throw new RuntimeException(  
  5.                     "Jbpm transition error: user selected transition is null!");  
  6.         } else {  
  7.             // 获取当前TaskInstance选择的路径  
  8.             selectedTransition = variable.toString();  
  9.         }  

其中的selectedTransition是用户选择的路径,也就是通过这个来判断会签的用户选择了“同意”或者“拒绝到复核人”,你可以通过流程变量的形式来保存。

如果“同意”,则继续下去,直到该TaskNode中所有的TaskInstance完成以后,通过会签,继续下去,如果选择“拒绝到复核人”,则会自动完成余下的所有TaskInstance,然后转到Transition“拒绝到复核人”,会签不通过。
其中有一句,设置所有自动完成的TaskInstance的Actor为“automatic complete”,这个可以解决在“以办事务”中出现自动完成的任务(TaskInstance)
Java代码   收藏代码
  1. unfinishedTaskInstance.setActorId("automatic complete");  


到这里整个会签的实现都在这里了,行文有点乱。哈哈!

原文链接:http://blog.csdn.net/wangxiaojing123/article/details/7069401
加载中
返回顶部
顶部