Activiti7進階之組任務和網關


1 組任務

1.1 概述

  • 在流程定義中的任務結點的assignee固定設置任務負責人,如果臨時任務負責人變更則需要修改流程定義,系統的可擴展性差。針對這種情況可以給任務設置多個候選人,可以從候選人中選擇參與者來完成任務。

1.2 設置任務候選人

  • 在流程圖中任務結點的配置中設置Candidate users,多個候選人之間用逗號隔開。

設置任務候選人.

  • 查看holiday.bpmn文件:
<process id="holiday" name="請假申請流程" isExecutable="true">
    <startEvent id="startevent1" name="開始"></startEvent>
    <userTask id="usertask1" name="填寫請假申請單" activiti:assignee="張三"></userTask>
    <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
    <userTask id="usertask2" name="部門經理審批" activiti:candidateUsers="李四,王五"></userTask>
    <sequenceFlow id="flow2" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow>
    <userTask id="usertask3" name="總經理審批" activiti:assignee="趙六"></userTask>
    <sequenceFlow id="flow3" sourceRef="usertask2" targetRef="usertask3"></sequenceFlow>
    <endEvent id="endevent1" name="結束"></endEvent>
    <sequenceFlow id="flow4" sourceRef="usertask3" targetRef="endevent1"></sequenceFlow>
</process>
  • 我們可以看到部門經理審批的審核人已經設置為"李四,王五"這樣的一組候選人了。

1.3 組任務的辦理流程

  • 1️⃣查詢組任務:
    • 指定候選人,查詢該候選人當前的待辦任務。
    • 候選人不能辦理任務。
  • 2️⃣拾取(claim)任務:
    • 該組任務的所有候選人都能拾取任務。
    • 所謂的拾取任務就是將候選熱的組任務變成個人任務,即原來的候選人變成了任務的負責人。
    • 如果拾取任務后不想辦理任務,只需要將已經拾取的個人任務歸還到組里面,那么此時的個人任務將變為組任務。
  • 3️⃣查詢個人任務:
    • 查詢方式同個人任務部分,根據assignee查詢用戶負責的個人任務。
  • 4️⃣辦理個人任務。

1.4 組任務辦理流程的應用示例

1.4.1 准備工作

  • 創建請假流程的BPMN文件(其中填寫請假申請單的assignee是張三,部門經理審批的candidate users是李四,王五,總經理審批的assignee是趙六):

創建請假申請流程的bmpn文件

  • 部署流程定義以及啟動流程實例:
package com.sunxiaping;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.junit.Before;
import org.junit.Test;

/**
 * @author <a href="mailto:1900919313@qq.com">weiwei.xu</a>
 * @version 1.0
 * 2020-08-10 21:37
 */
public class GroupTest {

    ProcessEngine processEngine = null;

    @Before
    public void before() {
        ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti-cfg.xml");
        processEngine = configuration.buildProcessEngine();
    }

    @Test
    public void after() {
        if (processEngine != null) {
            processEngine.close();
        }
    }

    /**
     * 部署流程定義
     */
    @Test
    public void testDeployment() {
        RepositoryService repositoryService = processEngine.getRepositoryService();

        Deployment deployment = repositoryService.createDeployment()
                .addClasspathResource("diagram/holiday.bpmn")
                .addClasspathResource("diagram/holiday.png")
                .name("請假申請流程")
                .deploy();

        String id = deployment.getId();
        System.out.println("流程部署的id = " + id);
        String name = deployment.getName();
        System.out.println("流程部署的名稱 = " + name);
    }

    /**
     * 啟動流程實例
     */
    @Test
    public void testStartProcessInstance() {

        String processDefinitionKey = "holiday";

        RuntimeService runtimeService = processEngine.getRuntimeService();

        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey);

        String id = processInstance.getId();
        System.out.println("流程實例的id = " + id);
    }
}

1.4.2 張三完成請假申請任務

  • 示例:
package com.sunxiaping;

import org.activiti.engine.*;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Before;
import org.junit.Test;

import java.util.List;

/**
 * @author <a href="mailto:1900919313@qq.com">weiwei.xu</a>
 * @version 1.0
 * 2020-08-10 21:37
 */
