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("猪八戒");}}
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
- Activiti进阶(十一)——分配组任务的三种方式
- Activiti进阶(十一)——分配组任务的三种方式
- Activiti进阶(十一)——分配组任务的三种方式
- Activiti(十一)——分配组任务的三种方式
- Activiti进阶(十)——分配个人任务的三种方式
- Activiti进阶(十)——分配个人任务的三种方式
- Activiti(十)——分配个人任务的三种方式
- Activiti 分配组任务(三种方式)
- Activiti 分配组任务(三种方式)
- activiti组任务及三种分配方式
- activiti个人任务及三种分配方式
- Activiti进阶(二)——部署流程资源的三种方式
- Activiti进阶(二)——部署流程资源的三种方式
- Activiti进阶(二)——部署流程资源的三种方式
- activiti 组任务指定办理人三种方式(十一)
- Activiti — 动态任务分配
- Activiti进阶(三)——流程定义的CRUD
- Activiti进阶(三)——流程定义的CRUD
- sqoop导入导出数据库文件
- Android高效率编码-第三方SDK详解系列(二)——Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能
- 牛客网 | 猫狗收容所
- Canvas中的非零环绕规则原理
- 浅谈Activity启动模式
- Activiti进阶(十一)——分配组任务的三种方式
- 网络协议之《网络七层协议》
- Comparator字母排序
- jquery自动刷新页面的几种方法
- JVM可支持的最大线程数(转)
- 括号层次
- 《Java Web程序开发入门》知识总结(四)
- 用currentStyle和getCompusedStyle获取元素的样式
- sklearn系列之----开山篇