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_系列表,创建的视图要保证数据类型,推荐。

相关文章
|
JSON 自然语言处理 搜索推荐
银行卡归属地及开户行查询API查询实战指南
银行卡归属地及开户行查询API,通过卡号快速识别发卡行、开户地及卡种信息,支持全国1500+银行,数据实时更新。提供结构化数据返回,广泛应用于支付、风控、用户画像等场景,助力金融系统高效、安全运行。
4497 126
|
移动开发 算法 API
淘宝/天猫:使用物流查询API实时显示包裹位置,减少客服咨询量
电商平台中物流咨询占客服工作40%以上,用户频繁追问包裹位置。本文介绍通过物流查询API实现包裹实时追踪,降低75.6%咨询量,提升用户体验与复购率,助力降本增效。(238字)
|
人工智能 JSON API
淘宝/天猫:使用物流查询API实时显示包裹位置,减少客服咨询量
在电商竞争激烈的环境下,淘宝、天猫通过集成物流查询API,实现实时追踪包裹位置,显著减少用户咨询量。本文解析其原理、实现步骤与效益,展示如何以技术手段提升用户体验、降低客服压力,助力平台高效运营。(238字)
|
监控 安全 算法
快递查询API|一次接通2700+快递服务商的物流轨迹
在物流数字化的浪潮中,企业对接多家快递服务商的痛点日益凸显:每新增一家合作物流商,技术团队就要投入 5-7 个工作日进行接口开发,不同服务商的接口协议差异导致系统稳定性差,物流轨迹数据分散在各平台难以整合分析。快递鸟快递查询 API 通过标准化接口架构,创新性地实现了 2700 + 国内外快递服务商的一键接入,将传统模式下的周级开发周期压缩至小时级,彻底重构了物流数据对接的技术范式。
774 0
|
人工智能 API
阿里云百炼API-KEY在哪查询?如何获取阿里云AI百炼大模型的API-KEY?
阿里云百炼是阿里云推出的AI大模型平台,用户可通过其管理控制台获取API-KEY。需先开通百炼平台及大模型服务,即可创建并复制API-KEY。目前平台提供千万tokens免费额度,详细操作流程可参考官方指引。
|
JSON 监控 API
Minecraft(我的世界)服务器信息查询免费API接口详解
本文介绍接口盒子提供的免费Minecraft服务器查询API,涵盖参数说明、返回解析及PHP/Python调用示例,助您快速集成服务器监控功能。
1115 1
|
JSON API 定位技术
公交线路站点查询API接口详解:免费获取全国公交路线数据
公交线路站点查询API提供全国公交数据,支持线路编号查询路线、站点、票价及运营时间。具备GET/POST请求方式,免费调用,适用于公交App、智慧交通及地图导航等场景。
1878 4
|
JSON 前端开发 API
汽车配件:使用VIN码查询API精准匹配车型配件,提升用户信任
VIN码是汽车的唯一“身份证”,通过API可精准解析车型信息,实现配件99.5%以上匹配度。本文详解VIN码API的工作流程、技术实现与信任提升价值,助力汽配销售从经验判断迈向数据驱动,降低退货率,提升用户体验与复购。
1324 0
|
JSON 监控 API
淘宝/天猫:使用订单查询API实时追踪包裹状态,自动推送物流通知至用户
在淘宝/天猫平台,通过集成订单查询API实现物流状态实时监控,结合定时轮询与自动推送通知功能,可有效减少用户频繁刷新页面,提升购物体验。本文详解API调用原理、状态判断及Python代码实现,助力开发者构建高效、智能的物流通知系统。
1384 0