public class GroupTest {

    ProcessEngine processEngine = null;

    @Before
    public void before() {
        ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti-cfg.xml");
        processEngine = configuration.buildProcessEngine();
    }

    @Test
    public void after() {
        if (processEngine != null) {
            processEngine.close();
        }
    }

    /**
     * 部署流程定義
     */
    @Test
    public void testDeployment() {
        RepositoryService repositoryService = processEngine.getRepositoryService();

        Deployment deployment = repositoryService.createDeployment()
                .addClasspathResource("diagram/holiday.bpmn")
                .addClasspathResource("diagram/holiday.png")
                .name("請假申請流程")
                .deploy();

        String id = deployment.getId();
        System.out.println("流程部署的id = " + id);
        String name = deployment.getName();
        System.out.println("流程部署的名稱 = " + name);
    }

    /**
     * 啟動流程實例
     */
    @Test
    public void testStartProcessInstance() {

        String processDefinitionKey = "holiday";

        RuntimeService runtimeService = processEngine.getRuntimeService();

        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey);

        String id = processInstance.getId();
        System.out.println("流程實例的id = " + id);
    }

    /**
     * 張三完成請假申請任務
     */
    @Test
    public void testTaskZhangsan() {
        String processDefinitionKey = "holiday";

        String assignee = "張三";

        TaskService taskService = processEngine.getTaskService();

        List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskAssignee(assignee).list();

        for (Task task : taskList) {
            String taskId = task.getId();
            System.out.println("任務的id = " + taskId);

            taskService.complete(taskId);
        }

    }
}

1.4.3 李四查詢組任務

  • 示例:
package com.sunxiaping;

import org.activiti.engine.*;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Before;
import org.junit.Test;

import java.util.List;

/**
 * @author <a href="mailto:1900919313@qq.com">weiwei.xu</a>
 * @version 1.0
 * 2020-08-10 21:37
 */
public class GroupTest {

    ProcessEngine processEngine = null;

    @Before
    public void before() {
        ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti-cfg.xml");
        processEngine = configuration.buildProcessEngine();
    }

    @Test
    public void after() {
        if (processEngine != null) {
            processEngine.close();
        }
    }

    /**
     * 部署流程定義
     */
    @Test
    public void testDeployment() {
        RepositoryService repositoryService = processEngine.getRepositoryService();

        Deployment deployment = repositoryService.createDeployment()
                .addClasspathResource("diagram/holiday.bpmn")
                .addClasspathResource("diagram/holiday.png")
                .name("請假申請流程")
                .deploy();

        String id = deployment.getId();
        System.out.println("流程部署的id = " + id);
        String name = deployment.getName();
        System.out.println("流程部署的名稱 = " + name);
    }

    /**
     * 啟動流程實例
     */
    @Test
    public void testStartProcessInstance() {

        String processDefinitionKey = "holiday";

        RuntimeService runtimeService = processEngine.getRuntimeService();

        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey);

        String id = processInstance.getId();
        System.out.println("流程實例的id = " + id);
    }

    /**
     * 張三完成請假申請任務
     */
    @Test
    public void testTaskZhangsan() {
        String processDefinitionKey = "holiday";

        String assignee = "張三";

        TaskService taskService = processEngine.getTaskService();

        List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskAssignee(assignee).list();

        for (Task task : taskList) {
            String taskId = task.getId();
            System.out.println("任務的id = " + taskId);

            taskService.complete(taskId);
        }

    }

    /**
     * 查詢候選人組任務
     */
    @Test
    public void testQueryCandidateGroupTask() {
        String processDefinitionKey = "holiday";

        String candidateUser = "李四";

        TaskService taskService = processEngine.getTaskService();
        //查詢組任務
        List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskCandidateUser(candidateUser).list();

        for (Task task : taskList) {
            String taskId = task.getId();
            System.out.println("任務的id = " + taskId);
            String processInstanceId = task.getProcessInstanceId();
            System.out.println("流程實例的id = " + processInstanceId);
            String name = task.getName();
            System.out.println("任務名稱 = " + name);
            String assignee = task.getAssignee(); //null,說明當前的張三只是一個候選人,不是任務的負責人
            System.out.println("任務的負責人是 = " + assignee);
        }
    }
}

