在设计流程图的时候,加上候选人,后期的使用中,根据候选人查找对应的任务,领取任务,完成任务,这是比较常见的操作。
之前都没有考虑任务和候选人是如何关联的,也没有思考是否可以在代码中添加候选人。
以下用个小案例说明。
流程设计
只有一个节点,任务中有两个候选人
开启实例
@Transactional
public void startProcess() {
HashMap<String, Object> map = new HashMap<>();
map.put("canditate1","jack");
map.put("canditate2","rose");
runtimeService.startProcessInstanceByKey("addCandidateUser",map);
}
根据候选人查询任务
@Transactional
public void queryCandtask() {
Task task = taskService.createTaskQuery().taskCandidateUser("jack").singleResult();
System.out.println("queryCandtask===>"+task);
}
然后我们发现以下sql机制,其中?用"jack"填充
SELECT DISTINCT
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
原来候选人信息是存在ACT_RU_IDENTITYLINK 表中的:
这就比较清楚任务和候选人的关系了。
代码中灵活添加候选人
这也是可以的,第一个参数是任务ID,第二个是候选人userID
@Transactional
public void addCandidateUser() {
taskService.addCandidateUser("0abb7171-d99a-11ec-a82d-3c9c0f202230","123");
}
然后可以在ACT_RU_IDENTITYLINK中看见添加的记录了。