Activiti6自学之路(七)——个人任务和组任务

article/2025/9/28 14:34:22

Activiti6 任务有个人任务和组任务之分,理解两者的区别并且知道如何操作对应的任务是学习activiti重要一步。

本章承接上文章节,这里就不详细描述了

一、个人任务与组任务区别

个人任务:流程中的某个任务由指定的user来执行

组任务:流程中的某个任务由指定的group来完成,其中group由多个user组成

实例分析
在这里插入图片描述
1、填写请假申请任务:个人任务,比如张三提交请假申请

2、总监审批任务:组任务,这里我简单将总监理解为另一组权限的用户,不和实际意义相关;如 张三提交了请假申请后,总监一、和总监二都具有审批的权限,并且组任务中只要有一人审批了申请,组任务代表完成了,进入了下一个节点

3、经理审批:同2;

4、人力资源审核:同2

二、创建个人任务的三种方式

分配个人任务的三种方式

1、直接指定办理人

选择Main config 可以配置Assignee,可以指定一个用户来执行该任务,但是一般实际项目开发不会这么做,这样分配任务的办理人不够灵活,因为项目开发中任务的办理人不要放置XML文件中。
在这里插入图片描述
在这里插入图片描述

直接启动流程实例即可

    //9、启动流程实例@RequestMapping("/startProcessInstance") public void startProcessInstance() {// 流程定义的KeyString processDefinitionKey = "myProcess";ProcessInstance processInstance = processEngine.getRuntimeService()// 与正在执行的流程实例和执行对象相关的Service.startProcessInstanceByKey(processDefinitionKey);// 使用流程定义的key启动流程实例,key对应leave.bpmn文件中id的属性System.out.println("流程实例ID:" + processInstance.getId());// 流程实例ID: System.out.println("流程定义ID:" + processInstance.getProcessDefinitionId());// 流 }

启动程序,执行启动流程实例方法startProcessInstance()
在这里插入图片描述

流程启动后,会操作如下表

act_ru_execution:执行流程实例表,核心,启动后会生成一个流程实例和待执行的任务节点
在这里插入图片描述

act_ru_task:用户任务表,待执行的任务
在这里插入图片描述

act_ru_identitylink:用户身份关系表,存储待执行任务的用户关系

act_hi_taskinst:历史用户任务表,存储所有已执行或待执行的用户任务历史

act_hi_procinst:历史流程实例表,存储流程实例
在这里插入图片描述

act_hi_actinst:历史活动节点表,存储所有已执行的节点(各类节点)
在这里插入图片描述
act_hi_identitylink:历史用户身份关系表,历史用户任务的关系表

2、使用流程变量

使用动态的流程变量${userId} 来代替静态指定用户。
在这里插入图片描述

//10、启动流程实例--使用流程变量 userId@RequestMapping("/startProcessInstance2") public void startProcessInstance2() {// 流程定义的KeyString processDefinitionKey = "myProcess";Map<String, Object> variables = new HashMap<String, Object>();variables.put("userId", "user1");//这里传入id为user1的用户ProcessInstance processInstance = processEngine.getRuntimeService()// 与正在执行的流程实例和执行对象相关的Service.startProcessInstanceByKey(processDefinitionKey,variables);// 使用流程定义的key启动流程实例,key对应leave.bpmn文件中id的属性System.out.println("流程实例ID:" + processInstance.getId());// 流程实例ID: System.out.println("流程定义ID:" + processInstance.getProcessDefinitionId());// 流 }

3、使用监听类

流程图中任务节点的配置

Main config不作任何配置
在这里插入图片描述
选择Listeners ,选择TaskListenerImp监听类
在这里插入图片描述

