上一篇博客我们讲了分配个人任务的三种方式,这篇博客我们来介绍一下分配组任务的三种方式。
一、流程图
图一 分配组任务的三种方式
二、分配组任务方式一:直接指定办理人
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*/
- @Test
- public 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());
- }
- /**查询我的个人任务,没有执行结果*/
- @Test
- public 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("#######################################");
- }
- }
- }
- /**查询组任务*/
- @Test
- public 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("#######################################");
- }
- }
- }
- /**完成任务*/
- @Test
- public void completeTask() {
- // 任务ID
- String taskId = "3708";
- processEngine.getTaskService()//
- .complete(taskId);
- System.out.println("完成任务:" + taskId);
- }
- /**查询正在执行的组任务列表*/
- @Test
- public void findGroupCandidate() {
- // 任务ID
- String 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("#########################################");
- }
- }
- }
- /**查询历史的组任务列表*/
- @Test
- public void findHistoryGroupCandidate() {
- // 流程实例ID
- String 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();
- /**部署流程定义+启动流程实例*/
- @Test
- public 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());
- }
- /**查询我的个人任务*/
- @Test
- public 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("#######################################");
- }
- }
- }
- /**查询组任务*/
- @Test
- public 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("#######################################");
- }
- }
- }
- /**完成任务*/
- @Test
- public void completeTask(){
- //任务ID
- String taskId = "5909";
- processEngine.getTaskService()//
- .complete(taskId);
- System.out.println("完成任务:"+taskId);
- }
- /**查询正在执行的组任务列表*/
- @Test
- public void findGroupCandidate(){
- //任务ID
- String 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("#########################################");
- }
- }
- }
- /**查询历史的组任务列表*/
- @Test
- public void findHistoryGroupCandidate(){
- //流程实例ID
- String 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 {
- /**
- * 可以设置任务的办理人(个人组人和组任务)
- */
- @Override
- public void notify(DelegateTask delegateTask) {
- //指定组任务
- delegateTask.addCandidateUser("孙悟空");
- delegateTask.addCandidateUser("猪八戒");
- }
- }
3.测试代码
- public class TaskTest {
- //流程引擎对象
- ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
- /**部署流程定义+启动流程实例*/
- @Test
- public 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());
- }
- /**查询我的个人任务*/
- @Test
- public 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("#######################################");
- }
- }
- }
- /**查询组任务*/
- @Test
- public 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("#######################################");
- }
- }
- }
- /**完成任务*/
- @Test
- public void completeTask(){
- //任务ID
- String taskId = "6308";
- processEngine.getTaskService()//
- .complete(taskId);
- System.out.println("完成任务:"+taskId);
- }
- /**查询正在执行的组任务列表*/
- @Test
- public void findGroupCandidate(){
- //任务ID
- String 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("#########################################");
- }
- }
- }
- /**查询历史的组任务列表*/
- @Test
- public void findHistoryGroupCandidate(){
- //流程实例ID
- String 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("#########################################");
- }
- }
- }
- /**将组任务指定个人任务(拾取任务)*/
- @Test
- public void claim(){
- //任务ID
- String taskId = "6308";
- //个人任务的办理人
- String userId = "唐僧";
- processEngine.getTaskService()//
- .claim(taskId, userId);
- }
- /**将个人任务再回退到组任务(前提:之前这个任务是组任务)*/
- @Test
- public void setAssignee(){
- //任务ID
- String taskId = "6308";
- processEngine.getTaskService()//
- .setAssignee(taskId, null);
- }
- /**向组任务中添加成员*/
- @Test
- public void addGroupUser(){
- //任务ID
- String taskId = "6308";
- //新增组任务的成员
- String userId = "如来";
- processEngine.getTaskService()//
- .addCandidateUser(taskId, userId);
- }
- /**向组任务中删除成员*/
- @Test
- public void deleteGroupUser(){
- //任务ID
- String taskId = "6308";
- //新增组任务的成员
- String userId = "猪八戒";
- processEngine.getTaskService()//
- .deleteCandidateUser(taskId, userId);
- }
- }
总结:
以上就是分配组任务的三种方式,和分配个人任务相对应,同样有三种方式,与个人任务的操作相比,组任务操
作增加了组任务分配个人任务(认领任务),个人任务分配给组任务,以及向组任务添加人员和向组任务删除人员的
操作。