1.4.4 李四拾取任務

  • 示例:
package com.sunxiaping;

import org.activiti.engine.*;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Before;
import org.junit.Test;

import java.util.List;

/**
 * @author <a href="mailto:1900919313@qq.com">weiwei.xu</a>
 * @version 1.0
 * 2020-08-10 21:37
 */
public class GroupTest {

    ProcessEngine processEngine = null;

    @Before
    public void before() {
        ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti-cfg.xml");
        processEngine = configuration.buildProcessEngine();
    }

    @Test
    public void after() {
        if (processEngine != null) {
            processEngine.close();
        }
    }

    /**
     * 部署流程定義
     */
    @Test
    public void testDeployment() {
        RepositoryService repositoryService = processEngine.getRepositoryService();

        Deployment deployment = repositoryService.createDeployment()
                .addClasspathResource("diagram/holiday.bpmn")
                .addClasspathResource("diagram/holiday.png")
                .name("請假申請流程")
                .deploy();

        String id = deployment.getId();
        System.out.println("流程部署的id = " + id);
        String name = deployment.getName();
        System.out.println("流程部署的名稱 = " + name);
    }

    /**
     * 啟動流程實例
     */
    @Test
    public void testStartProcessInstance() {

        String processDefinitionKey = "holiday";

        RuntimeService runtimeService = processEngine.getRuntimeService();

        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey);

        String id = processInstance.getId();
        System.out.println("流程實例的id = " + id);
    }

    /**
     * 張三完成請假申請任務
     */
    @Test
    public void testTaskZhangsan() {
        String processDefinitionKey = "holiday";

        String assignee = "張三";

        TaskService taskService = processEngine.getTaskService();

        List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskAssignee(assignee).list();

        for (Task task : taskList) {
            String taskId = task.getId();
            System.out.println("任務的id = " + taskId);

            taskService.complete(taskId);
        }

    }

    /**
     * 查詢候選人組任務
     */
    @Test
    public void testQueryCandidateGroupTask() {
        String processDefinitionKey = "holiday";

        String candidateUser = "李四";

        TaskService taskService = processEngine.getTaskService();
        //查詢組任務
        List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskCandidateUser(candidateUser).list();

        for (Task task : taskList) {
            String taskId = task.getId();
            System.out.println("任務的id = " + taskId);
            String processInstanceId = task.getProcessInstanceId();
            System.out.println("流程實例的id = " + processInstanceId);
            String name = task.getName();
            System.out.println("任務名稱 = " + name);
            String assignee = task.getAssignee(); //null,說明當前的張三只是一個候選人,不是任務的負責人
            System.out.println("任務的負責人是 = " + assignee);
        }
    }

    /**
     * 用戶拾取組任務:將候選人的組任務,變成個人任務。
     * 注意:
     *      ①即使該用戶不是候選人也能拾取,建議拾取的時候校驗是否有資格拾取任務。
     *      ②組任務拾取之后,該任務就有負責人了,通過候選人將查詢不到該任務
     */
    @Test
    public void testClaimTask() {
        String processDefinitionKey = "holiday";

        String candidateUser = "李四";

        TaskService taskService = processEngine.getTaskService();

        //查詢組任務
        List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskCandidateUser(candidateUser).list();

        for (Task task : taskList) {
            String taskId = task.getId();
            System.out.println("任務的id = " + taskId);

            taskService.claim(taskId,candidateUser);

            System.out.println("任務拾取完畢");
        }
    }
}

1.4.5 李四查詢任務並完成任務

  • 示例:
package com.sunxiaping;

import org.activiti.engine.*;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Before;
import org.junit.Test;

import java.util.List;

/**
 * @author <a href="mailto:1900919313@qq.com">weiwei.xu</a>
 * @version 1.0
 * 2020-08-10 21:37
 */
public class GroupTest {

    ProcessEngine processEngine = null;

