一、Candidate-users候选人

1、需求

  在流程定义中在任务节点的assignee固定设置任务负责人,在流程定义时将参数者固定设置在.bpmn文件中,如果临时任务负责人变更则需要修改流程定义,系统可扩展性差;

  针对这种情况可以给任务设置多个候选人,可以从候选人中选择参与者来完成任务;

2、设置任务候选人

  在流程图中任务节点的配置中设置candidate-users(候选人)多个候选人之间用逗号分开;

  

查看bpmn文件:

  

  可以看到部门经理的审批人已经设置为zhangsan,lisi这样的一组候选人,可以使用activiti:candiateUsers=“用户1,用户2,用户3”这样的方式来设置一组候选人;

3、办理组任务

  (1)查询组任务

    指定候选人,查询该候选人当前的代办任务;

  (2)拾取任务

    该组任务的所有候选人都能拾取;

    将候选人的组任务,变成个人任务;原来候选人就变成了该任务的负责人;

    如果不想办理该任务,需要将已经拾取的个人任务归还给组里,将个人任务变成组任务;

  (3)查询个人任务

    查询方式同个人任务部分,根据assignee查询用户负责的个人任务;

  (4)办理个人任务

二、实例展示

1、创建请假流程图

  

2、流程部署

package com.zn;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Deployment;
import org.junit.Test; public class ActivitiGroup {
/**
* 流程部署
*/
@Test
public void deployment() {
//获取ProcessEngine对象 默认配置文件名称:activiti.cfg.xml 并且configuration的Bean实例ID为processEngineConfiguration
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取RepositoryService对象进行流程部署
RepositoryService repositoryService = processEngine.getRepositoryService();
//进行部署,将对应的流程定义文件生成到数据库当中,作为记录进行保存
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("bmpnfiles/holidayGroup.bpmn") //加载流程文件
.addClasspathResource("bmpnfiles/holidayGroup.png")
.name("请假流程-组任务") //设置流程名称
.key("holiday")
.deploy(); //部署 //输出部署信息
System.out.println("流程名称:" + deployment.getName());
System.out.println("流程ID:" + deployment.getId());
System.out.println("流程Key:" + deployment.getKey());
}
}

数据库展示:

  

3、启动流程实例 

package com.zn;

import com.zn.entity.Holiday;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.junit.Test; import java.util.HashMap;
import java.util.Map; public class ActivitiGroup { /**
* 启动流程实例
*/
@Test
public void getInstance() {
//获取ProcessEngine对象 默认配置文件名称:activiti.cfg.xml 并且configuration的Bean实例ID为processEngineConfiguration
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取RuntimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
//设置流程变量 启动流程时设置
Holiday holiday=new Holiday();
holiday.setNum(3);
//定义一个map集合,存放assignee的值
Map<String ,Object> assMap=new HashMap<>();
assMap.put("holiday",holiday);
//启动一个流程实例
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("holidayGroup", assMap);
System.out.println("流程启动成功~");
}
}

数据库展示: 

  

4、提交任务

package com.zn;

import com.zn.entity.Holiday;
import org.activiti.engine.*;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test; import java.util.HashMap;
import java.util.Map; public class ActivitiGroup { /*
*任务处理
*/
@Test
public void completeTask(){
//获取ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取TaskService对象
TaskService taskService = processEngine.getTaskService();
//查询到自己的任务,然后通过任务ID进行提交
Task task = taskService.createTaskQuery().processDefinitionKey("holidayGroup").taskAssignee("xiaowang").singleResult();
//任务处理
taskService.complete(task.getId());
}
}

数据库展示: 

  

5、用户查询组任务

package com.zn;

