Flowable进阶学习(五)候选人与候选人组


在流程定义中在任务节点的assignee固定设置任务负责人,在流程定义时将参与者固定设置在.bpmn文件中,如果临时任务负责人发生变更,则需要修改流程定义,可扩展性差。针对此类情况,可以给任务设置多个候选人或者候选人组,可以从候选人中来选择参与者完成任务。

一、候选人

1. 绘制流程图,导出流程文件,并部署启动流程实例,完成任务处理

在这里插入图片描述1.部署一个流程=》2.运行流程实例=》3.查询待办任务=》4.领取待办任务=》5.退回待办任务=》6.交接待办任务=》7.完成任务

/**
* 部署一个流程
*/
@Test
public void test_deploy() {
   // 2. 获取 RepositoryService
   RepositoryService repositoryService = processEngine.getRepositoryService();
   // 3. 完成流程部署操作
   Deployment deploy = repositoryService.createDeployment()
           // 关联要部署的流程文件
           .addClasspathResource("请假流程-候选人.bpmn20.xml")
           .name("请假流程-候选人2023")
           .deploy();  // 部署流程
   System.out.println("deploy.getId() => " + deploy.getId());
   System.out.println("deploy.getName() => " + deploy.getName());
}

/**
* 运行流程实例
*/
@Test
public void test_run_proc() {
   RuntimeService runtimeService = processEngine.getRuntimeService();
   // 给流程定义中的UEL表达式赋值
   Map<String, Object> params = new HashMap<>();
   params.put("candidate0", "whx");
   params.put("candidate1", "dy");
   ProcessInstance processInstance = runtimeService.startProcessInstanceById("qjlc-candidate:1:4", params);
   System.out.println("processInstance.getId() = " + processInstance.getId());
}

// 这里省略了3.查询待办任务=》4.领取待办任务=》5.退回待办任务=》6.交接待办任务。请单独的参考文章正文部分。

/**
 * 任务完成
 */
@Test
public void complete_task() {
    TaskService taskService = processEngine.getTaskService();
    Task task = taskService.createTaskQuery()
            .processDefinitionId("qjlc-candidate:1:4")
            .taskCandidateOrAssigned("whx")
            .singleResult();
    if (task != null) {
        taskService.complete(task.getId());
        System.out.println("任务完成");
    }
}

2. 任务的查询

/**
 * 根据登录用户名/id查询所对应的待办任务
 */
@Test
public void query_task_candidate() {
    TaskService taskService = processEngine.getTaskService();
    List<Task> tasks = taskService.createTaskQuery()
            .processDefinitionId("qjlc-candidate:1:4")
            .taskCandidateUser("dy")
            .list();
    tasks.forEach(t -> {
        System.out.println("t.getId() = " + t.getId());
        System.out.println("t.getName() = " + t.getName());
        System.out.println("================================");
    });
}

3. 任务的认领拾取(领取后不可重复领取)

/**
 * 领取任务
 * 当该任务被领取后,其他人将无法查询到该任务,无法进行领取操作。
 * 当一个用户领取了当前任务后,不想处理,可以进行退还操作
 */
@Test
public void claim_task_candidate() {
    TaskService taskService = processEngine.getTaskService();
    Task task = taskService.createTaskQuery()
            .processDefinitionId("qjlc-candidate:1:4")
            .taskCandidateUser("dy")
            .singleResult();
    if (task != null) {
        taskService.claim(task.getId(), "dy");
        System.out.println("任务领取成功");
    }
}

4. 任务的归还

/**
 * 退还任务
 */
@Test
public void unclaim_task_candidate() {
    TaskService taskService = processEngine.getTaskService();
    Task task = taskService.createTaskQuery()
            .processDefinitionId("qjlc-candidate:1:4")
            .taskCandidateOrAssigned("dy")
            .singleResult();
    if (task != null) {
        taskService.unclaim(task.getId());
        System.out.println("任务退还成功");
    }
}

5. 任务的交接

/**
 * 任务交接
 */
@Test
public void handover_task_candidate() {
    TaskService taskService = processEngine.getTaskService();
    Task task = taskService.createTaskQuery()
            .processDefinitionId("qjlc-candidate:1:4")
            .taskCandidateOrAssigned("dy")
            .singleResult();
    if (task != null) {
        taskService.setAssignee(task.getId(), "whx");
        System.out.println("任务交接成功");
    }
}

二、候选人组

当候选人很多的情况下,可以使用候选人组来分组处理。先创建组,将用户分配到该组中。

1. 管理用户和组

1.1 用户管理 ACT_ID_USER

/**
 * 对应数据表:ACT_ID_USER
 */
