一、流程绘制与导入
百度啥的找了好多bpmn绘制工具,都不尽如人意,大多数都不能编辑网关出口的跳转条件,最后还是选择了activiti官方的那个绘图的app。。。
啥都好,就是线不能弯,很难受。(后来开发的时候惊讶地发现了方法,虽然感觉操作不是很友好)
要是有好用的希望大家能够推荐一下~
下面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= "启动某个流程")publicString start(@RequestParam String instanceKey) {//map中放入该流程需要的业务数据
Map map = new HashMap<>();
map.put("createUser", "Test");
map.put("createTime", 1576206360000L);
ProcessInstance instance=runtimeService.startProcessInstanceByKey(instanceKey, map);returninstance.getId();
}
调用runtimeService.startProcessInstanceByKey(),根据部署的流程key来启动一个流程,RuntimeService里面也有很多根据其他标识启动流程的方法,具体还需要研究。
其中instanceKey对应项目启动时日志中部署的流程key,也就是bpmn文件中该行的id。
根据方法返回的id观察数据库,可以发现很多表里面都会新建以该id为主键的数据,该条id也可以用来标识一条流程实例。
2.3 查询流程
流程的最基础的查询也需要用到RuntimeService这个类:
@PostMapping(value = "/list")
@ResponseBody
@ApiOperation(value= "查询某个流程实例")public Listlist(@RequestParam String definitionKey) {//创建查询条件
ProcessInstanceQuery processInstanceQuery =runtimeService.createProcessInstanceQuery();//根据流程实例key来查询,即查询该流程有多少个正在进行的实例
List runningList =processInstanceQuery.processDefinitionKey(definitionKey).list();//返回实例的id,这边需要包装成自己需要的业务数据返回
List ids = new ArrayList<>();
runningList.forEach(list->ids.add(list.getId()));returnids;
}
这边是根据2.2中的key来查询实例,实际观察该类里面的方法,可以发现很多的其他查询条件。
这边如果直接返回List会报懒加载的一些错误,所以还是自己封装一遍比较好,里面不需要的字段也比较多。