import com.zn.entity.Holiday;
import org.activiti.engine.*;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test; import java.util.HashMap;
import java.util.List;
import java.util.Map; public class ActivitiGroup { /**
* 查询组任务
*/
@Test
public void getGroupTask(){
//获取ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取TaskService对象
TaskService taskService = processEngine.getTaskService();
//查询组任务
List<Task> list = taskService.createTaskQuery().processDefinitionKey("holidayGroup").taskCandidateUser("zhangsan").list();
for (Task task:list) {
System.out.println("任务ID:"+task.getId());
//如果当前不是此任务处理人则处理不了该任务
/*taskService.complete(task.getId());*/
System.out.println("任务名称:"+task.getName());
System.out.println("任务处理人:"+task.getAssignee()); //Null代表 没有处理人说明当前任务没有人拾取
}
}
}

数据库:

  

6、用户拾取组任务

package com.zn;

import com.zn.entity.Holiday;
import org.activiti.engine.*;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test; import java.util.HashMap;
import java.util.List;
import java.util.Map; public class ActivitiGroup { /**
* 拾取任务
*/
@Test
public void claimTask() {
//获取ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取TaskService对象
TaskService taskService = processEngine.getTaskService();
//获取组任务
String candidateUser="zhangsan";
Task task = taskService.createTaskQuery().processDefinitionKey("holidayGroup").taskCandidateUser(candidateUser).singleResult();
//不等于Null代表能够获取到该任务
if(task!=null){
//拾取任务 任务ID,任务执行人
taskService.claim(task.getId(),candidateUser);
System.out.println("任务被:"+candidateUser+"拾取~");
}
}
}

数据库:

  

说明:

  即使该用户不是候选人也能拾取,建议拾取时校验是否有资格组任务拾取后,该任务已有负责人,通过候选人将查询不到该任务

7、用户查询处理个人代办任务

package com.zn;

import com.zn.entity.Holiday;
import org.activiti.engine.*;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test; import java.util.HashMap;
import java.util.List;
import java.util.Map; public class ActivitiGroup { /**
* 查看任务
*/
@Test
public void getTask() {
//获取ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取TaskService对象
TaskService taskService = processEngine.getTaskService();
//查询到自己的任务,然后通过任务ID进行提交
Task task = taskService.createTaskQuery().processDefinitionKey("holidayGroup").taskAssignee("zhangsan").singleResult();
//处理任务
if(task!=null){
taskService.complete(task.getId());
System.out.println("任务处理完毕");
}
}
}

数据库:

  

8、归还组任务

package com.zn;

