說說 Activiti 中的用戶與組的概念

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);

某個候選人簽收後,其餘候選人就看不到該任務咯。

相關文章
相關標籤/搜索