Определение непосредственного руководителя в сценарии
Пример сценария с использованием PublicAPI
Сценарий записывает всех начальников пользователя в контекстную переменную context.Nachaljniki (не только начальника отдела, но и выше по оргструктуре).
Контекстные переменные:
-
context.Ispolnitelj – переменная типа Пользователь;
-
context.Nachaljniki – переменная типа Пользователь, тип связи – Список.
Пространство имен:
Текст сценария:
foreach (var chief in PublicAPI.Portal.Security.OrganizationItem.GetChiefByUser(context.Ispolnitelj)) { context.Nachaljniki.Add(chief); }
Методы для получения руководителя
GetChiefByUser
С помощью этого метода можно получить всех начальников пользователя в виде списка, сформированного согласно нумерации идентификаторов записей в базе данных. При вызове метода First() будет выбрана запись с наименьшим Id из сформированного списка, которая не всегда соответствует непосредственному руководителю пользователя.
GetUserChiefsHierarchy
На выходе этого метода получим тип HierarchyChiefDisplayModel, внутри которого dictionary<IOrganizationItem, IEnumerable<HierarchyChiefModel>:
-
key — должность исходного пользователя;
-
value — список родительских должностей;
-
HierarchyChiefModel — модель родителя, содержит следующие свойства:
-
Lvl— уровень родителя (0 у исходного);
-
OrgItem — должность;
-
OrgItemId — Id должности;
-
StartItem — дочерняя должность;
-
StartItemId — Id дочерней должности;
-
User — пользователь на должности;
-
UserId — Id пользователя на должности.
-
Пример
Если для оргструктуры Директор (User 4) — Должность 3 (User 3) — Должность 2 (User 2) — Должность 1 (User 1) вызвать метод GetUserChiefsHierarchy, подставляя User 1, на выходе получится следующее:
Key будет содержать Должность 1, value будет содержать 3 элемента:
Должность 2:
Lvl | 1 |
OrgItem | Должность 2 |
OrgItemId | Id Должности 2 |
StartItem | Должность 1 |
StartItemId | Id Должности 1 |
User | User 2 |
UserId | Id User 2 |
Должность 3:
Lvl | 2 |
OrgItem | Должность 3 |
OrgItemId | Id Должности 3 |
StartItem | Должность 2 |
StartItemId | Id Должности 2 |
User | User 3 |
UserId | Id User 3 |
Директор:
Lvl | 3 |
OrgItem | Директор |
OrgItemId | Id Директора |
StartItem | Должность 3 |
StartItemId | Id Должности 3 |
User | User 4 |
UserId | Id User 4 |
GetOrgItemsHierarchy(IOrganizationItem startItem)
Этот метод позволяет получить список элементов оргструктуры (например, должности начальников пользователя (IEnumerable<IOrganizationItem>) в иерархическом в порядке: Должность 2 — Должность 3 — Директор), стартовый элемент из содержащихся в HierarchyChiefDisplayModel.Items.
GetUsersHierarchy(IOrganizationItem startItem)
Этот метод позволяет получить список начальников пользователя (IEnumerable<Models.IUser>) в виде иерархии (User 2 — User 3 — User 4), стартовый элемент из содержащихся в HierarchyChiefDisplayModel.Items.
В качестве аргумента укажите должность пользователя, по отношению к которой вы строите иерархию начальников:
var chiefs = model.GetUsersHierarchy(context.Iniciator.OrganizationItems.FirstOrDefault());
Метод OrganizationItemSecurityApi
GetChiefByUser(Models.IUser user) — аналогично GetUsersHierarchy(IOrganizationItem startItem), но пользователь любой.
Пример сценария без использования PublicAPI
В сценарии использованы контекстные переменные:
- context.Ispolnitelj – переменная Исполнитель, тип Пользователь;
- context.Nachaljnik – переменная Начальник, тип Пользователь.
Текст сценария:
var chiefs = context.Ispolnitelj.OrganizationItems.ToArray ().Union (context.Ispolnitelj.OrganizationGroups).Select (organizationItem => {
var parentOrganizationItem = organizationItem.ParentItem;
while (parentOrganizationItem != null && parentOrganizationItem.User == null)
parentOrganizationItem = parentOrganizationItem.ParentItem;
return parentOrganizationItem != null ? parentOrganizationItem.User : null;
}).Where (u => u != null);
if(!chiefs.Any()) //Если не найдено ни одного элемента организационной структуры (высшее звено)
context.Nachaljnik = context.Ispolnitelj; //Начальник инициатора - сам инициатор
else //Стандартная ветка
{
var chief = chiefs.First ();
context.Nachaljnik = chief;
}