UserSet
在組織中有著許多物件,例如人員(employee)、部門(department)、職務(job function)、職稱(job title)、主管...等,在各種的需求情況下,可能會需要一個集合來同時代表這些物件。
例如,我希望設定 採購單 的申請權限為
- 部門: 採購部門
- 人員: Mark 特助
- 職稱: 所有的經理
該如何同時用一個物件,就可以代表各種組合情況呢? UserSet 物件就是為此目的而存在
結構¶
UserSet 結構通常是一個集合組成,集合中每個項目代表一個 選項,而每個選項包含一個 ItemType
屬性,表示此項目的內容類型。
例如,如果要用 UserSet 來表示 採購單 的申請權限:
- 部門: 採購部門
- 人員: Mark 特助
- 職稱: 所有的經理
其結構會如下
📜 UserSet (採購單申請權限集合)
| └─ ▪︎ 項目一
| └─ ItemType: 部門
| └─ 🏷️ 部門: 採購
| └─ ▪︎ 項目二
| └─ ItemType: 人員
| └─ 👬 員工: Mark
| └─ ▪︎ 項目三
| └─ ItemType: 職稱
| └─ 📛 職稱: 經理
透過 ItemType
定義每個項目類型後,在其內容各自存放對應的屬性值,例如 ItemType
為部門,則 部門
屬性值則填入 採購
,依此類推,則可以將各自不同性質的權限項目,放在同一個集合中。
類型 ItemType¶
不同的使用情境下,每個項目可能會有不同的性質 (例如: 部門、人員、職稱...等),甚至會有組合式的性質,例如: 部門 + 職稱、部門 + 員工...等,我們將其歸納為 8 種類型:
Type | 代號 | 說明 |
---|---|---|
Employee | 0 | 員工,不指定部門 (一個員工可能身兼多部門) |
Department | 1 | 部門 |
JobTitle | 2 | 職稱 |
JobFunction | 3 | 職務 |
DeptJobTitle | 4 | 部門 + 職稱 |
DeptJobFunc | 5 | 部門 + 職務 |
DeptSupervisor | 6 | 部門主管 |
DeptEmployee | 7 | 部門 + 員工,指定部門內的員工 |
在 SDK 中我們建立了一個 enum
(UserSetItemType),來表示這 8 種類型:
public enum UserSetItemType
{
/// <summary>
/// 員工,不指定部門,即不管此員工身兼多部門都會列出來
/// </summary>
Employee = 0,
/// <summary>
/// 部門
/// </summary>
Department = 1,
/// <summary>
/// 職稱
/// </summary>
JobTitle = 2,
/// <summary>
/// 職務
/// </summary>
JobFunction = 3,
/// <summary>
/// 部門 + 職稱
/// </summary>
DeptJobTitle = 4,
/// <summary>
/// 部門 + 職務
/// </summary>
DeptJobFunc = 5,
/// <summary>
/// 部門主管
/// </summary>
DeptSupervisor = 6,
/// <summary>
/// 指定部門內的人員
/// </summary>
DeptEmployee = 7,
}
在程式中使用 UserSet¶
如前述 UserSet
通常會以集合方式出現,例如一個讀者權限會以下列方式呈現:
UserSetItem 物件¶
而其 UserSetItem
物件屬性如下,除選擇類型 ItemType
一定會有值外,其餘屬性則依照 選擇類型 放入對應的 value,如沒用到的屬性則會是 null
。
public class UserSetItem
{
/// <summary>
/// 選擇類型
/// </summary>
public UserSetItemType ItemType { get; set; }
/// <summary>
/// 員工
/// </summary>
public UserSetEmplItem Employee { get; set; }
/// <summary>
/// 部門
/// </summary>
public UserSetDeptItem Dept { get; set; }
/// <summary>
/// 職稱代碼
/// </summary>
public string JobTitleCode { get; set; }
/// <summary>
/// 職務代碼
/// </summary>
public string JobFuncCode { get; set; }
}
public class UserSetEmplItem
{
/// <summary>
/// 使用者類型。
/// </summary>
public UserType UserType { get; set; }
/// <summary>
/// 使用者代碼。
/// </summary>
public string UserCode { get; set; }
}
public class UserSetDeptItem
{
/// <summary>
/// 部門代碼
/// </summary>
public string Code { get; set; }
/// <summary>
/// 是否包含子部門
/// </summary>
public bool ContainsChildren { get; set; }
}
public enum UserType
{
/// <summary>
/// 帳號
/// </summary>
Account = 0,
/// <summary>
/// 員編
/// </summary>
EmployeeNo = 1
}
舉例來說,項目類型為: 員工,員工帳號是 Mark,其 UserSetItem
項目內容為:
自己建立 UserSetItem 物件¶
如果要在現有的 讀者權限 UserSet
集合中,新增一個權限項目,可以怎麼做呢?
SDK 提供對應 ItemType
類型的 8 種 UserSetItem
static 建立方式,建議透過下列這些方法來建立 UserSetItem
,避免資料輸入錯誤的情況。
1. 建立員工項目 Employee¶
var user = UserModel.Create(UserType.Account, "員工帳號");
var item = UserSetItem.CreateEmployeeItem(user)
UserModel
使用說明可以參考 使用者物件章節
2. 建立部門項目 Department¶
部門是樹狀結構,因此必須指定是否包含子部門
var containsChildren = true; // 是否包含子部門
var item = UserSetItem.CreateDepartmentItem("部門代碼", containsChildren)
3. 建立職稱項目 JobTitle¶
4. 建立職務項目 JobFunction¶
5. 建立部門+職稱項目 DeptJobTitle¶
var containsChildren = true; // 是否包含子部門
var item = UserSetItem.CreateDeptJobTitleItem("部門代碼", containsChildren, "職稱代碼")
6. 建立部門+職務項目 DeptJobFunc¶
var containsChildren = true; // 是否包含子部門
var item = UserSetItem.CreateDeptJobFuncItem("部門代碼", containsChildren, "職務代碼")
7. 建立部門主管項目 DeptSupervisor¶
var containsChildren = true; // 是否包含子部門
var item = UserSetItem.CreateDeptSupervisorItem("部門代碼", containsChildren)