Activiti组任务
一、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组任务的更多相关文章
- Activiti组任务(十)
1 Candidate-users 候选人 1.1需求 在流程定义中在任务结点的 assignee 固定设置任务负责人,在流程定义时将参与者固定设置在.bpmn 文件中,如果临时任务负责人变更则需要修 ...
- 工作流Activiti框架中的LDAP组件使用详解!实现对工作流目录信息的分布式访问及访问控制
Activiti集成LDAP简介 企业在LDAP系统中保存了用户和群组信息,Activiti提供了一种解决方案,通过简单的配置就可以让activit连接LDAP 用法 要想在项目中集成LDAP,需要在 ...
- Activiti第三篇【连接、排他网关、指定任务处理人、组任务】
连线 上面我们已将学过了流程变量了,可以在[任务服务.运行时服务.流程开始.完成某个任务时设置流程变量],而我们的连接就是流程变量的实际应用了-. 定义流程图 我们并不是所有的流程都是按一条的路径来走 ...
- activiti 工作流 动态 设置 指定 节点任务人、责任人、组 的实现方式
首先给大家看一下我的流程图: 流程文件leaveBill.bpmn <?xml version="1.0" encoding="UTF-8"?>&l ...
- 2017.2.28 activiti实战--第五章--用户与组及部署管理(三)部署流程及资源读取
学习资料:<Activiti实战> 第五章 用户与组及部署管理(三)部署流程及资源读取 内容概览:如何利用API读取已经部署的资源,比如读取流程定义的XML文件,或流程对应的图片文件. 以 ...
- 2017.2.28 activiti实战--第五章--用户与组及部署管理(二)部署流程资源
学习资料:<Activiti实战> 第五章 用户与组及部署管理(二)部署流程资源 内容概览:讲解流程资源的读取与部署. 5.2 部署流程资源 5.2.1 流程资源 流程资源常用的有以下几种 ...
- 2017.2.20 activiti实战--第五章--用户与组及部署管理(一)用户与组
学习资料:<Activiti实战> 第五章 用户与组及部署管理(一)用户与组 内容概览:讲解activiti中内置的一套用户.组的关系,以及如何通过API添加.删除.查询. 5.1 用户与 ...
- activiti 工作流动态设置指定节点任务人、责任人、组的实现方式
首先给大家看一下我的流程图: 流程文件leaveBill.bpmn <?xml version="1.0" encoding="UTF-8"?>&l ...
- 流程activiti的组和用户的使用
一.数据表增加用户和分组 1.建立用户 2.建立组 3.建立用户和组的关联关系 二.新建测试流程 1.流程整体 2.设置“部门经理”任务的属性,填写组的ID 3.设置“总经理”任务的属性,填写组的ID ...
随机推荐
- C++读入输出优化
读入输出优化虽然对于小数据没有半点作用,但是对于大数据来说,可以优化几十ms. 有时就是那么几十ms,可以被卡掉大数据的点 读入优化 int read() { int x=0,sig=1; char ...
- 2019年最新老男孩高性能Web架构与自动化运维架构视频教程
课程目录L001-老男孩架构15期-Web架构之单机时代L002-老男孩架构15期-Web架构之集群时代L003-老男孩架构15期-Web架构之dnsL004-老男孩架构15期-Web架构之缓存体系L ...
- 机器学习 - LSTM应用之sequence generation
概述 LSTM在机器学习上面的应用是非常广泛的,从股票分析,机器翻译 到 语义分析等等各个方面都有它的用武之地,经过前面的对于LSTM结构的分析,这一节主要介绍一些LSTM的一个小应用,那就是sequ ...
- jQuery上传文件按钮美化
效果图如下: 思路: 1:打开文件设置为透明,外面包一层标签,给标签设置颜色背景,给人点击浏览其实是点击打开文件的错觉.(给外标签相对定位,打开文件标签绝对定位). 2:点击浏览后,选择了文件,就把文 ...
- vue中犯下的小错误(一)
在开发采筑平台SRM的移动项目中:一个页面,感觉没啥错误,但是页面报错如下: 页面中的data或者mothods都没有任何问题,但是这个报错很是让人纠结,后来发现,在使用子组件时候: 此tabShow ...
- cocoapods安装以及ZXingObjC的安装
因为项目要用到第三方包ZXingObjC,需要安装cocoapods.下面是我曲折的安装过程. 1.直接在终端内输入: sudo gem install cocoapods 我直接安装成功. 由于国内 ...
- Nginx 推流 拉流 --- 点播直播
1. 准备环境 安装操作系统Cenos 配置yum源 yum:https://developer.aliyun.com/mirror/ Nginx依赖 gcc-c++ zlib pcre openss ...
- SpringBoot——学习笔记
关于微服务和SOA 这,仅是我学习过程中记录的笔记.确定了一个待研究的主题,对这个主题进行全方面的剖析.笔记是用来方便我回顾与学习的,欢迎大家与我进行交流沟通,共同成长.不止是技术. 官网教程学习ht ...
- Array.isArray() 判断是不是数组
var arr = new Array(); if(Array.isArray()){ console.log('yes') } else { conssole.log('no') }
- vs2017打包exe安装包
1,安装扩展程序Install Projects 2,在打开的界面搜索Install,找到Install Projects 3,在要打包的项目解决方案下创建一个生成exe的项目 4,在打包项目的文件系 ...