工作流 —activiti7網關


1. 排他網關

    排他網關(也叫異或(XOR)網關,或叫基於數據的排他網關),用來在流程中實現決策。 

  當流程執行到這個網關,所有分支都會判斷條件是否為true,如果為 true 則執行該分支,

  注意,排他網關只會選擇一個為 true 的分支執行。(即使有兩個分支條件都為 true,排他網關也會只選擇一條分支去執行)

 

  1.1 定義流程

  

 

 

   1.2 部署流程  

/**
     * 流程部署的方法
     */
    @Test
    public void deployment() {
        //獲取ProcessEngine對象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //獲取RepositoryService對象
        RepositoryService repositoryService = processEngine.getRepositoryService();
        //流程部署
        Deployment deploy = repositoryService.createDeployment()
                .addClasspathResource("holiday/holidayOld.bpmn")
                .name("請假流程-排他網關")
                .deploy();
        System.out.println("流程部署成功:" + deploy.getName());
    }

  1.3 啟動流程  當前給的流程變量是5 兩個條件都符合

/**
     * 啟動流程實例,設置流程變量的值
     */
    @Test
    public void startInstance() {
        //獲取ProcessEngine對象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //獲取RuntimeService
        RuntimeService runtimeService = processEngine.getRuntimeService();
        //設置流程變量
        Holiday holiday = new Holiday();
        holiday.setNum(5);
        Map<String, Object> assMap = new HashMap<>();
        assMap.put("holiday", holiday);
        //啟動流程實例
        ProcessInstance holidayGroup = runtimeService.startProcessInstanceByKey("holidaygetway", assMap);
        System.out.println("流程實例:" + holidayGroup.getId());
    }

  1.4 處理任務

/**
     * 處理任務
     */
    @Test
    public void commitTask() {
        //獲取ProcessEngine對象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //獲取TaskService對象
        TaskService taskService = processEngine.getTaskService();
        //查詢到自己的任務,然后通過任務ID進行提交
        Task task = taskService.createTaskQuery().processDefinitionKey("holidaygetway").taskAssignee("zhangsan").singleResult();
        //處理任務
        taskService.complete(task.getId());
    }

  1.5  處理lisi的任務

/**
     * 處理任務
     */
    @Test
    public void commitTask() {
        //獲取ProcessEngine對象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //獲取TaskService對象
        TaskService taskService = processEngine.getTaskService();
        //查詢到自己的任務,然后通過任務ID進行提交
        Task task = taskService.createTaskQuery().processDefinitionKey("holidaygetway").taskAssignee("lisi").singleResult();
        //處理任務
        taskService.complete(task.getId());
    }

 

  1.6 處理完lisi的任務時條件兩者都符合時選擇ID最小的分支

 

   1.7 查看數據庫任務表 

 

2. 並行網關

  並行網關允許將流程分成多條分支,也可以把多條分支匯聚到一起,並行網關的功能是基於進 入和外出順序流的:

   fork 分支:

    並行后的所有外出順序流,為每個順序流都創建一個並發分支。

   join 匯聚:

    所有到達並行網關,在此等待的進入分支, 直到所有進入順序流的分支都到達以后,  流程就會通過匯聚網關。

 

  注意,如果同一個並行網關有多個進入和多個外出順序流, 它就同時具有分支和匯聚功能。

  這時, 網關會先匯聚所有進入的順序流,然后再切分成多個並行分支。 與其他網關的主要區別是,

  並行網關不會解析條件。 即使順序流中定義了條件,也會被忽略。

  
  2.1 定義流程圖

  

 

   2.2 部署流程

 /**
     * 流程部署
     */
    @Test
    public void deployment(){
        //獲取ProcessEngine對象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //獲取RepositoryService對象
        RepositoryService repositoryService = processEngine.getRepositoryService();
        //流程部署
        Deployment deploy = repositoryService.createDeployment()
                .addClasspathResource("holiday/holidayPar.bpmn")
                .name("請假流程-並行網關")
                .deploy();
        System.out.println("流程部署成功:" + deploy.getName());
    }

  2.3 啟動流程

 /**
     * 啟動流程實例
     */
    @Test
    public void startInstance() {
        //獲取ProcessEngine對象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //獲取RuntimeService
        RuntimeService runtimeService = processEngine.getRuntimeService();
        //設置流程變量

        Map<String, Object> assMap = new HashMap<>();
        assMap.put("num", 3);
        //啟動流程實例
        ProcessInstance holidayGroup = runtimeService.startProcessInstanceByKey("holidayPar", assMap);
        System.out.println("流程實例:" + holidayGroup.getId());
    }

  2.4 執行流程zhangsan

/**
     * 執行流程
     */
    @Test
    public void commitTask() {
        //獲取ProcessEngine對象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //獲取TaskService對象
        TaskService taskService = processEngine.getTaskService();
        //查詢到自己的任務,然后通過任務ID進行提交
        Task task = taskService.createTaskQuery().processDefinitionKey("holidayPar").taskAssignee("zhangsan").singleResult();
        //處理任務
        taskService.complete(task.getId());
    }

  2.5 執行lisi任務因為天數為3所以直接到人事存檔zhaoliu

