Activiti进阶(十一)——分配组任务的三种方式

来源:互联网 发布:基础设施建设投资数据 编辑:程序博客网 时间:2024/05/15 12:09

     上一篇博客我们讲了分配个人任务的三种方式,这篇博客我们来介绍一下分配组任务的三种方式。


     一、流程图


                                           

                                            图一  分配组任务的三种方式  



     二、分配组任务方式一:直接指定办理人


     1.在任务节点设置办理人


     


     2.测试代码

package cn.gome.m_groupTask;import java.io.InputStream;import java.util.HashMap;import java.util.List;import java.util.Map;import org.activiti.engine.ProcessEngine;import org.activiti.engine.ProcessEngines;import org.activiti.engine.history.HistoricIdentityLink;import org.activiti.engine.repository.Deployment;import org.activiti.engine.runtime.ProcessInstance;import org.activiti.engine.task.IdentityLink;import org.activiti.engine.task.Task;import org.junit.Test;public class TaskTest {// 流程引擎对象ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();/**部署流程定义+启动流程实例:3905*/@Testpublic void deployementAndStartProcess() {//1.发布流程InputStream inputStreamBpmn = this.getClass().getResourceAsStream("task.bpmn");InputStream inputStreamPng = this.getClass().getResourceAsStream("task.png");processEngine.getRepositoryService()//.createDeployment()//.addInputStream("task.bpmn", inputStreamBpmn)//.addInputStream("task.png", inputStreamPng)//.deploy();//2.启动流程ProcessInstance pi = processEngine.getRuntimeService()//.startProcessInstanceByKey("task");System.out.println("pid:" + pi.getId());}/**查询我的个人任务,没有执行结果*/@Testpublic void findPersonalTaskList() {// 任务办理人String assignee = "小A";List<Task> list = processEngine.getTaskService()//.createTaskQuery()//.taskAssignee(assignee)// 个人任务的查询.list();if (list != null && list.size() > 0) {for (Task task : list) {System.out.println("任务ID:" + task.getId());System.out.println("任务的办理人:" + task.getAssignee());System.out.println("任务名称:" + task.getName());System.out.println("任务的创建时间:" + task.getCreateTime());System.out.println("流程实例ID:" + task.getProcessInstanceId());System.out.println("#######################################");}}}/**查询组任务*/@Testpublic void findGroupTaskList() {// 任务办理人String candidateUser = "小A";List<Task> list = processEngine.getTaskService()//.createTaskQuery()//.taskCandidateUser(candidateUser)// 参与者,组任务查询.list();if (list != null && list.size() > 0) {for (Task task : list) {System.out.println("任务ID:" + task.getId());System.out.println("任务的办理人:" + task.getAssignee());System.out.println("任务名称:" + task.getName());System.out.println("任务的创建时间:" + task.getCreateTime());System.out.println("流程实例ID:" + task.getProcessInstanceId());System.out.println("#######################################");}}}/**完成任务*/@Testpublic void completeTask() {// 任务IDString taskId = "3708";processEngine.getTaskService()//.complete(taskId);System.out.println("完成任务:" + taskId);}/**查询正在执行的组任务列表*/@Testpublic void findGroupCandidate() {// 任务IDString taskId = "3708";List<IdentityLink> list = processEngine.getTaskService()//.getIdentityLinksForTask(taskId);if (list != null && list.size() > 0) {for (IdentityLink identityLink : list) {System.out.println("任务ID:" + identityLink.getTaskId());System.out.println("流程实例ID:"+ identityLink.getProcessInstanceId());System.out.println("用户ID:" + identityLink.getUserId());System.out.println("工作流角色ID:" + identityLink.getGroupId());System.out.println("#########################################");}}}/**查询历史的组任务列表*/@Testpublic void findHistoryGroupCandidate() {// 流程实例IDString processInstanceId = "3705";List<HistoricIdentityLink> list = processEngine.getHistoryService().getHistoricIdentityLinksForProcessInstance(processInstanceId);if (list != null && list.size() > 0) {for (HistoricIdentityLink identityLink : list) {System.out.println("任务ID:" + identityLink.getTaskId());System.out.println("流程实例ID:"+ identityLink.getProcessInstanceId());System.out.println("用户ID:" + identityLink.getUserId());System.out.println("工作流角色ID:" + identityLink.getGroupId());System.out.println("#########################################");}}}}


     说明:

     1)小A,小B,小C,小D是组任务的办理人

     2)但是这样分配组任务的办理人不够灵活,因为项目开发中任务的办理人不要放置XML文件中。

     3)act_ru_identitylink表存放组任务的办理人,表示正在执行的任务

     4)act_hi_identitylink表存放所有任务的办理人,包括个人任务和组任务表示历史任务


           三、分配组任务方式二:使用流程变量


     1.在任务节点设置变量

     


     2.测试代码

