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

article/2024/4/20 15:44:46

文章目录

  • 一、候选人
    • 1. 绘制流程图,导出流程文件,并部署启动流程实例,完成任务处理
    • 2. 任务的查询
    • 3. 任务的认领拾取(领取后不可重复领取)
    • 4. 任务的归还
    • 5. 任务的交接
  • 二、候选人组
    • 1. 管理用户和组
      • 1.1 用户管理 ACT_ID_USER
      • 1.2 用户组管理 ACT_ID_GROUP
      • 1.3 分配用户组 ACT_ID_MEMBERSHIP
    • 2. 候选人组的应用
      • 2.1 绘制流程图,并启动部署流程实例
      • 2.2 任务的查询与领取

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

一、候选人

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

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

/**
* 部署一个流程
*/
@Test
public void test_deploy() {// 2. 获取 RepositoryServiceRepositoryService 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. 获取 RepositoryServiceRepositoryService 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("任务领取成功");}
}

http://www.ngui.cc/article/show-841451.html

相关文章

学习Go的全部网站集合

给Golang 入门新手整理了一份全部所需网站集合&#xff0c;主要分为三类。 社区类&#xff1a;这类网站是问答、文档、搜索、资源类网站汇总 镜像和安装包类&#xff1a;有些安装包可能无法下载&#xff0c;此处列出一些可下载Go包和镜像的网站。 开发工具&#xff1a;目前流…

【Ubuntu】Nacos 2.1 单机安装

目录Nacos 2.1 单机安装1. 从GitHub下载2.1.0的压缩包2. 解压与配置3. 数据库配置4. 单机启动nacos遇到的一些错误ErrMsg:jmenv.tbsite.netlibstdc.so.6: cannot open shared object file: No such file or directoryCaused by: java.lang.IllegalStateException: No DataSourc…

Coolify系列01- 从0到1超详细手把手教你上手Heroku 和 Netlify 的开源替代方案

什么是Coolify 一款超强大的开源自托管 Heroku / Netlify 替代方案coolLabs是开源、自托管和以隐私为中心的应用程序和服务的统称 为什么使用Coolify 只需单击几下即可托管你的应用、数据库或其他开源服务&#xff0c;等。它是 Heroku 和 Netlify 的一个替代方案。通过 Cool…

Java基础 Stream流方法引用异常文件

Stream流 引例 需求&#xff1a;按照下面要求完成集合的创建和遍历 创建一个集合&#xff0c;存储多个字符串元素 1. 把所有以“曹”开头的元素存储到新集合中 2. 把曹开头&#xff0c;长度为3的元素存储到新集合中 List<String> list List.of("曹操", "…

恶意代码分析实战 5 分析恶意Windows程序

1 Lab07-01 本次实验分析lab07-01.exe,lab07-02.exe,先来看lab07-01.exe的问题 问题 计算机重启后&#xff0c;这个程序如何确保它继续运行&#xff08;达到持久化驻留&#xff09; 首先&#xff0c;查看导入函数。 OpenSCManagerA和CreateServiceA函数暗示着这个恶意代码…

手把手教你写一个极简版Netty

目录前言BIO版本NIO版本mini-netty版本v1&#xff1a;Reactor线程模型mini-netty版本v2&#xff1a;任务处理总结前言 Netty如今是使用最广泛的网络通信框架&#xff0c;许多人对此有强烈的学习需求。但是Netty本身代码量大、概念众多&#xff0c;单纯看代码学习容易一头雾水&…

【老卫搞机】136期:华为开发者联盟社区2022年度战码先锋2期开源贡献之星

首先祝大家兔年大吉&#xff0c;身体安康&#xff0c;钱兔似锦&#xff01;接上次的“2022年牛人之星”&#xff08; https://developer.huawei.com/consumer/cn/forum/topic/0203109930647268095&#xff09;&#xff0c;今天咱们来开箱另外一件特殊的奖品&#xff0c;来自华为…

ubuntu压缩、归档 tar zip gzip的介绍

不同文件需要使用不同的工具进行压缩和解压&#xff0c;可以使用file文件查看是什么类型的文件 file 文件名如图&#xff0c;在第二行看到这个文件是gzip类型的。 文件&#xff1a;gzip 工具&#xff1a;gunzip gunzip是 gnu unzip的缩写。用来解压gzip压缩包。 解压命令 …

Leetcode 数组存储大整数加一

前言&#xff1a;Leetcode 每日刷题&#xff0c;从容易题目开始&#xff0c;坚持不懈是成功的一半&#xff0c;喜欢的朋友欢迎订阅关注&#xff0c;欢迎大家留言交流&#xff0c;共同学习共同进步~~题目介绍&#xff1a;https://leetcode.com/problems/plus-one/d大型整数使用数…

LabVIEW将台式电脑转换为 Phar Lap ETS 实时目标

LabVIEW将台式电脑转换为 Phar Lap ETS 实时目标注意&#xff1a;NI将在NI2020软件版本中删除对cRIO的Pharlap和NI2022软件版本中对PXI的支持。更多信息&#xff0c;请参阅PharLapRTOSEOL路线图。您可能已经拥有一台台式PC&#xff0c;可以作为下一个可靠的确定性测试或控制系统…