activiti學習9:給用戶任務分配權限
大部分的業務流程都會有人的參與,用戶任務是最常用的任務,在流程圖中使用userTask元素定義用戶任務。
當流程到達用戶任務時該任務會被分配到特定用戶或者用戶組,這就是給用戶任務分配權限。這個分配權限指的是分配后可以通過activiti提供的任務查詢api根據用戶或者用戶組來查詢到這個任務。
一、使用JUEL表達式分配權限
1.1給用戶任務分配候選人
這是一個含有一個用戶任務的流程圖
一個任務可以設置多個候選人,候選人在業務上指的是有權對該任務進行操作的群體。在流程圖上使用juel表達式分配候選人的方法如下
<userTask id="sid-31845D76-A308-4442-AE19-4AA4238DB39A" name="juel表達式分配候選人" activiti:candidateUsers="${candidateUsers}"></userTask>
這里的candidateUsers是一個流程變量,以list的形式存放了候選人列表。
啟動流程時創建這樣一個流程變量,流程啟動后會在任務表中創建一個用戶任務,該任務的候選人就是流程變量中傳遞的這幾個值,注意任務和候選人的關系存儲在act_ru_identitylink
表中
//使用juel表達式指定候選人
List<String> candidateUsers=new ArrayList<>();
candidateUsers.add("zhangsan");
candidateUsers.add("lisi");
Map<String,Object> variableMap=new HashMap<>();
variableMap.put("candidateUsers",candidateUsers);
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("juel-candidateUser2",variableMap);
System.out.println(processInstance);
權限分配成功后就可以使用activiti提供的任務查詢api來根據候選人查詢任務
List<Task> list = taskService.createTaskQuery().taskCandidateUser("lisi").list();
for (Task task : list) {
System.out.println(task.getName());
}
注意這里流程變量中放的值activiti會當做用戶id來處理,但這個用戶可以不在activiti的用戶表中存在,所以可以用來關聯自己系統中的用戶id
1.2 給用戶任務分配候選組
候選組的概念和候選人類似,用來把一個群體的人指定為一個任務的權限人,對應的是activiti中的用戶組,分配一個用戶組id到某個任務上,可以指定整個組的人為該任務的候選人,在流程圖上指定候選組的方式和指定候選人類似
<userTask id="juel-candidateGroup" name="juel表達式指定候選組" activiti:candidateGroups="${candidateGroup}"></userTask>
這里的candidateGroup也是一個流程變量,其中存放了用戶組id的lsit集合
Map<String,Object> map=new HashMap<>();
List<String> groupList=new ArrayList<>();
groupList.add("項目經理");
groupList.add("測試");
map.put("candidateGroup",groupList);
runtimeService.startProcessInstanceByKey("juel-candidateGroup2",map);
注意這個用戶組在activiti的群組表中可以不存在。
可以使用任務查詢api查詢群組對應的任務
List<Task> list = taskService.createTaskQuery().taskCandidateGroup("項目經理").list();
for (Task task : list) {
System.out.println(task.getName());
}
1.3 給用戶任務分配代理人
和候選人不同,一個用戶任務只允許有一個代理人。為一個任務分配代理人后act_ru_task表的ASSIGNEE_
字段會被設置為響應的值。設置方法和候選人類似,可以在流程文件中用juel表達式配置
<userTask id="sid-9253B2C0-D7CF-49C9-BE00-3B68D87413D4" name="juel表達式分配代理人" activiti:assignee="${assignee}"></userTask>
assignee也是一個流程變量
//使用juel表達式指定代理人
Map<String,Object> map=new HashMap<>();
map.put("assignee","jerry");
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("juel-assignee",map);
System.out.println(processInstance);
同樣的,流程變量assignee中配置的用戶id也可以不在activiti的用戶表中。
根據用戶任務權限查詢api查詢任務
List<Task> list = taskService.createTaskQuery().taskAssignee("jerry").list();
for (Task task : list) {
System.out.println(task.getName());
}
與候選人和候選組不同的是,代理人會被設置到任務表act_ru_task
的ASSIGNEE_
字段中
上面的juel表達式中放置的都是一個流程變量,流程變量中存的是集合或者字符串,實際上也可以在流程變量中存一個JavaBean對象,然后在juel表達式中調用這個對象的方法和或者屬性,調用屬性時需要提供屬性的get方法,並且屬性要是public的,調用方式如下
${authBean.getAssignee}
${authBean.getCandidateUsers}
二、使用任務監聽器給用戶任務分配權限
在activiti中可以通過編寫自定義的任務監聽器,在監聽器中進行任務權限分配。
public class AuthListener implements TaskListener {
@Override
public void notify(DelegateTask delegateTask) {
delegateTask.setAssignee("岳不群");
delegateTask.addCandidateUser("林平之");
delegateTask.addCandidateUser("令狐沖");
delegateTask.addCandidateGroup("華山派");
}
}
自定義任務監聽器要實現TaskListener
接口,在notify方法中進行權限分配,然后在流程圖中配置監聽器
<userTask id="sid-B6160828-7BF0-4936-B172-5EE48E8B12C8" name="使用監聽器分配權限">
<extensionElements>
<activiti:taskListener event="create" class="com.lyy.activiti_listener.AuthListener"> </activiti:taskListener>
</extensionElements>
</userTask>
其中的event=create表示在創建這個用戶任務時執行這個監聽
這種方式比juel表達式要靈活些,如果要修改某個任務的權限人規則,不需要重新部署流程圖,只需要修改任務監聽就可以了。
public void test17(){
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("tasklistener-auth");
System.out.println(processInstance);
}
三、使用taskService的api分配
如果想在任務創建號了以后改變任務的權限人,可以使用taskService提供的api完成
taskService.setAssignee("taskId","userId");
taskService.addCandidateGroup("taskId","groupId");
taskService.addCandidateUser("taskId","userId");
類似的,如果要刪除某個任務的權限人,也可以使用taskService中的api