1. 概述
樹資料集主要是用來構建部門之間的關係,每個部門需要提供一個原始的標記欄位和父標記欄位,後端在同步的時候根據這兩個欄位來建立一種樹狀結構。
但客戶有時在更新設計器版本時,會出現同步樹資料集失敗的情況,主要是因為樹資料集配置錯誤或者本身並不是一個完整的樹狀結構。
下面舉幾種比較完備的樹狀結構,來告訴大家構建樹資料集時需要注意哪些事項。
2. 樹狀結構及注意事項
2.1 樹狀結構(類型一)
2.1.1 資料表
2.1.2 樹資料集
上面是一個就是一個完整的樹資料集,以“部門 ID”為原始標記欄位,“上級 ID”是父標記欄位。
例如:
第二行的意思是“人力資源部”的原始標記為 11,其父部門是標記為 1 的部門(然後可以根據這個標記來查詢它的父部門是總部)。
第一行表示總部的標記是 1,父標記為空,表示它是根部門,沒有父部門,通常如果一個部門沒有父部門,那麼父部門標記為空。
遍歷這個資料集後,能得到所有的部門資訊,職位資訊;根據“上級 ID”,到“部門 ID”這一欄去尋找相應的部門名稱,進而可以構建父部門。
2.1.3 注意事項
需要注意的是:“上級 ID”中出現的標記(除了是空),都必須在“部門ID”中找到對應的標記,可以看到上圖中所有的“上級 ID”都能在“部門 ID”中找到對應的值。
如果出現下圖的這種情況,“上級 ID”為 2,但是在部門 ID中找不到是 2 的部門資訊,這樣就沒辦法構建上級ID為2的部門資訊,這樣就認為樹是不完整的,同步資料集的同步動作直接傳回,不進行同步操作。
那麼在日誌裏面會報如下形式的錯誤:
意思是找不到標記 2 對應的部門!
2.2 樹狀結構(類型二)
2.2.1 資料表
2.2.2 樹資料集
這個以“部門名稱”和“上級名稱”來構建樹,這個所謂的標記欄位只是為了標記部門直接的層級關係,不會參與業務處理。
這其中也要要求“上級名稱”中的標記欄位要能在“部門名稱”中找到對應的部門,如果找不到,則直接跳出,拒絕同步。
2.2.3 注意事項
注意事項同上。“上級名稱”中出現的標記(除了是空),都必須在“部門名稱”中找到對應的標記,否則就認為樹是不完整的,同步資料集的同步動作直接傳回,不進行同步操作。
2.3 樹狀結構(類型三)
2.3.1 資料表
2.3.2 樹資料集
同樣的是使用“部門 ID”和“上級 ID”來做標記,同樣需要保證“上級 ID”列的能在“部門 ID”中能夠找的到,否則也會拒絕同步。
根據“部門ID”和“上級ID”來構建樹。
2.3.3 注意事項
確定樹資料集是正確的充要條件:
a. 父標記欄位中出現的值(除了是空),在原始標記欄位中都能找到對應的值。
b. 原始標記欄位相同的行,其部門名和父標記這兩列也必須相同,如上圖資料表中的最後兩行。
c. 父標記和部門名相同的行,其原始標記列必須相同,如上圖資料表中的最後兩行。
如果出現下圖的這些情況會報錯:
1)報錯資訊如下:
一個確定的部門有兩個父部門,顯然不是樹狀結構。
一旦一個部門的標記相同,就代表這個部門是確定的,那麼這個部門的“上級 ID”和“部門 ID”必須相同。
如下圖中 lyon 和 loy 的部門標記都為 d,但是他們的父部門竟然不相同,顯然是資料錯了,改正過來就行了。
2)報錯資訊如下:
一個標記對應的部門名稱不同也是錯誤的,這樣也會拒絕同步的。
3)報錯資訊如下:
意思就是在父部門確定的情況下,部門名稱是唯一的,那麼部門標記也是唯一的;上圖說明部門標記不唯一。
部門名稱是可以相同的,比如銷售部有個子部門叫效能組,研發部也可以有個子部門叫效能組。
但是當父部門確定的情況下,部門名是不能重複的。
例如:lyon 和 loy 所在的部門都是效能組,且父部門標記都是d,那就表明兩個人在同一個部門,那麼部門標記就應該相同,上圖的兩個員工部門標記不相同,那麼也會報錯,拒絕同步。即在父部門確定的情況下,根據部門名能唯一的確定一個部門。
4)實際情況中還有一種是互為上下級的情況,這種結構或者說資料有時候會在一些實行扁平化管理的公司出現,即A部門是B部門的上級,B部門又是A部門的上級,這樣的兩個部門在組織同步的時候也會失敗,但很少見。
3. 補充說明
原始欄位和父標記欄位中不能出現 0、,0000000 類似的欄位,因為這些標記會被解析成 0,而 0 是程式中的保留欄位,是所有部門的 ID,所以要儘量避免.
在構建樹狀結構的時候,如果一個部門沒有父部門,那麼父部門就空着,不要隨便寫。
另外,在設計器升級之前一定要備份 JAR 包檔案。