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("王五"); } }