1. 程式人生 > 實用技巧 >說說 Activiti 中的使用者與組的概念

說說 Activiti 中的使用者與組的概念

Activiti 中的使用者與組用於界定任務的候選者與辦理者。組可以理解為角色,屬於某個組的使用者,就可以作為某個任務的候選者或者辦理者。

我們還可以通過 Activiti 的 API 來建立、查詢或刪除某個使用者或者某個組。Activiti 還提供了建立關係的 API 用於繫結使用者與組之間的關係。

1 使用者

(1)建立使用者

User user = identityService.newUser(userId);
user.setFirstName("Deniro");
user.setLastName("Lee");
user.setEmail("[email protected]");
identityService.saveUser(user);

首先使用 identityService 的newUser(String userId),建立一個 User 物件;然後設定其相關屬性,最後呼叫saveUser(User user)持久化該使用者。

(2)查詢使用者

identityService.createUserQuery().userId(userId).singleResult()

這裡把 userId 作為查詢條件,查詢出剛剛建立的使用者。UserQuery 類中的方法(比如這裡的 userId 方法)大都支援鏈式操作。鏈式操作指的是這些方法都會返回類物件本身,這樣我們就可以像一根鏈條一樣呼叫這些類方法。

>鏈式程式設計的表現形式為多個方法以 “.” 分割。在呼叫並執行完一個方法之後,該方法返回當前方法的物件例項,這樣可以繼續呼叫返回物件例項的其他方法。鏈式程式設計可以減少臨時變數,而且可以讓程式碼更加優雅,所以在各種框架或元件中經常出現。 Activiti 中所有以 Query 為結尾的類都支援鏈式程式設計。

(3)刪除使用者

identityService.deleteUser(userId);

userId 作為入參,呼叫 deleteUser 方法,就會刪除該使用者。

2 組

在 Activiti 中,組的型別分為 assignment 和 security-role ,前者是普通角色,用於分配業務功能許可權;後者是管理角色,用於管理組織結構與流程。

//新建組物件
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);

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

推薦:網路營銷