    @Before
    public void before() {
        ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti-cfg.xml");
        processEngine = configuration.buildProcessEngine();
    }

    @Test
    public void after() {
        if (processEngine != null) {
            processEngine.close();
        }
    }

    /**
     * 部署流程定義
     */
    @Test
    public void testDeployment() {
        RepositoryService repositoryService = processEngine.getRepositoryService();

        Deployment deployment = repositoryService.createDeployment()
                .addClasspathResource("diagram/holiday.bpmn")
                .addClasspathResource("diagram/holiday.png")
                .name("請假申請流程")
                .deploy();

        String id = deployment.getId();
        System.out.println("流程部署的id = " + id);
        String name = deployment.getName();
        System.out.println("流程部署的名稱 = " + name);
    }

    /**
     * 啟動流程實例
     */
    @Test
    public void testStartProcessInstance() {

        String processDefinitionKey = "holiday";

        RuntimeService runtimeService = processEngine.getRuntimeService();

        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey);

        String id = processInstance.getId();
        System.out.println("流程實例的id = " + id);
    }

    /**
     * 張三完成請假申請任務
     */
    @Test
    public void testTaskZhangsan() {
        String processDefinitionKey = "holiday";

        String assignee = "張三";

        TaskService taskService = processEngine.getTaskService();

        List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskAssignee(assignee).list();

        for (Task task : taskList) {
            String taskId = task.getId();
            System.out.println("任務的id = " + taskId);

            taskService.complete(taskId);
        }

    }

    /**
     * 查詢候選人組任務
     */
    @Test
    public void testQueryCandidateGroupTask() {
        String processDefinitionKey = "holiday";

        String candidateUser = "李四";

        TaskService taskService = processEngine.getTaskService();
        //查詢組任務
        List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskCandidateUser(candidateUser).list();

        for (Task task : taskList) {
            String taskId = task.getId();
            System.out.println("任務的id = " + taskId);
            String processInstanceId = task.getProcessInstanceId();
            System.out.println("流程實例的id = " + processInstanceId);
            String name = task.getName();
            System.out.println("任務名稱 = " + name);
            String assignee = task.getAssignee(); //null,說明當前的張三只是一個候選人,不是任務的負責人
            System.out.println("任務的負責人是 = " + assignee);
        }
    }

    /**
     * 用戶拾取組任務:將候選人的組任務,變成個人任務。
     * 注意:
     *      ①即使該用戶不是候選人也能拾取,建議拾取的時候校驗是否有資格拾取任務。
     *      ②組任務拾取之后,該任務就有負責人了,通過候選人將查詢不到該任務
     */
    @Test
    public void testClaimTask() {
        String processDefinitionKey = "holiday";

        String candidateUser = "李四";

        TaskService taskService = processEngine.getTaskService();

        //查詢組任務
        List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskCandidateUser(candidateUser).list();

        for (Task task : taskList) {
            String taskId = task.getId();
            System.out.println("任務的id = " + taskId);

            taskService.claim(taskId,candidateUser);

            System.out.println("任務拾取完畢");
        }
    }


    /**
     * 查詢任務並完成任務
     */
    @Test
    public void testCompleteTask(){
        String processDefinitionKey = "holiday";

        String assignee = "李四";

        TaskService taskService = processEngine.getTaskService();

        List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskAssignee(assignee).list();

        for (Task task : taskList) {
            String taskId = task.getId();
            System.out.println("任務的id = " + taskId);

            taskService.complete(taskId);
        }
    }
}

1.4.6 當前用戶歸還組任務

  • 示例:
package com.sunxiaping;

import org.activiti.engine.*;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Before;
import org.junit.Test;

import java.util.List;

/**
 * @author <a href="mailto:1900919313@qq.com">weiwei.xu</a>
 * @version 1.0
 * 2020-08-10 21:37
 */
public class GroupTest {

    ProcessEngine processEngine = null;

    @Before
    public void before() {
        ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti-cfg.xml");
        processEngine = configuration.buildProcessEngine();
    }

    @Test
    public void after() {
        if (processEngine != null) {
            processEngine.close();
        }
    }

