记Activiti入门使用-2 流程绘制、导入及开始一个流程


一、流程绘制与导入

百度啥的找了好多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>会报懒加载的一些错误,所以还是自己封装一遍比较好,里面不需要的字段也比较多。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM