<< Click to Display Table of Contents >> Интеграция с внешними системами > Примеры настройки интеграции Как обновить документ |
Ситуация
Предположим, из внешней системы внесли в Directum RX простой документ с названием «Список детей сотрудников». В дальнейшем его содержимое изменили. Необходимо в Directum RX создать новую версию документа и внести в нее измененные данные.
Решение
1.В среде разработки с установленной библиотекой Simple.OData.Client создайте приложение, например консольное. В коде задайте URL запроса, аутентификационные данные и обязательные заголовки. Подробнее см. раздел «Разработка консольного приложения для интеграции».
2.Перед передачей содержимого документа нужно проверить, что необходимый документ в системе уже создан, и узнать количество его версий. Для этого напишите GET-запрос с функцией фильтрации и получите значение свойства-коллекции Версии (Versions). Пример кода для создания запроса:
// Поиск документа по названию и определение номера для новой версии.
var currentDocument = await odataClient.For("ISimpleDocument")
.Filter("Name eq 'Список детей сотрудников'")
.Expand("Versions")
.FindEntriesAsync();
var currentDocumentId = currentDocument.First()["Id"];
var currentDocumentNewVersionId = currentDocument.First()["Versions"] + 1;
Примечание. Для упрощения считаем, что в ответах сервиса интеграции будет возвращаться список с одним соответствием.
3.При создании версии документа нужно указать идентификатор приложения-обработчика (AssociatedApplications), с помощью которого документ можно редактировать. Для этого напишите GET-запрос с функцией фильтрации. Пример кода для создания запроса, который вернет идентификатор приложения-обработчика для файлов в формате DOC:
// Поиск идентификатора подходящего приложения-обработчика для документа.
var associatedApplication = await odataClient.For("IAssociatedApplications")
.Filter("Extension eq 'doc'")
.FindEntriesAsync();
var associatedApplicationId = associatedApplication.First()["Id"];
4.В найденном документе создайте новую версию. Для этого напишите POST-запрос, в котором для созданного простого документа заполните обязательное свойство Версии. Пример кода для создания запроса:
// Создание версии документа.
var newVersion = await odataClient.For("ISimpleDocuments").Key(currentDocumentId)
.NavigateTo("Versions")
.Set(new { Number = currentDocumentNewVersionId, AssociatedApplication = new { Id = associatedApplicationId } })
.InsertEntryAsync();
5.В созданную версию добавьте содержимое документа. Для этого отправьте POST-запрос, в котором для этой версии заполните обязательное свойство Текст (Body). Передавать документ можно в виде строки байт и потока данных. Пример кода для создания запроса:
Передача строки байт
// Добавление строки, закодированной в Base64, в свойство Body версии
// документа. Для примера взята строка "111111".
await odataClient.For("ISimpleDocuments ").Key(newSimpleDocument["Id"])
.NavigateTo("Versions").Key(newVersion["Id"])
.NavigateTo("Body")
.Set(new { Value = "MTExMTEx" })
.InsertEntryAsync();
Передача потока данных
// Добавление значения из потока байт в свойство Body версии документа.
// Для примера взята строка "Test String For Body".
// Преобразуем строку в поток байт.
using (var stream = new MemoryStream(Encoding.UTF8.GetBytes("Test String For Body"))) await odataClient
.SetMediaStreamAsync($"ISimpleDocuments({newSimpleDocument ["Id"]})/Versions({newVersion["Id"]})/Body/$value", stream, "mutipart/octet-stream", false);
6.Запустите приложение.
В результате в Directum RX для существующего документа создастся новая версия, в которую добавится обновленное содержимое. Старый документ останется доступен в предыдущей версии документа.
Примечание. Перечисленные запросы можно отправить в одной транзакции с помощью пакетного запроса. Это удобно, если нужно обновить несколько документов. Если при выполнении одного из подзапросов произойдет ошибка, на остальной процесс она не повлияет. При этом в пакетном запросе содержимое документа можно передавать только в виде строки или массива байт.
Работа с другими видами документов, например договорами (ContractualDocument), выполняется аналогично.
© Компания Directum, 2024 |