    /**
     * 部署流程定義
     */
    @Test
    public void testDeployment() {
        RepositoryService repositoryService = processEngine.getRepositoryService();

        Deployment deployment = repositoryService.createDeployment()
                .addClasspathResource("diagram/holiday.bpmn")
                .addClasspathResource("diagram/holiday.png")
                .name("請假申請流程")
                .deploy();

        String id = deployment.getId();
        System.out.println("流程部署的id = " + id);
        String name = deployment.getName();
        System.out.println("流程部署的名稱 = " + name);
    }

    /**
     * 啟動流程實例
     */
    @Test
    public void testStartProcessInstance() {

        String processDefinitionKey = "holiday";

        RuntimeService runtimeService = processEngine.getRuntimeService();

        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey);

        String id = processInstance.getId();
        System.out.println("流程實例的id = " + id);
    }

    /**
     * 張三完成請假申請任務
     */
    @Test
    public void testTaskZhangsan() {
        String processDefinitionKey = "holiday";

        String assignee = "張三";

        TaskService taskService = processEngine.getTaskService();

        List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskAssignee(assignee).list();

        for (Task task : taskList) {
            String taskId = task.getId();
            System.out.println("任務的id = " + taskId);

            taskService.complete(taskId);
        }

    }

    /**
     * 查詢候選人組任務
     */
    @Test
    public void testQueryCandidateGroupTask() {
        String processDefinitionKey = "holiday";

        String candidateUser = "李四";

        TaskService taskService = processEngine.getTaskService();
        //查詢組任務
        List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskCandidateUser(candidateUser).list();

        for (Task task : taskList) {
            String taskId = task.getId();
            System.out.println("任務的id = " + taskId);
            String processInstanceId = task.getProcessInstanceId();
            System.out.println("流程實例的id = " + processInstanceId);
            String name = task.getName();
            System.out.println("任務名稱 = " + name);
            String assignee = task.getAssignee(); //null,說明當前的張三只是一個候選人,不是任務的負責人
            System.out.println("任務的負責人是 = " + assignee);
        }
    }

    /**
     * 用戶拾取組任務:將候選人的組任務,變成個人任務。
     * 注意:
     *      ①即使該用戶不是候選人也能拾取,建議拾取的時候校驗是否有資格拾取任務。
     *      ②組任務拾取之后,該任務就有負責人了,通過候選人將查詢不到該任務
     */
    @Test
    public void testClaimTask() {
        String processDefinitionKey = "holiday";

        String candidateUser = "李四";

        TaskService taskService = processEngine.getTaskService();

        //查詢組任務
        List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskCandidateUser(candidateUser).list();

        for (Task task : taskList) {
            String taskId = task.getId();
            System.out.println("任務的id = " + taskId);

            taskService.claim(taskId,candidateUser);

            System.out.println("任務拾取完畢");
        }
    }

    /**
     * 歸還組任務
     * 說明:建議歸還任務前校驗用戶是否是該任務的負責人,也可以通過setAssignee方法將任務委托給其他用戶負責,注意被委托的用戶可以不是候選人(建議不要這么做)
     */
    @Test
    public void testUnclaim(){
        String processDefinitionKey = "holiday";

        String assignee = "李四";

        TaskService taskService = processEngine.getTaskService();

        List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskAssignee(assignee).list();

        for (Task task : taskList) {
            String taskId = task.getId();
            System.out.println("任務的id = " + taskId);

            // 如果設置為null,歸還組任務,該 任務沒有負責人
            taskService.setAssignee(taskId, null);
        }
    }
    
//    /**
//     * 查詢任務並完成任務
//     */
//    @Test
//    public void testCompleteTask(){
//        String processDefinitionKey = "holiday";
//
//        String assignee = "李四";
//
//        TaskService taskService = processEngine.getTaskService();
//
//        List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskAssignee(assignee).list();
//
//        for (Task task : taskList) {
//            String taskId = task.getId();
//            System.out.println("任務的id = " + taskId);
//
//            taskService.complete(taskId);
//        }
//    }
    
}

1.4.7 任務交接

  • 任務交接就是任務負責人將任務交給其它候選人辦理該任務。

  • 示例:

package com.sunxiaping;

import org.activiti.engine.*;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Before;
import org.junit.Test;

import java.util.List;

/**
 * @author <a href="mailto:1900919313@qq.com">weiwei.xu</a>
 * @version 1.0
 * 2020-08-10 21:37
 */
public class GroupTest {

    ProcessEngine processEngine = null;

    @Before
    public void before() {
        ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti-cfg.xml");
        processEngine = configuration.buildProcessEngine();
    }

    @Test
    public void after() {
        if (processEngine != null) {
            processEngine.close();
        }
    }

    /**
     * 部署流程定義
     */
    @Test
    public void testDeployment() {
        RepositoryService repositoryService = processEngine.getRepositoryService();

        Deployment deployment = repositoryService.createDeployment()
                .addClasspathResource("diagram/holiday.bpmn")
                .addClasspathResource("diagram/holiday.png")
                .name("請假申請流程")
                .deploy();

        String id = deployment.getId();
        System.out.println("流程部署的id = " + id);
        String name = deployment.getName();
        System.out.println("流程部署的名稱 = " + name);
    }

    /**
     * 啟動流程實例
     */
    @Test
    public void testStartProcessInstance() {

        String processDefinitionKey = "holiday";

        RuntimeService runtimeService = processEngine.getRuntimeService();

        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey);

        String id = processInstance.getId();
        System.out.println("流程實例的id = " + id);
    }

    /**
     * 張三完成請假申請任務
     */
    @Test
    public void testTaskZhangsan() {
        String processDefinitionKey = "holiday";

        String assignee = "張三";

        TaskService taskService = processEngine.getTaskService();

        List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskAssignee(assignee).list();

        for (Task task : taskList) {
            String taskId = task.getId();
            System.out.println("任務的id = " + taskId);

            taskService.complete(taskId);
        }

    }

    /**
     * 查詢候選人組任務
     */
    @Test
    public void testQueryCandidateGroupTask() {
        String processDefinitionKey = "holiday";

        String candidateUser = "李四";

        TaskService taskService = processEngine.getTaskService();
        //查詢組任務
        List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskCandidateUser(candidateUser).list();

        for (Task task : taskList) {
            String taskId = task.getId();
            System.out.println("任務的id = " + taskId);
            String processInstanceId = task.getProcessInstanceId();
            System.out.println("流程實例的id = " + processInstanceId);
            String name = task.getName();
            System.out.println("任務名稱 = " + name);
            String assignee = task.getAssignee(); //null,說明當前的張三只是一個候選人,不是任務的負責人
            System.out.println("任務的負責人是 = " + assignee);
        }
    }

    /**
     * 用戶拾取組任務:將候選人的組任務,變成個人任務。
     * 注意:
     * ①即使該用戶不是候選人也能拾取,建議拾取的時候校驗是否有資格拾取任務。
     * ②組任務拾取之后,該任務就有負責人了,通過候選人將查詢不到該任務
     */
    @Test
    public void testClaimTask() {
        String processDefinitionKey = "holiday";

        String candidateUser = "李四";

        TaskService taskService = processEngine.getTaskService();

        //查詢組任務
        List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskCandidateUser(candidateUser).list();

        for (Task task : taskList) {
            String taskId = task.getId();
            System.out.println("任務的id = " + taskId);

            taskService.claim(taskId, candidateUser);

            System.out.println("任務拾取完畢");
        }
    }

    /**
     * 任務交接
     */
    @Test
    public void testExchangeTask() {
        String processDefinitionKey = "holiday";

        String assignee = "李四";

        TaskService taskService = processEngine.getTaskService();

        List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskAssignee(assignee).list();

        for (Task task : taskList) {
            String taskId = task.getId();
            System.out.println("任務的id = " + taskId);

            taskService.setAssignee(taskId, "王五");
        }

    }


