一、测试 分配任务候选人 (Task1这个任务的候选人有angus,候选组有managenment,以及boss )
1.1 新建候选人candidate.bpmn 在这个bpmn文件中直接用 potentialOwner配置(Task1这个任务的候选人有angus,候选组有managenment,以及boss )
1.2 修改candidate.bpmn 指定 Task1这个任务的候选人有user(angus),候选组有group(managenment),以及boss(候选组)
其中 angus, managenment,boss 均是数据库ID,对应的JAVA代码
Group managementGroup = identityService.newGroup("management");
Group bossGroup = identityService.newGroup("boss");
User angus = identityService.newUser("angus");
1.3 测试代码
//测试 分配任务候选人 (Task1这个任务的候选人有angus,候选组有managenment,以及boss )
public static void testCandidate(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务 和 用户组的管理服务 和TaskService 任务管理TaskService
RuntimeService runService = engine.getRuntimeService();
IdentityService identityService = engine.getIdentityService();
TaskService taskService = engine.getTaskService();
//用 identityService 添加 management和boss两个组--id,和angus-id这个人
Group managementGroup = identityService.newGroup("management");
managementGroup.setName("管理组");
Group bossGroup = identityService.newGroup("boss");
bossGroup.setName("老板组");
User angus = identityService.newUser("angus");
angus.setFirstName("MsLiu");
identityService.saveGroup(managementGroup);
identityService.saveGroup(bossGroup);
identityService.saveUser(angus);
// 启动服务
Deployment dep = rs.createDeployment().addClasspathResource("candidate.bpmn").deploy();
ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();
ProcessInstance pi = runService.startProcessInstanceById(pd.getId());
//查询当前流程节点即Task1 的候选人及组是不是我们定义的 <formalExpression>user(angus), group(management), boss
Task managementTask = taskService.createTaskQuery().taskCandidateGroup("management").singleResult(); //参数ID
Task bossTask = taskService.createTaskQuery().taskCandidateGroup("boss").singleResult(); //参数ID
Task angusTask = taskService.createTaskQuery().taskCandidateUser("angus").singleResult();//参数id
System.out.println("管理组可以认领的任务有 "+managementTask.getName());
System.out.println("老板组可以认领的任务有 "+bossTask.getName());
System.out.println("候选人MsLiu可以认领的任务有 "+angusTask.getName());
/*
输出结果:
管理组可以认领的任务有 Task1
老板组可以认领的任务有 Task1
候选人MsLiu可以认领的任务有 Task1
可以看到 我们在candidate.bpmn 中 设置 <formalExpression>user(angus), group(management), boss 的 management和boss两个组--id,和angus-id这个人
均有认领权限了
*/
}
二、测试 分配任务代理人,和测试 分配任务候选人,一样只是bpmn Task1代理人用的便签不一样,而且代理人于任务是一对一的关系,所以只能指定一个(bpmn中标签中放代理人的数据库id)
2.1 新建代理人Assignee.bpmn在这个bpmn文件中直接用 humanPerformer标签配置
2.2 修改Assignee.bpmn ,指定Task1任务代理人为deputy1
2.3 测试代码
//测试 分配代理人 (指定Task1这个任务的代理人是deputy1)
public static void testAssignee(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务 和 用户组的管理服务 和TaskService 任务管理TaskService
RuntimeService runService = engine.getRuntimeService();
IdentityService identityService = engine.getIdentityService();
TaskService taskService = engine.getTaskService();
//用 identityService 添加deputy1这个人
User deputy1 = identityService.newUser("deputy1");
deputy1.setFirstName("MsLiu");
identityService.saveUser(deputy1);
// 启动服务
Deployment dep = rs.createDeployment().addClasspathResource("Assignee.bpmn").deploy();
ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();
ProcessInstance pi = runService.startProcessInstanceById(pd.getId());
//查询当前流程节点即Task1 的候选人及组是不是我们定义的 <formalExpression>user(angus), group(management), boss
Task deputy1Task = taskService.createTaskQuery().taskAssignee("deputy1").singleResult();//查询deputy1 代理的任务
System.out.println("代理人MsLiu代理任务有 "+deputy1Task.getName());
/*
输出结果:
代理人MsLiu代理任务有 Task1
*/
}
三、activiti 的权利分配扩展方式来分配候选人和代理人,标签如下
四、使用任务监听器进行权限分配
如何配置任务监听器,在bpmn xml的 userTask任务节点的标签中配置任务监听的JAVA类,在上图的监听JAVA类代码中指定任务的候选人,候选组,代理人等即可
五、使用JUEL 表达式分配权限
5.1 新建候选人juel.bpmn
5.2 修改 juel.bpmn
在这个bpmn文件中 参考上上图直接用 我们在java代码的bean--authSevice 的自定义方法来获取指定 Task1这个任务的候选人, 而候选组,以及代理人就不测了,参照上上图在userTask换个activiti的扩展属性就可以了 )
、
5.3 java代码
AuthService.java
package com.xiangshuai.act.c19;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
public class AuthService implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
public List<String> getCandidateUsers(){
List<String> result=new ArrayList<String>();
result.add("userA");
result.add("userB");
return result;
}
}
测试方法
/*
测试 JUEL 表达式分配权限-- 将我们自定义的JAVABEAN AuthSevice在流程启动时,
用ByKey这个方法,然后将 带 "authService",new AuthSevice() 这个key,value的map作为参数加入,如下java代码,然后在juel.bpmn中及可识别了
Map<String, Object> vars=new HashMap<String, Object>();
vars.put("authService",new AuthService());
ProcessInstance pi = runService.startProcessInstanceByKey(pd.getKey(), vars);
*/
public static void testJuel(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务 和TaskService 任务管理TaskService
RuntimeService runService = engine.getRuntimeService();
TaskService taskService = engine.getTaskService();
// 启动服务
Deployment dep = rs.createDeployment().addClasspathResource("juel.bpmn").deploy();
ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();
/*
百度RuntimeService API
startProcessInstanceByKey(String processDefinitionKey, String businessKey)
Starts a new process instance in the latest version of the process definition with the given key.
*/
Map<String, Object> vars=new HashMap<String, Object>();
vars.put("authService",new AuthService());
ProcessInstance pi = runService.startProcessInstanceByKey(pd.getKey(), vars);
//查询userA 候选的任务--AuthService已定义好 <userTask id="usertask3" name="Task1" activiti:candidateUsers="${authService.getCandidateUsers()}">
Task userATask = taskService.createTaskQuery().taskCandidateUser("userA").singleResult();
System.out.println("候选人userA认领的任务有 "+userATask.getName());
/*
输出结果:
候选人userA认领的任务有 Task1
*/
}
总测试类 UserTaskTest1.java
package com.xiangshuai.act.c19;
import java.util.HashMap;
import java.util.Map;
import org.activiti.engine.IdentityService;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.identity.Group;
import org.activiti.engine.identity.User;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
/**
* @author lqx
* 文件在 E:\学习文档子目录压缩\框架\工作流引擎\Activiti6.0\window\复习步骤16- BPMN任务(1)用户任务
* 或 我的网盘\我的笔记\学习文档子目录压缩\框架\工作流引擎\Activiti6.0\window\复习步骤16- BPMN任务(1)用户任务
* 任务的代理人,候选人,候选组,及指定代理人,候选人,候选组的多种方式
*/
public class UserTaskTest1 {
public static void main(String[] args) {
//testCandidate();
//testAssignee();
testJuel();
}
//测试 分配任务候选人 (Task1这个任务的候选人有angus,候选组有managenment,以及boss )
public static void testCandidate(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务 和 用户组的管理服务 和TaskService 任务管理TaskService
RuntimeService runService = engine.getRuntimeService();
IdentityService identityService = engine.getIdentityService();
TaskService taskService = engine.getTaskService();
//用 identityService 添加 management和boss两个组--id,和angus-id这个人
Group managementGroup = identityService.newGroup("management");
managementGroup.setName("管理组");
Group bossGroup = identityService.newGroup("boss");
bossGroup.setName("老板组");
User angus = identityService.newUser("angus");
angus.setFirstName("MsLiu");
identityService.saveGroup(managementGroup);
identityService.saveGroup(bossGroup);
identityService.saveUser(angus);
// 启动服务
Deployment dep = rs.createDeployment().addClasspathResource("candidate.bpmn").deploy();
ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();
ProcessInstance pi = runService.startProcessInstanceById(pd.getId());
//查询当前流程节点即Task1 的候选人及组是不是我们定义的 <formalExpression>user(angus), group(management), boss
Task managementTask = taskService.createTaskQuery().taskCandidateGroup("management").singleResult(); //参数ID
Task bossTask = taskService.createTaskQuery().taskCandidateGroup("boss").singleResult(); //参数ID
Task angusTask = taskService.createTaskQuery().taskCandidateUser("angus").singleResult();//参数id
System.out.println("管理组可以认领的任务有 "+managementTask.getName());
System.out.println("老板组可以认领的任务有 "+bossTask.getName());
System.out.println("候选人MsLiu可以认领的任务有 "+angusTask.getName());
/*
输出结果:
管理组可以认领的任务有 Task1
老板组可以认领的任务有 Task1
候选人MsLiu可以认领的任务有 Task1
可以看到 我们在candidate.bpmn 中 设置 <formalExpression>user(angus), group(management), boss 的 management和boss两个组--id,和angus-id这个人
均有认领权限了
*/
}
//测试 分配代理人 (指定Task1这个任务的代理人是deputy1)
public static void testAssignee(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务 和 用户组的管理服务 和TaskService 任务管理TaskService
RuntimeService runService = engine.getRuntimeService();
IdentityService identityService = engine.getIdentityService();
TaskService taskService = engine.getTaskService();
//用 identityService 添加deputy1这个人
User deputy1 = identityService.newUser("deputy1");
deputy1.setFirstName("MsLiu");
identityService.saveUser(deputy1);
// 启动服务
Deployment dep = rs.createDeployment().addClasspathResource("Assignee.bpmn").deploy();
ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();
ProcessInstance pi = runService.startProcessInstanceById(pd.getId());
//查询当前流程节点即Task1 的候选人及组是不是我们定义的 <formalExpression>user(angus), group(management), boss
Task deputy1Task = taskService.createTaskQuery().taskAssignee("deputy1").singleResult();//查询deputy1 代理的任务
System.out.println("代理人MsLiu代理任务有 "+deputy1Task.getName());
/*
输出结果:
代理人MsLiu代理任务有 Task1
*/
}
/*
测试 JUEL 表达式分配权限-- 将我们自定义的JAVABEAN AuthSevice在流程启动时,
用ByKey这个方法,然后将 带 "authService",new AuthSevice() 这个key,value的map作为参数加入,如下java代码,然后在juel.bpmn中及可识别了
Map<String, Object> vars=new HashMap<String, Object>();
vars.put("authService",new AuthService());
ProcessInstance pi = runService.startProcessInstanceByKey(pd.getKey(), vars);
*/
public static void testJuel(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务 和TaskService 任务管理TaskService
RuntimeService runService = engine.getRuntimeService();
TaskService taskService = engine.getTaskService();
// 启动服务
Deployment dep = rs.createDeployment().addClasspathResource("juel.bpmn").deploy();
ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();
/*
百度RuntimeService API
startProcessInstanceByKey(String processDefinitionKey, String businessKey)
Starts a new process instance in the latest version of the process definition with the given key.
*/
Map<String, Object> vars=new HashMap<String, Object>();
vars.put("authService",new AuthService());
ProcessInstance pi = runService.startProcessInstanceByKey(pd.getKey(), vars);
//查询userA 候选的任务--AuthService已定义好 <userTask id="usertask3" name="Task1" activiti:candidateUsers="${authService.getCandidateUsers()}">
Task userATask = taskService.createTaskQuery().taskCandidateUser("userA").singleResult();
System.out.println("候选人userA认领的任务有 "+userATask.getName());
/*
输出结果:
候选人userA认领的任务有 Task1
*/
}
}