import com.zn.entity.Holiday;
import org.activiti.engine.*;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test; import java.util.HashMap;
import java.util.List;
import java.util.Map; public class ActivitiGroup {
/**
* 流程部署
*/
@Test
public void deployment() {
//获取ProcessEngine对象 默认配置文件名称:activiti.cfg.xml 并且configuration的Bean实例ID为processEngineConfiguration
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取RepositoryService对象进行流程部署
RepositoryService repositoryService = processEngine.getRepositoryService();
//进行部署,将对应的流程定义文件生成到数据库当中,作为记录进行保存
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("bmpnfiles/holidayGroup.bpmn") //加载流程文件
.addClasspathResource("bmpnfiles/holidayGroup.png")
.name("请假流程-组任务") //设置流程名称
.key("holiday")
.deploy(); //部署 //输出部署信息
System.out.println("流程名称:" + deployment.getName());
System.out.println("流程ID:" + deployment.getId());
System.out.println("流程Key:" + deployment.getKey());
} /**
* 启动流程实例
*/
@Test
public void getInstance() {
//获取ProcessEngine对象 默认配置文件名称:activiti.cfg.xml 并且configuration的Bean实例ID为processEngineConfiguration
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取RuntimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
//设置流程变量 启动流程时设置
Holiday holiday=new Holiday();
holiday.setNum(3);
//定义一个map集合,存放assignee的值
Map<String ,Object> assMap=new HashMap<>();
assMap.put("holiday",holiday);
//启动一个流程实例
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("holidayGroup", assMap);
System.out.println("流程启动成功~");
} /*
*任务处理
*/
@Test
public void completeTask(){
//获取ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取TaskService对象
TaskService taskService = processEngine.getTaskService();
//查询到自己的任务,然后通过任务ID进行提交
Task task = taskService.createTaskQuery().processDefinitionKey("holidayGroup").taskAssignee("xiaowang").singleResult();
//任务处理
taskService.complete(task.getId());
} /**
* 查询组任务
*/
@Test
public void getGroupTask(){
//获取ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取TaskService对象
TaskService taskService = processEngine.getTaskService();
//查询组任务
List<Task> list = taskService.createTaskQuery().processDefinitionKey("holidayGroup").taskCandidateUser("zhangsan").list();
for (Task task:list) {
System.out.println("任务ID:"+task.getId());
//如果当前不是此任务处理人则处理不了该任务
/*taskService.complete(task.getId());*/
System.out.println("任务名称:"+task.getName());
System.out.println("任务处理人:"+task.getAssignee()); //Null代表 没有处理人说明当前任务没有人拾取
}
} /**
* 拾取任务
*/
@Test
public void claimTask() {
//获取ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取TaskService对象
TaskService taskService = processEngine.getTaskService();
//获取组任务
String candidateUser="zhangsan";
Task task = taskService.createTaskQuery().processDefinitionKey("holidayGroup").taskCandidateUser(candidateUser).singleResult();
//不等于Null代表能够获取到该任务
if(task!=null){
//拾取任务 任务ID,任务执行人
taskService.claim(task.getId(),candidateUser);
System.out.println("任务被:"+candidateUser+"拾取~");
}
} /**
* 任务退回/交接
*/
@Test
public void taskReturn(){
//获取ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取TaskService对象
TaskService taskService = processEngine.getTaskService();
//查询到自己的任务,然后通过任务ID进行提交
Task task = taskService.createTaskQuery().processDefinitionKey("holidayGroup").taskAssignee("zhangsan").singleResult(); if(task!=null){
//任务退回 任务ID null代表没有处理人执行,需要后续再次拾取任务
//任务交接 任务ID 如果第二个参数,处理人不为空代表将该任务交给次处理人
taskService.setAssignee(task.getId(),null);
System.out.println("任务退回");
}
}
}

数据库:

  

9、任务交接

package com.zn;

