/**
* 启动流程实例,添加businessKey
*/
@Test
public void addBusinessKey(){
// 1、得到ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2、得到RunTimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
// 3、启动流程实例,同时还要指定业务标识businessKey,也就是出差申请单id,这里是1001
ProcessInstance processInstance = runtimeService.
startProcessInstanceByKey("myFlow01","C00001");
// 4、输出processInstance相关属性
System.out.println("业务id=="+processInstance.getBusinessKey());
}
这样创建的流程实例就能够根据自己实际业务系统的C00001业务相关联,而这个字段会被保存在act_ru_execution表的Businesskey字段中。
/**
* 全部流程实例挂起与激活
*/
@Test
public void SuspendAllProcessInstance(){
// 获取processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 获取repositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
// 查询流程定义的对象
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().
processDefinitionKey("myFlow01").
singleResult();
// 得到当前流程定义的实例是否都为暂停状态(默认以查询到的第一个流程为标准)
boolean suspended = processDefinition.isSuspended();
// 流程定义id
String processDefinitionId = processDefinition.getId();
// 判断是否为暂停
if(suspended){
// 如果是暂停,可以执行激活操作 ,参数1 :流程定义id ,参数2:是否激活,参数3:激活时间
repositoryService.activateProcessDefinitionById(processDefinitionId,true,null);
System.out.println("流程定义----"+processDefinitionId+",已激活");
}else{
// 如果是激活状态,可以暂停,参数1 :流程定义id ,参数2:是否暂停,参数3:暂停时间
repositoryService.suspendProcessDefinitionById(processDefinitionId,true,null);
System.out.println("流程定义----"+processDefinitionId+",已挂起");
}
}
运行结果
在数据表中两个流程实例均被挂起
如果是要单个流程实例挂起则需要使用查询流程实例的ProcessInstanceQuery
/**
* 单个流程实例挂起与激活
*/
@Test
public void SuspendSingleProcessInstance(){
// 获取processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// RuntimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
// 查询流程定义的对象
ProcessInstance processInstance = runtimeService.
createProcessInstanceQuery().
processInstanceId("25001").
singleResult();
// 得到当前流程定义的实例是否都为暂停状态
boolean suspended = processInstance.isSuspended();
// 流程定义id
String processDefinitionId = processInstance.getId();
// 判断是否为暂停
if(suspended){
// 如果是暂停,可以执行激活操作 ,参数:流程定义id
runtimeService.activateProcessInstanceById(processDefinitionId);
System.out.println("流程定义:"+processDefinitionId+",已激活");
}else{
// 如果是激活状态,可以暂停,参数:流程定义id
runtimeService.suspendProcessInstanceById( processDefinitionId);
System.out.println("流程定义:"+processDefinitionId+",已挂起");
}
}
通过部署流程定义,启动流程实例后通过查询打印
@Test
public void testQueryTest(){
String ass = "操作员01";
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
List<Task> list = taskService.createTaskQuery().taskAssignee(ass).list();
for (Task task:list)
System.out.println(ass + "的任务名为" + task.getName() + "---" + task.getId());
}
方式二:UEL表达式
1、bpmn图输入表达式
2、在代码中分配
/**
* 设置流程负责人
*/
@Test
public void assigneeUEL(){
// 获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 获取 RuntimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
// 设置assignee的取值,用户可以在界面上设置流程的执行
Map<String,Object> assigneeMap = new HashMap<>();
assigneeMap.put("assignee","张三");
// 启动流程实例,同时还要设置流程定义的assignee的值
runtimeService.startProcessInstanceByKey("myFlow02",assigneeMap);
}
}
通过方式一的代码获取任务
方式三:使用监听器
1、实现 org.activiti.engine.delegate.TaskListener 接口
public class MyTaskListener implements TaskListener {
@Override
public void notify(DelegateTask delegateTask) {
if(delegateTask.getName().equals("")&&
delegateTask.getEventName().equals("create")){
//这里指定任务负责人
delegateTask.setAssignee("张三");
}
}
}
2、在bpmn图中设置我们写好的监听器(这里我插件出了问题,无法扩展)
通过获取任务对象的流程实例Id来获取流程实例中的businessKey,通过businessKey来获取业务数据库中的数据。
@Test
public void findProcessInstance(){
// 获取processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 获取TaskService
TaskService taskService = processEngine.getTaskService();
// 获取RuntimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
// 查询流程定义的对象
Task task = taskService.createTaskQuery()
.processDefinitionKey("myEvection1")
.taskAssignee("张三")
.singleResult();
// 使用task对象获取实例id
String processInstanceId = task.getProcessInstanceId();
// 使用实例id,获取流程实例对象
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
.processInstanceId(processInstanceId)
.singleResult();
// 使用processInstance,得到 businessKey
String businessKey = processInstance.getBusinessKey();
System.out.println("businessKey=="+businessKey);
}
globa变量
流程变量的默认作用域是流程实例。当一个流程变量的作用域为流程实例时,可以称为 global 变量
local变量
任务和执行实例仅仅是针对一个任务和一个执行实例范围,范围没有流程实例大, 称为 local 变量。
1、在创建流程实例时设置流程变量
流程业务对象
/**
* 自定义流程实例业务对象
*/
public class EventPOJO implements Serializable {
//条件
private Integer num;
public Integer getNum() {
return num;
}
public void setNum(Integer num) {
this.num = num;
}
}
在对流程实例部署之后启动流程实例中设置流程变量如果在bpmn中是以${eventPOJO.num < 3}设置条件的则用方式2来设置
/**
* 启动流程实例并定义流程变量
*/
@Test
public void testStartProcess02(){
// 1、创建ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2、获取RunTimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
//创建自定义的流程业务对象
EventPOJO eventPOJO = new EventPOJO();
eventPOJO.setNum(1);
//将设置的流程变量或是其他变量放入map
Map<String, Object> map = new HashMap<>();
//方式1
map.put("num",1);
//方式2(在以下的方式同理)
// map.put("eventPOJO",eventPOJO);
// 3、根据流程定义Id启动流程
ProcessInstance processInstance = runtimeService
.startProcessInstanceByKey("myFlow04",map);
// 输出内容
System.out.println("流程定义id:" + processInstance.getProcessDefinitionId());
System.out.println("流程实例id:" + processInstance.getId());
System.out.println("当前活动Id:" + processInstance.getActivityId());
}
接下来完成“事件01”后默认执行的就是“事件03”
2、在任务办理时设置流程变量
在部署和流程实例创建后
@Test
public void completTask() {
//任务id
String key = "myFlow04";
// 任务负责人
// String assingee = "张三";
// 获取processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 创建TaskService
TaskService taskService = processEngine.getTaskService();
// 创建变量集合
Map<String, Object> map = new HashMap<>();
// 定义流程变量
map.put("num",4);
// 完成任务前,需要校验该负责人可以完成当前任务
// 校验方法:
// 根据任务id和任务负责人查询当前任务,如果查到该用户有权限,就完成
Task task = taskService.createTaskQuery()
.processDefinitionKey(key)
// .taskAssignee(assingee)
.singleResult();
if(task != null){
//完成任务是,设置流程变量的值
taskService.complete(task.getId(),map);
System.out.println("任务执行完成");
}
}
在办理事件01时设置流程变量为4,此时num>3则如bpmn图接下来要执行事件02
3、通过当前流程实例设置
通过流程实例id设置全局变量,该流程实例必须未执行完成。
@Test
public void setGlobalVariableByExecutionId(){
// 当前流程实例执行 id,通常设置为当前执行的流程实例
String executionId="2601";
// 获取processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 获取RuntimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
// 通过流程实例 id设置流程变量
runtimeService.setVariable(executionId, "num", 1);
// 一次设置多个值
// runtimeService.setVariables(executionId, variables)
}
4、通过当前任务设置
@Test
public void setGlobalVariableByTaskId(){
//当前待办任务id
String taskId="1404";
// 获取processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
//通过任务设置流程变量
taskService.setVariable(taskId, "num", 1);
//一次设置多个值
//taskService.setVariables(taskId, variables)
}
5、local流程变量设置
只需通过TaskService对象的以下这个方法就可以设置
// 通过任务设置流程变量
taskService.setVariableLocal(taskId, "num", 1);
在对组任务进行查询逻辑基本都与前面一致,无非是通过任务查询器TaskQuery来通过各种条件对于任务内容进行查询(这里是通过候选人进行任务的查询)。
拾取组任务
//拾取任务 claim(要拾取的任务id,任务候选人id)
taskService.claim(taskId, userId);
归还组任务、交接组任务
本质就是修改Assignee
// 如果设置为null,归还组任务,该 任务没有负责人
taskService.setAssignee(taskId, null);
参考