1. 程式人生 > >Activiti工作流demo

Activiti工作流demo

分享一下我老師大神的人工智慧教程吧。零基礎,通俗易懂!風趣幽默!http://www.captainbed.net/

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

繼上篇《Activiti工作流的環境配置

       前幾篇對Activiti工作流進行了介紹,並講解了其環境配置。本篇將會用一個demo來展示Activiti工作流具體的體現,直接上乾貨。

一、demo業務分析

       以HelloWorld程式為例。

      首先說一下業務流程,員工張三提交了一個申請,然後由部門經理李四稽核,稽核通過後再由總經理王五稽核,通過則張三申請成功。接下來用Actitivi工作流來實現業務。

二、新建專案

        首先新建一個Activiti專案,目錄結構如下。

       

三、畫流程圖

        在diagrams下新建一個Activiti Diagram:右擊diagrams->new->others->Activiti Diagram

        然後畫流程圖:

         指派各活動節點的分派人:分別為張三,李四,王五。

四、配置環境

       

引jar包,建資料庫建表,配置日誌檔案,參考上篇博文《Activiti工作流的環境配置》

五、新建HelloWorld類

        配置好環境後,新建HelloWorld類,程式碼如下。

<span style="font-size:18px;">package cn.itcast.a_helloworld;import java.util.List;import org.activiti.engine.ProcessEngine;import org.activiti.engine.ProcessEngines;import org.activiti.engine.repository.Deployment;import org.activiti.engine.runtime.ProcessInstance;import org.activiti.engine.task.Task;import org.junit.Test;public class HelloWorld {  ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();  /**部署流程定義*/ @Test public void deploymentProcessDefinition(){  Deployment deployment = processEngine.getRepositoryService()//與流程定義和部署物件相關的Service   .createDeployment() //建立一個部署物件   .name("helloworld入門程式")//新增部署的名稱   .addClasspathResource("diagrams/helloword.bpmn")//從classpath的資源中載入,一次只能載入一個檔案   .addClasspathResource("diagrams/helloword.png")//從classpath的資源中載入,一次只能載入一個檔案   .deploy(); //完成部署  System.out.println("部署ID:"+deployment.getId());  //1  System.out.println("部署名稱"+deployment.getName()); //helloworld入門程式   }  /**啟動流程例項**/ @Test public void startProcessInstance(){  //流程定義的key  String processDefinitionKey ="helloworld";  ProcessInstance pi = processEngine.getRuntimeService()//與正在執行 的流程例項和執行物件相關的Service      .startProcessInstanceByKey(processDefinitionKey);  //使用流程定義的key啟動流程例項,key對應helloworld.bpmn檔案中id的屬性值,使用key值啟動,預設是按照最新版本的流程定義啟動  System.out.println("流程例項ID:"+pi.getId());  System.out.println("流程定義ID:"+pi.getProcessDefinitionId()); }  /**查詢當前人的個人任務*/ @Test public void findMyPersonalTask(){  String assignee = "張三";   List<Task> list = processEngine.getTaskService()//與正在執行的任務管理相關的Service      .createTaskQuery()//建立任務查詢      .taskAssignee(assignee)//指定個人任查詢,指定辦理人      .list();  if(list!=null && list.size()>0){   for(Task task:list){    System.out.println("任務ID:"+task.getId());    System.out.println("任務名稱:"+task.getName());    System.out.println("任務的建立時間:"+task.getCreateTime());    System.out.println("任務的辦理人:"+task.getAssignee());    System.out.println("流程例項ID:"+task.getProcessInstanceId());    System.out.println("執行物件ID:"+task.getExecutionId());    System.out.println("流程定義ID:"+task.getProcessDefinitionId());    System.out.println("############################################");   }  } }  /**完成我的任務*/ @Test public void completeMyPersonalTask(){  //任務ID  String taskId = "11402";  processEngine.getTaskService()//與正在執行的任務管理相關的Service      .complete(taskId);  System.out.println("完成任務:任務ID:"+taskId); }}</span>
        分開來講:

1、部署流程定義

<span style="font-size:18px;"/**部署流程定義*/ @Test public void deploymentProcessDefinition(){  Deployment deployment = processEngine.getRepositoryService()//與流程定義和部署物件相關的Service   .createDeployment() //建立一個部署物件   .name("helloworld入門程式")//新增部署的名稱   .addClasspathResource("diagrams/helloword.bpmn")//從classpath的資源中載入,一次只能載入一個檔案   .addClasspathResource("diagrams/helloword.png")//從classpath的資源中載入,一次只能載入一個檔案   .deploy(); //完成部署  System.out.println("部署ID:"+deployment.getId()); //1  System.out.println("部署名稱"+deployment.getName()); //helloworld入門程式  </span>

       執行完後,4張表中的資料:

      1)act_re_deployment (部署資訊表)

      2)act_re_procdef(流程定義資料表)


      3)act_ge_bytearray(二進位制陣列表)

       4)act_ge_property(屬性資料表)


2、啟動流程例項

<span style="font-size:18px;">/**啟動流程例項**/ @Test public void startProcessInstance(){  //流程定義的key  String processDefinitionKey ="helloworld";  ProcessInstance pi = processEngine.getRuntimeService()//與正在執行 的流程例項和執行物件相關的Service      .startProcessInstanceByKey(processDefinitionKey);  //使用流程定義的key啟動流程例項,key對應helloworld.bpmn檔案中id的屬性值,使用key值啟動,預設是按照最新版本的流程定義啟動  System.out.println("流程例項ID:"+pi.getId());//流程例項ID   101  System.out.println("流程定義ID:"+pi.getProcessDefinitionId());//流程定義ID }</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、查詢當前人的個人任務

<span style="font-size:18px;">/**查詢當前人的個人任務*/ @Test public void findMyPersonalTask(){  String assignee = "張三";   List<Task> list = processEngine.getTaskService()//與正在執行的任務管理相關的Service      .createTaskQuery()//建立任務查詢      .taskAssignee(assignee)//指定個人任查詢,指定辦理人      .list();  if(list!=null && list.size()>0){   for(Task task:list){    System.out.println("任務ID:"+task.getId());    System.out.println("任務名稱:"+task.getName());    System.out.println("任務的建立時間:"+task.getCreateTime());    System.out.println("任務的辦理人:"+task.getAssignee());    System.out.println("流程例項ID:"+task.getProcessInstanceId());    System.out.println("執行物件ID:"+task.getExecutionId());    System.out.println("流程定義ID:"+task.getProcessDefinitionId());    System.out.println("############################################");   }  } }</span>
        執行完後,能夠從執行時任務節點表中查詢出相關的資訊並顯示出來。與上面同理,act_ge_property的兩個值分別又變了。

        

4、完成我的任務

<span style="font-size:18px;">    /**完成我的任務*/    @Test    public void completeMyPersonalTask(){        //任務ID        String taskId = "104";//執行時任務ID        processEngine.getTaskService()//與正在執行的任務管理相關的Service                        .complete(taskId);        System.out.println("完成任務:任務ID:"+taskId);    }</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

          

           

給我老師的人工智慧教程打call!http://www.captainbed.net/

這裡寫圖片描述