Activiti(十)——分配个人任务的三种方式

来源:互联网 发布:查看淘宝卖家实名认证 编辑:程序博客网 时间:2024/05/16 04:48

   转自:http://blog.csdn.net/zjx86320/article/details/50388157

    用户任务(UserTask)即用户操作的任务, 个人任务是用户任务的一种,这篇博文将简单地介绍下分配个人任务的三种方式。


     一、流程图


                                            

                                               图一   分配用户任务流程图


     二、方式一:直接指定办理人

     1.流程图中配置任务节点


                                 

                                                图二   配置任务节点办理人


     2.测试代码

[java] view plain copy
  1.        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();  
  2.        //部署流程定义,启动流程实例  
  3. @Test  
  4. public void testTask() throws Exception {  
  5.       
  6.     // 1 发布流程  
  7.     InputStream inputStreamBpmn = this.getClass().getResourceAsStream("taskProcess.bpmn");  
  8.     InputStream inputStreamPng = this.getClass().getResourceAsStream("taskProcess.png");  
  9.     processEngine.getRepositoryService()//  
  10.                     .createDeployment()//  
  11.                     .addInputStream("userTask.bpmn", inputStreamBpmn)//  
  12.                     .addInputStream("userTask.png", inputStreamPng)//  
  13.                     .deploy();  
  14.       
  15.     // 2 启动流程  
  16.     //启动流程实例的同时,设置流程变量  
  17.     ProcessInstance pi = processEngine.getRuntimeService()//  
  18.                     .startProcessInstanceByKey("taskProcess");  
  19.     System.out.println("pid:" + pi.getId());  
  20. }  
  21.   
  22.        //查询我的个人任务列表  
  23. @Test  
  24. public void findMyTaskList(){  
  25.     String userId = "周江霄";  
  26.     List<Task> list = processEngine.getTaskService()//  
  27.                     .createTaskQuery()//  
  28.                     .taskAssignee(userId)//指定个人任务查询  
  29.                     .list();  
  30.     for(Task task:list ){  
  31.         System.out.println("id="+task.getId());  
  32.         System.out.println("name="+task.getName());  
  33.         System.out.println("assinee="+task.getAssignee());  
  34.         System.out.println("createTime="+task.getCreateTime());  
  35.         System.out.println("executionId="+task.getExecutionId());  
  36.           
  37.     }  
  38. }  
  39.   
  40.        //完成任务  
  41. @Test  
  42. public void completeTask(){  
  43.     String taskId = "3209";  
  44.     processEngine.getTaskService()//  
  45.                 .complete(taskId);//  
  46.     System.out.println("完成任务");  
  47. }  


     说明:在上面的例子中,周江霄是个人任务的办理人;但是这样分配任务的办理人不够灵活,因为项目开发中任

务的办理人不要放置XML文件中。
    


     方式二:直接指定办理人


     1.流程图中配置任务节点变量


                              

                                           图三   配置任务节点变量


     2.测试代码

[java] view plain copy
  1. package cn.gome.k_personTask;  
  2.   
  3. import java.io.InputStream;  
  4. import java.util.HashMap;  
  5. import java.util.List;  
  6. import java.util.Map;  
  7.   
  8. import org.activiti.engine.ProcessEngine;  
  9. import org.activiti.engine.ProcessEngines;  
  10. import org.activiti.engine.repository.Deployment;  
  11. import org.activiti.engine.runtime.ProcessInstance;  
  12. import org.activiti.engine.task.Task;  
  13. import org.junit.Test;  
  14.   
  15. public class TaskTest {  
  16.       
  17.     //流程引擎对象  
  18.     ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();  
  19.       
  20.     /**部署流程定义+启动流程实例*/  
  21.     @Test  
  22.     public void deployementAndStartProcess(){  
  23.         InputStream inputStreamBpmn = this.getClass().getResourceAsStream("task.bpmn");  
  24.         InputStream inputStreampng = this.getClass().getResourceAsStream("task.png");  
  25.           
  26.         //部署流程定义  
  27.         Deployment deployment = processEngine.getRepositoryService()//  
  28.                         .createDeployment()//创建部署对象  
  29.                         .addInputStream("task.bpmn", inputStreamBpmn)//部署加载资源文件  
  30.                         .addInputStream("task.png", inputStreampng)  
  31.                         .name("个人任务演示")  
  32.                         .deploy();  
  33.         System.out.println("部署ID:"+deployment.getId());  
  34.           
  35.         //启动流程实例  
  36.         /** 
  37.          * 启动流程实例的同时,设置流程变量,使用流程变量的方式设置下一个任务的办理人 
  38.          *     流程变量的名称,就是在task.bpmn中定义#{userID}的userID 
  39.          *     流程变量的值,就是任务的办理人 
  40.          */  
  41.         Map<String, Object> variables = new HashMap<String, Object>();  
  42.         variables.put("userID""周江霄");  
  43.         ProcessInstance pi = processEngine.getRuntimeService()//  
  44.                 .startProcessInstanceByKey("task",variables);//使用流程定义的key的最新版本启动流程  
  45.         System.out.println("流程实例ID:"+pi.getId());  
  46.         System.out.println("流程定义的ID:"+pi.getProcessDefinitionId());  
  47.     }  
  48.       
  49.     /**查询我的个人任务*/  
  50.     @Test  
  51.     public void findPersonalTaskList(){  
  52.         //任务办理人  
  53.         String assignee = "周江霄";  
  54.         List<Task> list = processEngine.getTaskService()  
  55.                     .createTaskQuery()  
  56.                     .taskAssignee(assignee)//个人任务的查询  
  57.                     .list();  
  58.         if(list!=null && list.size()>0){  
  59.             for(Task task:list){  
  60.                 System.out.println("任务ID:"+task.getId());  
  61.                 System.out.println("任务的办理人:"+task.getAssignee());  
  62.                 System.out.println("任务名称:"+task.getName());  
  63.                 System.out.println("任务的创建时间:"+task.getCreateTime());  
  64.                 System.out.println("流程实例ID:"+task.getProcessInstanceId());  
  65.                 System.out.println("#######################################");  
  66.             }  
  67.         }  
  68.     }  
  69.       
  70.     /**完成任务*/  
  71.     @Test  
  72.     public void completeTask(){  
  73.         //任务ID  
  74.         String taskId = "5209";  
  75.         processEngine.getTaskService()  
  76.                         .complete(taskId);  
  77.         System.out.println("完成任务:"+taskId);  
  78.     }  
  79. }  

     方式三:使用类


     1.TaskListenerImpl类,用来设置任务的办理人