public class TaskTest {//流程引擎对象ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();/**部署流程定义+启动流程实例*/@Testpublic void deployementAndStartProcess(){InputStream inputStreamBpmn = this.getClass().getResourceAsStream("task.bpmn");InputStream inputStreampng = this.getClass().getResourceAsStream("task.png");//部署流程定义Deployment deployment = processEngine.getRepositoryService()//.createDeployment()//创建部署对象.addInputStream("task.bpmn", inputStreamBpmn)//部署加载资源文件.addInputStream("task.png", inputStreampng)//.deploy();System.out.println("部署ID:"+deployment.getId());//启动流程实例/** * 启动流程实例的同时,设置流程变量,使用流程变量的方式设置下一个任务的办理人 * 流程变量的名称,就是在task.bpmn中定义activiti:candidateUsers="#{userIDs}"的userIDs *  流程变量的值,就是任务的办理人(组任务) */Map<String, Object> variables = new HashMap<String, Object>();variables.put("userIDs", "大大,中中,小小");ProcessInstance pi = processEngine.getRuntimeService()//.startProcessInstanceByKey("task",variables);//使用流程定义的key的最新版本启动流程System.out.println("流程实例ID:"+pi.getId());System.out.println("流程定义的ID:"+pi.getProcessDefinitionId());}/**查询我的个人任务*/@Testpublic void findPersonalTaskList(){//任务办理人String assignee = "小A";List<Task> list = processEngine.getTaskService()//.createTaskQuery()//.taskAssignee(assignee)//个人任务的查询.list();if(list!=null && list.size()>0){for(Task task:list){System.out.println("任务ID:"+task.getId());System.out.println("任务的办理人:"+task.getAssignee());System.out.println("任务名称:"+task.getName());System.out.println("任务的创建时间:"+task.getCreateTime());System.out.println("流程实例ID:"+task.getProcessInstanceId());System.out.println("#######################################");}}}/**查询组任务*/@Testpublic void findGroupTaskList(){//任务办理人String candidateUser = "小A";List<Task> list = processEngine.getTaskService()//.createTaskQuery()//.taskCandidateUser(candidateUser)//参与者,组任务查询.list();if(list!=null && list.size()>0){for(Task task:list){System.out.println("任务ID:"+task.getId());System.out.println("任务的办理人:"+task.getAssignee());System.out.println("任务名称:"+task.getName());System.out.println("任务的创建时间:"+task.getCreateTime());System.out.println("流程实例ID:"+task.getProcessInstanceId());System.out.println("#######################################");}}}/**完成任务*/@Testpublic void completeTask(){//任务IDString taskId = "5909";processEngine.getTaskService()//.complete(taskId);System.out.println("完成任务:"+taskId);}/**查询正在执行的组任务列表*/@Testpublic void findGroupCandidate(){//任务IDString taskId = "5909";List<IdentityLink> list = processEngine.getTaskService()//.getIdentityLinksForTask(taskId);if(list!=null && list.size()>0){for(IdentityLink identityLink:list){System.out.println("任务ID:"+identityLink.getTaskId());System.out.println("流程实例ID:"+identityLink.getProcessInstanceId());System.out.println("用户ID:"+identityLink.getUserId());System.out.println("工作流角色ID:"+identityLink.getGroupId());System.out.println("#########################################");}}}/**查询历史的组任务列表*/@Testpublic void findHistoryGroupCandidate(){//流程实例IDString processInstanceId = "5905";List<HistoricIdentityLink> list = processEngine.getHistoryService().getHistoricIdentityLinksForProcessInstance(processInstanceId);if(list!=null && list.size()>0){for(HistoricIdentityLink identityLink:list){System.out.println("任务ID:"+identityLink.getTaskId());System.out.println("流程实例ID:"+identityLink.getProcessInstanceId());System.out.println("用户ID:"+identityLink.getUserId());System.out.println("工作流角色ID:"+identityLink.getGroupId());System.out.println("#########################################");}}}}

             四、分配组任务方式三:使用类


     1.编写类

public class TaskListenerImpl implements TaskListener {/** * 可以设置任务的办理人(个人组人和组任务) */@Overridepublic void notify(DelegateTask delegateTask) {//指定组任务delegateTask.addCandidateUser("孙悟空");delegateTask.addCandidateUser("猪八戒");}}


     2.设置任务监听

     


