Activiti 分配组任务(三种方式)

本文详细介绍了在Activiti中如何处理组任务,包括三种分配方式:定义流程时指定组候选人、使用流程变量设定和通过监听类设置。通过具体的流程图和Java测试代码展示了每种方式的操作步骤,并总结了它们的特点。同时,提到了act_ru_identitylink和act_hi_identitylink表在记录个人任务和组任务办理人中的不同之处。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一章我们讲到用户任务分为个人任务和组任务,这一章我们来具体看看怎么使用组任务。
这里我们用到的流程还是最简单的审批流程:
这里写图片描述

方式一:定义流程时指定组任务候选人(该方式不够灵活,使用较少)

这里写图片描述

方式二:使用流程变量指定组任务候选人

这里写图片描述

流程图代码

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
  <process id="groupTask1" name="GroupTask1" isExecutable="true">
    <startEvent id="startevent1" name="Start"></startEvent>
    <userTask id="usertask1" name="审批" activiti:candidateUsers="#{userIds}"></userTask>
    <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
    <endEvent id="endevent1" name="End"></endEvent>
    <sequenceFlow id="flow2" sourceRef="usertask1" targetRef="endevent1"></sequenceFlow>
  </process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_groupTask1">
    <bpmndi:BPMNPlane bpmnElement="groupTask1" id="BPMNPlane_groupTask1">
      <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
        <omgdc:Bounds height="35.0" width="35.0" x="410.0" y="40.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1">
        <omgdc:Bounds height="55.0" width="105.0" 
### Activiti 工作流中任务交接的实现方式Activiti 中,任务交接通常指的是将某个用户任务从当前处理人转移到另一个处理人。这种功能可以通过修改任务的 `assignee` 属性或者将其加入候选来完成[^1]。 以下是具体的实现方法: #### 方法一:通过 API 修改任务分配者 可以使用 Activiti 提供的任务服务 (`TaskService`) 来更新任务分配者。以下是一个简单的代码示例: ```java // 获取 TaskService 对象 TaskService taskService = processEngine.getTaskService(); // 查询需要交接的任务 ID String taskId = "task_id_to_transfer"; // 设置新的任务处理人 taskService.setAssignee(taskId, "new_assignee"); System.out.println("任务已成功交接给 new_assignee"); ``` 此方法适用于单个用户的任务交接场景,并且可以直接更改任务的 `assignee` 字段[^3]。 --- #### 方法二:通过候选人或候选设置任务交接 除了直接指定 `assignee` 外,还可以将任务交给一候选人或候选中的成员。这种方式更加灵活,允许多个用户参与任务处理。 ##### 配置 BPMN 文件 在 BPMN 文件中定义用户任务时,可以不指定 `assignee` 而是指定 `candidateUsers` 或 `candidateGroups`: ```xml <userTask id="taskUser" name="审批任务"> <potentialOwner> <!-- 候选用户 --> <resourceAssignmentExpression> <formalExpression>${'userA', 'userB'}</formalExpression> </resourceAssignmentExpression> </potentialOwner> </userTask> ``` ##### 动态调整候选人列表 运行时也可以动态调整候选人列表: ```java // 添加新候选人 taskService.addCandidateUser(taskId, "new_candidate_user"); // 移除旧候选人 taskService.deleteCandidateUser(taskId, "old_candidate_user"); System.out.println("任务候选人已成功更新"); ``` 这种方法适合于多人协作的工作流设计[^2]。 --- #### 方法三:利用监听器 (Listener) 自动执行任务交接逻辑 如果希望在某些特定条件下自动触发任务交接操作,则可以在 BPMN 定义中引入 **Execution Listener** 或 **Task Listener**。 例如,在任务完成后自动重新分配下一个任务: ```xml <boundaryEvent id="escalationBoundary" cancelActivity="false"> <extensionElements> <activiti:executionListener event="end" class="com.example.TaskEscalationListener"/> </extensionElements> </boundaryEvent> ``` 对应的 Java 类实现如下: ```java public class TaskEscalationListener implements ExecutionListener { @Override public void notify(DelegateExecution execution) throws Exception { String currentUserId = (String) execution.getVariable("currentUserId"); String nextUserId = determineNextUserId(currentUserId); // 自定义业务逻辑 if (nextUserId != null && !nextUserId.isEmpty()) { TaskService taskService = execution.getProcessEngineServices().getTaskService(); List<Task> tasks = taskService.createTaskQuery() .processInstanceId(execution.getProcessInstanceId()) .list(); for (Task task : tasks) { taskService.setAssignee(task.getId(), nextUserId); } } } private String determineNextUserId(String currentUserId) { // 返回下一个处理人的 ID return "new_handler"; } } ``` 以上代码展示了如何基于自定义条件动态改变任务的所有权[^4]。 --- ### 总结 Activiti 支持多种任务交接方案,具体选择取决于实际需求: - 如果只是简单更换任务拥有者,可直接调用 `setAssignee`。 - 若需支持更复杂的权限管理,建议采用候选人机制。 - 当涉及复杂业务规则时,可通过监听器扩展灵活性。 ---
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值