[java] view plain copy
  1. package cn.gome.l_personTask;  
  2.   
  3. import org.activiti.engine.delegate.DelegateTask;  
  4. import org.activiti.engine.delegate.TaskListener;  
  5.   
  6. public class TaskListenerImpl implements TaskListener{  
  7.   
  8.     /**设置任务的办理人(个人任务和组任务)*/  
  9.     @Override  
  10.     public void notify(DelegateTask delegateTask) {  
  11.         //指定个人任务  
  12.         delegateTask.setAssignee("郭靖");  
  13.     }  
  14.       
  15. }  

     2.流程图中配置任务节点监听


        

                                           图四  流程图中配置任务节点监听


     3.测试代码

[java] view plain copy
  1. package cn.gome.l_personTask;  
  2.   
  3. import java.io.InputStream;  
  4. import java.util.List;  
  5.   
  6. import org.activiti.engine.ProcessEngine;  
  7. import org.activiti.engine.ProcessEngines;  
  8. import org.activiti.engine.repository.Deployment;  
  9. import org.activiti.engine.runtime.ProcessInstance;  
  10. import org.activiti.engine.task.Task;  
  11. import org.junit.Test;  
  12.   
  13. public class TaskTest {  
  14.       
  15.     //流程引擎对象  
  16.     ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();  
  17.       
  18.     /**部署流程定义+启动流程实例*/  
  19.     @Test  
  20.     public void deployementAndStartProcess(){  
  21.         InputStream inputStreamBpmn = this.getClass().getResourceAsStream("task.bpmn");  
  22.         InputStream inputStreampng = this.getClass().getResourceAsStream("task.png");  
  23.         //部署流程定义  
  24.         Deployment deployment = processEngine.getRepositoryService()//  
  25.                         .createDeployment()//创建部署对象  
  26.                         .addInputStream("task.bpmn", inputStreamBpmn)//部署加载资源文件  
  27.                         .addInputStream("task.png", inputStreampng)//  
  28.                         .deploy();  
  29.         System.out.println("部署ID:"+deployment.getId());  
  30.         //启动流程实例  
  31.         ProcessInstance pi = processEngine.getRuntimeService()//  
  32.                     .startProcessInstanceByKey("task");//使用流程定义的key的最新版本启动流程  
  33.         System.out.println("流程实例ID:"+pi.getId());  
  34.         System.out.println("流程定义的ID:"+pi.getProcessDefinitionId());  
  35.     }  
  36.       
  37.     /**查询我的个人任务*/  
  38.     @Test  
  39.     public void findPersonalTaskList(){  
  40.         //任务办理人  
  41.         String assignee = "郭靖";  
  42.         List<Task> list = processEngine.getTaskService()//  
  43.                     .createTaskQuery()//  
  44.                     .taskAssignee(assignee)//个人任务的查询  
  45.                         .list();  
  46.         if(list!=null && list.size()>0){  
  47.             for(Task task:list){  
  48.                 System.out.println("任务ID:"+task.getId());  
  49.                 System.out.println("任务的办理人:"+task.getAssignee());  
  50.                 System.out.println("任务名称:"+task.getName());  
  51.                 System.out.println("任务的创建时间:"+task.getCreateTime());  
  52.                 System.out.println("流程实例ID:"+task.getProcessInstanceId());  
  53.                 System.out.println("#######################################");  
  54.             }  
  55.         }  
  56.     }  
  57.       
  58.     /**完成任务*/  
  59.     @Test  
  60.     public void completeTask(){  
  61.         //任务ID  
  62.         String taskId = "5408";  
  63.         processEngine.getTaskService().complete(taskId);  
  64.         System.out.println("完成任务:"+taskId);  
  65.     }  
  66.       
  67.     /**将个人任务从一个人分配给另一个人*/  
  68.     @Test  
  69.     public void setAssignee(){  
  70.         //指定任务的办理人  
  71.         String userId = "黄蓉";  
  72.         //任务ID  
  73.         String taskId = "5408";  
  74.         processEngine.getTaskService()//  
  75.                 .setAssignee(taskId, userId);  
  76.     }  
  77.       
  78. }  

           总结:

     通过对比,我们发现,分配个人任务的三种方式中,第一种欠灵活,后面两种都还是不错的,可以在项目中灵活的分配个人任务。

0 0
原创粉丝点击