前几篇对Activiti工作流进行了介绍,并讲解了其环境配置。本篇将会用一个demo来展示Activiti工作流具体的体现,直接上干货。

一、demo业务分析

       以HelloWorld程序为例。

      首先说一下业务流程,员工张三提交了一个申请,然后由部门经理李四审核,审核通过后再由总经理王五审核,通过则张三申请成功。接下来用Actitivi工作流来实现业务。

二、新建项目

        首先新建一个Activiti项目,目录结构如下。

androidactivity模板 activity demo_Test

        

三、画流程图

        在diagrams下新建一个Activiti Diagram:右击diagrams->new->others->Activiti Diagram

        然后画流程图:

androidactivity模板 activity demo_System_02

         指派各活动节点的分派人:分别为张三,李四,王五。

androidactivity模板 activity demo_加载_03

四、配置环境

        引jar包,建数据库建表,配置日志文件,参考上篇博文《Activiti工作流的环境配置》

五、新建HelloWorld类

        配置好环境后,新建HelloWorld类,代码如下。

1. <span style="font-size:18px;">package cn.itcast.a_helloworld;  
2.   
3.   
4. import java.util.List;  
5.   
6. import org.activiti.engine.ProcessEngine;  
7. import org.activiti.engine.ProcessEngines;  
8. import org.activiti.engine.repository.Deployment;  
9. import org.activiti.engine.runtime.ProcessInstance;  
10. import org.activiti.engine.task.Task;  
11. import org.junit.Test;  
12.   
13. public class HelloWorld {  
14.       
15.     ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();  
16.       
17. /**部署流程定义*/  
18. @Test  
19. public void deploymentProcessDefinition(){  
20. //与流程定义和部署对象相关的Service  
21. //创建一个部署对象  
22. "helloworld入门程序")//添加部署的名称  
23. "diagrams/helloword.bpmn")//从classpath的资源中加载,一次只能加载一个文件  
24. "diagrams/helloword.png")//从classpath的资源中加载,一次只能加载一个文件  
25. //完成部署  
26. "部署ID:"+deployment.getId());  //1  
27. "部署名称"+deployment.getName()); //helloworld入门程序  
28.           
29.     }  
30.       
31. /**启动流程实例**/  
32. @Test  
33. public void startProcessInstance(){  
34. //流程定义的key  
35. "helloworld";  
36. //与正在执行   的流程实例和执行对象相关的Service  
37. //使用流程定义的key启动流程实例,key对应helloworld.bpmn文件中id的属性值,使用key值启动,默认是按照最新版本的流程定义启动  
38. "流程实例ID:"+pi.getId());  
39. "流程定义ID:"+pi.getProcessDefinitionId());  
40.     }  
41.       
42. /**查询当前人的个人任务*/  
43. @Test  
44. public void findMyPersonalTask(){  
45. "张三";  
46. //与正在执行的任务管理相关的Service  
47. //创建任务查询  
48. //指定个人任查询,指定办理人  
49.                         .list();  
50. if(list!=null && list.size()>0){  
51. for(Task task:list){  
52. "任务ID:"+task.getId());  
53. "任务名称:"+task.getName());  
54. "任务的创建时间:"+task.getCreateTime());  
55. "任务的办理人:"+task.getAssignee());  
56. "流程实例ID:"+task.getProcessInstanceId());  
57. "执行对象ID:"+task.getExecutionId());  
58. "流程定义ID:"+task.getProcessDefinitionId());  
59. "############################################");  
60.             }  
61.         }  
62.     }  
63.       
64. /**完成我的任务*/  
65. @Test  
66. public void completeMyPersonalTask(){  
67. //任务ID  
68. "11402";  
69. //与正在执行的任务管理相关的Service  
70.                         .complete(taskId);  
71. "完成任务:任务ID:"+taskId);  
72.     }  
73. }  
74. </span>

        分开来讲:

 

1、部署流程定义

1. <span style="font-size:18px;">    /**部署流程定义*/  
2. @Test  
3. public void deploymentProcessDefinition(){  
4. //与流程定义和部署对象相关的Service  
5. //创建一个部署对象  
6. "helloworld入门程序")//添加部署的名称  
7. "diagrams/helloword.bpmn")//从classpath的资源中加载,一次只能加载一个文件  
8. "diagrams/helloword.png")//从classpath的资源中加载,一次只能加载一个文件  
9. //完成部署  
10. "部署ID:"+deployment.getId()); //1  
11. "部署名称"+deployment.getName()); //helloworld入门程序  
12.           
13. </span>

 

       执行完后,4张表中的数据:

      1)act_re_deployment (部署信息表)

