上一篇博客我们讲了分配个人任务的三种方式,这篇博客我们来介绍一下分配组任务的三种方式。
一、流程图
图一 分配组任务的三种方式
二、分配组任务方式一:直接指定办理人
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 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 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 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 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 variables = new HashMap();
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 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 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 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 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 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 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 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 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);
}
}
以上就是分配组任务的三种方式,和分配个人任务相对应,同样有三种方式,与个人任务的操作相比,组任务操
作增加了组任务分配个人任务(认领任务),个人任务分配给组任务,以及向组任务添加人员和向组任务删除人员的
操作。