import com.zn.entity.Holiday;
import org.activiti.engine.*;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test; import java.util.HashMap;
import java.util.List;
import java.util.Map; public class ActivitiGroup {
/**
* 流程部署
*/
@Test
public void deployment() {
//获取ProcessEngine对象 默认配置文件名称:activiti.cfg.xml 并且configuration的Bean实例ID为processEngineConfiguration
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取RepositoryService对象进行流程部署
RepositoryService repositoryService = processEngine.getRepositoryService();
//进行部署,将对应的流程定义文件生成到数据库当中,作为记录进行保存
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("bmpnfiles/holidayGroup.bpmn") //加载流程文件
.addClasspathResource("bmpnfiles/holidayGroup.png")
.name("请假流程-组任务") //设置流程名称
.key("holiday")
.deploy(); //部署 //输出部署信息
System.out.println("流程名称:" + deployment.getName());
System.out.println("流程ID:" + deployment.getId());
System.out.println("流程Key:" + deployment.getKey());
} /**
* 启动流程实例
*/
@Test
public void getInstance() {
//获取ProcessEngine对象 默认配置文件名称:activiti.cfg.xml 并且configuration的Bean实例ID为processEngineConfiguration
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取RuntimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
//设置流程变量 启动流程时设置
Holiday holiday=new Holiday();
holiday.setNum(3);
//定义一个map集合,存放assignee的值
Map<String ,Object> assMap=new HashMap<>();
assMap.put("holiday",holiday);
//启动一个流程实例
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("holidayGroup", assMap);
System.out.println("流程启动成功~");
} /*
*任务处理
*/
@Test
public void completeTask(){
//获取ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取TaskService对象
TaskService taskService = processEngine.getTaskService();
//查询到自己的任务,然后通过任务ID进行提交
Task task = taskService.createTaskQuery().processDefinitionKey("holidayGroup").taskAssignee("xiaowang").singleResult();
//任务处理
taskService.complete(task.getId());
} /**
* 查询组任务
*/
@Test
public void getGroupTask(){
//获取ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取TaskService对象
TaskService taskService = processEngine.getTaskService();
//查询组任务
List<Task> list = taskService.createTaskQuery().processDefinitionKey("holidayGroup").taskCandidateUser("zhangsan").list();
for (Task task:list) {
System.out.println("任务ID:"+task.getId());
//如果当前不是此任务处理人则处理不了该任务
/*taskService.complete(task.getId());*/
System.out.println("任务名称:"+task.getName());
System.out.println("任务处理人:"+task.getAssignee()); //Null代表 没有处理人说明当前任务没有人拾取
}
} /**
* 拾取任务
*/
@Test
public void claimTask() {
//获取ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取TaskService对象
TaskService taskService = processEngine.getTaskService();
//获取组任务
String candidateUser="lisi";
Task task = taskService.createTaskQuery().processDefinitionKey("holidayGroup").taskCandidateUser(candidateUser).singleResult();
//不等于Null代表能够获取到该任务
if(task!=null){
//拾取任务 任务ID,任务执行人
taskService.claim(task.getId(),candidateUser);
System.out.println("任务被:"+candidateUser+"拾取~");
}
} /**
* 任务交接
*/
@Test
public void taskReturnAll(){
//获取ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取TaskService对象
TaskService taskService = processEngine.getTaskService();
//查询到自己的任务,然后通过任务ID进行提交
Task task = taskService.createTaskQuery().processDefinitionKey("holidayGroup").taskAssignee("lisi").singleResult(); if(task!=null){
//任务退回 任务ID null代表没有处理人执行,需要后续再次拾取任务
//任务交接 任务ID 如果第二个参数,处理人不为空代表将该任务交给次处理人
taskService.setAssignee(task.getId(),"zhangsan");
System.out.println("任务交接成功!");
}
}
}

数据库:

  

Activiti组任务的更多相关文章

  1. Activiti组任务(十)

    1 Candidate-users 候选人 1.1需求 在流程定义中在任务结点的 assignee 固定设置任务负责人,在流程定义时将参与者固定设置在.bpmn 文件中,如果临时任务负责人变更则需要修 ...

  2. 工作流Activiti框架中的LDAP组件使用详解!实现对工作流目录信息的分布式访问及访问控制

    Activiti集成LDAP简介 企业在LDAP系统中保存了用户和群组信息,Activiti提供了一种解决方案,通过简单的配置就可以让activit连接LDAP 用法 要想在项目中集成LDAP,需要在 ...

  3. Activiti第三篇【连接、排他网关、指定任务处理人、组任务】

    连线 上面我们已将学过了流程变量了,可以在[任务服务.运行时服务.流程开始.完成某个任务时设置流程变量],而我们的连接就是流程变量的实际应用了-. 定义流程图 我们并不是所有的流程都是按一条的路径来走 ...

  4. activiti 工作流 动态 设置 指定 节点任务人、责任人、组 的实现方式

    首先给大家看一下我的流程图: 流程文件leaveBill.bpmn <?xml version="1.0" encoding="UTF-8"?>&l ...

  5. 2017.2.28 activiti实战--第五章--用户与组及部署管理(三)部署流程及资源读取

    学习资料:<Activiti实战> 第五章 用户与组及部署管理(三)部署流程及资源读取 内容概览:如何利用API读取已经部署的资源,比如读取流程定义的XML文件,或流程对应的图片文件. 以 ...

  6. 2017.2.28 activiti实战--第五章--用户与组及部署管理(二)部署流程资源

    学习资料:<Activiti实战> 第五章 用户与组及部署管理(二)部署流程资源 内容概览:讲解流程资源的读取与部署. 5.2 部署流程资源 5.2.1 流程资源 流程资源常用的有以下几种 ...

  7. 2017.2.20 activiti实战--第五章--用户与组及部署管理(一)用户与组

    学习资料:<Activiti实战> 第五章 用户与组及部署管理(一)用户与组 内容概览:讲解activiti中内置的一套用户.组的关系,以及如何通过API添加.删除.查询. 5.1 用户与 ...

  8. activiti 工作流动态设置指定节点任务人、责任人、组的实现方式

    首先给大家看一下我的流程图: 流程文件leaveBill.bpmn <?xml version="1.0" encoding="UTF-8"?>&l ...

  9. 流程activiti的组和用户的使用

    一.数据表增加用户和分组 1.建立用户 2.建立组 3.建立用户和组的关联关系 二.新建测试流程 1.流程整体 2.设置“部门经理”任务的属性,填写组的ID 3.设置“总经理”任务的属性,填写组的ID ...

