Activiti工作流demo
分享一下我老師大神的人工智慧教程吧。零基礎,通俗易懂!風趣幽默!http://www.captainbed.net/
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
繼上篇《Activiti工作流的環境配置》
前幾篇對Activiti工作流進行了介紹,並講解了其環境配置。本篇將會用一個demo來展示Activiti工作流具體的體現,直接上乾貨。
一、demo業務分析
以HelloWorld程式為例。
首先說一下業務流程,員工張三提交了一個申請,然後由部門經理李四稽核,稽核通過後再由總經理王五稽核,通過則張三申請成功。接下來用Actitivi工作流來實現業務。
二、新建專案
首先新建一個Activiti專案,目錄結構如下。
三、畫流程圖
在diagrams下新建一個Activiti Diagram:右擊diagrams->new->others->Activiti Diagram
然後畫流程圖:
指派各活動節點的分派人:分別為張三,李四,王五。
四、配置環境
五、新建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