Activiti 和候选组
Activiti and candidate groups
在 APS 1.8.1 中,我定义了一个流程,其中每个任务都有一个候选组。
当我使用属于候选组的用户登录时,我看不到流程实例。
我发现当我尝试访问流程实例时,APS 在数据库中执行以下查询:
select distinct RES.* , DEF.KEY_ as PROC_DEF_KEY_, DEF.NAME_ as PROC_DEF_NAME_, DEF.VERSION_ as PROC_DEF_VERSION_, DEF.DEPLOYMENT_ID_ as DEPLOYMENT_ID_
from ACT_HI_PROCINST RES
left outer join ACT_RE_PROCDEF DEF on RES.PROC_DEF_ID_ = DEF.ID_
left join ACT_HI_IDENTITYLINK I_OR0 on I_OR0.PROC_INST_ID_ = RES.ID_
WHERE RES.TENANT_ID_ = 'tenant_1'
and
( (
exists(select LINK.USER_ID_ from ACT_HI_IDENTITYLINK LINK where USER_ID_ = '1003' and LINK.PROC_INST_ID_ = RES.ID_)
)
or (
I_OR0.TYPE_ = 'participant'
and
I_OR0.GROUP_ID_ IN ('1','2','2023','2013','2024','2009','2025','2026','2027','2028','2029','2007','2018','2020','2017','2015','2012','2003','2021','2019','2004','2002','2005','2030','2031','2032','2011','2006','2008','2014','2010','2016','2022','2033','2034','2035','2036','2037','1003')
) )
order by RES.START_TIME_ desc
LIMIT 50 OFFSET 0
此查询没有 return 任何记录,原因有二:
- 在我的 ACT_HI_IDENTITYLINK 中,没有任务同时设置 group_id_ 和 proc_inst_id_。
记录的类型是"candidate"但是查询正在寻找"participant"
select * fro m ACT_HI_IDENTITYLINK;
-[ RECORD 1 ]-+----------
id_ | 260228
group_id_ |
type_ | starter
user_id_ | 1002
task_id_ |
proc_inst_id_ | 260226
-[ RECORD 2 ]-+----------
id_ | 260294
group_id_ | 2006
type_ | candidate
user_id_ |
task_id_ | 260293
proc_inst_id_ |
-[ RECORD 3 ]-+----------
id_ | 260300
group_id_ | 2009
type_ | candidate
user_id_ |
task_id_ | 260299
proc_inst_id_ |
-[ RECORD 4 ]-+----------
id_ | 262503
group_id_ |
type_ | starter
user_id_ | 1002
task_id_ |
proc_inst_id_ | 262501
-[ RECORD 5 ]-+----------
id_ | 262569
group_id_ | 2016
type_ | candidate
user_id_ |
task_id_ | 262568
proc_inst_id_ |
-[ RECORD 6 ]-+----------
id_ | 262575
group_id_ | 2027
type_ | candidate
user_id_ |
task_id_ | 262574
proc_inst_id_ |
为什么查询只查找 "participant",为什么 type_ = 'candidate' 的记录没有任何 proc_inst_id_ 集?
更新:
约束 "participant" 的问题有一个简单的解决方法:添加与参与者相同的候选组就足够了。
另见 Feature allowing "Participant" configuration in BPM Modeler
不幸的是,这还不足以解决第二个问题。该记录仍未 return 编辑,因为未设置列 proc_inst_id_。
我尝试手动更新 "participant" 记录上的列,并且我已经验证这样做可以访问该页面并且运行良好。
有谁知道为什么没有设置列?
首先尝试检查您的工作流程是否真的通过访问 "workflow I have started" 启动。如果没有,您应该会在 "active task" 中看到您的任务,这意味着您的定义存在一些错误。如果一切正常,请检查您的组名,不要忘记添加 "GROUP_"myGRPName。
如果您想查看工作流实例,使用 Web 脚本和服务会更简单。
一种可能的解决方案(或解决方法,直到 ACTIVITI-696 得到修复)是将每个作为候选添加到任务中的组添加为流程实例的参与者。
有一个 REST API 可以做到这一点:
POST /enterprise/process-instances/{processInstanceId}/identitylinks
这个 API 所做的应该由任务侦听器完成,该侦听器将自动添加已创建任务的候选组作为流程实例的参与者。
要添加新身份 link,请在侦听器中使用以下行:
ActivitiEntityEvent aee = (ActivitiEntityEvent)activitiEvent;
TaskEntity taskEntity = (TaskEntity)aee.getEntity();
List<IdentityLinkEntity> identities = taskEntity.getIdentityLinks();
if (identities != null) {
for (IdentityLinkEntity identityLinkEntity : identities) {
String groupId = identityLinkEntity.getGroupId();
runtimeService.addGroupIdentityLink(activitiEvent.getProcessInstanceId(), groupId, "participant");
};
}
在 APS 1.8.1 中,我定义了一个流程,其中每个任务都有一个候选组。
当我使用属于候选组的用户登录时,我看不到流程实例。
我发现当我尝试访问流程实例时,APS 在数据库中执行以下查询:
select distinct RES.* , DEF.KEY_ as PROC_DEF_KEY_, DEF.NAME_ as PROC_DEF_NAME_, DEF.VERSION_ as PROC_DEF_VERSION_, DEF.DEPLOYMENT_ID_ as DEPLOYMENT_ID_
from ACT_HI_PROCINST RES
left outer join ACT_RE_PROCDEF DEF on RES.PROC_DEF_ID_ = DEF.ID_
left join ACT_HI_IDENTITYLINK I_OR0 on I_OR0.PROC_INST_ID_ = RES.ID_
WHERE RES.TENANT_ID_ = 'tenant_1'
and
( (
exists(select LINK.USER_ID_ from ACT_HI_IDENTITYLINK LINK where USER_ID_ = '1003' and LINK.PROC_INST_ID_ = RES.ID_)
)
or (
I_OR0.TYPE_ = 'participant'
and
I_OR0.GROUP_ID_ IN ('1','2','2023','2013','2024','2009','2025','2026','2027','2028','2029','2007','2018','2020','2017','2015','2012','2003','2021','2019','2004','2002','2005','2030','2031','2032','2011','2006','2008','2014','2010','2016','2022','2033','2034','2035','2036','2037','1003')
) )
order by RES.START_TIME_ desc
LIMIT 50 OFFSET 0
此查询没有 return 任何记录,原因有二:
- 在我的 ACT_HI_IDENTITYLINK 中,没有任务同时设置 group_id_ 和 proc_inst_id_。
记录的类型是"candidate"但是查询正在寻找"participant"
select * fro m ACT_HI_IDENTITYLINK; -[ RECORD 1 ]-+---------- id_ | 260228 group_id_ | type_ | starter user_id_ | 1002 task_id_ | proc_inst_id_ | 260226 -[ RECORD 2 ]-+---------- id_ | 260294 group_id_ | 2006 type_ | candidate user_id_ | task_id_ | 260293 proc_inst_id_ | -[ RECORD 3 ]-+---------- id_ | 260300 group_id_ | 2009 type_ | candidate user_id_ | task_id_ | 260299 proc_inst_id_ | -[ RECORD 4 ]-+---------- id_ | 262503 group_id_ | type_ | starter user_id_ | 1002 task_id_ | proc_inst_id_ | 262501 -[ RECORD 5 ]-+---------- id_ | 262569 group_id_ | 2016 type_ | candidate user_id_ | task_id_ | 262568 proc_inst_id_ | -[ RECORD 6 ]-+---------- id_ | 262575 group_id_ | 2027 type_ | candidate user_id_ | task_id_ | 262574 proc_inst_id_ |
为什么查询只查找 "participant",为什么 type_ = 'candidate' 的记录没有任何 proc_inst_id_ 集?
更新: 约束 "participant" 的问题有一个简单的解决方法:添加与参与者相同的候选组就足够了。 另见 Feature allowing "Participant" configuration in BPM Modeler
不幸的是,这还不足以解决第二个问题。该记录仍未 return 编辑,因为未设置列 proc_inst_id_。
我尝试手动更新 "participant" 记录上的列,并且我已经验证这样做可以访问该页面并且运行良好。
有谁知道为什么没有设置列?
首先尝试检查您的工作流程是否真的通过访问 "workflow I have started" 启动。如果没有,您应该会在 "active task" 中看到您的任务,这意味着您的定义存在一些错误。如果一切正常,请检查您的组名,不要忘记添加 "GROUP_"myGRPName。 如果您想查看工作流实例,使用 Web 脚本和服务会更简单。
一种可能的解决方案(或解决方法,直到 ACTIVITI-696 得到修复)是将每个作为候选添加到任务中的组添加为流程实例的参与者。
有一个 REST API 可以做到这一点:
POST /enterprise/process-instances/{processInstanceId}/identitylinks
这个 API 所做的应该由任务侦听器完成,该侦听器将自动添加已创建任务的候选组作为流程实例的参与者。
要添加新身份 link,请在侦听器中使用以下行:
ActivitiEntityEvent aee = (ActivitiEntityEvent)activitiEvent;
TaskEntity taskEntity = (TaskEntity)aee.getEntity();
List<IdentityLinkEntity> identities = taskEntity.getIdentityLinks();
if (identities != null) {
for (IdentityLinkEntity identityLinkEntity : identities) {
String groupId = identityLinkEntity.getGroupId();
runtimeService.addGroupIdentityLink(activitiEvent.getProcessInstanceId(), groupId, "participant");
};
}