Activiti工作流demo




       本篇将会用一个demo来展示Activiti工作流具体的体现。

一、demo业务分析

       以HelloWorld程序为例。

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

二、新建项目

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

       

三、画流程图

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

        然后画流程图:

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

四、配置环境

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

五、新建HelloWorld类

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


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

1、部署流程定义


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

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

      1)act_re_deployment (部署信息表)

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


      3)act_ge_bytearray(二进制数组表)

       4)act_ge_property(属性数据表)


2、启动流程实例


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

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


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

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

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


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


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

 

         7)act_hi_actinst(历史节点表)


         8)act_ge_property

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

        

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


 
 
  1. <span style= "font-size:18px;"> /*查询当前人的个人任务/
  2. @Test
  3. public void findMyPersonalTask(){
  4. String assignee = "张三";
  5. List<Task> list = processEngine.getTaskService() //与正在执行的任务管理相关的Service
  6. .createTaskQuery() //创建任务查询
  7. .taskAssignee(assignee) //指定个人任查询,指定办理人
  8. .list();
  9. if(list!= null && list.size()> 0){
  10. for(Task task:list){
  11. System.out.println( "任务ID:"+task.getId());
  12. System.out.println( "任务名称:"+task.getName());
  13. System.out.println( "任务的创建时间:"+task.getCreateTime());
  14. System.out.println( "任务的办理人:"+task.getAssignee());
  15. System.out.println( "流程实例ID:"+task.getProcessInstanceId());
  16. System.out.println( "执行对象ID:"+task.getExecutionId());
  17. System.out.println( "流程定义ID:"+task.getProcessDefinitionId());
  18. System.out.println( "############################################");
  19. }
  20. }
  21. }</span>
        执行完后,能够从运行时任务节点表中查询出相关的信息并显示出来。与上面同理,act_ge_property的两个值分别又变了。

        

4、完成我的任务


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

       1)act_ru_task


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

        2)act_ru_identitylink


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

      3)act_hi_actinst


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

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

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


        这是Activiti工作流的一个小demo,大家可以参照着实践一下。下面是本demo及更多demo源码下载的地址:http://download.csdn.net/detail/u013037201/9559857

          
转自:https://blog.csdn.net/qwlzxx/article/details/52416614

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值