`

十九、会签(通过PooledActors或者在一个TaskNode中定义多个Task)来实现

 
阅读更多

如何实现多人会签,而且只要其中一个人审批通过就继续往下?


实现方法一:

利用pooled-actors,可以使用pooled-actors定义多个参与者,并使用findPooledTaskInstances来查找这种定义的任务实例 ,其中任意一个人审批通过并提交之后,其他人将看不到这个任务实例。

 

任务分配模式:


 

<?xml version="1.0" encoding="UTF-8"?>

<process-definition
  xmlns="urn:jbpm.org:jpdl-3.2"  name="test9">
   <start-state name="开始">
      <transition name="" to="领导审批"></transition>
   </start-state>
   <task-node name="领导审批" >
         <task name="审批">
             <assignment pooled-actors="张三,李四"></assignment>
         </task>
      <transition name="" to="结束" ></transition>
   </task-node>
   <end-state name="结束"></end-state>
  
</process-definition>

 

private void printTask(JbpmContext context, String actorId) {
       
        //查询actorid独占的任务实例
        List<TaskInstance> list = context.getTaskMgmtSession().findTaskInstances(actorId);
        for (TaskInstance taskInstance : list) {
            Long documentId = (Long) taskInstance.getContextInstance().getVariable("documentId");
            Document document = (Document) context.getSession().load(Document.class, documentId);
           
            System.err.println(actorId + "待处理的公文是:" + document.getTitle());
           
        }
       
        //查询actorid所属组的任务实例
        List<TaskInstance> list2 = context.getTaskMgmtSession().findPooledTaskInstances(actorId);
        for (TaskInstance taskInstance : list2) {
            Long documentId = (Long) taskInstance.getContextInstance().getVariable("documentId");
            Document document = (Document) context.getSession().load(Document.class, documentId);
           
            System.err.println(actorId + "待处理的公文是:" + document.getTitle());
           
        }
    }


实现方法二:

在同一个TaskNode节点中定义多个Task,并设置signal="first"

1、last  默认,最后一个任务实例被结束时执行继续;如果Task-Node下面根本没有定义Task,则执行继续。

2、last-wait  最后一个任务实例被结束时执行继续;如果Task-Node下面根本没有定义Task,则等待。

3、first  第一个任务实例被结束时执行继续;如果Task-Node下面根本没有定义Task,则执行继续。

4、firstt-wait  第一个任务实例被结束时执行继续;如果Task-Node下面根本没有定义Task,则执行继续。

5、never  执行永远不会继续(即通过TaskInstance.end操作不会触发流程往下走)。

6、unsychronized  直接往下执行(signal),不管是否有任务实例。

 

 

<?xml version="1.0" encoding="UTF-8"?>

<process-definition
  xmlns="urn:jbpm.org:jpdl-3.2"  name="test10">
   <start-state name="开始">
      <transition name="" to="领导审批"></transition>
   </start-state>
   <task-node name="领导审批" signal="first" >
         <task name="审批">
             <assignment actor-id="张三"></assignment>
         </task>
         <task name="审批">
             <assignment actor-id="李四"></assignment>
         </task>
         <event type="node-leave">
             <action class="com.ygtim.domain.TerminatedTaskInstanceAction"/>
         </event>

      <transition name="" to="结束" ></transition>
   </task-node>
   <end-state name="结束"></end-state>
  
</process-definition>

 

public class TerminatedTaskInstanceAction implements ActionHandler {
   
    /** Comment for <code>serialVersionUID</code> */
    private static final long    serialVersionUID    = -7195658442210655120L;
   
    @SuppressWarnings("unchecked")
    @Override
    public void execute(ExecutionContext executionContext) throws Exception {
        //查询尚未结束的任务实例
        Collection<TaskInstance> collection = executionContext.getTaskMgmtInstance()
            .getUnfinishedTasks(executionContext.getToken());
       
        for (TaskInstance taskInstance : collection) {
            taskInstance.end();
        }
    }
}


在某个用户审批通过后,实例就会离开该节点,为了让其余的用户不再能查询该节点的任务,就需要TerminatedTaskInstanceAction来删除其余用户的任务实例。

 

 

 

 

  • 大小: 115.8 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics