1.流程定義id : 就是指向特定的流程,版本,和一個隨機數. 就是指向了某一個流程的確定版本
2.流程實例id : 就是一個流程被創建之後,會生成一個id. 就是指向了一個具體的流程
3.流程任務id : 就是一個正在執行的任務,流程進行到任何一步都會生成一個id, 就是記錄了一個流程實例執行到了哪一步;誰是執行人
4.活動id: 就是執行流程過程中,記錄了流程所處的活動位置(這個活動位置可能並不是任務);
請假流程:
----->填寫一張請假單,保存到leavesheet表中,可以增刪改查
部署流程----->編寫一個流程bpmn,保存到activiti的相關表中,真正的bpmn文件內容是保存在:act_ge_bytearray表中;
@Test
public void deploy(){
//取得流程引擎對象
//ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine();
//獲取倉庫服務 :管理流程定義
RepositoryService repositoryService = processEngine.getRepositoryService();
Deployment deploy = repositoryService.createDeployment()//創建一個部署的構建器
.addClasspathResource("diagrams/LeaveBill.bpmn")//從類路徑中添加資源,一次只能添加一個資源
.addClasspathResource("diagrams/LeaveBill.png")//從類路徑中添加資源,一次只能添加一個資源
.name("請求單流程")//設置部署的名稱
.category("辦公類別")//設置部署的類別
.deploy();
System.out.println("部署的id"+deploy.getId());
System.out.println("部署的名稱"+deploy.getName());
}
開啓任務----->提交到流程,使用"流程引擎"獲得"運行時服務",使用"運行時服務"開啓流程實例:
String processDefiKey="leaveBill";
//取運行時服務
RuntimeService runtimeService = processEngine.getRuntimeService();
//取得流程實例
ProcessInstance pi = runtimeService.startProcessInstanceByKey(processDefiKey);//通過流程定義的key 來執行流程
查詢任務----->此時,在activiti的23張表中相關表中就產生了數據,每個用戶可以根據用戶名來查詢自己的任務(list):
//任務的辦理人
String assignee="王五";
//取得任務服務
TaskService taskService = processEngine.getTaskService();
//創建一個任務查詢對象
TaskQuery taskQuery = taskService.createTaskQuery();
//辦理人的任務列表
List<Task> list = taskQuery.taskAssignee(assignee)//指定辦理人
.list();
完成任務-----> 每個人都可以根據 任務id來完成任務:
//執行任務
@Test
public void compileTask(){
String taskId="502";
//taskId:任務id
processEngine.getTaskService().complete(taskId);
System.out.println("當前任務執行完畢");
}
任務流轉----->每個人完成了任務,流程引擎會查詢 act_ge_bytearray 表中的bpmn文件,查找下一個節點,並將節信息更新到"運行任務表";
關於流程變量:
1.有兩種服務可以設置流程變量:
//TaskService taskService = processEngine.getTaskService();
//RuntimeService runtimeService = processEngine.getRuntimeService();
2.每個服務都有三種設置流程變量的方式:
1.通過 runtimeService 來設置流程變量
* exxcutionId: 執行對象
* variableName:變量名
* values:變量值
*/
// runtimeService.getVariableLocalVariable(exxcutionId, variableName, values);
// runtimeService.setVariableLocal(executionId, variableName, values);
//設置本執行對象的變量 ,該變量的作用域只在當前的execution對象
// runtimeService.setVariables(exxcutionId, variables);
//可以設置多個變量 放在 Map<key,value> Map<String,Object>
2. 通過TaskService來設置流程變量
* taskId:任務id
*/
// taskService.setVariable(taskId, variableName, values);
// taskService.setVariableLocal(taskId, variableName, values);
//// 設置本執行對象的變量 ,該變量的作用域只在當前的execution對象
// taskService.setVariables(taskId, variables); //設置的是Map<key,values>
3. 流程變量設置的兩個特殊時機(1.流程啓動時; 2.任務完成時;):
3. 當流程開始執行的時候,設置變量參數
* processDefiKey: 流程定義的key
* variables: 設置多個變量 Map<key,values>
*/
// processEngine.getRuntimeService()
// .startProcessInstanceByKey(processDefiKey, variables)
4. 當執行任務時候,可以設置流程變量
* taskId:任務id
* variables: 設置多個變量 Map<key,values>
*/
// processEngine.getTaskService().complete(taskId, variables);
4. 獲取流程變量的兩種服務:
5. 通過RuntimeService取變量值
* exxcutionId: 執行對象
*
*/
// runtimeService.getVariable(exxcutionId, variableName);//取變量
// runtimeService.getVariableLocal(exxcutionId, variableName);//取本執行對象的某個變量
// runtimeService.getVariables(variablesName);//取當前執行對象的所有變量
6. 通過TaskService取變量值
* TaskId: 執行對象
*
*/
// taskService.getVariable(taskId, variableName);//取變量
// taskService.getVariableLocal(taskId, variableName);//取本執行對象的某個變量
// taskService.getVariables(taskId);//取當前執行對象的所有變量
關於用TaskService設置的流程變量: Variable和VariableLocal的區別:
setVariable 是執行對象的公用變量,每一個任務對象都可以獲得並修改其值;屬於公共變量;
setVariableLocal 是當前任務的私用變量,只對當前任務可用;其他任務對象可以有同名變量,用任務id區別;
getVariable 是獲取公有變量; 也可以獲得當前私有變量(因爲getVariable方法執行時要傳入任務id,所以當前任務的私有變量
它可以拿到)
getVariableLocal 是獲取私有變量,沒法獲得公共變量;
上邊都是邏輯理解,但本質上是這樣的:
當使用TaskService來設置變量時,
它的流程id(例如1301),執行id(例如1301)都是確定的:
當使用setVariable,它是直接存儲了一個變量,
使用: 流程id(例如1301)+執行id(例如1301)+變量名 來確定
當使用setVariableLocal, 它是直接存儲一個變量,同時存儲一個任務id(例如1304),所以這個變量用:
使用: 流程id(例如1301)+執行id(例如1301)+任務id(例如1304)+變量名 來確定
當使用TaskService來獲取變量時,
它的流程id(例如1301),執行id(例如1301)都是確定的:
當使用getVariable,它是直接存儲了一個變量,
使用: 流程id(例如1301)+執行id(例如1301)+變量名 來確定
當使用getVariableLocal, 它是直接存儲一個變量,同時存儲一個任務id(例如1304),所以這個變量用:
使用: 流程id(例如1301)+執行id(例如1301)+任務id(例如1304)+變量名 來確定
所以 當使用getVariable來獲得變量時,是可以獲得 setVariableLocal方法定義的變量;
請假流程分析:
1.前端頁面: (modelid----指向了---->js類------>指向了一個業務類)
1.在模塊菜單表中配置模塊,前端就有了模塊按鈕 (與modelID綁定)
2.在操作表中配置按鈕, 前端就有了按鈕(通過modelid 與js中的特定方法綁定)
3.在tab_col表中配置列,在grid表中就顯示響應的列;
2.後端
js--->調action--->...
3.請假流程分析:
---->在操作表中配置 "流程提交" 按鈕,並與js中submit()方法綁定
---->點擊提交按鈕,讀取請假表中的數據填充 "流程變量" 並complete()任務;
---->下一個節點執行人進入請假模塊界面,會查詢到當前流到他的任務, 在後端配置"審覈" 按鈕;
並且在後端 my_act_flow 表中配置 "審覈菜單" 中的按鈕: "批准", "發回修改", "取消流程"等選項;
同時給這些按鈕配置相應的值: 用來填充決定流程走向的 "流程變量"; 當點擊"審覈"按鈕時,會調用js類
中的 "審覈方法" ,該方法會調用action到數據庫中查詢 my_act_task 表,獲得數據給彈窗生成提供支持,
同時還會查詢 my_act_flow 表,來給彈窗添加 流程轉向按鈕; 我們點擊提交以後, 會調用complete()方法,
任務流轉;
---->後邊的節點任務流轉同上;
---->
現在流程要增加節點:
1.首先要重新畫流程圖;
2.這樣前端在提交
我們假設沒有指定任務執行人 asignee沒有賦值,默認所有人都可以看到所有的grid數據,然後給有權限的人分配
"審覈" 按鈕的權限,那麼可以審覈的人就可以在grid中選中一條申請,打開審覈窗口,就會依據這條申請信息