//    /**
//     * 歸還組任務
//     * 說明:建議歸還任務前校驗用戶是否是該任務的負責人,也可以通過setAssignee方法將任務委托給其他用戶負責,注意被委托的用戶可以不是候選人(建議不要這么做)
//     */
//    @Test
//    public void testUnclaim() {
//        String processDefinitionKey = "holiday";
//
//        String assignee = "李四";
//
//        TaskService taskService = processEngine.getTaskService();
//
//        List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskAssignee(assignee).list();
//
//        for (Task task : taskList) {
//            String taskId = task.getId();
//            System.out.println("任務的id = " + taskId);
//
//            // 如果設置為null,歸還組任務,該 任務沒有負責人
//            taskService.setAssignee(taskId, null);
//        }
//    }

//    /**
//     * 查詢任務並完成任務
//     */
//    @Test
//    public void testCompleteTask(){
//        String processDefinitionKey = "holiday";
//
//        String assignee = "李四";
//
//        TaskService taskService = processEngine.getTaskService();
//
//        List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskAssignee(assignee).list();
//
//        for (Task task : taskList) {
//            String taskId = task.getId();
//            System.out.println("任務的id = " + taskId);
//
//            taskService.complete(taskId);
//        }
//    }

}

1.4.8 數據庫表操作

  • act_ru_task:任務執行表,記錄當前執行的任務,由於該任務當前是組任務,所有的assignee為空,當拾取任務后該字段就是拾取用戶的id。

act_ru_task任務執行表

  • act_ru_identitylink:任務參與者,記錄當前參與任務用戶或組,當前任務如果設置了候選人,會向該表插入候選人記錄,有幾個候選人就插入幾個。

act_ru_identitylink任務參與者表

  • act_ru_identitylink對應一張歷史表act_hi_identitylink,向act_ru_identitylink插入記錄的同時也會向歷史表插入記錄。

act_hi_identitylink任務參與者歷史表

2 網關

2.1 排他網關

2.1.1 什么是排他網關?

  • 排他網關(異或網關或基於數據的排他網關),用來在流程中實現決策。當流程執行到這個網關的時候,所有分支都會判斷條件是否為true,如果為true則執行該分支。

注意:

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

2.1.2 流程定義

  • 如果不用排他網關,如果條件都滿足或都不滿足,流程就結束(異常結束)了。

不使用排他網關

  • 如果使用了排他網關來決定分支的走向,如下:

使用排他網關

注意:

  • 如果從網關出去的所有分支都不滿足條件,系統將拋出異常。換言之,經過排他網關有且僅有一條分支。

2.2 並行網關

2.2.1 什么是並行網關?

  • 並行網關允許將流程分成多條分支,也可以把多條分支匯聚到一起,並行網關的功能是基於進入和外出的順序流的。
  • Fork分支:並行后的所有外出順序流,為每個順序流都創建一個並行分支。
  • Join匯聚:所有到達並行網關,在此等待的進入分支,直到所有進入順序流的分支都到達以后,流程就會通過匯聚網關。

注意:

  • 如果桶一個並行網關有多個進入和多個外出順序流,它就同時具有分支和匯聚功能。這時,網關會先匯聚所有進入的順序流,然后再切分成多個並行分支。
  • 和其他網關不同的是,並行網關並不會解析條件。即使順序流中定義了條件,也會被忽略。

2.2.2 流程定義

並行網關

2.3 包含網關

2.3.1 什么是包含網關?

  • 包含網關可以看做是排他網關和並行網關的結合體。和排他網關一樣,你可以在外出順序流上定義條件,包含網關會解析它們。但是主要的區別是包含網關可以選擇多於一條順序流,這和並行網關一樣。
  • 包含網關的功能是基於進入和外出順序流的:
  • 分支:所有外出順序流的條件都會被解析,結果為true的順序流會以並行方式繼續執行,會為每個順序流創建一個分支。
  • 匯聚:所有並行分支到達包含網關,會進入等待狀態,直到每個包含流程的進入順序流的分支都到達。這是和並行網關的最大不同。換言之,包含網關只會等待被選中執行了的進入順序流。在匯聚之后,流程會穿過包含網關繼續執行。

2.3.2 流程定義

  • 企業體檢流程,公司全體員工進行常規項檢查、抽血化驗,公司管理層除常規檢查和抽血化驗還要進行增加項檢查。

包含網關


免責聲明!

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



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