@Test
public void create_user(){
    // 通过identityService来完成用户与用户组的管理
    IdentityService identityService = processEngine.getIdentityService();
    User user = identityService.newUser("1001");
    user.setFirstName("w");
    user.setLastName("hx");
    identityService.saveUser(user);
    List<User> list = identityService.createUserQuery().list();
    list.forEach(u -> {
        System.out.println(u.getId() + "-" + u.getFirstName() + "-" + u.getLastName());
    });
}

1.2 用户组管理 ACT_ID_GROUP

/**
 * 对应数据表:ACT_ID_GROUP
 */
@Test
public void create_user_group(){
    // 通过identityService来完成用户与用户组的管理
    IdentityService identityService = processEngine.getIdentityService();
    Group group = identityService.newGroup("group1");
    group.setName("财务部");
    group.setType("type1");
    identityService.saveGroup(group);
    List<Group> list = identityService.createGroupQuery().list();
    list.forEach(u -> {
        System.out.println(u.getId() + "-" + u.getName() + "-" + u.getType());
    });
}

1.3 分配用户组 ACT_ID_MEMBERSHIP

/**
 * 对应数据表:ACT_ID_MEMBERSHIP
 */
@Test
public void test_user_group_ship(){
    IdentityService identityService = processEngine.getIdentityService();
    User user = identityService.createUserQuery().userIdIgnoreCase("1001").singleResult();
    Group group1 = identityService.createGroupQuery().groupId("group1").singleResult();
    identityService.createMembership(user.getId(),group1.getId());
    System.out.println("创建用户关系成功");
//        identityService.deleteMembership(user.getId(),group1.getId());
}

2. 候选人组的应用

2.1 绘制流程图,并启动部署流程实例

在这里插入图片描述

/**
* 部署一个流程
*/
@Test
public void test_deploy() {
   // 2. 获取 RepositoryService
   RepositoryService repositoryService = processEngine.getRepositoryService();
   // 3. 完成流程部署操作
   Deployment deploy = repositoryService.createDeployment()
           // 关联要部署的流程文件
           .addClasspathResource("请假流程-候选人组.bpmn20.xml")
           .name("请假流程-候选人组2023")
           .deploy();  // 部署流程
   System.out.println("deploy.getId() => " + deploy.getId());
   System.out.println("deploy.getName() => " + deploy.getName());
}

/**
* 运行流程实例
*/
@Test
public void test_run_proc() {
   IdentityService identityService = processEngine.getIdentityService();
   Group group = identityService.createGroupQuery().groupId("group1").singleResult();
   RuntimeService runtimeService = processEngine.getRuntimeService();
   // 给流程定义中的UEL表达式赋值
   Map<String, Object> params = new HashMap<>();
   params.put("g1", group.getId());
   ProcessInstance processInstance = runtimeService.startProcessInstanceById("qjlc-candidateGrop:1:17504", params);
   System.out.println("processInstance.getId() = " + processInstance.getId());
}

对应表结构:详细变化需要执行每一次测试后查看。
在这里插入图片描述

2.2 任务的查询与领取

这里的方法也可以采用候选人中的方法。且后续的退还、交接、完成任务都与前面的候选人中的方法相同。

/**
 * 根据登录用户名/id查询所对应的待办任务
 */
@Test
public void query_task_candidate_group() {
    IdentityService identityService = processEngine.getIdentityService();
    User user = identityService.createUserQuery().userId("dy").singleResult();
    Group group = identityService.createGroupQuery().groupMember(user.getId()).singleResult();

    TaskService taskService = processEngine.getTaskService();
    List<Task> tasks = taskService.createTaskQuery()
            .processDefinitionId(PROC_DEF_ID)
            .taskCandidateGroup(group.getId())
//                .taskCandidateUser("dy")      // 也可以直接使用候选人的ID来查询
            .list();
    tasks.forEach(t -> {
        System.out.println("t.getId() = " + t.getId());
        System.out.println("t.getName() = " + t.getName());
        System.out.println("================================");
    });
}

/**
 * 领取任务
 * 当该任务被领取后,其他人将无法查询到该任务,无法进行领取操作。
 * 当一个用户领取了当前任务后,不想处理,可以进行退还操作
 */
@Test
public void claim_task_candidate() {
    IdentityService identityService = processEngine.getIdentityService();
    Group group = identityService.createGroupQuery().groupMember("dy").singleResult();
    TaskService taskService = processEngine.getTaskService();
    Task task = taskService.createTaskQuery()
            .processDefinitionId(PROC_DEF_ID)
            .taskCandidateGroup(group.getId())
//                .taskCandidateUser("dy")     // 也可以直接使用候选人的ID来查询
            .singleResult();
    if (task != null) {
        taskService.claim(task.getId(), "dy");
        System.out.println("任务领取成功");
    }
}
posted @   Huathy  阅读(635)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示