Jbpm4提供兩個接口可以獲取該用戶的待處理任務,
一個是個人的任務:
taskService.findPersonalTasks(userId)
另一個是取得該用戶對應的候選任務:
taskService.findGroupTasks(userId)
有時我們需要在一個列表中顯示該任務的所有任務,包括他的個人任務,候選任務,這時直接用jbpm4提供的api完成不了該功能要求。
於是可以使用以下方式進行擴展:
/**
* 取得用戶的對應的任務列表
* @param userId
* @return
*/
public List<TaskImpl> getTasksByUserId(String userId){
AppUser user=(AppUser)getHibernateTemplate().load(AppUser.class, new Long(userId));
Iterator<AppRole> rolesIt=user.getRoles().iterator();
StringBuffer groupIds=new StringBuffer();
int i=0;
while(rolesIt.hasNext()){
if(i>0)groupIds.append(",");
groupIds.append("'"+rolesIt.next().getRoleId().toString()+"'");
}
/**
* select * from `jbpm4_task` task
left join jbpm4_participation pt on task.`DBID_`=pt.`TASK_`
where task.`ASSIGNEE_`='1' or ( pt.`TYPE_` = 'candidate' and (pt.`USERID_`='1')
or pt.`GROUPID_`in ('1'))
*/
StringBuffer hqlSb=new StringBuffer();
hqlSb.append("select task from org.jbpm.pvm.internal.task.TaskImpl task left join task.participations pt where task.assignee=?");
hqlSb.append(" or (pt.type = 'candidate' and ((pt.userId=?)");
if(user.getRoles().size()>0){
hqlSb.append(" or (pt.groupId in ("+groupIds.toString()+"))");
}
hqlSb.append("))");
hqlSb.append(" order by task.priority desc");
return findByHql(hqlSb.toString(), new Object[]{userId,userId});
}
這樣非常方便可以取得用戶的待處理的任務,對於候選的任務,用戶可以申請執行。