随机推荐

  1. Jsp页面中动态的引入另一个jsp,jsp:include路径是变量的实现

    1 问题描述 在页面搭建时,会有这样的需求,希望局部页面动态的引用另一个jsp.这里的"动态"的意思引用的jsp的路径是个变量.举个例子,我们希望局部页面可能是page1.jsp或 ...

  2. arm 添加 ftp server 之 bftpd

    本来想装vsftp 结果装上以后执行报错 Segmentation fault , 换到几个 其它的小型ftp server 软件 ,试了 Stupid-FTPd,不能用. bftpd 可以使用,Ti ...

  3. django 验证码图片生成视图函数

    def verify_code(request): import random # 定义验证码图片背景颜色 宽和高 bgcolor = (random.randrange(20,180),random ...

  4. Redis使用指南

    原文链接 能坚持别人不能坚持的,才能拥有别人未曾拥有的.关注编程大道公众号,让我们一同坚持心中所想,一起成长!! 设置过期时间.释放资源 使用Redis做K-V存储,一定要注意过期时间的把控,任何K- ...

  5. Python数据基本类型3

    -*- coding:utf-8 -*-字典 键值对数据 dict dic = {'键':'值'}存储数据 字典的查找快一些不可哈希的,就是可变的数据 可变的数据不能哈希 不可变的数据能哈希 pyth ...

  6. Kona JDK 在腾讯大数据领域内的实践与发展

    导语 | 近日,云+社区技术沙龙“腾讯开源技术”圆满落幕.本次沙龙邀请了多位腾讯技术专家,深度揭秘了腾讯开源项目TencentOS tiny.TubeMQ.Kona JDK.TARS以及Medical ...

  7. python获取群成员信息

    #coding: utf-8 import itchat,datetime from itchat.content import TEXT itchat.auto_login(hotReload=Tr ...

  8. 网络安全从入门到精通 (第二章-2) 后端基础SQL—MySQL数据库简介及SQL语法

    本文内容: 什么是数据库 常见数据库 数据库的基本知识 基本SQL语法 1,什么是数据库? 数据库就是将大量数据保存起来,通过计算机加工,可以高效访问的数据聚合. 数据库就是长期存储在计算机内,有组织 ...

  9. vue后台管理系统权限处理

    vue后台管理系统权限 1.权限问题:用户和管理员进入管理系统看到的模块是不一样的,管理员看的的要比用户看到的多.需要用到动态加载路由,router.addRouters()来动态的挂载路由 // 1 ...

  10. iOS开发:判断iPhone是否是刘海屏iPhoneX、iPhoneXR、iPhoneXs、iPhoneXs Max等

    保证能判断,呕心沥血,不行切JIJI 方法一 Objective-C // iPhoneX.iPhoneXR.iPhoneXs.iPhoneXs Max等 // 判断刘海屏,返回YES表示是刘海屏 - ...