【Flowable】 10-候选人组讲解

Metadata

title: 【Flowable】 10-候选人组讲解
date: 2023-01-23 17:19
tags:
  - 行动阶段/完成
  - 主题场景/组件
  - 笔记空间/KnowladgeSpace/ProgramSpace/ModuleSpace
  - 细化主题/Module/Flowable
categories:
  - Flowable
keywords:
  - Flowable
description: 【Flowable】 10-候选人组讲解

【Flowable】 10-候选人组讲解

当候选人很多的情况下,我们可以分组来处理。先创建组,然后把用户分配到这个组中。

1 管理用户和组

1.1 用户管理

通过act_id_user表维护用户

/**
 * 维护用户
 */
@Test
public void createUser() {
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    // 通过 IdentityService 完成相关的用户和组的管理
    IdentityService identityService = processEngine.getIdentityService();

    User user = null;
    for (int i = 1; i <= 3; i++) {
        user = identityService.newUser("员工" + i);
        user.setFirstName(i+"");
        user.setEmail(i+"@qq.com");
        identityService.saveUser(user);
    }
}

1.2 用户组管理

通过act_id_group表维护

/**
 * 维护用户组
 */
@Test
public void createGroup() {
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    // 通过 IdentityService 完成相关的用户和组的管理
    IdentityService identityService = processEngine.getIdentityService();

    Group group = identityService.newGroup("group1");
    group.setName("研发部");
    group.setType("1");
    identityService.saveGroup(group);

}

1.3 用户和用户组关联

通过act_id_membership表维护

/**
 * 用户和用户组关联
 */
@Test
public void userGroup() {
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    IdentityService identityService = processEngine.getIdentityService();

    // 根据组的编号找到对应的Group对象
    Group group = identityService.createGroupQuery().groupId("group1").singleResult();
    //找到用户
    List<User> users = identityService.createUserQuery().list();
    for (User user : users) {
        //用户分配给用户组
        identityService.createMembership(user.getId(), group.getId());
    }

}

2 候选人组应用

用户和用户组的创建及关联搞清楚后,就可以使用候选人组实现流程任务分配

2.2.1 设计流程

设计一个新的流程。

2.2 部署流程和启动流程实例

/**
 * 部署流程
 */
@Test
public void deployment() {
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

    RepositoryService repositoryService = processEngine.getRepositoryService();

    repositoryService.createDeployment().addClasspathResource("flowable-5.bpmn20.xml").name("候选人组流程").deploy();
}

/**
 * 启动流程
 */
@Test
public void startProcess() {
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    RuntimeService runtimeService = processEngine.getRuntimeService();

    //查询到用户组
    IdentityService identityService = processEngine.getIdentityService();
    Group group = identityService.createGroupQuery().groupId("group1").singleResult();

    //然后给流程设计里面的${group1}流程变量赋值
    Map<String, Object> variables = new HashMap<>();
    variables.put("group1", group.getId());

    runtimeService.startProcessInstanceById("flowable-5:1:32504", variables);
}

act_ru_identitylink表中可以看到流程任务绑定的候选人组

2.3 任务的拾取和完成

/**
 * 查询候选人组任务
 */
@Test
public void queryTaskCandidateGroup() {
    //获取ProcessEngine引擎
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    //根据用户获取候选组
    IdentityService identityService = processEngine.getIdentityService();
    Group group = identityService.createGroupQuery().groupMember("员工1").singleResult();

    //获取组任务
    TaskService taskService = processEngine.getTaskService();
    List<Task> taskList = taskService.createTaskQuery()
            .processInstanceId("35001")
            .taskCandidateGroup(group.getId())
            .list();

    for (Task task : taskList) {
        System.out.println("task.getId() = " + task.getId());
        System.out.println("task.getName() = " + task.getName());
    }
}
/**
 * 拾取组任务
 * 就是通过候选组绑定查询出来的任务,然后拾取,和普通的流程任务操作一样
 * 正常业务开发下,该组下的任务只能由该组人员拾取
 * 拾取之后,不想操作的话也可以退还或者交接给他人
 */
@Test
public void claimTaskCandidate() {
//获取ProcessEngine引擎
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    //根据用户获取候选组
    IdentityService identityService = processEngine.getIdentityService();
    Group group = identityService.createGroupQuery().groupMember("员工1").singleResult();

    //获取组任务
    TaskService taskService = processEngine.getTaskService();
    List<Task> taskList = taskService.createTaskQuery()
            .processInstanceId("35001")
            .taskCandidateGroup(group.getId())
            .list();

    for (Task task : taskList) {
        System.out.println("task.getId() = " + task.getId());
        System.out.println("task.getName() = " + task.getName());
        //拾取
        taskService.claim(task.getId(), "员工1");
        System.out.println("任务:"+task.getName()+"拾取成功");
    }
}
/**
 * 完成组任务
 * 就是完成正常的一个流程任务
 */
@Test
public void completeTask() {
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    TaskService taskService = processEngine.getTaskService();

    Task task = taskService.createTaskQuery().processInstanceId("35001").taskAssignee("员工1").singleResult();
    Assert.assertNotNull(task);
    //流程设计的时候有个assignee0流程变量,这里需要设置下
    Map<String, Object> variables = new HashMap<>();
    variables.put("assignee0", "经理");
    taskService.complete(task.getId(), variables);
}

启动流程实例之后,查询当前任务执行表:

select * from act_ru_task;

记录了当前执行的任务,由于该任务是组任务,assignee_字段值是 null,让拾取任务之后该字段才会有拾取用户的信息。

查询任务参与者:

select * from act_ru_identitylink

记录了参与任务用户或组,当前任务如果设置了候选人,就会向该表插入候选人记录,有几个候选人就插入几条记录,与act_ru_identitylink对应的还有一张历史表act_hi_identitylink,向act_ru_identitylink插入记录的同时也会向act_hi_identitylink插入记录。