- 前言
- 一、环境
- 1、引入依赖
- 2、创建表
- 3、配置文件
- 二、bpmn文件
- 三、测试
前言
Flowable是一个使用Java编写的轻量级业务流程引擎,可以实现需要工作流的业务流程。
一、环境 1、引入依赖引入 flowable 相关依赖
2、创建表org.flowable flowable-spring-boot-starter 6.7.2 xerces xercesImpl 2.12.2
(1)自动创建表
打开配置
flowable.database-schema-update=true
自动创建表的语句都在各个模块的包下面
(2)手动创建表
下载官网的sql文件
https://documentation.flowable.com/latest/develop/dbs/overview
下载下来是db-scripts-3.11.0.zip,解压后如下图,从里面找出对应数据库的sql文件,导入到数据库中
数据库表如图所示:
3、配置文件# standalone 模式 flowable.standalone.server.enabled=false # 允许 bean overriding spring.main.allow-bean-definition-overriding=true # 关闭定时任务 flowable.async-executor-activate=false # 检测身份信息 flowable.idm.enabled=false # 生成数据库表 flowable.database-schema-update=false二、bpmn文件
1、holiday-request.bpmn20.xml
将文件放在classpath下
approved} ]]> !approved} ]]>
2、ApprovalSuccessDelegate
审批通过回调任务
public class ApprovalSuccessDelegate implements JavaDelegate {
@Override
public void execute(DelegateExecution execution) {
System.out.println("审批通过了");
}
}
3、ApprovalFailedDelegate
审批驳回回调任务
public class ApprovalFailedDelegate implements JavaDelegate {
@Override
public void execute(DelegateExecution execution) {
System.out.println("审批驳回了");
}
}
三、测试
1、测试类
@RunWith(SpringRunner.class)
@SpringBootTest(classes = BizApp.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class FlowableTest {
@Autowired
private RepositoryService repositoryService;
@Autowired
private RuntimeService runtimeService;
@Autowired
private TaskService taskService;
@Autowired
private HistoryService historyService;
}
2、部署流程
@Test
public void createDeployment() {
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("holiday-request.bpmn20.xml")
.deploy();
System.out.println(deployment.getId());
}
打印出流程id
ce2bb094-caaf-11ec-90e1-00ff2b067e93
3、获取流程定义
@Test
public void getProcessDefinition() {
ProcessDefinition result = repositoryService.createProcessDefinitionQuery()
.deploymentId("ce2bb094-caaf-11ec-90e1-00ff2b067e93")
.singleResult();
System.out.println("definitionId: " + result.getId());
System.out.println("definition: " + JsonUtils.toJson(result));
}
结果:
definitionId: holidayRequest:1:ce44dde6-caaf-11ec-90e1-00ff2b067e93
definition: {
"id":"holidayRequest:1:ce44dde6-caaf-11ec-90e1-00ff2b067e93",
"revision":1,
"isInserted":false,
"isUpdated":false,
"isDeleted":false,
"originalPersistentState":{
"suspensionState":1,
"category":"http://www.flowable.org/processdef"
},
"name":"请假流程",
"key":"holidayRequest",
"version":1,
"category":"http://www.flowable.org/processdef",
"deploymentId":"ce2bb094-caaf-11ec-90e1-00ff2b067e93",
"resourceName":"holiday-request.bpmn20.xml",
"tenantId":"",
"isGraphicalNotationDefined":false,
"hasStartFormKey":false,
"suspensionState":1,
"isIdentityLinksInitialized":false,
"definitionIdentityLinkEntities":[
],
"derivedVersion":0,
"suspended":false,
"graphicalNotationDefined":false,
"inserted":false,
"updated":false,
"deleted":false
}
4、启动流程
模拟用户发起一个请假流程
@Test
public void startProcessDefinition() {
Map variables = new HashMap();
variables.put("employee", "张三");
variables.put("nrOfHolidays", 3);
variables.put("description", "有事请假");
ProcessInstance processInstance =
runtimeService.startProcessInstanceByKey("holidayRequest", variables);
}
5、获取任务
用户发起流程后,相关的人员能够查询该任务
@Test
public void getTask() {
List tasks = taskService.createTaskQuery()
.active()
.includeProcessVariables()
.taskCandidateOrAssigned("admin")
.list();
System.out.println("You have " + tasks.size() + " tasks:");
for (int i = 0; i < tasks.size(); i++) {
Task task = tasks.get(i);
System.out.println((i + 1) + ") " + "taskId: " + task.getId() + ", taskName: " + task.getName());
}
}
结果:
You have 1 tasks: 1) taskId: 696f2831-cab0-11ec-aa1d-00ff2b067e93, taskName: 同意或驳回请求
6、审批任务
查询到任务后,对任务进行审批
@Test
public void completeTask() {
Map variables = new HashMap();
variables.put("approved", true);
taskService.complete("696f2831-cab0-11ec-aa1d-00ff2b067e93", variables);
}
结果回调了 ApprovalSuccessDelegate ,打印出"审批通过了"
7、查询历史任务
任务完成审批以后,会作为历史任务存储起来
@Test
public void historyTask() {
List list = historyService.createHistoricActivityInstanceQuery()
.taskAssignee("admin")
.finished()
.list();
list.stream().map(JsonUtils::toJson).forEach(System.out::println);
}
结果:
{
"id":"696c1af0-cab0-11ec-aa1d-00ff2b067e93",
"revision":2,
"isInserted":false,
"isUpdated":false,
"isDeleted":false,
"originalPersistentState":{
"executionId":"696b308d-cab0-11ec-aa1d-00ff2b067e93",
"activityId":"approveTask",
"transactionOrder":3,
"durationInMillis":134771,
"activityName":"同意或驳回请求",
"endTime":"2022-05-03 15:14:51",
"assignee":"admin",
"taskId":"696f2831-cab0-11ec-aa1d-00ff2b067e93"
},
"processInstanceId":"696a9449-cab0-11ec-aa1d-00ff2b067e93",
"processDefinitionId":"holidayRequest:1:ce44dde6-caaf-11ec-90e1-00ff2b067e93",
"startTime":"2022-05-03 15:12:37",
"endTime":"2022-05-03 15:14:51",
"durationInMillis":134771,
"transactionOrder":3,
"activityId":"approveTask",
"activityName":"同意或驳回请求",
"activityType":"userTask",
"executionId":"696b308d-cab0-11ec-aa1d-00ff2b067e93",
"assignee":"admin",
"taskId":"696f2831-cab0-11ec-aa1d-00ff2b067e93",
"tenantId":"",
"inserted":false,
"updated":false,
"deleted":false
}



