铁汉生态建设有限公司网站,上海哪家公司做网站比较好,恺策网优 营销型网站建设品牌服务商,vs2008网站消息弹窗怎么做一.简介
有的时候#xff0c;一个任务节点会存在多个候选人#xff0c;例如#xff1a;张三提交一个任务#xff0c;这个任务即可以由李四处理#xff0c;又可以由王五处理#xff0c;那么针对这种多个任务候选人的情况#xff0c;该如何处理#xff1f;
二.绘制流程…一.简介
有的时候一个任务节点会存在多个候选人例如张三提交一个任务这个任务即可以由李四处理又可以由王五处理那么针对这种多个任务候选人的情况该如何处理
二.绘制流程图
首先我们还是使用之前旧的流程图但是在为 UserTask 设置分配用户的时候我们设置多个用户流程图截图如下
分配图截图如下
设置完成后载这个流程文件该流程对应的XML文件内容如下
process iddemo01 namedemo01 isExecutabletruedocumentationdemo01/documentationstartEvent idstartEvent1 flowable:initiatorINITATOR flowable:formFieldValidationtrue/startEventuserTask idsid-5F901234-AFF1-480E-9D66-2D196B910BA3 flowable:candidateUsersjavaboy,zhangsan,lisi flowable:formFieldValidationtrue/userTasksequenceFlow idsid-71FB3A81-F753-419D-9A0A-2FC6E5361CED sourceRefstartEvent1 targetRefsid-5F901234-AFF1-480E-9D66-2D196B910BA3/sequenceFlowendEvent idsid-D0B9E5BF-8C1A-4F8F-B2C2-F423F5DC556D/endEventsequenceFlow idsid-DEBE03CD-F247-4EF3-BB67-ABBA94739B0A sourceRefsid-5F901234-AFF1-480E-9D66-2D196B910BA3 targetRefsid-D0B9E5BF-8C1A-4F8F-B2C2-F423F5DC556D/sequenceFlow
/process可以看到UserTask 中的 flowable:candidateUsers“javaboy,zhangsan,lisi” 就表示这个 UserTask 由 javaboy、zhangsan 和 lisi 三个用户处理用户名之间用 , 隔开。
三.查询任务处理人
接下来就是部署并启动上面这个流程具体如何部署如何启动看之前的文章。 当流程启动成功之后去查询 javaboy 需要处理的 UserTask代码如下
ListTask list taskService.createTaskQuery().taskAssignee(javaboy).list();
for (Task task : list) {logger.info(id:{}name:{}taskDefinitionKey:{}, task.getId(), task.getName(), task.getTaskDefinitionKey());
}发现这个 SQL 执行完成后查询不到任何数据这个方法最终查询的是数据库中的 ACT_RU_TASK 表查询的 SQL 如下 去检查 ACT_RU_TASK 表以及它的 ASSIGNEE_ 字段截图如下 发现 ACT_RU_TASK 表中记录的 ASSIGNEE_ 字段值为 null。为 null 这个其实也好理解因为这个 UserTask 有多个人可以处理但是只有一个字段没法储存肯定有其他存储方式。
这种有多个候选人的任务应该按照如下方式来查询
Test
void test12() {ListTask list taskService.createTaskQuery().taskCandidateUser(javaboy).list();for (Task task : list) {logger.info(id:{}name:{}taskDefinitionKey:{}, task.getId(), task.getName(), task.getTaskDefinitionKey());}
}这里调用 taskCandidateUser 方法进行处理。那么这个方法查询的是哪张表呢看下上面方法最终执行的 SQL如下
: Preparing: SELECT RES.* from ACT_RU_TASK RES WHERE RES.ASSIGNEE_ is null and exists(select LINK.ID_ from ACT_RU_IDENTITYLINK LINK where LINK.TYPE_ candidate and LINK.TASK_ID_ RES.ID_ and ( LINK.USER_ID_ ? ) ) order by RES.ID_ asc
: Parameters: javaboy(String)
: Total: 1这里的查询涉及到两张表分别是 ACT_RU_TASK 和 ACT_RU_IDENTITYLINK两张表联合查询查出来的来看看 ACT_RU_IDENTITYLINK 表的内容,截图如下 TYPE_ 为 candidate 的就表示这个 Task 的候选人id 为 c5693038-3f42-11ed-b9e2-acde48001122 的 Task 一共有三个候选人两张表联合查询才可以查到这个 UserTask 该由谁来处理。
另外一种常见的需求就是已经知道了要处理的流程实例了但是不知道应该由谁来处理此时通过查询 ACT_RU_IDENTITYLINK 表就可以确定一个流程实例都有哪些参与者代码如下
Test
void test13() {ListProcessInstance list runtimeService.createProcessInstanceQuery().list();for (ProcessInstance pi : list) {ListIdentityLink identityLinksForProcessInstance runtimeService.getIdentityLinksForProcessInstance(pi.getId());for (IdentityLink identityLink : identityLinksForProcessInstance) {logger.info(ProcessInstanceId:{},UserId:{},identityLink.getProcessInstanceId(),identityLink.getUserId());}}
}这个执行的 SQL截图如下 可以看到其实就是通过查询 ACT_RU_IDENTITYLINK 表获取的数据。