activiti 7 + springboot2(七) Activiti流程實例的運行過程


流程部署完成后,每啟動一次流程就是一個流程實例。

 

(一)根據流程定義key啟動流程實例

ProcessInstance processInstance = runtimeServic.startProcessInstanceByKey("myProcess_1");

每個執行是單獨的流程實例,不同的實例之間不會相互干擾。

在任務節點表ACT_RU_TASK生成任務實例數據。

 

(二)啟動流程實例的時候指定businesskey(業務標識)

//第一個參數:是指流程定義key
//第二個參數:業務標識businessKey
 ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess_1", "sn001");

businesskey:業務標識,業務標識來源於業務系統。通常為業務表的主鍵,根據業務標識來關聯查詢業務系統的數據。

啟動流程實例時,指定的businesskey,就會在ACT_RU_EXECUTION #流程實例的執行表中存儲businesskey

 

(三)查詢流程實例

 可以查看流程實例的狀態,當前運行結點等信息。 

    /**
     * 查詢指定流程的所有實例
     */
    @Test
    public void processInstanceQuery() {
        String processDefinitionKey = "myProcess_1";
        List<ProcessInstance> list = runtimeService.createProcessInstanceQuery().processDefinitionKey(processDefinitionKey).list();
        for (ProcessInstance instance : list) {
            System.out.println("流程實例id: " + instance.getProcessInstanceId());
            System.out.println("所屬流程定義id: " + instance.getProcessDefinitionId());
            System.out.println("是否執行完成: " + instance.isEnded());
            System.out.println("是否暫停: " + instance.isSuspended());
            System.out.println(" 當 前 活 動 標 識 : " + instance.getActivityId());
        }
    }

 

(四)刪除已經部署成功的流程 

    /**
     * 刪除已經部署的流程定義
     * delete from ACT_RE_DEPLOYMENT 流程部署信息表;
     * ACT_RE_PROCDEF 流程定義數據表;
     * ACT_GE_BYTEARRAY 二進制數據表;
     */
    @Test
    public void deleteProcessDefinition(){
        //執行刪除流程定義  參數代表流程部署的id
        repositoryService.deleteDeployment("b10a151b-3366-11ea-bc18-30b49ec7161f");
    }

 1.當我們正在執行的這一套流程沒有完全審批結束的時候,此時如果要刪除流程定義信息就會失敗。

2.如果要求強制刪除,可以使用repositoryService.deleteDeployment("myProcess_1:1:f482ce07-35bf-11ea-b325-30b49ec7161f",true);

參數true代表級聯刪除,此時就會先刪除沒有完成的流程結點,最后就可以刪除流程定義信息 false的值代表不級聯

 

 (五)刪除流程實例

 當前流程實例沒有完全結束的時候,刪除流程實例就會失敗

    /**
     * 刪除流程實例
     */
    @Test
    public void deleteProcessInstance(){
        String processInstanceId = "80a5703b-35c0-11ea-aa1a-30b49ec7161f";

        //當前流程實例沒有完全結束的時候,刪除流程實例就會失敗
        runtimeService.deleteProcessInstance(processInstanceId,"刪除原因");
    }

 執行刪除部分SQL如下  :

1。 ACT_RU_TASK 運行時任務節點表
  delete from ACT_RU_TASK where ID_ = ? and REV_ = ?  

    2。 ACT_RU_IDENTITYLINK 運行時流程人員表,主要存儲任務節點與參與者的相關信息   

delete from ACT_RU_IDENTITYLINK where ID_ = ?  

   3。 ACT_RU_EXECUTION 運行時流程執行實例表 

delete from ACT_RU_EXECUTION where ID_ = ? and REV_ = ?

執行更新部分SQL如下:

   1。 ACT_HI_PROCINST 歷史流程實例表  

update ACT_HI_PROCINST set PROC_DEF_ID_ = ?, START_TIME_ = ?,  END_TIME_ = ?, DURATION_ = ?, END_ACT_ID_ = ?, DELETE_REASON_ = ?  where ID_ = ?  

   2。 ACT_HI_ACTINST 歷史節點表  

update ACT_HI_ACTINST set EXECUTION_ID_ = ?, ASSIGNEE_ = ?, END_TIME_   = ?, DURATION_ = ? where ID_ = ?  

   3。 ACT_HI_TASKINST 歷史任務實例表   

update ACT_HI_TASKINST set EXECUTION_ID_ = ?, NAME_ = ?,   PARENT_TASK_ID_ = ?, DESCRIPTION_ = ?, OWNER_ = ?, ASSIGNEE_ = ?,   CLAIM_TIME_ = ?, END_TIME_ = ?, DURATION_ = ?, DELETE_REASON_ = ?,   TASK_DEF_KEY_ = ?, FORM_KEY_ = ?, PRIORITY_ = ?, DUE_DATE_ = ? where   ID_ = ?  

 

(六)操作流程掛起、激活

操作流程定義為掛起狀態,該流程定義下邊所有的流程實例全部暫停;
流程定義為掛起狀態該流程定義將不允許啟動新的流程實例,同時該流程定義下所有的流程實例將全部掛起暫停執行。 

    /**
     * 操作流程的掛起、激活
     */
    @Test
    public void activateProcessDefinitionById(){
        //查詢流程定義對象
        ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionKey("myProcess_1").singleResult();
        //當前流程定義的實例是否都為暫停狀態
        boolean suspended = processDefinition.isSuspended();

        String processDefinitionId = processDefinition.getId();

        if(suspended){
            //掛起狀態則激活
            repositoryService.activateProcessDefinitionById(processDefinitionId,true,new Date());
            System.out.println("流程定義:"+processDefinitionId+"激活");
        }else{
            //激活狀態則掛起
            repositoryService.suspendProcessDefinitionById(processDefinitionId,true,new Date());
            System.out.println("流程定義:"+processDefinitionId+"掛起");
        }
    }

 

(七)單個流程實例的掛起,激活 

    /**
     * 單個流程實例的掛起,激活
     */
    @Test
    public void activateProcessInstanceById(){
        //查詢流程實例對象
        ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId("80a5703b-35c0-11ea-aa1a-30b49ec7161f").singleResult();

        //當前流程定義的實例是否都為暫停狀態
        boolean suspended = processInstance.isSuspended();

        String processInstanceId = processInstance.getId();
        if(suspended){
            //激活
            runtimeService.activateProcessInstanceById(processInstanceId);
            System.out.println("流程:"+processInstanceId+"激活");
        }else{
            //掛起
            runtimeService.suspendProcessInstanceById(processInstanceId);
            System.out.println("流程:"+processInstanceId+"掛起");
        }
    }

 

 (八)實例任務的執行

    /**
     * 完成任務
     */
    @Test
    public void completeTask(){
        //任務ID
        String taskId = "967465fe-3367-11ea-a057-30b49ec7161f";
        taskService.complete(taskId);
        System.out.println("完成任務:任務ID:"+taskId);
    }

當流程實例的所有任務都終止后,流程實例也就結束了;

 

(九)設置流程實例的啟動者

        //設置當前用戶id,啟動流程會讀取這個信息,對應processInstance.getStartUserId()
        Authentication.setAuthenticatedUserId(String.valueOf(user.getId()));
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(pd.getKey());
System.out.println("實例Id:"+processInstance.getId());
System.out.println("StartUserId:"+processInstance.getStartUserId());

 打開act_hi_procinst表,看到該記錄的START_USER_ID_字段記錄了設置的用戶id

 

 

 

源碼下載  https://download.csdn.net/download/zsg88/12100238

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM