1. 程式人生 > >工作流學習——Activiti流程例項、任務管理四步曲

工作流學習——Activiti流程例項、任務管理四步曲

轉載:https://blog.csdn.net/zwk626542417/article/details/46646565

一、前言

    上一篇文章中我們將Activiti流程定義管理的知識進行了介紹,這篇文章我們繼續Activiti流程例項和任務管理的學習。

二、正文

流程例項(ProcessInstance )

    流程例項(ProcessInstance)和上一篇文章中流程定義(ProcessDefinition)的關係,與類和例項物件的關係有點像,ProcessDefinition是整個流程步驟的說明而ProcessInstance就是指流程定義從開始到結束的那個最大的執行路線。

執行物件(Execution

    提到ProcessInstance同時又會出現另一個名詞,那就是執行物件(Execution),Execution是按照ProcessDefinition的規則執行的當前的路線,

    如果ProcessDefinition只有一個執行路線的話,那麼Execution和ProcessInstance就是完全一樣瞭如果ProcessDefinition中有多個執行路線的話,Execution和ProcessInstance可能是同一個也可能不是同一個。所以得出結論:一個流程中ProcessInstance有且只能有一個,而Execution可以存在多個。

任務(Task )

    任務(Task)應該比較好理解,就是當流程執行到某步驟或某環節時生產的任務資訊。

    在上篇文章中我們將如何畫流程圖、如何部署流程定義已經介紹,流程定義和流程例項的關係剛才已經介紹了,所有現在我們就該開始啟動流程例項了:

程式碼

啟動流程例項

  1. /** 
  2.  * 啟動流程例項 
  3.  */
  4. @Test
  5. publicvoid startProcessInstance() {  
  6.     // 流程定義的key
  7.     String processDefinitionKey = "HelloWorld";  
  8.     ProcessInstance pi = processEngine.getRuntimeService()// 與正在執行的流程例項和執行物件相關的Service
  9.             .startProcessInstanceByKey(processDefinitionKey);// 使用流程定義的key啟動流程例項,key對應HelloWorld.bpmn檔案中id的屬性值,使用key值啟動,預設是按照最新版本的流程定義啟動
  10.     System.out.println("流程例項ID:" + pi.getId());  
  11.     System.out.println("流程定義ID:" + pi.getProcessDefinitionId());  
  12. }  

執行結果:

    流程例項ID:501

    流程定義ID:HelloWorld:2:404

說明:

    1)資料庫的act_ru_execution正在執行的執行物件表中插入一條記錄

2)在資料庫的act_hi_procinst程例項的歷史表中插入一條記錄

3)在資料庫的act_hi_actinst活動節點的歷史表中插入一條記錄

4)我們圖中節點都是任務節點,所以同時也會在act_ru_task流程例項的歷史表新增一條記錄

5)在資料庫的act_hi_taskinst任務歷史表中也插入一條記錄。

查詢歷史流程例項

流程例項啟動以後,我們也可以對某個流程例項一共一共執行了多少次流程進行查詢,因為我們本例中現在剛進行了一個流程,所以目前只能查出一個流程:

  1. /** 
  2.  * 查詢歷史流程例項 
  3.  */
  4. @Test
  5. publicvoid findHistoryProcessInstance(){  
  6.     String processInstanceId="501";  
  7.     HistoricProcessInstance hpi = processEngine.getHistoryService()  
  8.             .createHistoricProcessInstanceQuery()  
  9.             .processInstanceId(processInstanceId)  
  10.             .singleResult();  
  11.     System.out.println(hpi.getId() +"    "+hpi.getProcessDefinitionId()+"   "+ hpi.getStartTime()+"   "+hpi.getDurationInMillis());  
  12. }  

執行結果:

    501    HelloWorld:2:404   Fri Jun 26 09:34:51 CST 2015   null

查詢當前的個人任務

在上面講流程啟動後,因為該節點是任務節點所以在任務表中插入了任務的記錄,現在我們就通過辦理人將任務進行下查詢:

  1. /** 
  2.  * 查詢當前的個人任務 
  3.  */
  4. @Test
  5. publicvoid findMyPersonTask() {  
  6.     String assignee = "張三"// TODO
  7.     List<Task> list = processEngine.getTaskService()// 與正在執行的任務管理相關的service
  8.             .createTaskQuery()// 建立任務查詢物件
  9.             // 查詢條件
  10.             .taskAssignee(assignee)// 指定個人任務查詢,指定辦理人
  11.             // .taskCandidateGroup("")//組任務的辦理人查詢
  12.             // .processDefinitionId("")//使用流程定義ID查詢
  13.             // .processInstanceId("")//使用流程例項ID查詢
  14.             // .executionId(executionId)//使用執行物件ID查詢
  15.             /** 排序 */
  16.             .orderByTaskCreateTime().asc()// 使用建立時間的升序排列
  17.             // 返回結果集
  18.             // .singleResult() //返回唯一的結果集
  19.             // .count()//返回結果集的數量
  20.             // .listPage(firstResult, maxResults)//分頁查詢
  21.             .list();// 返回列表
  22.     if (list != null && list.size() > 0) {  
  23.         for (Task task : list) {  
  24.             System.out.println("任務ID:" + task.getId());  
  25.             System.out.println("任務名稱:" + task.getName());  
  26.             System.out.println("任務的建立時間:" + task.getCreateTime());  
  27.             System.out.println("任務的辦理人:" + task.getAssignee());  
  28.             System.out.println("流程例項ID:" + task.getProcessInstanceId());  
  29.             System.out.println("執行物件ID:" + task.getExecutionId());  
  30.             System.out.println("流程定義ID:" + task.getProcessDefinitionId());  
  31.             System.out  
  32.                     .println("##################################################");  
  33.         }  

執行結果:

    任務ID:504

    任務名稱:提交申請

任務的建立時間:Fri Jun 2609:34:51 CST 2015

任務的辦理人:張三

流程例項ID:501

執行物件ID:501

流程定義ID:HelloWorld:2:404

##################################################

說明:

1)因為是任務查詢,所以從processEngine中應該得到TaskService

2)使用TaskService獲取到任務查詢物件TaskQuery

3)為查詢物件新增查詢過濾條件,使用taskAssignee指定任務的辦理者(即查詢指定使用者的代辦任務),同時可以新增分頁排序等過濾條件

4)呼叫list方法執行查詢,返回辦理者為指定使用者的任務列表

5)任務ID、名稱、辦理人、建立時間可以從act_ru_task表中查到。

6)在現在這種情況下,ProcessInstance相當於Execution

7) 一個Task節點和Execution節點是1對1的情況,在task物件中使用Execution_來表示他們之間的關係

8)任務ID在資料庫表act_ru_task中對應“ID_”列

完成任務

查詢完任務後,我們接下來將這個任務id504的任務進行完成:

  1. /** 
  2.  * 完成我的任務 
  3.  */
  4. @Test
  5. publicvoid compliteMyPersonTask() {  
  6.     // 任務ID
  7.     String taskId = "504";  
  8.     processEngine.getTaskService().complete(taskId);  
  9.     ;  
  10.     System.out.println("完成任務:任務ID:" + taskId);  
  11. }  

執行結果:

    完成任務:任務ID:504

說明:

1)是完成任務,所以從ProcessEngine得到的是TaskService。

2)當執行完這段程式碼,再以員工的身份去執行查詢的時候,會發現這個時候已經沒有資料了,因為正在執行的任務中沒有資料。

3)對於執行完的任務,activiti將從act_ru_task表中刪除該任務,下一個任務會被插入進來。

4)以”部門經理”的身份進行查詢,可以查到結果。因為流程執行到部門經理審批這個節點了。

5)再執行辦理任務程式碼,執行完以後以”部門經理”身份進行查詢,沒有結果。

6)重複第3和4步直到流程執行完。

查詢歷史任務

