根据用户ID,查询该用户的待办事项,包括前一环节直接指定的情况,包括定义流程时定义的处理人的情况,包括根据角色或者组确定该用户可以处理的情况。
经过分析Activiti的数据库表,我们发现并不复杂,和待办事项有关系的表,包括ACT_RU_TASK、ACT_RU_IDENTITYLINK,ACT_RU_TASK中存储了任务相关信息,ACT_RU_IDENTITYLINK中存储了候选组和候选人信息。
在Activiti中,对于一个节点,可分为受托人,候选人和候选组三种情况,后两种可以设置多个,用逗号分隔,对应到数据库中,会被拆分为ACT_RU_IDENTITYLINK的多条记录。
基于以上,使用以下sql可查询获得所有待办事项:
SELECT A.ID_ AS TASK_ID,
A.PROC_INST_ID_ PROC_INST_ID,
A.TASK_DEF_KEY_ AS ACT_ID,
A.NAME_ AS ACT_NAME,
A.ASSIGNEE_ AS ASSIGNEE,
A.DELEGATION_ AS DELEGATION_ID,
A.DESCRIPTION_ AS DESCRIPTION,
A.CREATE_TIME_ AS CREATE_TIME,
A.DUE_DATE_ AS DUE_DATE,
-- date_format(A.CREATE_TIME_, 'YYYY-MM-DD HH24:MI:SS') AS CREATE_TIME,
-- date_format(A.DUE_DATE_,'YYYY-MM-DD HH24:MI:SS') AS DUE_DATE,
I.USER_ID AS CANDIDATE
FROM ACT_RU_TASK A
LEFT JOIN (SELECT DISTINCT * FROM
(SELECT I.TASK_ID_, I.USER_ID_ as USER_ID
FROM ACT_RU_IDENTITYLINK I, ACT_RU_TASK T
WHERE TASK_ID_ IS NOT NULL
AND USER_ID_ IS NOT NULL
AND I.TASK_ID_ = T.ID_
AND T.ASSIGNEE_ IS NULL
AND TYPE_ = 'candidate'
UNION
SELECT TASK_ID_, R.USER_ID_ as USER_ID
FROM ACT_RU_IDENTITYLINK I,act_id_membership R,ACT_RU_TASK T
WHERE I.TASK_ID_ IS NOT NULL
AND I.GROUP_ID_ IS NOT NULL
AND I.TASK_ID_ = T.ID_
AND T.ASSIGNEE_ IS NULL
AND I.TYPE_ = 'candidate'
AND I.GROUP_ID_ = R.GROUP_ID_)U) I -- 候选组和业务上的角色用户表关联
ON A.ID_ = I.TASK_ID_
根据以上sql,直接定义为视图也好,或者将查询数据放入某张表中已好,之后查询某用户的待办事项时,就可查询,比如定义为视图view_todotask;
SELECT
*
FROM
view_todotask WHERE
ASSIGNEE = :userId
OR
CANDIDATE = :userId
该查询可获得任务的相关信息,比如流程实例,任务实例等。