一、连线
使用流程变量去控制流程的走向
1、流程图
(1)指定流程的key
(2)提交申请节点
(3)部门经理审批节点
(4)部门经理审批节点连线
(5)总经理审批节点
2、流程
(1)部署、启动
/**
* 部署流程使用zip
*/
@Test
public void deployProcess() {
// 得到流程部署的service
RepositoryService repositoryService = this.processEngine.getRepositoryService();
InputStream inputStream=this.getClass().getResourceAsStream("SequenceFlowBPMN.zip");
ZipInputStream zipInputStream=new ZipInputStream(inputStream);
Deployment deploy = repositoryService.createDeployment().name("报销流程")
.addZipInputStream(zipInputStream).deploy();
System.out.println("部署成功:流程部署ID:" + deploy.getId());
}
/**
* 启动流程
*/
@Test
public void startProcess() {
RuntimeService runtimeService = this.processEngine.getRuntimeService();
String processDefinitionKey = "SequenceFlowBPMN";
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey);
System.out.println("流程启动成功:" + processInstance.getId() + " " + processInstance.getProcessDefinitionId() + " "
+ processInstance.getProcessInstanceId());
}
(2)查询
/**
* 查询我的个人任务act_ru_task
*/
@Test
public void queryMyTask() {
TaskService taskService = this.processEngine.getTaskService();
String assignee = "李四";
List<Task> list = taskService.createTaskQuery()
// 条件
.taskAssignee(assignee)// 根据任务办理人查询任务
// 排序
.orderByTaskCreateTime().desc()
// 结果集
.list();
if (null != list && list.size() > 0) {
for (Task task : list) {
System.out.println("任务ID:" + task.getId());
System.out.println("任务办理人:" + task.getAssignee());
System.out.println("执行实例ID:" + task.getExecutionId());
System.out.println("任务名称:" + task.getName());
System.out.println("流程定义ID:" + task.getProcessDefinitionId());
System.out.println("流程实例ID:" + task.getProcessInstanceId());
System.out.println("任务创建时间:" + task.getCreateTime());
System.out.println("####################");
}
}
}
(3)办理任务
/**
* 办理任务
*/
@Test
public void completeTask() {
TaskService taskService = this.processEngine.getTaskService();
String taskId = "15003";
// 根据任务ID去完成任务
taskService.complete(taskId);
// 根据任务ID去完成任务并指定流程变量
// taskService.complete(taskId, variables);
System.out.println("任务完成");
}
(4)办理任务并使用流程变量指定流程走向
@Test
public void completeTask2() {
TaskService taskService = this.processEngine.getTaskService();
String taskId = "12502";
Map<String, Object> variables=new HashMap<>();
variables.put("outcome", "重要");
// 根据任务ID去完成任务并指定流程变量
taskService.complete(taskId, variables);
System.out.println("任务完成");
}
二、排他网关
1、流程图
(1)指定流程图的key
(2)设置排他网关默认出口
(3)设置条件
2、部署、启动
/**
* 部署流程使用zip
*/
@Test
public void deployProcess() {
// 得到流程部署的service
RepositoryService repositoryService = this.processEngine.getRepositoryService();
InputStream inputStream=this.getClass().getResourceAsStream("ExclusiveGateWay.zip");
ZipInputStream zipInputStream=new ZipInputStream(inputStream);
Deployment deploy = repositoryService.createDeployment().name("报销流程")
.addZipInputStream(zipInputStream).deploy();
System.out.println("部署成功:流程部署ID:" + deploy.getId());
}
/**
* 启动流程
*/
@Test
public void startProcess() {
RuntimeService runtimeService = this.processEngine.getRuntimeService();
String processDefinitionKey = "myProcess";
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey);
System.out.println("流程启动成功:" + processInstance.getId() + " " + processInstance.getProcessDefinitionId() + " "
+ processInstance.getProcessInstanceId());
}
3、查询
/**
* 查询我的个人任务act_ru_task
*/
@Test
public void queryMyTask() {
TaskService taskService = this.processEngine.getTaskService();
// String assignee = "张三";
// String assignee = "部门经理";
String assignee = "总经理";
List<Task> list = taskService.createTaskQuery()
// 条件
.taskAssignee(assignee)// 根据任务办理人查询任务
// 排序
.orderByTaskCreateTime().desc()
// 结果集
.list();
if (null != list && list.size() > 0) {
for (Task task : list) {
System.out.println("任务ID:" + task.getId());
System.out.println("任务办理人:" + task.getAssignee());
System.out.println("执行实例ID:" + task.getExecutionId());
System.out.println("任务名称:" + task.getName());
System.out.println("流程定义ID:" + task.getProcessDefinitionId());
System.out.println("流程实例ID:" + task.getProcessInstanceId());
System.out.println("任务创建时间:" + task.getCreateTime());
System.out.println("####################");
}
}
}
4、办理任务
/**
* 办理任务
*/
@Test
public void completeTask() {
TaskService taskService = this.processEngine.getTaskService();
String taskId = "22504";
// 根据任务ID去完成任务
taskService.complete(taskId);
// 根据任务ID去完成任务并指定流程变量
// taskService.complete(taskId, variables);
System.out.println("任务完成");
}
/**
* 办理任务并使用流程变量指定流程走向
*/
@Test
public void completeTask2() {
TaskService taskService = this.processEngine.getTaskService();
String taskId = "20004";
Map<String, Object> variables=new HashMap<>();
variables.put("money", 1200);
// 根据任务ID去完成任务并指定流程变量
taskService.complete(taskId, variables);
System.out.println("任务完成");
}
5、说明
1)一个排他网关对应一个以上的顺序流
2)由排他网关流出的顺序流都有个conditionExpression元素,在内部维护返回boolean类型的决策结果。
3)决策网关只会返回一条结果。当流程执行到排他网关时,流程引擎会自动检索网关出口,从上到下检索如果发现第一条决策结果为true或者没有设置条件的(默认为成立),则流出。
4)如果没有任何一个出口符合条件,则抛出异常
5)使用流程变量,设置连线的条件,并按照连线的条件执行工作流,如果没有条件符合的条件,则以默认的连线离开。
三、并行网关
1、流程图
2、代码
package com.activiti.a_init;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipInputStream;
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.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;
/**
* 并行网关
* if else if else if else
*/
public class TestParallelGateWay {
private ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
/**
* 部署流程使用zip
*/
@Test
public void deployProcess() {
// 得到流程部署的service
RepositoryService repositoryService = this.processEngine.getRepositoryService();
InputStream inputStream = this.getClass().getResourceAsStream("ParallelGateWay.zip");
ZipInputStream zipInputStream = new ZipInputStream(inputStream);
Deployment deploy = repositoryService.createDeployment().name("tao宝流程")
.addZipInputStream(zipInputStream).deploy();
System.out.println("部署成功:流程部署ID:" + deploy.getId());
}
/**
* 启动流程
*/
@Test
public void startProcess() {
RuntimeService runtimeService = this.processEngine.getRuntimeService();
String processDefinitionKey = "myProcess";
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey);
System.out.println("流程启动成功:" + processInstance.getId() + " " + processInstance.getProcessDefinitionId() + " "
+ processInstance.getProcessInstanceId());
}
/**
* 查询我的个人任务act_ru_task
*/
@Test
public void queryMyTask() {
TaskService taskService = this.processEngine.getTaskService();
// String assignee = "张三";
String assignee = "商家";
// String assignee = "买家";
List<Task> list = taskService.createTaskQuery()
// 条件
.taskAssignee(assignee)// 根据任务办理人查询任务
// 排序
.orderByTaskCreateTime().desc()
// 结果集
.list();
if (null != list && list.size() > 0) {
for (Task task : list) {
System.out.println("任务ID:" + task.getId());
System.out.println("任务办理人:" + task.getAssignee());
System.out.println("执行实例ID:" + task.getExecutionId());
System.out.println("任务名称:" + task.getName());
System.out.println("流程定义ID:" + task.getProcessDefinitionId());
System.out.println("流程实例ID:" + task.getProcessInstanceId());
System.out.println("任务创建时间:" + task.getCreateTime());
System.out.println("####################");
}
}
}
/**
* 办理任务
*/
@Test
public void completeTask() {
TaskService taskService = this.processEngine.getTaskService();
String taskId = "10002";
// 根据任务ID去完成任务
taskService.complete(taskId);
// 根据任务ID去完成任务并指定流程变量
System.out.println("任务完成");
}
}
3、说明
1)一个流程中流程实例只有1个,执行对象有多个
2)并行网关的功能是基于进入和外出的顺序流的
分支(fork):
并行后的所有外出顺序流,为每个顺序流都创建一个并发分支。
汇聚(join):
所有到达并行网关,在此等待的进入分支, 直到所有进入顺序流的分支都到达以后, 流程就会通过汇聚网关。
3)并行网关的进入和外出都是使用相同节点标识
4)如果同一个并行网关有多个进入和多个外出顺序流, 它就同时具有分支和汇聚功能。 这时,网关会先汇聚所有进入的顺序流,然后再切分成多个并行分支。
5)并行网关不会解析条件。 即使顺序流中定义了条件,也会被忽略。
6)并行网关不需要是“平衡的”(比如, 对应并行网关的进入和外出节点数目不一定相等)。如图中标示是合法的: