構建學生請假審批流程


構建學生請假審批流程

標簽(空格分隔): activiti


1.繪制流程圖:start->學生請假申請->班長審批->班主任審批->end,對這個流程圖文件命名為:StudentLeaveProcess.bpmn,保存后自動生成同名的png文件。中間這三個節點的處理人分別為張三,李四,王五。
2.編寫相關的部署代碼:
package flow;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.repository.Deployment;
import org.junit.Test;

public class StudentLeaveProcess {

/**
* 獲取默認流程引擎實例,會自動讀取activiti.cfg.xml文本
*/
private ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine();

/**
* 部署流程定義
*/
@Test
public void deploy(){
Deployment deployment=processEngine.getRepositoryService()//獲取部署相關Service
.createDeployment() //創建部署對象
.addClasspathResource("diagrams/StudentLeaveProcess.bpmn") //加載資源文件
.addClasspathResource("diagrams/StudentLeaveProcess.png")
.name("學生請假流程")
.deploy(); //部署

System.out.println("流程部署ID:"+deployment.getId());
System.out.println("流程部署Name:"+deployment.getName());
}

}

上述代碼執行后,對流程進行部署:
查詢流程部署表:act_re_deployment,可看到名字為學生請假流程的新部署的流程。
查詢流程定義表:act_re_procdef,也可以查詢到名字為Student Leave Process的新流程定義。
查詢資源文件表:act_ge_bytearray,可以看到名字為diagrams/StudentLeaveProcess.bpmn和diagrams/StudentLeaveProcess.png這兩條數據,將圖片以二進制的形式保存在數據庫里。

3.接下來創建流程實例:
@Test
public void start() {
ProcessInstance pi=processEngine.getRuntimeService()//運行時Service
.startProcessInstanceByKey(“studentLeaveProcess”);//流程定義表的KEY字段
System.out.println(“流程實例ID:”+pi.getId());
System.out.println(“流程定義ID:”+pi.getProcessDefinitionId());
}

接口中的studentLeaveProcess來自於流程定義表中KEY字段。打印輸出:
流程實例ID:27501
流程定義ID:studentLeaveProcess:1:25004

啟動流程實例后,有下述幾張表發生變化:
1.執行對象表:act_ru_execution,發現表中有一條數據usertask1,指的是當前節點處於第一個節點,流程中處於不同節點就會生成不同的執行對象,這個表就會多一條數據。
2.身份聯系表:act_ru_identitylink,發現表中有一條數據,USER_ID為張三,這個人是流程圖中第一個節點的處理人。
3.用戶任務表:act_ru_task,表中有一條數據,里面包含usertask1和張三等字段。
4.活動節點歷史表:act_hi_actinst,表中有兩條數據,分別為Start節點和學生請假申請這兩個節點的信息,其中start節點的結束時間已經賦值,而由於當前仍處於學生請假申請節點,所以結束時間還是空的。因此這個表會記錄流程走過的所有節點的信息。
5.歷史身份聯系表:act_hi_identitylink,表中記錄了第一個節點的張三的信息。
6.歷史流程實例表: act_hi_procinst.
7.歷史任務表:act_hi_taskinst

4.接下來查詢張三這個用戶的相關任務:
/**
* 查看任務
*/
@Test
public void findTask(){
List taskList=processEngine.getTaskService() //任務相關Service
.createTaskQuery() //創建任務查詢
.taskAssignee(“張三”) //指定某個人
.list();

    for(Task task:taskList){
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.getProcessDefinitionId());
}
}

由結果可以看出:
任務ID:27504
任務名稱:學生請假申請
任務創建時間:Sat Jun 17 12:31:53 CST 2017
任務委派人:張三
流程實例ID:studentLeaveProcess:1:25004

5.接下來完成學生請假申請這個任務,讓流程走到下個節點。
/**
* 完成任務
*
*/
@Test
public void completeTask(){
processEngine.getTaskService() //任務相關service
.complete(“27504”);
}
執行完以后,查看執行對象表,發現執行對象已經替換為usertask2;身份聯系表中多了一條李四的相關信息;活動節點歷史表中也多了一條班長審批的記錄,原來學生請假審批節點信息的結束時間字段也被賦值了,新加的班長審批節點的結束時間為空;其他的歷史表中也相應的增加了李四的相關信息。

6,接下來再查詢張三的任務信息,findTask()函數執行后無輸出,說明張三已經沒有任務了,將參數換成李四繼續查詢發現,有結果如下:
任務ID:30002
任務名稱:班長審批
任務創建時間:Sat Jun 17 13:08:53 CST 2017
任務委派人:李四
流程實例ID:studentLeaveProcess:1:25004
說明李四這個人有任務需要處理。

7.接着那種李四的任務ID:30002去執行completeTask函數來完成班長審批這個節點。執行完后當前節點為班主任審批節點,查看執行對象表,執行對象為usertask3;身份聯系表多了王五這一條字段;活動節點歷史表中也多了一條班主任審批的記錄,原來的班長審批節點信息的結束時間字段被賦值,而新加的班主任審批節點的結束時間為空;其他歷史表也相應的增加了王五的相關信息。

8.接下來查詢王五的任務,結果為:
任務ID:32502
任務名稱:班主任審批
任務創建時間:Sat Jun 17 13:18:32 CST 2017
任務委派人:王五
流程實例ID:studentLeaveProcess:1:25004
拿着這個任務ID,去執行完成任務函數來完成班主任審批這個節點。執行完后整個流程結束,查詢執行對象表,發現為空,當前沒有執行對象;身份聯系表為空,用戶任務表也為空,其他歷史表中依然有數據。此外歷史流程實例表中,學生請假這個流程的結束時間被賦值,也說明了當前流程已結束。查看歷史任務表,發現班主任審批這個字段的結束時間已被賦值。

9.最后貼上一些常用的SQL語句,對工作流的常用表進行查詢:
select * from act_re_procdef;

流程部署表

select * from act_re_deployment;

流程定義表

select * from act_re_procdef;

資源文件表

select * from act_ge_bytearray;

執行對象表

select * from act_ru_execution;

身份聯系表

select * from act_ru_identitylink;

用戶任務表

select * from act_ru_task;

活動節點歷史表

select * from act_hi_actinst;

歷史身份聯系表

select * from act_hi_identitylink;

歷史流程實例表

select * from act_hi_procinst;

歷史任務表

select * from act_hi_taskinst;


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com