jBPM4.4之(Task)任務分配


  jBPM中的(Task)任務有個人任務和組任務。

一、個人任務的分配

  流程圖:

                                                                           

  1、通過assignee直接指定某個人辦理

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

<process name="AssignTask" xmlns="http://jbpm.org/4.4/jpdl">
   <start g="150,61,48,48" name="start1">
      <transition g="-43,-20" name="to 申請" to="申請"/>
   </start>
   <end g="155,239,48,48" name="end1"/>
   <task assignee="張三" g="131,150,92,52" name="申請">
      <transition g="-45,-20" name="to end1" to="end1"/>
   </task>
</process>

  在”申請“任務節點直接使用 assignee="張三" 指定張三辦理申請任務。  

  查找出待張三處理的任務:

String userId = "張三";
List<Task> tasks = processEngine.getTaskService().findPersonalTasks(userId);

  2、使用流程變量分配任務

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

<process name="AssignTask" xmlns="http://jbpm.org/4.4/jpdl">
   <start g="150,61,48,48" name="start1">
      <transition g="-43,-20" name="to 申請" to="申請"/>
   </start>
   <end g="155,239,48,48" name="end1"/>
   <task assignee="#{userId}" g="131,150,92,52" name="申請">
      <transition g="-45,-20" name="to end1" to="end1"/>
   </task>
</process>

  使用assignee="#{userId}"分配,userId是一個流程變量,在到達該任務之前需要把userId的值存到流程變量中。

Map<String,String> variables = new HashMap<String,String>();
variables.put("userId", "張三");
            
//把下一步處理人存到流程變量中
processEngine.getExecutionService().startProcessInstanceByKey("AssignTask",variables);

   3、使用AssignmentHandler接口指定任務處理人

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

<process name="AssignTask" xmlns="http://jbpm.org/4.4/jpdl">
   <start g="142,59,48,48" name="start1">
      <transition g="-43,-20" name="to 申請" to="申請"/>
   </start>
   <end g="155,239,48,48" name="end1"/>
   <task g="131,150,92,52" name="申請">
         <assignment-handler class="cn.luxh.jbpm4.handler.AssignmentHandlerImpl"></assignment-handler>
      <transition g="-45,-20" name="to end1" to="end1"/>
   </task>
</process>

   使用<assignment-handler class="cn.luxh.jbpm4.handler.AssignmentHandlerImpl"></assignment-handler>指定一個實現了AssignmentHandler接口的類來分配任務處理人。

package cn.luxh.jbpm4.handler;

import org.jbpm.api.model.OpenExecution;
import org.jbpm.api.task.Assignable;
import org.jbpm.api.task.AssignmentHandler;

public class AssignmentHandlerImpl implements AssignmentHandler {

    @Override
    public void assign(Assignable assignable, OpenExecution execution)
            throws Exception {
        //實際可能是從數據庫查出相應的用戶
        String userId = "張三";
        assignable.setAssignee(userId);

    }

}

   4、在程序中直接分配

String taskId = "10001";
String userId = "張三";
//直接把ID為10001的任務分配給張三處理
processEngine.getTaskService().assignTask(taskId, userId);

 

二、組任務的分配

  流程走到某個任務節點,這個任務可以分配給多個人,誰先拾取了這個任務就變成誰的待辦任務。比如說會計核算任務,一些大的公司,會有多個會計,流程到達會計核算任務節點時,如果有張三、李四、王五三個會計,這個任務就會變成張三、李四、王五的組任務,這個時候張三、李四、王五都能看到這個任務,但是這個時候還沒有具體的處理人,如果其中一個會計張三拾取了組任務,這個任務就變成張三的個人任務由張三處理了,李四和王五就看不到這個組任務了。

  流程圖:

                                                                        

  1、使用 candidate-users="張三,李四,王五" 分配組任務,各個處理人之間用英文輸入法下的逗號隔開

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

<process name="AssignTask" xmlns="http://jbpm.org/4.4/jpdl">
   <start name="start1" g="164,33,48,48">
      <transition name="to 會計核算" to="會計核算" g="-67,-20"/>
   </start>
   <end name="end1" g="174,218,48,48"/>
   <task name="會計核算" g="152,125,92,52" candidate-users="張三,李四,王五">
      <transition name="to end1" to="end1" g="-45,-20"/>
   </task>
</process>

  查找組任務:

String userId = "張三";
List<Task> tasks = processEngine.getTaskService().findGroupTasks(userId);
for(Task task : tasks) {
    //張三拾取組任務,拾取之后就變成張三的個人任務了,只能由張三處理,其他人就看不到了
    processEngine.getTaskService().takeTask(task.getId(), userId);
}

  2、使用流程變量 candidate-users="#{userIds}" 分配組任務

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

<process name="AssignTask" xmlns="http://jbpm.org/4.4/jpdl">
   <start name="start1" g="164,33,48,48">
      <transition name="to 會計核算" to="會計核算" g="-67,-20"/>
   </start>
   <end name="end1" g="174,218,48,48"/>
   <task name="會計核算" g="152,125,92,52" candidate-users="#{userIds}">
      <transition name="to end1" to="end1" g="-45,-20"/>
   </task>
</process>

  candidate-users="#{userIds}"中的userIds也是用英文輸入法下的逗號隔開的字符串。

String userIds = "張三,李四,王五";
            Map<String,String> variables = new HashMap<String,String>();
            variables.put("userIds", userIds);
            processEngine.getExecutionService().startProcessInstanceByKey("AssignTask",variables);

  3、使用AssignmentHandler接口指定任務處理人

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

<process name="AssignTask" xmlns="http://jbpm.org/4.4/jpdl">
   <start name="start1" g="164,33,48,48">
      <transition name="to 會計核算" to="會計核算" g="-67,-20"/>
   </start>
   <end name="end1" g="174,218,48,48"/>
   <task name="會計核算" g="152,125,92,52">
         <assignment-handler class="cn.luxh.jbpm4.handler.AssignmentHandlerImpl"></assignment-handler>
      <transition name="to end1" to="end1" g="-45,-20"/>
   </task>
</process>

  使用<assignment-handler class="cn.luxh.jbpm4.handler.AssignmentHandlerImpl"></assignment-handler>指定一個實現了AssignmentHandler接口的類來分配任務處理人。

package cn.luxh.jbpm4.handler;

import org.jbpm.api.model.OpenExecution;
import org.jbpm.api.task.Assignable;
import org.jbpm.api.task.AssignmentHandler;

public class AssignmentHandlerImpl implements AssignmentHandler {

    @Override
    public void assign(Assignable assignable, OpenExecution execution)
            throws Exception {
        
        assignable.addCandidateUser("張三");
        assignable.addCandidateUser("李四");
        assignable.addCandidateUser("王五");

    }

}

 

 

 

  

  

 

 

 

 

 

  

 

 

  

 

 

  

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM