目录
流程设计
![](https://i-blog.csdnimg.cn/blog_migrate/6dfe4fe97a893f20eecc491ccb686ff2.png)
注:此时总经理审批环节不设定具体的负责人,而是采用用户组的方式(即这三个人都有权限审批)
流程部署,启动及前两个环节处理
package org.wxy.com.activiti;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
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.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;
import org.wxy.com.model.Holiday;
//组任务测试
public class CandidateUserTest {
//第一步:流程部署
@Test
public void testprocessdeploy(){
//获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//通过流程架构知道所有的service都是通过ProcessEngine调用的
//创建部署对象
RepositoryService repositoryService = processEngine.getRepositoryService();
//流程部署
repositoryService.createDeployment().addClasspathResource("leveldef.bpmn")
.addClasspathResource("leveldef.png")
.name("请假审批流程")
.activateProcessDefinitionsOn(new Date())
.deploy();
}
//第二步:流程实例的启动
@Test
public void testprocessstart(){
//获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//流程定义key
String processDefinitionKey = "myProcess";
//流程定义激活即有效
RepositoryService repositoryService = processEngine.getRepositoryService();
repositoryService.activateProcessDefinitionByKey(processDefinitionKey);
//流程定义终止即无效
//repositoryService.suspendProcessDefinitionByKey("myProcess");
//创建流程启动对象
RuntimeService runtimeService = processEngine.getRuntimeService();
//业务id
String businessKey = "2";
//在启动流程实例时设置流程变量
Map<String, Object> variables = new HashMap<String, Object>();
//员工王五填写请假申请
variables.put("staff", "王五");
//设置部门领导审批负责人
variables.put("divManager", "张三");
//总经理审批环节采用组任务处理
//分支变量控制
Holiday holiday = new Holiday();
holiday.setNum(4);
//员工填写申请当
variables.put("holiday", holiday);
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey,businessKey, variables);
System.out.println("流程定义id:"+processInstance.getProcessDefinitionId());
System.out.println("流程实例id:"+processInstance.getProcessInstanceId());
}
//第三步:员工王五填写请假单处理
@Test
public void testStaffHandler(){
//获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//流程定义key
//创建流程启动对象
String processDefinitionKey = "myProcess";
TaskService taskService = processEngine.getTaskService();
//查询当前用户的任务
Task task = taskService.createTaskQuery().
processDefinitionKey(processDefinitionKey).
taskAssignee("王五").singleResult();
if(task != null){
String taskId = task.getId();
taskService.complete(taskId);
}
}
//第四步:部门领导审批
@Test
public void testDeptHandler(){
//获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//流程定义key
//创建流程启动对象
String processDefinitionKey = "myProcess";
TaskService taskService = processEngine.getTaskService();
//查询当前用户的任务
Task task = taskService.createTaskQuery().
processDefinitionKey(processDefinitionKey).
taskAssignee("张三").singleResult();
if(task != null){
String taskId = task.getId();
taskService.complete(taskId);
}
}
}
此时任务进入到总经理审批环节设置候选人为张飞,张三,张忠三个人,在act_ru_tack表中显示ASSIGEE字段为null(在流程定义是故意未设定),
候选人设置中文问题
流程定义中在总经理审批环节设置候选人为中文 张三,张飞,张忠时 ,在总经理审批环节发现当前参与的用户participant为一条数据
![](https://i-blog.csdnimg.cn/blog_migrate/463a64e4b77d8cfc11dc1f82fce0b19f.png)
而流程定义中在总经理审批环节设置候选人为英文 zhangsan,zhangfei,zhangzhong 时,在总经理审批环节发现当前参与的用户participant为三个用户
![](https://i-blog.csdnimg.cn/blog_migrate/c0aea38427b1a5ff739bbc6e71b9b0eb.png)
流程定义中在总经理审批环节设置候选人为中文 张三,张飞,张忠时查询候选人任务是查不到数据?
@Test
public void findGroupTaskList() {
//获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 流程定义key
String processDefinitionKey = "myProcess";
// 任务候选人
String candidateUser = "张三";
// 创建TaskService
TaskService taskService = processEngine.getTaskService();
//查询组任务
List<Task> list = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskCandidateUser(candidateUser).list();
//根据候选人查询
for (Task task : list) {
System.out.println("----------------------------");
System.out.println("流程实例id:" + task.getProcessInstanceId());
System.out.println("任务id:" + task.getId());
System.out.println("任务负责人:" + task.getAssignee());
System.out.println("任务名称:" + task.getName());
}
}
因此在中文情况下程序是将张三,张飞,张忠看成了一个用户参与者,因此会查不到数据。
候选人任务设置
用户查询组任务
候选人设置成英文,根据候选人查询用户组任务
@Test
public void findGroupTaskList() {
//获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 流程定义key
String processDefinitionKey = "myProcess";
// 任务候选人
String candidateUser = "zhangsan";
// 创建TaskService
TaskService taskService = processEngine.getTaskService();
//查询组任务
List<Task> list = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskCandidateUser(candidateUser).list();
//根据候选人查询
for (Task task : list) {
System.out.println("----------------------------");
System.out.println("流程实例id:" + task.getProcessInstanceId());
System.out.println("任务id:" + task.getId());
System.out.println("任务负责人:" + task.getAssignee());
System.out.println("任务名称:" + task.getName());
}
}
通过设置的总经理审批候选人zhangsan查询用户组任务如下
注:因为设置的是候选之人,没有具体分配负责人因此任务负责人为nul,符合预期结果。
用户拾取组任务
候选人查询出任务,然后拾取任务为个人任务
//候选人拾取任务
@Test
public void claimTask(){
//获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 流程定义key
String processDefinitionKey = "myProcess";
TaskService taskService = processEngine.getTaskService();
//要拾取的任务id
//任务候选人
String candidateUser = "zhangsan";
//拾取任务
//即使该用户不是候选人也能拾取(建议拾取时校验是否有资格)
//校验该用户有没有拾取任务的资格
Task task = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).
taskCandidateUser(candidateUser).singleResult();
if(task!=null){
taskService.claim(task.getId(), candidateUser);
System.out.println("任务拾取成功");
}
}
注:1.拾取任务方法 taskService.claim(task.getId(), candidateUser) 其他代码和候选人查询用户组任务都一样。
2.候选人拾取任务就是将候选人变成该环节具体负责人的过程
select * from act_ru_task; ##记录运行中的流程实例即将要执行的任务
select *from act_hi_actinst;
此时总经理审批环节,就有具体的负责人为zhangsan
![](https://i-blog.csdnimg.cn/blog_migrate/d11850398e94caae596de8b97015f49a.png)
用户查询个人待办任务
//第六步查询自己的任务
@Test
public void queryAssignTask(){
//获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 流程定义key
String processDefinitionKey = "myProcess";
TaskService taskService = processEngine.getTaskService();
//任务负责人
String assignee = "zhangsan";
//查询自己的任务
List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).
taskAssignee(assignee).list();
if(taskList != null && taskList.size()>0){
for (Task task : taskList) {
System.out.println("----------------------------");
System.out.println("流程实例id:" + task.getProcessInstanceId());
System.out.println("任务id:" + task.getId());
System.out.println("任务负责人:" + task.getAssignee());
System.out.println("任务名称:" + task.getName());
}
}
}
此时总经理审批环节具体负责人,就变成了zhangsan
归还组任务
场景:候选人zhangsan拾取任务后,又想退回任务(前提是该任务zhangsan未执行,如果执行完了自动进入到下一个环节了)
//任务归还
@Test
public void discardTask(){
//获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 流程定义key
String processDefinitionKey = "myProcess";
TaskService taskService = processEngine.getTaskService();
//任务候选人
String assignee = "zhangsan";
//拾取任务
//即使该用户不是候选人也能拾取(建议拾取时校验是否有资格)
//校验该用户有没有拾取任务的资格
Task task = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).
taskAssignee(assignee).singleResult();
if(task!=null){
taskService.setAssignee(task.getId(),null);
System.out.println("归还组任务成功");
}
}
注:这里张三已经成为审批的负责人,因此使用taskAssign()查询的
Task task = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).
taskAssignee(assignee).singleResult();
这里张三已经成为审批的负责人,如果再用候选人查询是无任务的
Task task = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).
taskCandidateUser(candidateUser).singleResult();
归还组任务只需该任务的负责人为null 即可taskService.setAssignee(task.getId(),null);
注:
说明:建议归还任务前校验该用户是否是该任务的负责人
也可以通过 setAssignee 方法将任务委托给其它用户负责,注意被委托的用户可以不是候选人(建议
不要这样使用)
任务交接
@Test//任务交接
public void handoverTask(){
//获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 流程定义key
String processDefinitionKey = "myProcess";
TaskService taskService = processEngine.getTaskService();
//任务负责人
String assignee = "zhangsan";
String candidateUser = "zhangfei";
//查询自己的任务
List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).
taskAssignee(assignee).list();
if(taskList != null && taskList.size()>0){
for (Task task : taskList) {
taskService.setAssignee(task.getId(),candidateUser);
System.out.println("zhangsan将任务交给候选人zhangfei");
}
}
}
用户办理个人任务
//第七步处理任务
@Test
public void handlerTask(){
//获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 流程定义key
String processDefinitionKey = "myProcess";
TaskService taskService = processEngine.getTaskService();
//任务负责人
String assignee = "zhangfei";
//查询自己的任务
List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).
taskAssignee(assignee).list();
if(taskList != null && taskList.size()>0){
for (Task task : taskList) {
taskService.complete(task.getId());
}
}
}
此时审批进入下一个环节人事存档
####部署后涉及三张表
select * from act_re_deployment; ##部署信息
select * from act_re_procdef; ##流程定义信息
SELECT * from act_ge_bytearray;##流程定义的资源信息bpmn文件和png
###启动时涉及到的表
select * from act_hi_procinst; ##启动时创建流程实例生成实例id
select * from act_ru_task; ##记录运行中的流程实例即将要执行的任务
select *from act_hi_actinst; ##历史活动实例表 包括开始事件即流程实例中已经执行的各个环节
select * from act_hi_taskinst; ##历史任务实例表不包含开始任务即流程实例中已经执行的各个环节
select * from act_ru_variable ## 启动过程中设置了gloabl变量
select * from act_ge_bytearray; ##启动时设置pojo对象
select * from act_ru_execution; ##运行中的流程实例的执行记录
select * from act_hi_identitylink; ##启动时设置员工填写请假单,因此关联员工
select * from act_ru_identitylink; ##当前运行中的流程实例中参与关联的用户