/**
     * 執行流程
     */
    @Test
    public void commitTask() {
        //獲取ProcessEngine對象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //獲取TaskService對象
        TaskService taskService = processEngine.getTaskService();
        //查詢到自己的任務,然后通過任務ID進行提交
        Task task = taskService.createTaskQuery().processDefinitionKey("holidayPar").taskAssignee("lisi").singleResult();
        //處理任務
        taskService.complete(task.getId());
    }

  2.6 執行zhaoliu任務后進入並行網關 會有兩個待執行任務

/**
     * 執行流程
     */
    @Test
    public void commitTask() {
        //獲取ProcessEngine對象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //獲取TaskService對象
        TaskService taskService = processEngine.getTaskService();
        //查詢到自己的任務,然后通過任務ID進行提交
        Task task = taskService.createTaskQuery().processDefinitionKey("holidayPar").taskAssignee("zhaoliu").singleResult();
        //處理任務
        taskService.complete(task.getId());
    }

  2.7 查看數據庫任務表

 

   2.8 查看數據庫歷史表

 

   2.9 執行sunqi任務

 /**
     * 執行流程
     */
    @Test
    public void commitTask() {
        //獲取ProcessEngine對象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //獲取TaskService對象
        TaskService taskService = processEngine.getTaskService();
        //查詢到自己的任務,然后通過任務ID進行提交
        Task task = taskService.createTaskQuery().processDefinitionKey("holidayPar").taskAssignee("sunqi").singleResult();
        //處理任務
        taskService.complete(task.getId());
    }

  2.10 查看數據庫任務表

 

   2.11 查看數據庫歷史表

 

   2.12 執行sunba任務

/**
     * 執行流程
     */
    @Test
    public void commitTask() {
        //獲取ProcessEngine對象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //獲取TaskService對象
        TaskService taskService = processEngine.getTaskService();
        //查詢到自己的任務,然后通過任務ID進行提交
        Task task = taskService.createTaskQuery().processDefinitionKey("holidayPar").taskAssignee("zhouba").singleResult();
        //處理任務
        taskService.complete(task.getId());
    }

  2.13 查看數據庫任務表

 

  2.14 查看數據庫歷史表  當並行網關的所有任務都執行完畢后才會進入下一個任務

 

 

3. 包含網關 

    包含網關可以看做是排他網關和並行網關的結合體。 和排他網關一樣,你可以在外出順序流上定義條件,

  包含網關會解析它們。 但是主要的區別是包含網關可以選擇多於一條順序流,這和並行網關一樣。

  包含網關的功能是基於進入和外出順序流的

  3.1 流程定義

  

 

 

  3.2 部署流程

/**
     * 流程部署
     */
    @Test
    public void deployment(){
        //獲取ProcessEngine對象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //獲取RepositoryService對象
        RepositoryService repositoryService = processEngine.getRepositoryService();
        //流程部署
        Deployment deploy = repositoryService.createDeployment()
                .addClasspathResource("medical/medical.bpmn")
                .name("體檢流程-包含網關")
                .deploy();
        System.out.println("流程部署成功:" + deploy.getName());
    }

  3.3 啟動流程實例   當前流程變量為1

 /**
     * 啟動流程實例
     */
    @Test
    public void startInstance() {
        //獲取ProcessEngine對象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //獲取RuntimeService
        RuntimeService runtimeService = processEngine.getRuntimeService();
        //設置流程變量

        Map<String, Object> assMap = new HashMap<>();
        assMap.put("userType", 1);
        //啟動流程實例
        ProcessInstance holidayGroup = runtimeService.startProcessInstanceByKey("medical", assMap);
        System.out.println("流程實例:" + holidayGroup.getId());
    }

  3.4 執行zhangsan任務

/**
     * 執行流程
     */
    @Test
    public void commitTask() {
        //獲取ProcessEngine對象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //獲取TaskService對象
        TaskService taskService = processEngine.getTaskService();
        //查詢到自己的任務,然后通過任務ID進行提交
        Task task = taskService.createTaskQuery().processDefinitionKey("medical").taskAssignee("zhangsan").singleResult();
        //處理任務
        taskService.complete(task.getId());
    }

  3.5 查看數據庫任務表

 

   3.6 執行lisi任務

    /**
     * 執行流程
     */
    @Test
    public void commitTask() {
        //獲取ProcessEngine對象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //獲取TaskService對象
        TaskService taskService = processEngine.getTaskService();
        //查詢到自己的任務,然后通過任務ID進行提交
        Task task = taskService.createTaskQuery().processDefinitionKey("medical").taskAssignee("lisi").singleResult();
        //處理任務
        taskService.complete(task.getId());
    }

  3.7 查看數據庫任務表

 

   3.8 執行wangwu任務

 /**
     * 執行流程
     */
    @Test
    public void commitTask() {
        //獲取ProcessEngine對象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //獲取TaskService對象
        TaskService taskService = processEngine.getTaskService();
        //查詢到自己的任務,然后通過任務ID進行提交
        Task task = taskService.createTaskQuery().processDefinitionKey("medical").taskAssignee("wangwu").singleResult();
        //處理任務
        taskService.complete(task.getId());
    }

  3.9 查看數據庫任務表 包含網關任務

 

   3.10 查看數據庫歷史表  都已經執行完畢

 

 

  

 

  

 


免責聲明!

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



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