一、流程状态的挂起与激活与业务标记
业务标记
// 在流程开始时添加业务id,5555是业务标记的id
runtimeService.startProcessInstanceByKey("work_over_time","5555");
流程的挂起与激活
单个挂起:针对流程实例。使用的服务:TaskServiceImpl
@Test
void processInstanceSuspend(){
// 查询当前运行流程实例
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processDefinitionKey("work_over_time").singleResult();
// 流程实例为挂起状态,激活流程,为激活状态,挂起流程
if (processInstance.isSuspended()) {
runtimeService.activateProcessInstanceById(processInstance.getProcessInstanceId());
System.out.println("激活当前流程");
}else {
runtimeService.suspendProcessInstanceById(processInstance.getProcessInstanceId());
System.out.println("挂起当前流程");
}
}
全部挂起:针对流程定义及当前定义的所有流程实例。使用的服务: RepositoryServiceImpl
@Test
void processDefinitionSuspend() {
// 测试流程定义挂起
// 1. 查询改流程定义
List<ProcessDefinition> processDefinitionList = repositoryService.createProcessDefinitionQuery()
.processDefinitionKey("work_over_time")
.list();
// 挂起,激活流程定义
processDefinitionList.forEach(processDefinition -> {
// 判断是否被挂起
boolean processDefinitionSuspended = repositoryService.isProcessDefinitionSuspended(processDefinition.getId());
if (processDefinitionSuspended) {
// 挂起状态进行激活
repositoryService.activateProcessDefinitionById(processDefinition.getId());
System.out.println("流程:" + processDefinition.getName() + "版本:" + processDefinition.getVersion() + "已被激活");
} else {
// 激活状态进行挂起
repositoryService.suspendProcessDefinitionById(processDefinition.getId());
System.out.println("流程:" + processDefinition.getName() + "版本:" + processDefinition.getVersion() + "已被挂起");
}
});
}
挂起后完成任务或者新增实例的时候会抛一个任务挂起的异常。
二、个人任务分配
分配任务负责人
在bpmn流程定义中的assignee 中使用表达式${deptManager},deptManager是变量名,如图
在启动流程时传入表达式的参数
在数据库中查询当前任务的指定人为deptManager-a
数据库中查询到流程变量名与变量值的对应
监听器的配置类型
事件(all create assiginement delete)
类别(class ,expression – 表达式,delegateExpression)
值(具体的值,类名,或者具体表达式)
在任务流程开启时指定负责人(部门经理指定人为 deptManager-a,总经理指定人为 generalManager-b)
public class MyTaskListener implements TaskListener {
@Override
public void notify(DelegateTask delegateTask) {
/**
* (部门经理指定人为 deptManager-a,总经理指定人为 generalManager-b)
*/
// 判断是否在申请创建时期
if ("create".equals(delegateTask.getEventName())) {
if ("部门经理审批".equals(delegateTask.getName())) {
delegateTask.setAssignee("deptManager-a");
}
if ("总经理审批".equals(delegateTask.getName())){
delegateTask.setAssignee("generalManager-b");
}
}
}
}
查询任务
查询任务与以前查询代码一样
@Test
void taskQuery() {
// 任务查询
List<Task> taskList = taskService.createTaskQuery().taskAssignee("deptManager-a").list();
taskList.forEach(task -> {
System.out.println("任务名称" + task.getName());
System.out.println("拥有者" + task.getAssignee());
System.out.println("任务流程定义id" + task.getProcessDefinitionId());
System.out.println("任务实例id" + task.getProcessInstanceId());
System.out.println("-------------");
});
}
办理任务
完成任务
@Test
void completeTask() {
// 完成任务
// 1.查询请假流程任务(通过流程实例与当前处理者查询)
Task task = taskService.createTaskQuery()
.processDefinitionKey("myTaskListener")
.taskAssignee("deptManager-a")
.singleResult();
// 2.完成任务
taskService.complete(task.getId());
}
此时,任务通过监听流转到generalManager-b去了
三、流程变量
定义
流程变量是activiti在管理流程中需要设置的变量,例如在请假流程中,请假3天及以内需要主管审批,3天以上需要总经理审批,请假时间就可以是一个流程变量。
作用域
global变量
默认是流程实例,全局变量。后设置变量值会覆盖前值。
local变量: 作用域小,名称可以与global重复,不互相影响。
使用方式
流程变量两种使用方式
属性上使用uel表达式
${assignee}
连线上使用uel表达式
${item.day>3}
流程变量支持类型
这是强调一下自定义的类对象需要实现serializable接口。
例如
public class Holiday implements Serializable {
/**
* 假期开始时间
*/
private Date createTime;
/**
* 假期时长
*/
private Double day;
/**
* 假期单名称
*/
private String name;
}
实例
请假流程需求 超过3天总经理审批,否则部门经理审批。
流程定义与部署
设置global流程变量
1.启动流程时设置流程变量。
Map<String, Object> paramMap = new HashMap<>();
Holiday holiday = new Holiday();
holiday.setDay(1d);
holiday.setCreateTime(new Date());
holiday.setName("1天请假流程");
paramMap.put("item",holiday);
// 设置不同节点办理人
paramMap.put("user1","user");
paramMap.put("user2","dept");
paramMap.put("user3","money");
paramMap.put("user4","general");
// 开始任务,生成流程实例
runtimeService.startProcessInstanceByKey("holiday",paramMap);
2.任务办理时设置变量。
// 完成任务时设置流程变量
Map<String, Object> paramMap = new HashMap<>();
Holiday holiday = new Holiday();
holiday.setDay(5d);
holiday.setCreateTime(new Date());
holiday.setName("5天请假流程");
paramMap.put("item",holiday);
// 设置不同节点办理人
paramMap.put("user2","dept");
paramMap.put("user3","money");
paramMap.put("user4","general");
taskService.complete(task.getId(),paramMap);
3.通过当前流程设置。
Task task = taskService.createTaskQuery()
.taskAssignee("money")
.singleResult();
// 通过流程设置变量
String processInstanceId = task.getProcessInstanceId();
runtimeService.setVariable(processInstanceId,"user2","user3");
4.通过当前任务设置。
Task task = taskService.createTaskQuery()
.taskAssignee("money")
.singleResult();
// 设置变量
taskService.setVariable(task.getId(),"user1","dept");
设置local变量
1.任务办理时设置
runtimeService.setVariableLocal();
2.通过当前任务设置
taskService.setVariableLocal();