相比于市面上流行的flowable、activiti等,camunda相对来说简单一点,不过官方文档是英文的!!!!点这里Camunda 7 Docs
一、准备工作
1.先检查springboot版本,再决定使用的camunda的版本
我这里使用的springboot是2.5.1,所以选择了7.15.0版本的camunda。
接下来引入依赖:
<!-- camunda工作流 -->
<dependency>
<groupId>org.camunda.bpm.springboot</groupId>
<artifactId>camunda-bpm-spring-boot-starter</artifactId>
<version>7.15.0</version>
</dependency>
<dependency>
<groupId>org.camunda.bpm.springboot</groupId>
<artifactId>camunda-bpm-spring-boot-starter-rest</artifactId>
<version>7.15.0</version>
</dependency>
<dependency>
<groupId>org.camunda.bpm.springboot</groupId>
<artifactId>camunda-bpm-spring-boot-starter-webapp</artifactId>
<version>7.15.0</version>
</dependency>
配置yml:
camunda.bpm:
#禁止自动部署resources下面的bpmn文件
auto-deployment-enabled: false
generic-properties.properties:
javaSerializationFormatEnabled: true
admin-user:
id: admin
password: admin
run:
# https://docs.camunda.org/manual/latest/user-guide/camunda-bpm-run/#cross-origin-resource-sharing
cors:
enabled: true
allowed-origins: "*"
需要注意的是,要不要禁止自动部署bpmn文件。因为springboot启动时会自动读取resources下面的bpmn文件。
2.启动项目,会自动生成camunda相关的表(act_开头)
3.准备绘图工具
官方有提供绘图工具的下载地址:
通过访问:http://localhost:8090/camunda/app/cockpit/default/#/dashboard
端口需改成自己的。
二、绘制流程图
目前是简单的流程,后面遇到复杂的会补充上去。
审批人选用UserTask,点击后有一个小扳手可以修改
审批人需要给Assignee定义个变量,代码中会用到,比如${zhuguan}
审批过程中会出现同意或拒绝,所以需要加个网关上去,默认是排他网关。
业务过程中审批通过后可能会需要做一些数据操作,所以加上ServiceTask,定义如下
同意或拒绝需要加上变量,这里定义了个flag
我怕这里将这个文件放在resource下的bpmn文件夹下,像这样
最基本的流程图画完之后下一步就是部署到Camunda上去啦。
三、分享几个常用的api
1. 部署
//部署
Deployment deployment = repositoryService.createDeployment()
.name(name)
.addClasspathResource(resource)
.deploy();
调用接口后,发现已经部署上去了
2.发起
//开启流程
//map存放必要的变量,如刚刚定义的”zhuguan“
map.put("zhuguan", userId);
//businessKey绑定业务,便于后面查询
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey, businessKey, map);
注意这里的processDefinitionKey在bpmn文件里找
userId传的是审批人的id
发起流程后可以看到流程已经开始跑了。
3. 查询待办
taskService.createTaskQuery().taskAssignee("10086").list();
传对应的值:“10086”进去可以查到刚刚那条数据
{
"msg": "操作成功",
"code": 200,
"data": [
{
"cachedElContext": null,
"id": "7a7241ad-4ed6-11ee-9e62-96e6f74056a5",
"revision": 1,
"owner": null,
"assignee": "10086",
"delegationState": null,
"parentTaskId": null,
"parentTask": null,
"name": "主管",
"description": null,
"priority": 50,
"createTime": "2023-09-09T14:02:38.000+08:00",
"dueDate": null,
"followUpDate": null,
"suspensionState": 1,
"tenantId": null,
"executionId": "7a69dd37-4ed6-11ee-9e62-96e6f74056a5"
}
]
}
4. 审批
map.put("flag", "true");
taskService.complete(taskId, map);
因为这里有数据同步的操作,我们需要写一个类进行“委托执行”
/**
* 数据同步、持久化等操作
*/
@Component("AutoSync")
public class AutoSync implements JavaDelegate {
@Override
public void execute(DelegateExecution execution) {
//业务代码
System.out.println("1111数据同步操作1111");
}
}
请求通过了,检查下流程是否结束:
camunda图上的那个①看不到了,且控制台打印出内容了,说明此时流程已经结束。