package com.springboot.activiti.eimm.leave.controller;import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;public class TaskListenerImpl implements TaskListener {private static final long serialVersionUID = 1L;/*** 用来指定任务的办理人*/@Overridepublic void notify(DelegateTask delegateTask) {//指定个人任务的办理人,也可以指定组任务的办理人//通过类去查询数据库,将下一个任务的办理人查询获取,然后通过setAssignee()的方法指定任务办理人delegateTask.setAssignee("user1");}}
   //11、启动流程实例--使用监听类@RequestMapping("/startProcessInstance3") public void startProcessInstance3() {// 流程定义的KeyString processDefinitionKey = "myProcess";ProcessInstance processInstance = processEngine.getRuntimeService()// 与正在执行的流程实例和执行对象相关的Service.startProcessInstanceByKey(processDefinitionKey);// 使用流程定义的key启动流程实例,key对应leave.bpmn文件中id的属性System.out.println("流程实例ID:" + processInstance.getId());// 流程实例ID: System.out.println("流程定义ID:" + processInstance.getProcessDefinitionId());// 流 }

执行程序即可

三、查询当前人的个人任务

@RequestMapping("/findMyPersonalTask") public void findMyPersonalTask(){String assignee = "user1";List<Task> list = processEngine.getTaskService()//与正在执行的任务管理相关的Service.createTaskQuery()//创建任务查询对象/**查询条件(where部分)*/.taskAssignee(assignee)//指定个人任务查询,指定办理人
//						.taskCandidateUser(candidateUser)//组任务的办理人查询
//						.processDefinitionId(processDefinitionId)//使用流程定义ID查询
//						.processInstanceId(processInstanceId)//使用流程实例ID查询
//						.executionId(executionId)//使用执行对象ID查询/**排序*/.orderByTaskCreateTime().asc()//使用创建时间的升序排列/**返回结果集*/
//						.singleResult()//返回惟一结果集
//						.count()//返回结果集的数量
//						.listPage(firstResult, maxResults);//分页查询.list();//返回列表if(list!=null && list.size()>0){for(Task task:list){System.out.println("任务ID:"+task.getId());System.out.println("任务名称:"+task.getName());System.out.println("任务的创建时间:"+task.getCreateTime());System.out.println("任务的办理人:"+task.getAssignee());System.out.println("流程实例ID:"+task.getProcessInstanceId());System.out.println("执行对象ID:"+task.getExecutionId());System.out.println("流程定义ID:"+task.getProcessDefinitionId());System.out.println("########################################################");}}}

在这里插入图片描述

四、完成个人任务

上面我们创建了个人任务,所有需要完成当前节点的任务,流程才会自动进入下一节点

前面我们已经启动了流程实例,并且设置了所让人Assignee为user1用户,
在这里插入图片描述

查看act_ru_task 代运行的任务中发现任务id为15,

    //13、完成我的任务@RequestMapping("/completeMyPersonalTask")public void completeMyPersonalTask() {// 任务IDString taskId = "15";//完成任务的同时,设置流程变量,根据流程变量的结果来节点进入哪一个节点任务Map<String, Object> args = new HashMap<>();args.put("time", 2);processEngine.getTaskService()// 与正在执行的任务管理相关的Service.complete(taskId,args);System.out.println("完成任务:任务ID:" + taskId);

这里设置表单变量submitTime=2,根据流程图分支条件知,流程会自动到经理审批任务节点处。

执行程序后,控制台输出
在这里插入图片描述
数据表数据更新

act_ru_execution 所标识的数据更新为usertask3,也就是经理审批任务
在这里插入图片描述
act_ru_task 待执行任务也变为经理审批
在这里插入图片描述

五、创建组任务

创建组任务有多种方式

1、静态配置候选人成员,可以配置一个或多个,多个用户用逗号分隔即可
在这里插入图片描述

	@RequestMapping("/startProcessInstance1") public void startProcessInstance1() {// 流程定义的KeyString processDefinitionKey = "myProcess";ProcessInstance processInstance = processEngine.getRuntimeService()// 与正在执行的流程实例和执行对象相关的Service.startProcessInstanceByKey(processDefinitionKey);// 使用流程定义的key启动流程实例,key对应leave.bpmn文件中id的属性System.out.println("流程实例ID:" + processInstance.getId());// 流程实例ID: System.out.println("流程定义ID:" + processInstance.getProcessDefinitionId());// 流 }

启动程序即可

2、使用动态变量配置候选人成员

在这里插入图片描述

//10、启动流程实例--使用流程变量 userId和userId3@RequestMapping("/startProcessInstance4") public void startProcessInstance4() {// 流程定义的KeyString processDefinitionKey = "myProcess";Map<String, Object> variables = new HashMap<String, Object>();variables.put("userId", "user1");//这里传入id为user1的用户variables.put("userId3", "user2,user3");//这里可以传入多个用户ProcessInstance processInstance = processEngine.getRuntimeService()// 与正在执行的流程实例和执行对象相关的Service.startProcessInstanceByKey(processDefinitionKey,variables);// 使用流程定义的key启动流程实例,key对应leave.bpmn文件中id的属性System.out.println("流程实例ID:" + processInstance.getId());// 流程实例ID: System.out.println("流程定义ID:" + processInstance.getProcessDefinitionId());// 流 }

3、使用监听类来实现

方法和创建个人任务监听类是一个道理,只是可以添加一个或多个用户

4、配置候选人组来实现

创建候选人中 group3, 对应act_id_group中经理组,表示经理组中的用户都具有【经理审批】任务权限
在这里插入图片描述
在这里插入图片描述

	//10、启动流程实例--使用流程变量 userId@RequestMapping("/startProcessInstance2") public void startProcessInstance2() {// 流程定义的KeyString processDefinitionKey = "myProcess";Map<String, Object> variables = new HashMap<String, Object>();variables.put("userId", "user1");//这里传入id为user1的用户ProcessInstance processInstance = processEngine.getRuntimeService()// 与正在执行的流程实例和执行对象相关的Service.startProcessInstanceByKey(processDefinitionKey,variables);// 使用流程定义的key启动流程实例,key对应leave.bpmn文件中id的属性System.out.println("流程实例ID:" + processInstance.getId());// 流程实例ID: System.out.println("流程定义ID:" + processInstance.getProcessDefinitionId());// 流 }

其它步骤一样。

六、查询当前人的组任务

//14、查询当前人的组任务@RequestMapping("/findMyGroupTask") public void findMyGroupTask() {String candidateUser = "user2";List<Task> list = processEngine.getTaskService()// 与正在执行的任务管理相关的Service.createTaskQuery()// 创建任务查询对象/** 查询条件(where部分) */.taskCandidateUser(candidateUser)// 组任务的办理人查询/** 排序 */.orderByTaskCreateTime().asc()// 使用创建时间的升序排列/** 返回结果集 */.list();// 返回列表if (list != null && list.size() > 0) {for (Task task : list) {System.out.println("任务ID:" + task.getId());System.out.println("任务名称:" + task.getName());System.out.println("任务的创建时间:" + task.getCreateTime());System.out.println("任务的办理人:" + task.getAssignee());System.out.println("流程实例ID:" + task.getProcessInstanceId());System.out.println("执行对象ID:" + task.getExecutionId());System.out.println("流程定义ID:" + task.getProcessDefinitionId());System.out.println("########################################################");}}}

在这里插入图片描述

七、查询组用户的任务

@RequestMapping("/findPersonalTask") public void findPersonalTask(){String candidateUser = "user2";List<Task> list = processEngine.getTaskService()//与正在执行的任务管理相关的Service.createTaskQuery()//创建任务查询对象/**查询条件(where部分)*///.taskAssignee(assignee)//指定个人任务查询,指定办理人.taskCandidateUser(candidateUser)//组任务的办理人查询
//  						.processDefinitionId(processDefinitionId)//使用流程定义ID查询
//  						.processInstanceId(processInstanceId)//使用流程实例ID查询
//  						.executionId(executionId)//使用执行对象ID查询/**排序*/.orderByTaskCreateTime().asc()//使用创建时间的升序排列/**返回结果集*/
//  						.singleResult()//返回惟一结果集
//  						.count()//返回结果集的数量
//  						.listPage(firstResult, maxResults);//分页查询.list();//返回列表if(list!=null && list.size()>0){for(Task task:list){System.out.println("任务ID:"+task.getId());System.out.println("任务名称:"+task.getName());System.out.println("任务的创建时间:"+task.getCreateTime());System.out.println("任务的办理人:"+task.getAssignee());System.out.println("流程实例ID:"+task.getProcessInstanceId());System.out.println("执行对象ID:"+task.getExecutionId());System.out.println("流程定义ID:"+task.getProcessDefinitionId());System.out.println("########################################################");}}}

在这里插入图片描述


如果你觉得本篇文章对你有所帮助的话,麻烦请点击头像右边的关注按钮,谢谢!

技术在交流中进步,知识在分享中传播


http://chatgpt.dhexx.cn/article/Q1i0t1eo.shtml

相关文章

个人财务管理系统设计与实现

个人财务管理系统设计与实现 这里是分享个人的一份“个人财务管理系统”的设计报告,详细的介绍了整个项目的各个部分。 1 绪论 1.1 个人财务管理系统的研究背景与意义 随着中国经济的快速发展,无论是企业或是个人,各个环节都已经进入了金融化领域。在经济化潮流和金融危机的…

iSpace PIM 3.6.0.2027 个人任务管理系统发布

iSpace PIM是一款使用简单、设计灵巧、功能多样化的个人任务管理软件&#xff0c;包括待办事务管理、联系人管理等模块&#xff0c;可作为工作分解和任务管理的工具&#xff0c;实现高效的任务管理和工作过程知识记录和管理。 iSpace PIM 特色 支持树形结构式的父子任务分解…

如何做好项目管理任务分配

TL;DR 常见项目管理工具介绍项目管理最重要的内容谁来撰写以及分配任务如何有效地分配任务项目管理工具 在我工作的10多年中,使用过不少的项目管理系统,Excel, Microsoft Project, dotProject, Redmine, Jira, Teambition, Worktile, Tello…。比我谈过的女朋友还多。

ToDoList-简单有效的个人任务管理器

是否觉得日常工作很无序&#xff0c;经常工作杂乱无章&#xff0c;丢三落四&#xff0c;不能很好地控制每样工作的进度&#xff1f; (点击放大下图) 我一直在关注 ToDoList这个开源项目&#xff0c;它是一个简单有效的个人任务管理器&#xff0c;一树状结构显示所有任务。 □…

软件开发过程与项目管理(5.软件项目任务分解)

软件开发过程与项目管理&#xff08;5.软件项目任务分解&#xff09; 任务分解WBS工作包分解方法任务分解的基本步骤检验分解结果的标准WBS任务分解建议小结例题&#xff1a;简答题自练 任务分解 任务分解过程&#xff1a;将一个项目分解为更多的工作细目或者子项目&#xff0…

Activiti 学习笔记12:分配个人任务

一、流程图 二、分配个人任务方式一&#xff08;直接指定办理人&#xff09; 1、流程图中任务节点的配置 2、测试代码 ProcessEngine processEngine ProcessEngines.getDefaultProcessEngine(); //部署流程定义&#xff0c;启动流程实例Testpublic void testTask() throw…

分布式定时任务开源方案

目录 1、quartz1.1 架构1.2 优缺点 2、elastic-job2.1 架构2.2 优缺点 3、xxl-job3.1 架构3.2 优缺点 4、Saturn4.1 架构4.2 优缺点 5、antares5.1 架构5.2 优缺点 6、opencron6.1 优缺点 方案对比 1、quartz quartz的集群方案是使用数据库来实现的。通过在数据库中配置定时器…

做好目标管理和任务管理,提高办公协同效率

工作一段时间后&#xff0c;或者参与一个项目后&#xff0c;你会发现团队里每个人都非常优秀&#xff0c;工作也充满热情&#xff0c;但是整体的效率就是上不去&#xff1f;因为&#xff0c;一个团队的整体效率&#xff0c;并不是每个人效率的相加。因为这里面有协作成本。 如…

基于javaweb个人记账管理系统设计与实现(项目源码+论文+毕业设计任务书)

摘 要 随着互联网的快速发展&#xff0c;人们生活节奏日益加快&#xff0c;关于过度消费是大多数人头疼问题&#xff0c;导致出现不少的月光族&#xff0c;如我们定期花点时间去记录生活中的主要消费记录&#xff0c;掌握自己的收入和支出情况&#xff0c;这样你就会发现一些规…

计算机的任务管理器在哪,怎么打开任务管理器 多种方法详细教学

我们在使用电脑的过程中&#xff0c;任务管理器是我们经常会使用到的程序&#xff0c;可以在任务管理器里面查看所有正在服务的程序&#xff0c;还可以在任务管理器里面知道正在运行的有哪些服务于应用程序&#xff0c;同时我们也可以通过任务管理器来结束一些进程&#xff0c;…

《印象笔记留给你的空间》第5章 建立个人任务管理系统 / 第6章 记录你的人生轨迹

学习笔记内容来自&#xff1a; 《印象笔记留给你的空间-李参》 《用印象笔记做个人知识管理-李参个人成长课堂 》 第5章 建立个人任务管理系统 5.1关于任务管理 5.1.1任务的定义 5.1.2任务的组成 1.行动清单 2.参考资料 5.1.3任务管理的三个关注层面 工作流、经验库、…

12款适合小团队协作、任务管理和进度跟踪的在线任务管理的工具推荐?

国内外12款主流任务管理软件测评: 1.开发任务管理PingCode; 2.多合一项目任务管理Worktile;3.个人和小团队项目任务管理Notion; 4.企业任务管理平台SmartTask; 5.小团队任务管理Teambition;6.IT任务追踪管理Jira等。 无论是做好工作任务管理还是个人任务管理&#xff0c;从来都…

国内外最好用的9大工作任务管理软件

由于使用人群和需求的不同&#xff0c;对任务管理的功能要求也会有所差异&#xff0c;就比如个人任务管理和团队任务管理中&#xff0c;团队任务管理更注重协作功的打造&#xff0c;而这在个人任务管理中又很鸡肋。 再比如通用型项目的任务管理和软件项目的管理&#xff0c;通…

[工具]ToDoList-简单有效的个人任务管理器

原文地址为&#xff1a; [工具]ToDoList&#xff0d;简单有效的个人任务管理器 是否觉得日常工作很无序&#xff0c;经常工作杂乱无章&#xff0c;丢三落四&#xff0c;不能很好地控制每样工作的进度&#xff1f; (点击放大下图) 我一直在关注 ToDoList这个开源项目&#xf…

效率提升:用 Notion 实现个人任务管理监控

最近一直在找一款个人任务管理&#xff0c;并且可以进行任务完成情况实时监控统计的软件&#xff0c;但试了又试&#xff0c;一直没找到满意的&#xff0c;无意间在B站发现了别人用 Notion 做的仪表盘&#xff0c;很是满意心动&#xff0c;所以就打算先仿照着也弄一个。废话不多…

个人任务管理系统总结

1、数据库、三层架构相对熟练没有卡壳 2、UI层遇到问题如下&#xff1a; 单词记得不熟悉&#xff0c;系统没有提示就会有很多的卡&#xff08;style样式属性text-align: center冒号一直写成等于&#xff09; 优先级设置后台代码前台调用不会 //任务优先级后台代码 public st…

【Revit二次开发】单位转换

单位转换 Revit内部基本单位是英尺&#xff0c;我们需要进行单位转换 Revit2021和2020相比 单位的表示&#xff0c;由DisplayUnitType枚举字段表示&#xff0c;变成了UnitTypeId静态类的只读属性。 DisplayUnitType(int)——>UnitTypeId(ForgeTypeId) UnitUtils类&#xff…

【Revit二次开发】元素(Element)

图元与图元类型 元素 元素 元素(Element)也称图元 图元作为revit建模的基础&#xff0c;数量庞大&#xff0c;关系千丝万缕。先了解图元的分类&#xff0c;将会帮助我们整理思路&#xff0c;找到功能开发的关键点。 每一个人都可以按照自己的思路将图元进行分类。建模人员可以…

Revit二次开发——HelloRevitApp

HelloRevitApp 环境C#revit HelloRevitApp调试 环境 语言为C#&#xff0c;项目模板应为.Net Framework 类库&#xff0c;框架平台以Revit API 中的说明为准&#xff0c;Revit 2021 的要求选择.Net Framework 4.8。 C# Visual Studio 2019集成开发环境&#xff0c;框架版本.N…

【Revit二次开发】添加菜单和按钮

添加菜单和按钮 Ribbon实例 Ribbon菜单的创建以及各种不同的button Ribbon 这个类是PushButton和PulldownButton的基类。 按钮放在panel内&#xff0c;panel放在tab页内 在Revit API中&#xff0c;可以使用ExternalApplication类和ExternalCommand类来创建自定义菜单和按钮。…