員工張三的任務已經完成,現在任務到部門經理李四了,如果我們現在仍然查詢張三的任務的話,自然是查詢不到了,只有查詢李四才可以查到,不過我們可以通過流程例項id查詢歷史任務,查詢歷史任務可以將已經辦理過的任務和現在正在執行的任務都查詢出來:

  1. /** 
  2.  * 查詢歷史任務 
  3.  */
  4. @Test
  5. publicvoid findHistoryTask(){  
  6.     String processInstanceId="501";  
  7.     List<HistoricTaskInstance> list = processEngine.getHistoryService()//與歷史資料(歷史表)相關的service
  8.             .createHistoricTaskInstanceQuery()//建立歷史任務例項查詢
  9.             .processInstanceId(processInstanceId)  
  10. //              .taskAssignee(taskAssignee)//指定歷史任務的辦理人
  11.             .list();  
  12.     if(list!=null && list.size()>0){  
  13.         for(HistoricTaskInstance hti:list){  
  14.             System.out.println(hti.getId()+"    "+hti.getName()+"    "+hti.getProcessInstanceId()+"   "+hti.getStartTime()+"   "+hti.getEndTime()+"   "+hti.getDurationInMillis());  
  15.             System.out.println("################################");  
  16.         }  
  17.     }     
  18. }  

執行結果:

    504    提交申請   501   Fri Jun 26 09:34:51 CST2015   Fri Jun 26 09:50:50 CST 2015   959867

    ################################

602    審批【部門經理】   501   Fri Jun 26 09:50:51 CST2015   null   null

################################

查詢流程是否結束

我們還可以通過流程例項id查詢某個流程現在的狀態,是仍然在執行過程中呢,還是流程執行已經結束:

  1. 相關推薦

    工作學習——Activiti流程例項任務管理四步曲

    轉載:https://blog.csdn.net/zwk626542417/article/details/46646565一、前言    上一篇文章中我們將Activiti流程定義管理的知識進行了介紹,這篇文章我們繼續Activiti流程例項和任務管理的學習。二、正文流程例

    Activiti工作】8.流程例項任務,執行物件控制流程的執行

    我們之前講過了流程的定義,啟動,檢視和刪除,以及升級版本,接下來當流程 正式啟動成功之後,我們就要學習流程例項/任務的執行了。 1,流程例項/任務的執行 (1)啟動流程例項 (這裡前提是大家部署好了流程)/** * 啟動流程 * 當流程到達一個節點時,會在act_ru_

    工作學習——Activiti流程變量五步曲

    eight 作用域 bound ets oca ole ati pat nds 一、前言 上一篇文章我們將流程實例的啟動與查詢,任務的辦理查詢都進行了介紹,我們這篇文章來介紹activiti中的流程變量。 二、正文 流程變量與我們平常理解的變量是

    5.activiti工作-流程例項任務的執行

    1.流程圖 2.部署流程定義 3.啟動流程例項 說明: 1)操作資料庫的act_ru_execution表,如果是使用者任務節點,同時也會在act_ru_task新增一條記錄

    工作學習——Activiti整體認識二步曲

    表示 www avi clip service() 軟件 date ldp rom 一、前言 在上一篇文章中我們將工作流的相關概念、activiti的前世今生、activiti與jbpm的比較進行學習,這篇文章我們正式進行activiti的學習,activiti

    Activiti工作學習筆記入門(四)——流程例項的構建判斷狀態歷史流程例項查詢和歷史活動查詢

    第一節:構建學生請假審批流程 第二節:執行物件概念 第三節:判斷流程例項狀態 第四節:歷史流程例項查詢 第五節:歷史活動查詢 package com.java1234.activiti.flow; import java.util.List; import or

    工作4-流程例項任務,執行物件控制流程的執行

    流程例項: 從開始到結束 流程物件: 一個流程,流程例項只有一個,執行物件可以存在多個 1.啟動流程例項 public void startProcessInstance(){ //流程定義的key,根據key啟動最新version流程 String pr

    Activiti工作學習筆記入門(五)——流程變數

    package com.java1234.activiti.variable; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; i

    工作3-activiti工作流程定義的CURD

    activiti的流程定義API Explain:activiti對流程的增刪該查 (學習源自傳智播客itcast) 獲取引擎 ProcessEngine processEngine = ProcessEngine.getDefaultProcessEngine();

    activiti 工作學習

    activiti 工作流引擎          ProcessEngine(中文意思為流程引擎) 物件,activiti 工作流引擎的核心,activiti會為你建立28張表(這裡用的6.0jar,記得以前的好像是23張),底層自動結合Mybatis,提供7個介面,讓使用者去

    activiti 工作學習 2

    在第一節中,我們使用類去建立28張表,現在我們用配置檔案去建立  activiti.cfg.xml 我們在 解壓的 activiti-rest.war 的目錄下的 classes 的 activiti-custom-context.xml 和 log4j.propertie

    三款工作引擎比較:WWFnetBPM 和 ccflow 下面將對目前比較主流的三款工作進行介紹和比較,然後通過三款流程引擎分別設計一個較典型的流程來給大家分別演示這三款建立流程的過程.這

    下面將對目前比較主流的三款工作流進行介紹和比較,然後通過三款流程引擎分別設計一個較典型的流程來給大家分別演示這三款建立流程的過程.這三款工作流程引擎分別是 Windows Workflow Foundation,NetBPM, CCFlow. NetBPM 與 CCFlow 是兩款國內知名的開源軟體,尤其是

    activit工作-會籤流程(多例項

    使用工作流的時候有時會遇到這樣的一種情況就是一個任務需要幾個人一起審批,人數不定。這時常規的使用者任務就無法滿足要求,我們稱這種任務為會籤任務。 下面是我開發中的遇到的一個業務好遇到這種情況,記錄一下,以便小白參考。 流程圖: 說明:這是一個公文流轉(收文)流程,先是“

    Activiti工作之獲取流程定義中所有的節點

    初步設想實現一個部署完工作流之後,為UserTask節點動態分配任務執行者,或者在分支節點上新增進入條件的功能。為了實現這個功能需要解析流程定義檔案取出檔案中定義的所有節點。這裡有兩個方法可以實現此功能。 方法一(流程部署至伺服器上之後可使用): //<span st

    Activiti工作】7.流程定義的CRUD(上)

    工作流的23張表是如何存取的?每一步操作邏輯是什麼樣子的?我們來學習一下。 一、管理流程定義 1設計流程定義文件 1.1流程圖 我們之前已經看過,常見流程圖如下如所示: 包含了開始節點/結束節點/任務/流向線 1.2bpmn檔案 BPMN 2.0根節點是definition

    Activiti工作引擎的官方例項配置詳細步驟

    概述 學習Activiti工作流引擎,第一步自然是是下載官方提供的Demo原始碼來參考。 Activiti官網:activiti-5.22.0.zip 下載下來的原始碼結構為: war包裡就是官方示例 建立Java web專案

    工作學習2----入門

    XML drive pos 流程引擎 service() created pre tails 流程 引入jar包   創建activiti表   第一種方式:使用代碼來創建activiti工作流的表 import org.activiti.engine.Proces

    GitFlow工作常用操作流程

    localhost devel 例如 diff 行合並 hot per 進行 ash 1. 主要分支介紹 1.1 master分支 主分支,產品的功能全部實現後,最終在master分支對外發布。 1.2 develop分支 開發分支,基於master分支克隆,產品的編碼工作

    Activiti6.0 java項目框架 spring5 SSM 工作引擎 審批流程

    activiti工作流模塊----------------------------------------------------------------------------------------------------------1.模型管理 :web在線流程設計器、預覽流程xml、導出xml、

    JEPLUS工作之判斷流程——JEPLUS軟件快速開發平臺

    otto span sof mark data order 一個 water pan JEPLUS工作流之判斷流程 判斷流程就是可以在流程過程根據一定得條件來判斷,當達到某一個條件時執行後面得流程,當達成另外一個條件時執行另外得流程。一、效果展示二、實現步驟1、創