logo

Интеграция с ELMA4 через ожидание внешнего сообщения

Рассмотрим следующий пример: в одной компании установлено два экземпляра ELMA4 — в головном офисе и в дополнительном. Из системы головного офиса нужно поставить задачу для дополнительного офиса и получить информацию о её выполнении.

Реализуем это с помощью модулей интеграции.

  1. В системе дополнительного офиса добавим токен приложения через создание внешнего приложения. Скопируем его.
  2. Создадим пустой бизнес-процесс Составить отчет о деятельности офиса, который будет запускаться из головного офиса, формировать отчёт и отправлять его обратно. Установим настройки бизнес-процесса, как показано на рисунке ниже.

Разрешим запуск с помощью 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. Опубликуем процесс.

На этом настройка завершена. Общая схема работы полученных конфигураций строится следующим образом:

  1. Менеджер головного офиса запускает процесс.
  2. Процесс выполняет активити интеграции, запускает процесс в системе дополнительного офиса и ставится на ожидание внешнего события.
  3. В системе дополнительного офиса запускается процесс. В свойствах этого процесса записывается ключ активити из процесса головного офиса.
  4. Исполнитель процесса в дополнительном офисе выполняет задачу.
  5. В системе дополнительного офиса запускается активити и вызывает внешнее событие в системе головного офиса.
  6. Во внешнем событии системы головного офиса вычисляется ключ активити и вычисляется процесс, который продолжит исполнение.
  7. В процессе головного офиса в активити вызывается сценарий, назначенный на ожидание внешнего сообщения. С помощью данных, поступивших из системы дополнительного офиса, заполняются параметры активити и при необходимости переносятся в процесс.
  8. Процесс завершается.