Activiti學習心得

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中選中一條申請,打開審覈窗口,就會依據這條申請信息
        
        
        

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章