Activiti7 查询用户任务列表

package com.itheima.activiti;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;

import java.util.List;

/**
 * 查询当期用户任务的列表
 */
public class ActivitiTaskQuery {

    static final String ONE = "zhangsan";

    static final String TWO = "lisi";

    static final String THREE = "wangwu";

    static final String KEY = "holiday";

    /**
     * @param args
     */
    public static void main(String[] args) {

        // 1:得到ProcessEngine对象
        ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();

        // 2:获取TaskService服务
        TaskService taskService = defaultProcessEngine.getTaskService();

        // 3:根据流程定义的Key,负责人assignee来实现当前用户的任务列表的查询
        List<Task> list = taskService.createTaskQuery().processDefinitionKey(ActivitiTaskQuery.KEY).taskAssignee(ActivitiTaskQuery.ONE).list();

        // 4:任务列表的展示
        list.forEach(task -> {
            System.out.println("流程实例ID:" + task.getProcessDefinitionId());
            System.out.println("任务ID:" + task.getId());
            System.out.println("任务负责人:" + task.getAssignee());
            System.out.println("任务名称:" + task.getName());
        });

    }

}

在这里面定义好,任务处理人和流程发布的KEY就可以一直用了

作者:彼岸舞

时间:2020\08\31

内容关于:Activiti工作流

本文来源于网络,只做技术分享,一概不负任何责任

Activiti 7查询待领取任务(即候选任务)可以通过 `TaskService` 实现,具体方法取决于是否使用 `IdentityService` 或自定义身份管理。以下是详细代码示例和说明: --- ### **1. 查询待领取任务的几种方式** #### **(1) 使用 `taskCandidateGroup()` 查询候选组任务** ```java import org.activiti.engine.TaskService; import org.activiti.engine.task.Task; import org.springframework.stereotype.Service; import java.util.List; @Service public class TaskQueryService { private final TaskService taskService; public TaskQueryService(TaskService taskService) { this.taskService = taskService; } /** * 查询指定候选组的待领取任务 */ public List<Task> getTasksByCandidateGroup(String groupId) { return taskService.createTaskQuery() .taskCandidateGroup(groupId) // 查询候选组任务 .list(); } } ``` #### **(2) 使用 `taskCandidateUser()` 查询候选用户任务** (自动包含用户所属组的候选任务) ```java /** * 查询指定用户的待领取任务(包括个人候选和组候选) */ public List<Task> getTasksByCandidateUser(String userId) { return taskService.createTaskQuery() .taskCandidateUser(userId) // 查询用户个人候选或组候选任务 .list(); } ``` #### **(3) 结合 `IdentityService` 查询(如果可用)** ```java import org.activiti.engine.IdentityService; @Service public class TaskQueryService { private final TaskService taskService; private final IdentityService identityService; public TaskQueryService(TaskService taskService, IdentityService identityService) { this.taskService = taskService; this.identityService = identityService; } /** * 查询当前用户的待领取任务(需先设置认证用户) */ public List<Task> getTasksForAuthenticatedUser(String userId) { identityService.setAuthenticatedUserId(userId); return taskService.createTaskQuery() .taskCandidateUser(userId) .list(); } } ``` --- ### **2. 自定义身份管理时的实现** 如果未使用 `IdentityService`(如 Spring Boot 3 集成场景),需手动关联用户和组: #### **(1) 查询候选组任务** ```java /** * 查询属于指定候选组的任务 */ public List<Task> getTasksByCustomGroup(String groupId) { List<Task> allTasks = taskService.createTaskQuery().list(); List<Task> result = new ArrayList<>(); for (Task task : allTasks) { // 检查任务的候选组是否包含目标组 List<IdentityLink> identityLinks = taskService.getIdentityLinksForTask(task.getId()); for (IdentityLink link : identityLinks) { if ("candidate".equals(link.getType()) && groupId.equals(link.getGroupId())) { result.add(task); break; } } } return result; } ``` #### **(2) 查询用户可领取的任务(个人+组)** ```java /** * 查询用户可领取的任务(包括个人候选和组候选) */ public List<Task> getCandidateTasksForUser(String userId, Set<String> userGroups) { List<Task> allTasks = taskService.createTaskQuery().list(); List<Task> result = new ArrayList<>(); for (Task task : allTasks) { // 检查个人候选 if (userId.equals(task.getAssignee())) { result.add(task); continue; } // 检查组候选 List<IdentityLink> identityLinks = taskService.getIdentityLinksForTask(task.getId()); for (IdentityLink link : identityLinks) { if ("candidate".equals(link.getType())) { if ((link.getUserId() != null && link.getUserId().equals(userId)) || (link.getGroupId() != null && userGroups.contains(link.getGroupId()))) { result.add(task); break; } } } } return result; } ``` --- ### **3. 完整示例:Spring Boot 3 + Activiti 7** #### **(1) 配置类** ```java import org.activiti.spring.SpringProcessEngineConfiguration; import org.activiti.spring.boot.ProcessEngineConfigurationConfigurer; import org.springframework.context.annotation.Configuration; @Configuration public class ActivitiConfig implements ProcessEngineConfigurationConfigurer { @Override public void configure(SpringProcessEngineConfiguration config) { // 自定义配置(如需要) } } ``` #### **(2) 服务类** ```java import org.activiti.engine.TaskService; import org.activiti.engine.task.IdentityLink; import org.activiti.engine.task.Task; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; import java.util.Set; @Service public class TaskService { private final TaskService taskService; // 注意:与类名相同,需通过构造器注入 public TaskService(org.activiti.engine.TaskService taskService) { this.taskService = taskService; } /** * 查询用户可领取的任务(模拟IdentityService行为) */ public List<Task> findCandidateTasks(String userId, Set<String> groupIds) { List<Task> candidateTasks = new ArrayList<>(); List<Task> tasks = taskService.createTaskQuery().list(); for (Task task : tasks) { // 检查个人候选 if (userId.equals(task.getAssignee())) { candidateTasks.add(task); continue; } // 检查组候选 List<IdentityLink> links = taskService.getIdentityLinksForTask(task.getId()); for (IdentityLink link : links) { if ("candidate".equals(link.getType())) { if ((link.getUserId() != null && link.getUserId().equals(userId)) || (link.getGroupId() != null && groupIds.contains(link.getGroupId()))) { candidateTasks.add(task); break; } } } } return candidateTasks; } } ``` --- ### **4. 关键注意事项** 1. **性能优化** - 避免全表扫描:在生产环境中,建议通过数据库索引优化 `ACT_RU_TASK` 和 `ACT_RU_IDENTITYLINK` 表的查询。 - 分页查询:使用 `.listPage(firstResult, maxResults)` 分页获取任务。 2. **身份管理集成** - 如果使用 Spring Security,可通过 `SecurityContextHolder` 获取当前用户,替代 `IdentityService`。 3. **动态候选组** - 可在流程定义中通过表达式动态指定候选组,例如: ```xml <userTask id="task1" activiti:candidateGroups="${approvalGroup}" /> ``` 4. **任务过滤** - 结合其他条件(如流程变量)过滤任务: ```java taskService.createTaskQuery() .taskCandidateUser(userId) .processVariableValueEquals("priority", "high") .list(); ``` --- ### **相关问题** 1. 如何实现任务领取时的权限校验(如防止越权领取)? 2. 在微服务架构中,如何跨服务查询 Activiti 任务? 3. 如何为任务查询添加缓存机制以提升性能? 4. 如何处理任务分配时的并发冲突(如多人同时领取同一任务)? 5. 如何通过 REST API 暴露任务查询接口?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值