3.ProcessDefinition-流程定义操作:
流程定义操作主要针对的就是我们提前画好的BPMN文件的详细信息
这里我们先来看看我们的BPMN文件是什么样的
可以看到我们的流程定义的信息是这样的,那么接下来我们在看看我们的流程定义的读取操作读出来的信息是不是和我们定义的一样呢?
3.1-ProcessDefinition文件读取:
可以看到读取到的信息也的确是一样的,并且因为我们的流程Key没有发生改变,所以我们的版本是不一样的,并且采用+1操作的方式
3.2-ProcessDefinition文件删除:
//删除流程定义 @Test public void delDefinition(){ String pdID="fadb560c-3b76-11eb-a72f-3c58c24c1a1b"; repositoryService.deleteDeployment(pdID,true); System.out.println( ); }
这里我们想要删除我们定义的流程,就需要获得我们的Deployment的ID号,就是我们在上面查询Deployment获得的ID号.并且他会有一个选项即boolen的选项
true代表删除该流程的一切历史信息包括该流程的相关信息以及部署该流程的过程的详细信息,以及该流程文件的详细信息,反正就是所有的信息
false代表只删除该流程的信息,其他的信息是不会删除的.即只删除act_re_procdef表中的记录.
这里我们测试完成之后,可以发现已经测试成功了
那么接下来我们再去看看数据库里的信息发生率什么样的变化.
首先是act_re_procdef表,可以看到只剩下了一条数据了
我们再来看看act_re_deploymemt关于该流程的记录因为已经是删除了
最后我们再来看看act_ge_bytearray,发现该流程部署的两条文件数据也已近删除了,只剩下两条数据了.
这下我们便能更好的理解true和false的区别了
4.ProcessInstance-流程实例操作:
在学习下面的操作之前我们首先需要明白ProcessDefinition和Processinstance的区别.
ProcessDefinition指的是我们定义的流程,这个流程只是一个一般化的流程,就比方说请假,我们只是定义了请假的一般化流程,比如说各个层级请假需要经过哪些层级的审核等等
但是Processinstance指的则是我们已经创建好的一个流程实例,比方说今天小赵想要请假,那么就会根据上面的定义流程创建一个流程是只适用于小赵的请假流程,然后今天小余也像请假,呢么就肯定要在根据上面定义的实例再创建一个实例是只适用于小余的,那么我们就能了解这两者的区别以及联系了
简单来说就可以用下面的图来表示:
一对多的关系.流程只是一个一般化的过程,流程实例是需要与特定的业务数据进行绑定的
了解完两者的区别之后,我们就能继续下面的操作了.
4.1-ProcessInstance-流程实例定义操作:
@Autowired private RuntimeService runtimeService; //初始化流程实例 @Test public void initProcessInstance(){ //获取页面表单填报的内容,比如说请假时间,请假事由等等数据 //将填好的数据写入我们的业务表里,返回业务表的主键ID=====>BussinessKey //之后就需要将我们的业务数据绑定到流程上,这样创建出来的流程实例既能表现流程,同时又能够体现出我们系统的业务数据 ProcessInstance processInstance=runtimeService.startProcessInstanceByKey("myProcess_Part1","bKey0001"); System.out.println("ID:"+processInstance.getId()); System.out.println("ProcessInstanceId:"+processInstance.getProcessInstanceId()); System.out.println("ProcessDefinitionId:"+processInstance.getProcessDefinitionId()); }
这里我们定义流程实例是通过Key以及businessKey来进行定义的
这里我们需要重点理解的businessKey,其实这个key就是我们上面讲到的业务数据,一般我们定义流程实例之前都需要将我们本次流程实例需要绑定的业务数据的信息定义出来,定义出来时候,该业务数据本身就会有他自己的ID,那么我们创建流程实例的时候就只需要将该流程实例与该业务数据的ID绑定之后,那么完整的流程实例就已经创建好了,确切的创建流程实例的过程应该是这样的
理解上面的概念之后,我们来执行以下代码,可以发现已经执行成功了.
那么我们再来看看数据库中的信息会发生怎么样的变化.
首先我们先看到的就是act_ru_execution表里面增加了两条信息,为什么增加的是两条信息,大家可能要问了,这主要是因为我们的BPMN文件里面都是定义了一个起始结点以及一个结束结点的,所以会增加两条记录.
接着我们再看,就是能够发现我们的数据已经和我们定义的业务数据绑定了,这样后续我们查找该流程实例的业务数据后悔方便很多,直接关联我们的业务数据表进行关联查询即可.
还有一个表的数据是发生了变化的,就是act_ru_identitylink,这张表主要就是记录我们流程过程中参与流程的人员身份,这其中的人员身份只包括我们在BPMN文件里面定义的用户信息,并且这个信息应该只是代表一种身份,并不具体到确切的个人,只是我们这里定义的时候为了方便大家理解,选择使用bajie来替换,确切的人员信息应该是在业务数据里面定义的
这样我们的流式实例定义操作就已经结束了.
4.2-ProcessInstance-流程实例查询操作:
//获取流程实例列表 @Test public void getProcessInstances(){ List<ProcessInstance>processInstances=runtimeService.createNativeProcessInstanceQuery().list(); for(ProcessInstance processInstance:processInstances){ //流程实例ID System.out.println("ProcessInstanceId:"+processInstance.getProcessInstanceId()); //流程定义ID System.out.println("ProcessDefinitionId:"+processInstance.getProcessDefinitionId()); //流程实例是否已经执行结束 System.out.println("isEnded:"+processInstance.isEnded()); //流程实例是否已经挂起 System.out.println("isSuspended:"+processInstance.isSuspended()); } }
执行完代码之后我们就能够发现是的确已经执行成功了
4.3-ProcessInstance-流程实例挂起激活操作:
//暂停与激活流程实例 @Test public void activitieProcessInstances(){ runtimeService.suspendProcessInstanceById("bcad5409-3db6-11eb-87c1-3c58c24c1a1b"); System.out.println("流程实例挂起成功"); // runtimeService.activateProcessInstanceById("bcad5409-3db6-11eb-87c1-3c58c24c1a1b"); // System.out.println("流程实例激活成功"); }
我们首先先测试流程实例的挂起操作
嘴上说挂起成功没用,这时候我们重新去查询一下所有的流程实例,并且看看他们的状态
可以看到该流程实例奇缺已经挂起了
这时候我们重新将该流程实例重新激活
我们在重新去查看一下所有的流程实例
可以看到该流程实例的确已经激活了
4.4-ProcessInstance-流程实例删除操作:
//删除流程实例 @Test public void delProcessInstances(){ runtimeService.deleteProcessInstance("bcad5409-3db6-11eb-87c1-3c58c24c1a1b","拜拜了您嘞"); System.out.println("流程实例删除成功"); }
这里我们选择删除我们上面定义的流程实例,我们主要看第二个属性
可以看到Activiti7要求删除流程实例的时候必须要提供一个删除的原因,这个主要就是为了迎合我们的业务数据,我们停掉某个流程,很明显都是有原因的,那么我们就肯定是要记录这个原因的,所以Activiti7要求我们记录该原因.
接着我们测试一下删除流程实例的代码
可以看到该流程实例已经被成功删除掉了,我们这时候再去查看流程实例
可以看到已经没有流程实例,说明我们已经成功将该流程实例删除掉了.