<< Click to Display Table of Contents >> Интеграция с внешними системами > Примеры настройки интеграции Как синхронизировать оргструктуру |
Ситуация
Предположим, оргструктура компании настраивается во внешней системе. Дополнительно данные дублируются в Directum RX. После обновления оргструктуры необходимо синхронизировать данные во внешней системе и в Directum RX.
Важно. Синхронизацию данных рекомендуется выполнять в нерабочее время.
Решение
В Directum RX сведения о структурных частях компании хранятся в справочнике «Подразделения», а о сотрудниках – в справочнике «Сотрудники». Записи покинувших компанию сотрудников нужно закрыть. Перед тем, как добавить в справочник нового сотрудника, нужно найти его запись в справочнике «Персоны» или создать новую.
Чтобы обновить записи справочника Подразделения:
1.В среде разработки с установленной библиотекой Simple.OData.Client создайте приложение, например консольное. В коде задайте URL запроса, аутентификационные данные и обязательные заголовки. Подробнее см. раздел «Разработка консольного приложения для интеграции».
2.Получите список всех записей из справочника Подразделения. Для этого отправьте GET-запрос к справочнику. Пример кода для создания запроса:
// Получение всех записей справочника «Подразделения».
var getAllDepartments = await odataClient.For("IDepartments")
.FindEntriesAsync();
3.Из внешней системы получите актуальный список подразделений и сравните со списком записей из Directum RX, включая свойства. В результате получится список подразделений, информацию о которых нужно обновить или добавить в Directum RX.
4.Обновите записи в справочнике Подразделения. Это удобнее делать с помощью пакетного запроса. Для создания записей отправьте POST-запросы, а для обновления – PATCH-запросы.
Пример кода для создания пакетного запроса, в котором для нашей организации «ТехноСистемы, OOO» создается подразделение «Креативный отдел», а в записи справочника с идентификатором 11 меняется руководитель:
// Создание пакетного запроса.
var odataBatchRequest = new ODataBatch(odataClientSettings);
// Получение идентификатора нашей организации "ТехноСистемы, OOO". Для
// упрощения считаем, что в ответе сервиса интеграции будет список с одним
// соответствием.
var ourOrganizaion = await odataClient.For("IBusinessUnits")
.Filter("Name eq 'ТехноСистемы, OOO'")
.FindEntriesAsync();
var ourOrganizaionId = ourOrganizaion.First()["Id"];
// Создание записи справочника "Подразделения" для нашей организации "ТехноСистемы, OOO".
odataBatchRequest += async odataClient => await odataClient.For("IDepartments")
.Set(new { Name = "Креативный отдел", BusinessUnit = new { Id = ourOrganizaionId } })
.InsertEntryAsync();
// Поиск нового руководителя по имени. Для упрощения считаем, что в ответе
// сервиса интеграции будет список с одним соответствием.
var person = await odataClient.For("IEmployees")
.Expand("Person")
.Filter("contains(Person/Name, 'Маркина Алена Лукинична')")
.FindEntriesAsync();
var personId = person.First()["Id"];
// Обновление свойства Руководитель в записи справочника с идентификатором 11.
odataBatchRequest += async odataClient => await odataClient.For("IDepartments").Key(11)
.Set(new { Manager = personId })
.InsertEntryAsync();
// Выполнение пакетного запроса.
await odataBatchRequest.ExecuteAsync();
5.Запустите приложение.
Работа с другими справочниками, например со справочником Сотрудники, выполняется аналогично.
Чтобы закрыть записи покинувших компанию сотрудников:
1.В среде разработки с установленной библиотекой Simple.OData.Client создайте приложение, например консольное. В коде задайте URL запроса, аутентификационные данные и обязательные заголовки.
2.Получите список всех записей из справочника Сотрудники. Чтобы определить, какие записи нужно закрыть, для каждой из них достаточно получить значения свойства Состояние и свойств, которые помогут идентифицировать сотрудника при сравнении с данными из внешней системы. Например, это могут быть идентификаторы записей. Для этого отправьте GET-запрос с параметром Select.
Пример кода для создания запроса:
// Получение всех записей справочника «Сотрудники» с указанными свойствами.
var getAllEmployees = await odataClient.For("IEmployees")
.Select("Id", "Status")
.FindEntriesAsync();
3.Из внешней системы получите актуальный список работающих в компании сотрудников. Сравните его со списком записей из Directum RX по полученным свойствам. В результате получится список записей справочника Сотрудники, которые нужно закрыть.
4.Закройте записи. Это удобнее делать с помощью пакетного запроса. Отправьте в нем PATCH-запросы, в теле которых для найденных записей измените значение поля Состояние на Закрытая.
Пример кода для создания запроса, который закрывает записи с идентификаторами 999 и 1456:
// Создание пакетного запроса.
var odataBatchRequest = new ODataBatch(odataClientSettings);
// Обновление свойства Состояние в записи справочника с идентификатором 999.
odataBatchRequest += async odataClient => await odataClient.For("IEmployees").Key(999)
.Set(new { Status = "Closed" })
.InsertEntryAsync();
// Обновление свойства Состояние в записи справочника с идентификатором 1456.
odataBatchRequest += async odataClient => await odataClient.For("IEmployees").Key(1456)
.Set(new { Status = "Closed" })
.InsertEntryAsync();
// Выполнение пакетного запроса.
await odataBatchRequest.ExecuteAsync();
5.Запустите приложение.
Чтобы добавить записи для новых сотрудников:
1.В среде разработки с установленной библиотекой Simple.OData.Client создайте приложение, например консольное. В коде задайте URL запроса, аутентификационные данные и обязательные заголовки.
2.Получите список всех записей из справочников Сотрудники и Персоны. Для этого отправьте GET-запрос к справочнику. Пример кода для создания запросов:
// Получение всех записей справочника «Сотрудники».
var getAllEmployees = await odataClient.For("IEmployees")
.FindEntriesAsync();
// Получение всех записей справочника "Персоны".
var getAllPersons = await odataClient.For("IPersons")
.FindEntriesAsync();
3.Из внешней системы получите актуальный список сотрудников. Сравните его со списками записей из Directum RX. В результате получится список записей, информацию о которых нужно добавить в Directum RX.
4.Создайте записи для новых сотрудников. Для этого создайте записи в справочнике Сотрудники и обязательные связанные записи в справочнике Персоны. Это удобнее делать с помощью пакетного запроса. Для создания записей отправьте POST-запросы, попарно объединенные в наборы изменений.
Пример кода для создания запроса:
// Создание пакетного запроса.
var odataBatchRequest = new ODataBatch(odataClientSettings);
// Создание переменной postRequestsResult для сохранения ответов сервиса интеграции.
object postRequestsResult;
// Получение идентификатора записи отдела маркетинга. Для упрощения считаем,
// что в ответе сервиса интеграции будет список с одним соответствием.
var marketingDepartment = await odataClient.For("IDepartments")
.Filter("Name eq 'Отдел маркетинга")
.FindEntriesAsync();
var marketingDepartmentId = marketingDepartment.First()["Id"];
// Создание связанной записи справочника "Персоны" для первого сотрудника.
odataBatchRequest += async odataClient => postRequestsResult = await odataClient.For("IPersons")
.Set(new { Id = -1, LastName = "Иванова", FirstName = "Иванка", MiddleName = "Ивановна" })
.InsertEntryAsync();
// Создание записи справочника "Сотрудники" для первого сотрудника.
odataBatchRequest += async odataClient => postRequestsResult = await odataClient.For("IEmployees")
.Set(new { Department = marketingDepartmentId, Email = "Ivanova_II@companymail.ru", Persona = new { Id = -1 })
.InsertEntryAsync();
// Создание связанной записи справочника "Персоны" для второго сотрудника.
odataBatchRequest += async odataClient => postRequestsResult = await odataClient.For("IPersons")
.Set(new { Id = -2, LastName = "Сидоров", FirstName = "Владислав", MiddleName = "Вадимович" })
.InsertEntryAsync();
// Создание записи справочника "Сотрудники" для второго сотрудника.
odataBatchRequest += async odataClient => postRequestsResult = await odataClient.For("IEmployees")
.Set(new { Department = marketingDepartmentId, Email = "Sidorov_VV@companymail.ru", Persona = new { Id = -2 })
.InsertEntryAsync();
...
// Выполнение пакетного запроса.
await odataBatchRequest.ExecuteAsync();
5.Запустите приложение.
Примечание. Все три операции оптимально выполнять в рамках одного приложения. В примере они рассмотрены отдельно для лучшего понимания.
В результате данные из внешней системы и записи справочников Персоны и Сотрудники синхронизируются. В Directum RX добавится информация о новых и уволившихся сотрудниках, а также об изменениях в структуре компании.
© Компания Directum, 2024 |