Интеграция с ELMA4 через ожидание внешнего сообщения
Рассмотрим следующий пример: в одной компании установлено два экземпляра ELMA4 — в головном офисе и в дополнительном. Из системы головного офиса нужно поставить задачу для дополнительного офиса и получить информацию о её выполнении.
Реализуем это с помощью модулей интеграции.
- В системе дополнительного офиса добавим токен приложения через создание внешнего приложения. Скопируем его.
- Создадим пустой бизнес-процесс Составить отчет о деятельности офиса, который будет запускаться из головного офиса, формировать отчёт и отправлять его обратно. Установим настройки бизнес-процесса, как показано на рисунке ниже.
Разрешим запуск с помощью GET-запроса. Скопируем токен для запуска.
3. В системе головного офиса создадим модуль интеграции, например, Офис г. Киров.
Тип модуля интеграции выберем Rest API, Тип аутентификации — Basic.
4. В параметрах интеграции добавим свойство для хранения токена приложения дополнительного офиса. В Значение по умолчанию добавим скопированное заранее значение.
5. Перейдём на вкладку Аутентификация модуля интеграции и добавим сценарий, который будет выполняться до аутентификации.
В коде сценария используем свойство токена приложения.
Код сценария до аутентификации:
Пространства имен
using EleWise.ELMA.IntegrationModules.Models;
public virtual void PreAuth(EleWise.ELMA.IntegrationModules.IOfficeCKirov
integrationModule, object authenticationObject)
{
var httpClient = authenticationObject as HttpClient;
httpClient.Headers.Add("ApplicationToken",integrationModule.ApplicationToken);
}
Ключи из ответа запроса авторизации будут добавлены в заголовки следующих запросов активити.
6. Перейдём на вкладку Активити модуля интеграции и добавим активити Запросить отчет о деятельности с типом Сценарий и ожидание внешнего сообщения.
7. Добавим в контекст активити следующие свойства:
- URL запроса (RequestURL) типа Строка. В качестве значения по умолчанию установим адрес сервиса запуска процесса во внешней системе в виде <базовый URL системы дополнительного офиса/API/REST/Workflow/StartProcess>;
- Токен процесса типа Строка. В качестве значения установим сохранённое значение токена из процесса в системе дополнительного офиса.
8. Добавим сценарий StartProcess для активити.
Сценарий включает сериализацию, а значит требует ссылку на System.Web.Extensions.
Пространства имён:
using EleWise.ELMA.Serialization;
using EleWise.ELMA.IntegrationModules.Models;
public virtual void CreateTask(EleWise.ELMA.IntegrationModules.IReportOfSubOffice integrationModule, EleWise.ELMA.IntegrationModules.Activity.Irso_ReportTask activity, object authenticationObject)
{
var client = authenticationObject as HttpClient;
var data = new SendData
{
ProcessToken = activity.ProcessToken.ToString(),
ProcessName = "Наименование процесса",
Context = new Dictionary<string, object>{ {"ActivityKey", activity.Actyivitykey.ToString()} }
};
var sentData = Encoding.UTF8.GetBytes(new JsonSerializer().Serialize(data));
client.Post(activity.URL, new Dictionary<string, string>{ {"WebData-Version", "2.0" } } , sentData, "application/json; charset=utf-8");
}
private class SendData
{
public string ProcessToken { get; set; }
public string ProcessName { get; set; }
public Dictionary<string, object> Context { get; set; }
}
Важно заполнить и передать в систему дополнительного офиса значение ActivityKey. Когда в системе головного офиса обработается внешнее событие, по значению этого ключа в процессе найдётся задача. После этого процесс продолжит исполнение.
9. Также можно создать сценарий для Ожидания внешнего сообщения. В описании метода есть параметр object data, который по сути является объектом WebData. Этот параметр передаёт данные, которые пришли из внешнего события и затем могут использоваться в процессе.
10. Создадим внешнее событие. Для этого укажем название и напишем сценарий.
Каждое внешнее событие сгенерирует URL, на который ожидается поступление POST-запроса с данными. Когда поступит POST-запрос, выполнится сценарий из этого внешнего события.
Сценарий выявит, какие именно экземпляры активити из модуля интеграции ожидают данных по этому внешнему событию, и вернёт ActivityKey, которые мы передаём между системами двух офисов.
Сценарий для внешнего события:
Пространства имён:
using EleWise.ELMA.Common.Models;
using EleWise.ELMA.IntegrationModules.Models;
public virtual System.Collections.Generic.IEnumerable<Guid> GetReport(EleWise.ELMA.IntegrationModules.IofficeCKirov integrationModule, System.Object externalObject)
{
var webData = externalObject as WebData;
if (webData != null)
{
var keyItem = webData.FindItem("ActivityKey");
if (keyItem != null)
{
if (Guid.TryParse(keyItem.Value, out var key))
{
return new List<Guid>{ key };
}
}
}
return null;
}
11. Сохраним активити и опубликуем модуль интеграции.
12. Перейдём в настройки модуля интеграции в системе, заполним Url для аутентификации, логин, пароль.
13. Продолжим настройку конфигурации системы дополнительного офиса. Создадим интеграцию для отправки отчёта в головной офис Интеграция с головным офисом типа Rest API. Внешние события могут быть приняты даже от неавторизованных пользователей, поэтому тип аутентификации установим Без аутентификации.
14. Создадим активити для отправки отчёта в головной офис. Тип активити выберем Сценарий, так как подтверждение приёма отчёта не требуется.
15. В контекст интеграции добавим свойства:
- URL типа Строка. В качестве значения по умолчанию установим ссылку внешнего события из свойств интеграции в системе головного офиса;
- Ключ внешнего события типа Строка.
16. Добавим сценарий:
public virtual void SendReportScript(EleWise.ELMA.IntegrationModules.IBaseOfficeIntegration integrationModule, EleWise.ELMA.IntegrationModules.Activity.IBOI_SendReport activity, object authenticationObject)
{
var httpClient = new HttpClient();
var data = new Dictionary<string, object>();
data.Add("ActivityKey", activity.ExternalActivityKey);
var sentData = Encoding.UTF8.GetBytes(new JsonSerializer().Serialize(data));
httpClient.Post(activity.URL, new Dictionary<string, string>{ {"WebData-Version", "2.0" } } , sentData, "application/json; charset=utf-8");
}
Объект data также может содержать данные об отчёте, его местонахождении, ссылке на документ и т. п. Это данные, которые в итоге получит запрашивающий. По сути это и есть WebData, которая придёт в сценарий назначенный на Ожидание внешнего события.
17. Опубликуем интеграцию и используем её в процессе составления отчёта.
18. В процессе передадим ключ активити из процесса системы головного офиса в текущую активити через входные переменные в настройках активити.
19. Опубликуем процесс.
На этом настройка завершена. Общая схема работы полученных конфигураций строится следующим образом:
- Менеджер головного офиса запускает процесс.
- Процесс выполняет активити интеграции, запускает процесс в системе дополнительного офиса и ставится на ожидание внешнего события.
- В системе дополнительного офиса запускается процесс. В свойствах этого процесса записывается ключ активити из процесса головного офиса.
- Исполнитель процесса в дополнительном офисе выполняет задачу.
- В системе дополнительного офиса запускается активити и вызывает внешнее событие в системе головного офиса.
- Во внешнем событии системы головного офиса вычисляется ключ активити и вычисляется процесс, который продолжит исполнение.
- В процессе головного офиса в активити вызывается сценарий, назначенный на ожидание внешнего сообщения. С помощью данных, поступивших из системы дополнительного офиса, заполняются параметры активити и при необходимости переносятся в процесс.
- Процесс завершается.