一、流程绘制与导入
百度啥的找了好多bpmn绘制工具,都不尽如人意,大多数都不能编辑网关出口的跳转条件,最后还是选择了activiti官方的那个绘图的app。。。
啥都好,就是线不能弯,很难受。(后来开发的时候惊讶地发现了方法,虽然感觉操作不是很友好)
要是有好用的希望大家能够推荐一下~
官网:https://www.activiti.org/get-started
下面Old Version选择6.x Download,下载完成后是一个zip包,解压后把里面的activiti-app.war丢到tomcat下面启动就行,这边使用tomcat8.5.49,该war包需要java1.8。
(这边用idea直接起war包好像会遇到一系列问题,主要是contentPath会变,所以还是直接丢到tomcat下面吧)。
1、
启动后访问:http://localhost:8080/activiti-app/#/会跳转到登录页,默认账号:admin/test即可,登陆后界面如下,选择第一个:
2、
然后选择Create Process
3、
新建页面如下:
Model name为流程名称(可重复)
Model key为流程Key,实际调用中使用的即为该key,似乎key可以相同,但是后面创建的会有版本号的概念,会自动+1
4、
画图就完事了,绘图规则可以自行了解bpmn
5、
保存后选择下载,放入工程目录/resources/processes下,修改后缀为bpmn,其实应该是可以直接解析bpmn20.xml文件的来着,具体的还在学习~
启动项目出现:The following process definition files will be deployed: [***.bpmn]即说明流程部署成功。
二、如何开始一个流程
我们以上图的流程为例,这边先提几个关键的service类
2.1 服务接口
1、TaskService
在流程进行过程中,每个节点的操作方法,经常用的比如:查询处于“领导审批”这个节点的任务,完成这个任务等等。
2、RuntimeService
流程相关服务,基本的功能例如:开始一个实例流程等等。
3、RepositoryService
流程部署相关的服务
4、HistoryService
历史流程相关的服务
2.2 开始流程
如上所说,开始流程我们需要用到RuntimeService这个类。
直接上代码:
@PostMapping(value = "/start") @ResponseBody @ApiOperation(value = "启动某个流程") public String start(@RequestParam String instanceKey) { // map中放入该流程需要的业务数据 Map<String, Object> map = new HashMap<>(); map.put("createUser", "Test"); map.put("createTime", 1576206360000L); ProcessInstance instance = runtimeService.startProcessInstanceByKey(instanceKey, map); return instance.getId(); }
调用runtimeService.startProcessInstanceByKey(),根据部署的流程key来启动一个流程,RuntimeService里面也有很多根据其他标识启动流程的方法,具体还需要研究。
其中instanceKey对应项目启动时日志中部署的流程key,也就是bpmn文件中该行的id。
<process id="myFirstBpmn" name="myFirstBpmn" isExecutable="true">
根据方法返回的id观察数据库,可以发现很多表里面都会新建以该id为主键的数据,该条id也可以用来标识一条流程实例。
2.3 查询流程
流程的最基础的查询也需要用到RuntimeService这个类:
@PostMapping(value = "/list") @ResponseBody @ApiOperation(value = "查询某个流程实例") public List<String> list(@RequestParam String definitionKey) { // 创建查询条件 ProcessInstanceQuery processInstanceQuery = runtimeService.createProcessInstanceQuery(); // 根据流程实例key来查询,即查询该流程有多少个正在进行的实例 List<ProcessInstance> runningList = processInstanceQuery.processDefinitionKey(definitionKey).list(); // 返回实例的id,这边需要包装成自己需要的业务数据返回 List<String> ids = new ArrayList<>(); runningList.forEach(list -> ids.add(list.getId())); return ids; }
这边是根据2.2中的key来查询实例,实际观察该类里面的方法,可以发现很多的其他查询条件。
这边如果直接返回List<ProcessInstance>会报懒加载的一些错误,所以还是自己封装一遍比较好,里面不需要的字段也比较多。