     3.测试代码

public class TaskTest {//流程引擎对象ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();/**部署流程定义+启动流程实例*/@Testpublic void deployementAndStartProcess(){InputStream inputStreamBpmn = this.getClass().getResourceAsStream("task.bpmn");InputStream inputStreampng = this.getClass().getResourceAsStream("task.png");//部署流程定义Deployment deployment = processEngine.getRepositoryService()//.createDeployment()//创建部署对象.addInputStream("task.bpmn", inputStreamBpmn)//部署加载资源文件.addInputStream("task.png", inputStreampng)//.deploy();System.out.println("部署ID:"+deployment.getId());//启动流程实例ProcessInstance pi = processEngine.getRuntimeService()//.startProcessInstanceByKey("task");//使用流程定义的key的最新版本启动流程System.out.println("流程实例ID:"+pi.getId());System.out.println("流程定义的ID:"+pi.getProcessDefinitionId());}/**查询我的个人任务*/@Testpublic void findPersonalTaskList(){//任务办理人String assignee = "唐僧";List<Task> list = processEngine.getTaskService()//.createTaskQuery()//.taskAssignee(assignee)//个人任务的查询.list();if(list!=null && list.size()>0){for(Task task:list){System.out.println("任务ID:"+task.getId());System.out.println("任务的办理人:"+task.getAssignee());System.out.println("任务名称:"+task.getName());System.out.println("任务的创建时间:"+task.getCreateTime());System.out.println("流程实例ID:"+task.getProcessInstanceId());System.out.println("#######################################");}}}/**查询组任务*/@Testpublic void findGroupTaskList(){//任务办理人String candidateUser = "猪八戒";List<Task> list = processEngine.getTaskService()//.createTaskQuery()//.taskCandidateUser(candidateUser)//参与者,组任务查询.list();if(list!=null && list.size()>0){for(Task task:list){System.out.println("任务ID:"+task.getId());System.out.println("任务的办理人:"+task.getAssignee());System.out.println("任务名称:"+task.getName());System.out.println("任务的创建时间:"+task.getCreateTime());System.out.println("流程实例ID:"+task.getProcessInstanceId());System.out.println("#######################################");}}}/**完成任务*/@Testpublic void completeTask(){//任务IDString taskId = "6308";processEngine.getTaskService()//.complete(taskId);System.out.println("完成任务:"+taskId);}/**查询正在执行的组任务列表*/@Testpublic void findGroupCandidate(){//任务IDString taskId = "5909";List<IdentityLink> list = processEngine.getTaskService()//.getIdentityLinksForTask(taskId);if(list!=null && list.size()>0){for(IdentityLink identityLink:list){System.out.println("任务ID:"+identityLink.getTaskId());System.out.println("流程实例ID:"+identityLink.getProcessInstanceId());System.out.println("用户ID:"+identityLink.getUserId());System.out.println("工作流角色ID:"+identityLink.getGroupId());System.out.println("#########################################");}}}/**查询历史的组任务列表*/@Testpublic void findHistoryGroupCandidate(){//流程实例IDString processInstanceId = "5905";List<HistoricIdentityLink> list = processEngine.getHistoryService().getHistoricIdentityLinksForProcessInstance(processInstanceId);if(list!=null && list.size()>0){for(HistoricIdentityLink identityLink:list){System.out.println("任务ID:"+identityLink.getTaskId());System.out.println("流程实例ID:"+identityLink.getProcessInstanceId());System.out.println("用户ID:"+identityLink.getUserId());System.out.println("工作流角色ID:"+identityLink.getGroupId());System.out.println("#########################################");}}}/**将组任务指定个人任务(拾取任务)*/@Testpublic void claim(){//任务IDString taskId = "6308";//个人任务的办理人String userId = "唐僧";processEngine.getTaskService()//.claim(taskId, userId);}/**将个人任务再回退到组任务(前提:之前这个任务是组任务)*/@Testpublic void setAssignee(){//任务IDString taskId = "6308";processEngine.getTaskService()//.setAssignee(taskId, null);}/**向组任务中添加成员*/@Testpublic void addGroupUser(){//任务IDString taskId = "6308";//新增组任务的成员String userId = "如来";processEngine.getTaskService()//.addCandidateUser(taskId, userId);}/**向组任务中删除成员*/@Testpublic void deleteGroupUser(){//任务IDString taskId = "6308";//新增组任务的成员String userId = "猪八戒";processEngine.getTaskService()//.deleteCandidateUser(taskId, userId);}}

           总结:

     以上就是分配组任务的三种方式,和分配个人任务相对应,同样有三种方式,与个人任务的操作相比,组任务操

作增加了组任务分配个人任务(认领任务),个人任务分配给组任务,以及向组任务添加人员和向组任务删除人员的

操作。




2 0
原创粉丝点击