Activiti 中的用戶與組用於界定任務的候選者與辦理者。組能夠理解爲角色,屬於某個組的用戶,就能夠做爲某個任務的候選者或者辦理者。編程
咱們還能夠經過 Activiti 的 API 來建立、查詢或刪除某個用戶或者某個組。Activiti 還提供了創建關係的 API 用於綁定用戶與組之間的關係。框架
1 用戶
(1)建立用戶ide
User user = identityService.newUser(userId); user.setFirstName("Deniro"); user.setLastName("Lee"); user.setEmail("xxx@163.com"); identityService.saveUser(user);
首先使用 identityService 的 newUser(String userId)
,建立一個 User 對象;而後設置其相關屬性,最後調用saveUser(User user)
持久化該用戶。3d
(2)查詢用戶code
identityService.createUserQuery().userId(userId).singleResult()
這裏把 userId 做爲查詢條件,查詢出剛剛建立的用戶。UserQuery 類中的方法(好比這裏的 userId 方法)大都支持鏈式操做。鏈式操做指的是這些方法都會返回類對象自己,這樣咱們就能夠像一根鏈條同樣調用這些類方法。對象
>鏈式編程的表現形式爲多個方法以 「.」 分割。在調用並執行完一個方法以後,該方法返回當前方法的對象實例,這樣能夠繼續調用返回對象實例的其餘方法。鏈式編程能夠減小臨時變量,並且可讓代碼更加優雅,因此在各類框架或組件中常常出現。 Activiti 中全部以 Query 爲結尾的類都支持鏈式編程。blog
(3)刪除用戶ip
identityService.deleteUser(userId);
userId 做爲入參,調用 deleteUser 方法,就會刪除該用戶。get
2 組
在 Activiti 中,組的類型分爲 assignment 和 security-role ,前者是普通角色,用於分配業務功能權限;後者是管理角色,用於管理組織結構與流程。it
//新建組對象 Group group = identityService.newGroup(groupId); group.setName("部門領導"); group.setType("assignment"); //保存 identityService.saveGroup(group);
IdentityService 類中也有對應的新建、保存、查詢與刪除組的方法。
3 關係
用戶與組之間的關係是多對多。一個用戶能夠歸屬於多個組;而一個組也能夠包含多個用戶。
//把用戶加到指定組 identityService.createMembership(userId, groupId); //查詢指定組下的用戶 User userInGroup = identityService.createUserQuery().memberOfGroup(groupId).singleResult(); //查詢指定用戶下的組 Group groupContainUser = identityService.createGroupQuery().groupMember(userId).singleResult();
利用 reateMembership(String userId, String groupId)
方法,就能夠創建用戶與組之間的關係。
若是要查詢指定組下的全部用戶,那麼須要先建立 UserQuery 對象,而後調用 memberOfGroup(String groupId)
方法,就會生成查詢全部隸屬於該組下的用戶 SQL。
而要查詢指定用戶下的組,則須要建立 GroupQuery 對象,而後調用 groupMember(String groupMemberUserId)
方法。
4 任務中的用戶與組
這裏的任務指的是 userTask,即須要人辦理的任務。咱們能夠把任務先指定給一個或多個候選人或候選組。這樣,只有這個任務被某我的簽收後,它才能被辦理。
4.1 候選組
能夠在 bpmn 文件中的 userTask 標籤內,經過 activiti:candidateGroups
來指定候選組,形如:
<usertask id="usertask1" name="User Task" activiti:candidategroups="deptLeader"></usertask>
userTask 定義好候選組以後,屬於該候選組的用戶就能夠簽收而後辦理該任務。
Task task = taskService.createTaskQuery().taskCandidateUser(userId).singleResult(); taskService.claim(task.getId(), userId); taskService.complete(task.getId());
若是候選組中存在多個用戶,那麼只有其中的某個用戶簽收了任務,那麼其它用戶就看不到該任務咯:
//屬於候選組的用戶,均可以查詢到該任務 TaskService taskService = getTaskService(); Task task = taskService.createTaskQuery().taskCandidateUser(userId).singleResult(); Assert.assertNotNull(task); Task task2 = taskService.createTaskQuery().taskCandidateUser(otherUserId).singleResult(); Assert.assertNotNull(task2); //deniro 簽收任務 taskService.claim(task.getId(), userId); //簽收後,原候選組中的用戶就看不到剛纔的任務 task2 = taskService.createTaskQuery().taskCandidateUser(otherUserId).singleResult(); Assert.assertNull(task2);
只要任務還未被簽收,候選組內的任意用戶均可以簽收該任務;一旦任務被簽收,候選組內的其餘用戶就沒法查看與簽收該任務咯。
4.2 候選人
也能夠跳過候選組,直接把用戶分配給多個候選人。
首先在 bpmn 文件的 userTask 標籤中,定義 activiti:candidateUsers
,多個候選人以逗號分隔,這裏通常使用 userId。
<usertask id="usertask1" name="User Task" activiti:candidateusers="deniro, jack"></usertask>
定義好後,就能夠在 API 中,讓指定候選人查看並簽收該任務:
//根據用戶ID查詢任務 TaskService taskService = getTaskService(); Task task = taskService.createTaskQuery().taskCandidateUser(userId1).singleResult(); assertNotNull(task); Task task2 = taskService.createTaskQuery().taskCandidateUser(userId2).singleResult(); assertNotNull(task2); //某個候選人簽收 taskService.claim(task.getId(), userId1); //其餘候選人看不到該任務 task2 = taskService.createTaskQuery().taskCandidateUser(userId2).singleResult(); assertNull(task2);
某個候選人簽收後,其餘候選人就看不到該任務咯。