00:00
各位同学大家好,刚才呢,咱们完成了流程定义部署,那下面呢,我们继续往下来看我们的下一步该怎么做,首先啊,咱们还是回到这个流程中来看一下啊,第一步一种依赖初始化数据库,第二步通过工具绘制流程图,第三步流程定义部署,咱目前这三步都已经做到了,然后下面做的事情就是啊,启动一个流程实例,用户查询任务,进行任务相关的操作,下面就来做这个事情。那咱们下面啊,开始启动一个流程实例,什么叫流程实例呢?之前说过,这里边再解释一遍啊,咱们刚才呢,进行流程定义部署之后,这个时候呢里这个中已经加入了我们相关数据,而这过程中呢,好比说我们现在啊建立一个Java类。这各位都明确啊,Java类,而这个类要使用的话,咱是不是要创建类的实例啊,或者说new这个类的对象,所以我们下面就是启动一个流程实例,好比说咱们创建一个Java的一个实例对象,那咱下面看这个该怎么去做啊,而这里边做法跟刚才类似,我们看到啊在里呢装了很的们刚才的接service,通过我们来进行流程定义部署,那下面咱们启动一个流程实例怎么来做呢?用这个接口叫run time service,包括咱们进行任务的操作,用service,下面用runtime service进行流程实例的启动,咱们看这个怎么去写,下面啊给各位来写一下这个相关代码,就是它的做法就是调用里边的方法我们进行实现就可以了,那咱们来看一下啊。
01:53
我来到这个类里边,首先咱们先进行注入。注入这个叫runtime service,那我们来写一下啊,加上奥。
02:06
Private run time service别注入,别把这个注入进去啊,Run service。这个咱们注进来,然后注入它之后,我们下面的来调用里边的方法进行实现,那我把这个啊,我就写到这个位置,咱们现在做的事情就是启动一个流程的实例。这个过程中各位要明确啊,比如咱们Java类,一个类是不是能创建多个对象,而目前同样我们在这里边可以启动多个实例,比如说张三请假启动一个实例,李四请假启动一个实例,什么赵六请假又启动一个实例,咱们现在啊,就启动一个流程实例,那咱看怎么来写。我加上一个test,然后加上方法public啊,就是开启或者说启动一个实例,我们起个名字啊,就叫这个。
03:07
这是我们写一个方法,然后在方法中我们进行实现,怎么实现呢?调用run里边有一个方法,这一方法就叫做start process instance by k啊,咱用它进实现,然后这里边呢,加上咱们那个key的那个名字,我们是请假。这个K的名字是什么呢?我说各位是否记得啊,咱们当时啊,在画这个流程图的时候,我们曾经做过这个事情啊,在这位置有一个这个key的值叫请假,然后根据它进行启动,也就是我们在写配置文件中的这个值。那现在啊,加这个请假,然后最终呢,它会返回一个对象,就这个我们给他起个名字,就这个名,这样的话就完成了启动,完成启动之后,咱把它一些相关信息给它来输出一下啊,那我们来输出,比如说里边我输出第一个就是我们这个定义的ID就是它。
04:10
啊,这个ID流程定义的ID,我这里啊加上中文的这个注释,为了看着方便。流程定义的ID,这是一个值,然后咱们继续进行输出,第二个呢,我在里边输出,里边那个就是流程有一个实例的ID,也就这个。Get ID实例ID。我写到这个位置啊,这是实例ID。把它加上啊,然后之后呢,比如说我们可以再给它输出一个值,这个值是什么呢?这里写一下啊。D。
05:11
咱们先输出之后,然后看一下这个值都是什么啊。这个写一下。活动ID,所以现在这个就完成了,用它我们就能启动一个流程的实例,那下面咱们来执行一下啊,看一下效果。我把这个进行执行。等他定出来啊。然后这里边提到啊,我们现在是根据里边这个实例的行启动,而这个实例呢,刚才咱们表里边我们进行流程定义部署的时候,里边已经存入了他的相关的信息,不知各位是否记得啊,这里边有个key是不是叫请假,根据他我们进行启动。然后现在我们看啊,现在这个过程我们就已经完成了,咱就把它最终做到了。
06:04
然后这个做到之后呢,我们来看一下啊,我在课件中写到了这个过程中他会操作以下这几张表,然后这张表中我们发现啊,前面这几个表都是它的相关的历史信息,比如说里边流程实例的执行历史啊,参与用户的历史信息,包括任务的等信息,另外下面有一个流程执行信息等等,咱们就简单看几个主要的啊,比如说里边我们看第一个里面那个叫实例的历史信息,它叫HR。就是P么?咱们头相信息是如我再看一啊,咱们看下这个表流程的执行信息,以ru开头的这个表。我们找到这个目前进行到这个位置,然后之后呢,里边我们再找一个就是这个流程的参与的用户信息,找到用户这个link,这个大家看啊,现在我们要参与者是这个张三,因为咱们第一部分是张三审批,第二个是李四审批,所以目前到这里以上啊,就是咱们启动了一个流程的实例,这个就完成了。
07:19
然后这个完成之后,我们继续往下来看啊,下面做什么呢?咱们流程启动之后,是不是要一步一步往后执行啊,而这个时候因为咱们每个节点中都配置这个叫赛,就配置了它那个负责人是谁,在咱下面可以查询这个任务,就是这里写到啊,流程启动之后,任务的负责人就可以查询自己当前需要处理的任务,然后查理出任务之后,可以对这任务进行相关的处理,在咱下面就来做这个事情。咱们之前画这图的时候,各位应该记得啊,我们现在到这一步的时候,他的这个处理人负责人应该是张三,这一步应该是李四,所以咱就可以根据张三和李四查询他当前需要办理这个任务,就或者说他这个代办的任务,那在下面进行实现,然后咱们演示如何来查询任务,它的做法就是了,还是用中一个service进行实现,这个service叫task service,通过它可以做到那下面啊把这个我们来写一下,看它的写法是怎么样。
08:27
我写到这个位置啊,还是来到咱们这个方法中,我在里边注入一个service。咱们进行注入啊。加上。Task service就是这个任务的service。然后洗完之后在下面呢,咱先做个查询。查询什么呢?比如现在啊,我就查这个张三,它里边待执行任务,或者他代办的任务,把这个进行查询,那我这里边写下啊怎么做。
09:01
我写到这位置。查询就是某个人的那个代办的。任务。然后咱现在就查这个。张三。那下面写下啊,加上。Test,然后加上public,我们叫这个task啊,然后里边给它起个名字叫这个呃,List啊,这任务就是任务,可能一个也可能多个啊,咱来一个例子。然后这个之后,下面我们写下这个代码啊,首先怎么做跟之前都差不多啊,用里边有一个方法,这个方法叫task query,你看这个名字啊,创建任务,这个query,这个对象就是进行查询,然后下面加上就是查询那个负责人,就查询谁的这个任务,咱们点上一个方法叫task。这个叫。
10:00
然后里边加上一个就这个啊,里边加上你这个名称,咱就查这个张三啊,那这个我在外边下这个变量啊,咱来一个string叫这个。这个值等于这个张三啊,咱目前是进行测试啊。正三。然后把这个值咱给它就进去。啊S啊这个名字。活塞。现在啊,我们做这个查询,然后之后我们调用里边一个方法叫list,把它所有的信息都查出来,最终它会返回一个list,这个集合里边有当前这个张三,所有这个就是代办这个任务啊,这个我们就写了这个方法啊,然后写完之后,因为这里边反是一个集合,咱们把集合做个利,然后把里面相关内容给他输出就可以了,就是把集合咱就快速遍历一下啊,我这里快速写一下。
11:06
首先,我们将这个叫task。Task加上这个list,然后task里边有它一些相关的信息,咱通过task中的方法直接输出可以了,我这里写一下啊,我就写一个其他我就复制了啊,比如咱们首先输出第一个就是task里边,我们输入它里面那个流程实例IDID。Instance ID啊,把这个输出一下,然后包括里边有的任务ID,任务的负责人,包括任务的名称等等这些咱们都给他做个输出。写个注释啊,流程实例的ID,然后还有其他其他我从里边复制一下啊,就是里边调用task方法,直接给他输出就可以了啊,咱为了看的明确都给他输出一下啊,所以现在这就完成了,就是查询张三他这个人代执行任务,或者说叫代办的这个任务。
12:08
这个啊,咱就讲到这里,然后这个之后下面呢,我们来进行个测试,看一下这个效果到底它是怎么样的啊,咱试一下这个效果啊。现在我把这个知情下。咱们做一个具体查询。等它进行出来啊,这过程稍微慢一点,他稍微等一会儿。啊,各位看啊,现在已经执行完成了,咱们看它的输出内容啊,第一个就是流程实例ID,这个什么意思呢?就是一个流程啊,只有一个是例ID啊,这不可能是多个,然后这里边还一个叫做任务外D,什么叫任务外D呢?给大家强调啊,就是咱们流程啊,每进行到某个节点的时候,就会为这个节点分配一个任务ID,比如现在我到张三审批,这个时候分配一个任务ID,我到李四审批,那他就分配一个任外地啊,就是里边的这个特点,所以现在啊,咱们把这个输出,然后之后再来看下面有一个任务的负责人,咱们当前是张三。
13:13
然后这里边任务名称,我们目前叫张三审批,也就这个名字啊,把它就得到了,所以以上啊,咱就完成这个任务的一个查询操作,各位把这个要清楚啊,这个咱们用task service的方法进行实现。然后这个任务查询之后呢,咱下面干什么,还是回到我们最开始那个步骤里边啊,我们现在就是启动了一个流程实例,这个做到了,然后查询了用户代办的任务,这也做到了,然后下面做什么,用户是不是要办理任务,或者说处理这个任务,所以下面咱开始做这个处理当前这个任务。然后之后可以查询你已经处理的任务,然后最终啊,它就结束了,那在下面啊,来处理一下这个任务,那怎么处理呢?同样啊,我们做法就是用task three中的方法进行实现啊,通过它我们进行这个处理,那大看怎么做啊,这个代码咱先看一下。
14:11
首先啊,我们就是做法就是大家看啊。这步干什么,是不是要查询这个负责人,他这个任务是什么,然后把这任务给他完成是不可以,所以咱们先把任务查出来,然后再给他完成,那下面我来写一下这个处理当前这个任务啊,把这个进行实现,咱们写这位置啊。这里。处理当前的任务也是我们这个工作流中一个基本的流程啊,咱就是一步一步给大家测试,后面在具体功能中,咱们也按照这种方式加到咱们的具体功能中去。Public we,我给它加上一个方法,就是处理这个当前的任务啊,处理或者叫完成任务,我们叫这个。
15:01
这个task。我就跟课件中保持一致了啊,就要这个名字了。那就是他啊。然后在里边做个处理,首先啊,咱们先查询这个负责人,他需要处理的那个任务。啊,咱就返回,注意这里边需要返回它当前这个一条任务啊,就是返回一条一条一条进行处理。然后咱们写一下啊,Task里边还是刚才这个方法叫create task query点上一个方法叫task,加上这个任务,这个负责人我们是张三。然后加上之后,我们进行返回,点上里边的一个方法,这个方法咱就不点这个例子啊,有一个叫这个看到它啊single result是不是单一的记录,返回它的某一条记录,咱们给它起个名字叫task,然后这个之后下面呢,咱们把这个任务进行处理,或者说叫完成这个任务,或者说叫处理任务啊,那我写一下啊,注意怎么做。
16:14
Task service里边有一个方法,就这个方法就是然后里边加上task这个任务的ID,咱们get ID,把这个给它完成,所以现在啊,通过这个代码,这个过程就做到了,处理当前的任务,用complete加上任务ID进行实现。我写一下啊,它的参数。是那个任务外地。现在这个做到啊,然后这个做到之后我们继续来看啊,就是现在比如说啊,咱们任务完成之后,然后这个任务就自动到了下一个节点,比如我现在我张三审批完成了,它就自动到了李四审批这个位置啊,它会自动往下完成,因为用activity里边做到这个自动往下执行过程,然后在下面再做个查询,为了咱一会儿看到方便啊,查询什么,查询已处理的任务,比如张三把那任务处理过了,然后里面能看到张三处理过哪些任务,那咱们把这个给他写完啊,然后这个查询与处理任务怎么做,用一个service,叫history service,就是历史service,通过它进行实现。
17:30
然后把这个写一下啊。咱写这位置就这里边,我们现在是把任务处理过,让家看一下这张三是不是已经处理完了,咱通过它进行查询。首先啊,我先做个注入。Private。调用这里面的方法进行实现,就是查询已经处理的这个任务。啊,咱们小这里啊。加上,然后public。
18:02
我们给这个方法起个名字啊,就叫范的这个。就叫他find complete。啊,Complete这个task。例把这个我们做一个查询。查询已经处理的任务,然后这过程中我们写下这个具体代码啊,用service里边我们加上它的这么一个方法,这个方法名字大家看啊,这名字比较长,它叫history task query,也就是这个,呃,别选错啊,咱查询已有处理过的任务,这个你看这个名字啊,创建历史任务这个实例的查询通过他进行实现。然后在下面的指定它的参数,我们做个指定啊,加上一个叫。恶赛,但加上我们查询谁处理过的,比如查了一个张三啊,目前就是只写了一个张三啊,当然后面可能有李四,别的人之后呢,我们调用里面一个方法叫的,再点上一个的,然后得到它最终这个结果,它的结果是一个list集合。
19:18
所以现在啊,我们把这个就完成了,大家看他的泛型就是历史这个任务的事,就是已经处理过这个历史。就是哪个任务处理过啊,然后这个历史能够查到之后呢,把粒子集和便利,咱把它的最终结果我们做一个输出。啊,那我快速写一下啊,给他遍历一下。在这个过程中加上我们这个。实例啊。再加上这个次集合,然后最终给他输出一下啊,我就直接做输出了,首先第一个我在里边呢,把它这个就是实例的ID,咱们输出一下,这是第一个。啊,我加上一个中文的一个提示啊。
20:00
实力ID。这是第一个啊,然后之后还有其他值,比如说里边这个任务ID,任务负责人,包括任务名称跟刚才那个都一样啊,我就从里边拿过来了,因为刚才咱都写过了啊,就是里边这几个值,然后为了看到当前这个相关的信息。这个放到这里啊,然后大家看这是任务的ID。这是实例ID啊,然后这是你的任务负责人,这是那个任务名称,就是咱通过他能看到当天他处理过哪些任务,所以现在啊,这个过程我们就完成了,完成之后呢,下面咱们把它做一个测试,首先啊,就是现在你注意啊,我当前就是张三他需要代办的任务是到这里,就这里边是代办任务,那那下面呢,把任务进行处理,我现在处理一下啊,张三他的任务。咱们把这个执行。等他进行出来啊。然后执行之后,咱通过这个方法来看一下张三处理过哪些任务,如果他能查到,就问他处理过了,如果查不到就问他就没处理过,因为之前我没有做过执行啊,咱通过他能看到。
21:13
等他出来啊。大家看啊,现在这个任务已经处理过了啊,就已经执行完了,这里写到了啊,然后执行之后,下面咱给查询,就查一下张三处理过的任务,把这个方法进行执行。那咱看一下啊,最后的结果是怎么样。然后大家看啊,我这个已经查出来了,咱看最后啊,这是那个实力ID啊,这是任务ID,然后这是张三让他审批,证明张三把这个已经执行完成了,执行了他当前这个就任,所以这是我们出这个效果啊。这个效果演示之后呢,这么演示,有同学可能有疑惑,说老师你改个名字看能查出什么,那咱就改一下啊,张三,因为刚才他处理过了,这可能查到,这没啥可说的,比如现在我改个名字,我改成李四,李四是不是什么任务都没有处理过,因为我的代码之前没有执行过,我就执行过张三现在我查李四,看李四处理过哪些任务,那咱执行一下啊,就看我刚才说的是否正确,咱都做个测试,张三查出来肯定是对的,这没啥可说的,因为张三其实处理过了,咱就看李四能查出什么。
22:26
正常来讲啊,应该是什么都查不到,这个集合等于空,这便利应该都执行不到啊,大家看一下啊,是不是这个效果。让他执行。咱们看一下啊。然后大家看啊,最后的结果中,这是不是零啊,就是目前什么都查不到,因为你李四没有处理过这个任务啊,所以证明咱这方法就都正确了。然后这些呢,方法都演示之后,咱们最后啊看一下我们的课件里边,我在这位置关于流程操作中还有一些其他的操作接口方法,那我们来看一下啊,首先我这里写到我们通过这个方法可以查询你的流程定义,然后大家看一下啊,这个我就不测试了,跟刚才都差不多,咱们用这个方法,Create process DeFine query,然后咱们加上里面这些方法,最终得到流程定义信息,另外我们可以删除流程定义,删除的时候注意啊,根据你这个ID删除,但是删的时候有一个特点,什么特点我这里写到啊,因为大家注意这叫流程定义,就类似于咱说的Java类,而我Java类是不是叫实例啊,就是我类要创建实例或者创建对象,那这个时候有一个特点啊,如果说啊,你用这个方法直接删除这个流程定义,如果有流程实例它会出错,如果说你在里面加个。
23:57
那大家可以直接进行删除,就是做一个几连删除,既删除你的流程实例,也把你的流程定义删除,这个注意啊,我再说一遍,我们调这个方法删除流程定义的时候,如果说流程定义中已经创建了实例,那用这个方法删会直接出错,如果说想实现啊,流程定义和流程实例都删掉,你在里边再加上一个处,那表示可以做一个简单删除。
24:25
以上啊,就关于这个流程定义的这个相关操作,包括咱们分别演示里面这些基本的步骤,最后我们来看一遍啊,第一步引入依赖初始化数据库,第二步通过工具绘制流程图,第三步流程定义部署,第四步启动一个实例,然后第五步查询用户代办任务,第六步用户办理任务,最后流程结束。然后大家注意啊,我现在这个任务张三处理好了,咱们到了李四,那我可以怎么做,查询李四代办的任务,然后把任务完成,最终这个就结束啊,所以以上是咱关于这个一个入门的一个过程,大家把刚才这个步骤按照这个流程能给他自己测试出来。
25:12
这个咱们先讲到这里。
我来说两句