androidactivity模板 activity demo_androidactivity模板_04

      2)act_re_procdef(流程定义数据表)

androidactivity模板 activity demo_androidactivity模板_05

      3)act_ge_bytearray(二进制数组表)

androidactivity模板 activity demo_androidactivity模板_06

       4)act_ge_property(属性数据表)

androidactivity模板 activity demo_androidactivity模板_07

 

2、启动流程实例

1. <span style="font-size:18px;">/**启动流程实例**/  
2. @Test  
3. public void startProcessInstance(){  
4. //流程定义的key  
5. "helloworld";  
6. //与正在执行   的流程实例和执行对象相关的Service  
7. //使用流程定义的key启动流程实例,key对应helloworld.bpmn文件中id的属性值,使用key值启动,默认是按照最新版本的流程定义启动  
8. "流程实例ID:"+pi.getId());//流程实例ID   101  
9. "流程定义ID:"+pi.getProcessDefinitionId());//流程定义ID  
10.     }</span>

           执行完后四张表中的数据:

 

         1)act_ru_execution(运行时流程执行实例表)

androidactivity模板 activity demo_System_08

         2)act_ru_task(运行时任务节点表)

androidactivity模板 activity demo_System_09

         3)act_identitylink(运行时流程人员表)

androidactivity模板 activity demo_androidactivity模板_10

         4)act_hi_taskinst(历史任务实例表)

androidactivity模板 activity demo_System_11

         5)act_hi_procinst(历史流程实例表)

androidactivity模板 activity demo_Test_12

         6)act_hi_identitylink(历史流程人员表)

  

androidactivity模板 activity demo_androidactivity模板_13

         7)act_hi_actinst(历史节点表)

androidactivity模板 activity demo_System_14

         8)act_ge_property

androidactivity模板 activity demo_System_15

         从上图中可以看出变化,next.dbid的VALUE_值由原来的101变为201,REV_由原来的2变为3。

         

3、查询当前人的个人任务

1. <span style="font-size:18px;">/**查询当前人的个人任务*/  
2. @Test  
3. public void findMyPersonalTask(){  
4. "张三";  
5. //与正在执行的任务管理相关的Service  
6. //创建任务查询  
7. //指定个人任查询,指定办理人  
8.                         .list();  
9. if(list!=null && list.size()>0){  
10. for(Task task:list){  
11. "任务ID:"+task.getId());  
12. "任务名称:"+task.getName());  
13. "任务的创建时间:"+task.getCreateTime());  
14. "任务的办理人:"+task.getAssignee());  
15. "流程实例ID:"+task.getProcessInstanceId());  
16. "执行对象ID:"+task.getExecutionId());  
17. "流程定义ID:"+task.getProcessDefinitionId());  
18. "############################################");  
19.             }  
20.         }  
21.     }</span>

        执行完后,能够从运行时任务节点表中查询出相关的信息并显示出来。与上面同理,act_ge_property的两个值分别又变了。

 

         

4、完成我的任务

1. <span style="font-size:18px;">    /**完成我的任务*/  
2. @Test  
3. public void completeMyPersonalTask(){  
4. //任务ID  
5. "104";//运行时任务ID  
6. //与正在执行的任务管理相关的Service  
7.                         .complete(taskId);  
8. "完成任务:任务ID:"+taskId);  
9.     }</span>

        执行完后,表的变化。

 

       1)act_ru_task

androidactivity模板 activity demo_Test_16

       从上表中可以看出完成张三的任务后,张三的任务消失,李四的任务显示在表中。

        2)act_ru_identitylink

androidactivity模板 activity demo_System_17

      从上表中可以看出多了一条李四的用户数据。

      3)act_hi_actinst

androidactivity模板 activity demo_System_18

        从上表中可以看出多了一条李四的节点数据。

        同理act_hi_identitylink也会多一条李四的用户数据, ac_hi_taskinst多一条李四的任务数据。

        然后完成李四的任务,到王五同理;完成王五的任务后张三申请成功,同理,但是运行时表的数据会全部清除,act_hi_procinst的结束相关字段会更新。至此,整个申请结束。

 

        这是Activiti工作流的一个小demo,大家可以参照着实践一下。下面是本demo及更多demo源码下载的地址: