跳轉到

UserSet

在組織中有著許多物件,例如人員(employee)、部門(department)、職務(job function)、職稱(job title)、主管...等,在各種的需求情況下,可能會需要一個集合來同時代表這些物件。

例如,我希望設定 採購單 的申請權限為

  1. 部門: 採購部門
  2. 人員: Mark 特助
  3. 職稱: 所有的經理

該如何同時用一個物件,就可以代表各種組合情況呢? UserSet 物件就是為此目的而存在

結構

UserSet 結構通常是一個集合組成,集合中每個項目代表一個 選項,而每個選項包含一個 ItemType 屬性,表示此項目的內容類型。

例如,如果要用 UserSet 來表示 採購單 的申請權限:

  1. 部門: 採購部門
  2. 人員: Mark 特助
  3. 職稱: 所有的經理

其結構會如下

📜 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 通常會以集合方式出現,例如一個讀者權限會以下列方式呈現:

public List<UserSetItem> Readers { get; set; }

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 項目內容為:

{
    "ItemType": "Employee",
    "Employee ": {
        "UserType": "Account",
        "UserCode": "Mark",
    }
}

自己建立 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

var item = UserSetItem.CreateJobTitleItem("職稱代碼")

4. 建立職務項目 JobFunction

var item = UserSetItem.CreateJobFuncItem("職務代碼")

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)

8. 建立部門內人員項目 DeptEmployee

var user = new UserModel(){
    UserType = UserType.Account,
    UserCode = "員工帳號"
};
var item = UserSetItem.CreateDeptEmployeeItem("部門代碼", user)