Activiti6 Task查询API 映射 SQL

简介: 正好工作中遇到,整理工作流相关内容

一、前言
Activiti 自身提供了一套用户管理,但是在开发中业务系统本身就有一套用户管理系统,这时候就要把业务系统中的部分用户数据同步到 Activiti 用户表管理中。那么,如果不同步呢?不少开发者一开始以为必须要有用户才可以运行,其实 Task 的 Assignee,Candidate Users,Candidate Groups 信息已经以字符串形式保存在 act_ru_tak 和 ACT_RU_IDENTITYLINK 表中。只有少部分的查询 API 会用到 ACT_ID_* 表中的数据进行关联查询。

日志将avtiviti相关调整到DEBUG模式接口打印对应sql。

二、查询接口
2.1 taskAssignee
按照指派人查询,直接查询表 ACT_RU_TASK。
API:

taskService.createTaskQuery().taskAssignee(userId);

SQL:

select distinct RES.* from ACT_RU_TASK RES WHERE RES.ASSIGNEE_ = ?

2.2 taskCandidateGroup
按照分配组查询,没有用到 ACT_ID_* 表的数据。
API:

taskService.createTaskQuery().taskCandidateGroup("部门经理");

SQL:

SELECT DISTINCT
  RES.*
FROM ACT_RU_TASK RES
  INNER JOIN ACT_RU_IDENTITYLINK I
    ON I.TASK_ID_ = RES.ID_
WHERE RES.ASSIGNEE_ IS NULL
    AND I.TYPE_ = 'candidate'
    AND (I.GROUP_ID_ IN(?))

2.3 taskCandidateGroupIn
按照分配组查询,没有用到 ACT_ID_*表的数据。
API:

List<String> candidateGroups = new ArrayList<String>();
candidateGroups.add("部门经理");
candidateGroups.add("总裁");
taskService.createTaskQuery().taskCandidateGroupIn (candidateGroups);

SQL:

SELECT DISTINCT
  RES.*
FROM ACT_RU_TASK RES
  INNER JOIN ACT_RU_IDENTITYLINK I
    ON I.TASK_ID_ = RES.ID_
WHERE RES.ASSIGNEE_ IS NULL
    AND I.TYPE_ = 'candidate'
    AND (I.GROUP_ID_ IN(?))

2.4 taskCandidateOrAssigned
按照分配组 OR 指派人查询,用到了 ACT_ID_*表的数据,传入userId查询其所在权限组。
API:

taskService.createTaskQuery().taskCandidateOrAssigned(userId);

SQL:
首先查询用户所在组权限

SELECT
  g.*
FROM ACT_ID_GROUP g,
  ACT_ID_MEMBERSHIP membership
WHERE g.ID_ = membership.GROUP_ID_
    AND membership.USER_ID_ = ?

然后查询指派人任务或者指派人为空并且用户所在权限组的任务

SELECT DISTINCT
  RES.*
FROM ACT_RU_TASK RES
  LEFT JOIN ACT_RU_IDENTITYLINK I
    ON I.TASK_ID_ = RES.ID_
WHERE (RES.ASSIGNEE_ = ?
        OR (RES.ASSIGNEE_ IS NULL
            AND (I.USER_ID_ = ?
                  OR I.GROUP_ID_ IN(SELECT
                                      g.GROUP_ID_
                                    FROM ACT_ID_MEMBERSHIP g
                                    WHERE g.USER_ID_ = ?))))

2.5 taskCandidateUser
API:

taskService.createTaskQuery().taskCandidateUser(userId);

SQL:
先查找用户所属的组(用户所属用户组的信息从 Activiti 的 ACT_ID_*表获取)

SELECT
  g.*
FROM ACT_ID_GROUP g,
  ACT_ID_MEMBERSHIP membership
WHERE g.ID_ = membership.GROUP_ID_
    AND membership.USER_ID_ = ?

如果找到了用户组信息

SELECT DISTINCT
  RES.*
FROM ACT_RU_TASK RES
  INNER JOIN ACT_RU_IDENTITYLINK I
    ON I.TASK_ID_ = RES.ID_
WHERE RES.ASSIGNEE_ IS NULL
    AND I.TYPE_ = 'candidate'
    AND (I.USER_ID_ = ?
          OR I.GROUP_ID_ IN(?))

如果找不到用户所属的组

SELECT DISTINCT
  RES.*
FROM ACT_RU_TASK RES
  INNER JOIN ACT_RU_IDENTITYLINK I
    ON I.TASK_ID_ = RES.ID_
WHERE RES.ASSIGNEE_ IS NULL
    AND I.TYPE_ = 'candidate'
    AND (I.USER_ID_ = ?)

2.6 taskOwner
按照所属人查询
API:

taskService.createTaskQuery().taskOwner(userId);

SQL:

SELECT DISTINCT
  RES.*
FROM ACT_RU_TASK RES
WHERE RES.OWNER_ = ?

三、说明
有些查询使用到 Activiti 自带的用户信息的,比如 taskCandidateOrAssigned,如果项目中使用了自己的权限系统,这些 API 是不灵光的,这里提供三种方案,仅供参考:

同步系统用户权限信息到 Activiti 自带用户组,不推荐。
修改源代码 Task.xml 中的查询SQL,把 Activiti 自带的用户表替换成业务 系统用户表,不推荐。
用视图覆盖同名的ACT_ID_系列表,创建的视图要保证数据类型,推荐。

相关文章
|
12月前
|
SQL XML Java
菜鸟之路Day35一一Mybatis之XML映射与动态SQL
本文介绍了MyBatis框架中XML映射与动态SQL的使用方法,作者通过实例详细解析了XML映射文件的配置规范,包括namespace、id和resultType的设置。文章还对比了注解与XML映射的优缺点,强调复杂SQL更适合XML方式。在动态SQL部分,重点讲解了`&lt;if&gt;`、`&lt;where&gt;`、`&lt;set&gt;`、`&lt;foreach&gt;`等标签的应用场景,如条件查询、动态更新和批量删除,并通过代码示例展示了其灵活性与实用性。最后,通过`&lt;sql&gt;`和`&lt;include&gt;`实现代码复用,优化维护效率。
1155 5
|
SQL 存储 大数据
Dataphin V5.0:支持创建异步调用API,实现慢 SQL 复杂计算的直连消费
本文介绍了数据服务产品中异步调用的应用场景与优势,包括大数据引擎查询、复杂SQL及大规模数据下载等场景,解决了同步调用可能导致的资源浪费和性能问题。通过创建异步API、测试发布以及权限申请等功能,实现高效稳定的服务提供。以电商订单查询为例,展示了如何利用异步调用提升系统性能与用户体验。
465 9
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
API Java 数据库连接
从平凡到卓越:Hibernate Criteria API 让你的数据库查询瞬间高大上,彻底告别复杂SQL!
【8月更文挑战第31天】构建复杂查询是数据库应用开发中的常见需求。Hibernate 的 Criteria API 以其强大和灵活的特点,允许开发者以面向对象的方式构建查询逻辑,同时具备 SQL 的表达力。本文将介绍 Criteria API 的基本用法并通过示例展示其实际应用。此 API 通过 API 构建查询条件而非直接编写查询语句,提高了代码的可读性和安全性。无论是简单的条件过滤还是复杂的分页和连接查询,Criteria API 均能胜任,有助于提升开发效率和应用的健壮性。
580 0
慢sql治理问题之 Task 数量分布不均的问题你们是如何优化的
慢sql治理问题之 Task 数量分布不均的问题你们是如何优化的
167 0
慢sql治理问题之 Task 数量分布不均的问题你们是如何优化的
|
SQL 流计算
慢sql治理问题之下游 Task 频繁请求 JobMaster 导致 RPC 超时的问题你们是如何解决的
慢sql治理问题之下游 Task 频繁请求 JobMaster 导致 RPC 超时的问题你们是如何解决的
235 0
|
SQL JSON 关系型数据库
"SQL老司机大揭秘:如何在数据库中玩转数组、映射与JSON,解锁数据处理的无限可能,一场数据与技术的激情碰撞!"
【8月更文挑战第21天】SQL作为数据库语言,其能力不断进化,尤其是在处理复杂数据类型如数组、映射及JSON方面。例如,PostgreSQL自8.2版起支持数组类型,并提供`unnest()`和`array_agg()`等函数用于数组的操作。对于映射类型,虽然SQL标准未直接支持,但通过JSON数据类型间接实现了键值对的存储与查询。如在PostgreSQL中创建含JSONB类型的表,并使用`-&gt;&gt;`提取特定字段或`@&gt;`进行复杂条件筛选。掌握这些技巧对于高效管理现代数据至关重要,并预示着SQL在未来数据处理领域将持续扮演核心角色。
460 0
|
SQL Java 数据库连接
idea中配置mybatis 映射文件模版及 mybatis plus 自定义sql
idea中配置mybatis 映射文件模版及 mybatis plus 自定义sql
682 3
|
SQL 分布式计算 DataWorks
DataWorks产品使用合集之使用API调用ODPS SQL时,出现资源被定时任务抢占,该怎么办
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
320 32
|
SQL XML 数据库
后端数据库开发高级之通过在xml文件中映射实现动态SQL
后端数据库开发高级之通过在xml文件中映射实现动态SQL
347 3