Сервис запуска бизнес-процессов

Сложный

Одной из задач интеграции внешнего приложения с Creatio является запуск бизнес-процессов. С этой целью в сервисной модели Creatio реализован веб-сервис ProcessEngineService.svc. Назначение ProcessEngineService.svc — запуск бизнес-процессов.

Запуск бизнес-процессов из внешнего приложения 

Адрес сервиса ProcessEngineService.svc
https://mycreatio.com/0/ServiceModel/ProcessEngineService.svc

Основные методы сервиса  ProcessEngineService.svc:

  • Execute() — запускает бизнес-процесс. Позволяет передать набор входящих параметров бизнес-процесса и вернуть результат его выполнения.
  • ExecProcElByUId() — запускает отдельный элемент бизнес-процесса. Запускать на выполнение можно только элемент выполняющегося процесса.

На заметку. Полный перечень методов веб-сервиса доступен в Библиотеке .NET классов.

Запуск бизнес-процесса из front-end части  

Для запуска бизнес-процесса из клиентской схемы используется модуль ProcessModuleUtilities пакета NUI. Этот модуль предоставляет удобный интерфейс для выполнения запросов к сервису ProcessEngineService.svc.

Чтобы запустить бизнес-процесс из клиентской схемы:

  1. Подключите в качестве зависимости модуль ProcessModuleUtilities в модуль страницы, из которой вызывается сервис.
  2. Вызовите метод executeProcess(args) модуля ProcessModuleUtilities, передав ему в качестве параметра объект args с такими свойствами:
Свойства объекта args
Свойство Описание
sysProcessName Имя вызываемого процесса (необязательное свойство в случае, если определено свойство sysProcessId).
sysProcessId Уникальный идентификатор вызываемого процесса (необязательное свойство, если определено свойство sysProcessName).
parameters

Объект, свойствами которого являются входящие параметры вызываемого процесса. 

Запустить бизнес-процесс через веб-сервис
Сложный

Пример. Запустить пользовательские бизнес-процессы создания нового контакта и считывания всех контактов Creatio. Бизнес-процессы запустить из строки браузера и из консольного приложения. Для запуска используйте веб-сервис ProcessEngineService.svc.

1. Создать процесс добавления контакта 

На заметку. Особенности и лучшие практики создания бизнес-процессов в Creatio подробно описаны в документации по настройке процессов.

  1. Перейдите в раздел Конфигурация (Configuration) и выберите пользовательский пакет, в который будет добавлен бизнес-процесс.
  2. Перейдите в дизайнер процессов.
  3. Заполните свойства бизнес-процесса:

    • Название (Name) — "Add New External Contact".
    • Код (Code) — "UsrAddNewExternalContact".

    Для остальных свойств используйте значения по умолчанию.

    scr_add_contact_bp.png
  4. Добавьте параметры бизнес-процесса.

    С помощью параметров в процесс передаются данные добавляемого контакта — имя и телефон.

    Значения параметров бизнес-процесса, которые необходимо заполнить, представлены в таблице ниже.

    Значения параметров бизнес-процесса
    Заголовок
    (Title)
    Код
    (Code)
    Тип данных
    (Data type)
    Параметр ContactName
    "Имя контакта" ("Contact Name")
    "ContactName"
    "Текст (50 символов)" ("Text (50 characters)")
    Параметр ContactPhone
    "Телефон контакта" ("Contact Phone")
    "ContactPhone"
    "Текст (50 символов)" ("Text (50 characters)")
    scr_add_contact_params.png
  5. Добавьте элемент Задание-сценарий (ScriptTask).

    1. Заполните значения свойств элемента:

      • Название (Name) — "Add contact".
      • Код (Code) — "ScriptTaskAddContact".
    2. Реализуйте логику добавления нового контакта.

      Чтобы редактировать код сценария, дважды щелкните по элементу на диаграмме. На панели настройки элемента откроется окно для ввода и редактирования программного кода.

      ScriptTaskAddContact
      /* Создает экземпляр схемы объекта [Contact]. */
      var schema = UserConnection.EntitySchemaManager.GetInstanceByName("Contact");
      /* Создает экземпляр нового объекта. */
      var entity = schema.CreateEntity(UserConnection);
      /* Устанавливает значения по умолчанию для колонок объекта. */
      entity.SetDefColumnValues();
      string contactName = Get<string>("ContactName");
      string contactPhone = Get<string>("ContactPhone");
      /* Устанавливает значения колонки [Name] из параметра процесса. */
      entity.SetColumnValue("Name", contactName);
      /* Устанавливает значения колонки [Phone] из параметра процесса. */
      entity.SetColumnValue("Phone", contactPhone);
      /* Сохраняет новый контакт. */
      entity.Save();
      return true;
      
  6. Нажмите на кнопку Сохранить (Save) на панели инструментов дизайнера процессов.

2. Создать процесс чтения всех контактов 

Бизнес-процесс, который формирует перечень всех контактов, также содержит один элемент Задание-сценарий (ScriptTask).

Чтобы создать процесс чтения всех контактов:

  1. Перейдите в раздел Конфигурация (Configuration) и выберите пользовательский пакет, в который будет добавлен бизнес-процесс.
  2. Перейдите в дизайнер процессов.
  3. Заполните свойства бизнес-процесса:

    • Название (Name) — "Get All Contacts".
    • Код (Code) — "UsrGetAllContacts".

    Для остальных свойств используйте значения по умолчанию.

    scr_get_contacts_bp.png
  4. Добавьте параметр бизнес-процесса.

    Заполните значения параметра бизнес-процесса:

    • Заголовок (Title) — "Contact List".
    • Код (Code) — "ContactList".
    • Тип данных (Data type) — "Строка неограниченной длины" ("Unlimited length text").
    scr_get_contacts_param.png

    Параметр возвращает перечень всех контактов приложения в виде JSON-объекта.

  5. Добавьте элемент Задание-сценарий (ScriptTask).

    1. Заполните значения свойств элемента:

      • Название (Name) — "Get all contacts".
      • Код (Code) — "ScriptTaskGetAllContacts".
    2. Реализуйте логику чтения контактов.

      Чтобы редактировать код сценария, дважды щелкните по элементу на диаграмме. На панели настройки элемента откроется окно для ввода и редактирования программного кода.

      ScriptTaskGetAllContacts
      /* Создание экземпляра EntitySchemaQuery. */
      EntitySchemaQuery query = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "Contact");
      /* Признак для обязательного выбора первичной колонки [Id]. */
      query.PrimaryQueryColumn.IsAlwaysSelect = true;
      /* Добавление в запрос колонок. */
      query.AddColumn("Name");
      query.AddColumn("Phone");
      /* Получение результирующей коллекции. */
      var entities = query.GetEntityCollection(UserConnection);
      /* Формирование списка контактов для сериализации в JSON. */
      List<object> contacts = new List<object>();
      foreach (var item in entities)
      {
          var contact = new
          {
              Id = item.GetTypedColumnValue<Guid>("Id"),
              Name = item.GetTypedColumnValue<string>("Name"),
              Phone = item.GetTypedColumnValue<string>("Phone")
          };
          contacts.Add(contact);
      }
      /* Сохранение сериализованной в JSON коллекции контактов в параметр ContactList. */
      string contactList = JsonConvert.SerializeObject(contacts);
      Set<string>("ContactList", contactList);
      return true;
      
  6. Нажмите на кнопку Сохранить (Save) на панели инструментов дизайнера процессов.

Результат выполнения примера 

  1. Запустить выполнение бизнес-процессов из строки браузера.

    1. Запустите процесс создания нового контакта. Для этого в строку навигации браузера введите URL, который приведен ниже.

      URL для запуска процесса создания нового контакта
      http[s]://[Адрес приложения Creatio]/0/ServiceModel/ProcessEngineService.svc/UsrAddNewExternalContact/Execute?ContactName=John Johanson&ContactPhone=1 111 111 1111
      

      В результате в приложении будет добавлен новый контакт.

      scr_add_contact_result01.png

      Важно. Новый контакт создается при каждом успешном запросе к сервису. Если выполнить несколько запросов с одинаковыми параметрами, создается несколько контактов-дублей.

    2. Запустите процесс чтения всех контактов. Для этого в строку навигации браузера введите URL, который приведен ниже.

      URL для запуска процесса чтения всех контактов
      http[s]://[Адрес приложения Creatio]/0/ServiceModel/ProcessEngineService.svc/UsrGetAllContacts/Execute?ResultParameterName=ContactList
      

      В результате в окне браузера отображается JSON-объект, который содержит коллекцию контактов.

      scr_get_contacts_result01.png
  2. Запустить выполнение бизнес-процессов из консольного приложения.

    Исходный код консольного пользовательского приложения, который предназначен для запуска бизнес-процессов с помощью сервиса ProcessEngineService.svc, доступен на GitHub.

    1. Выполните аутентификацию. Для этого используйте сервис аутентификации AuthService.svc. Используйте пример, который доступен в статье Реализовать аутентификацию на C#.
    2. В исходный код класса Program добавьте строковое поле, которое содержит базовый URL сервиса.

      URL для формирования запросов к сервису ProcessEngineService.svc
      private const string processServiceUri = baseUri + @"/0/ServiceModel/ProcessEngineService.svc/";
      
    3. В исходный код класса Program добавьте метод GET для выполнения запуска бизнес-процесса создания нового контакта.

      Метод GET для выполнения запуска бизнес-процесса
      public static void AddContact(string contactName, string contactPhone)
      {
          /* Формирует URL запрос. */
          string requestString = string.Format(processServiceUri +
                  "UsrAddNewExternalContact/Execute?ContactName={0}&ContactPhone={1}",
                                   contactName, contactPhone);
          /* Создает Http-запрос. */
          HttpWebRequest request = HttpWebRequest.Create(requestString) as HttpWebRequest;
          request.Method = "GET";
          request.CookieContainer = AuthCookie;
          /* Выполняет запрос и анализ Http-ответа. */
          using (var response = request.GetResponse())
          {
              /* Выводит свойства http-ответа, поскольку сервис вернет пустую строку. */
              Console.WriteLine(response.ContentLength);
              Console.WriteLine(response.Headers.Count);
          }
      }
      
    4. В исходный код класса Program добавьте метод GET для выполнения запуска бизнес-процесса чтения вскх контактов Creatio.

      Метод GET для выполнения запуска бизнес-процесса
      public static void GetAllContacts()
      {
          /* Формирует URL запроса. */
          string requestString = processServiceUri +
                             "UsrGetAllContacts/Execute?ResultParameterName=ContactList";
          HttpWebRequest request = HttpWebRequest.Create(requestString) as HttpWebRequest;
          request.Method = "GET";
          request.CookieContainer = AuthCookie;
          /* Создает Http-запрос. */
          using (var response = request.GetResponse())
          {
              /* Выполняет запрос и выводит результат. */
              using (var reader = new StreamReader(response.GetResponseStream()))
              {
                  string responseText = reader.ReadToEnd();
                  Console.WriteLine(responseText);
              }
          }
      }
      
    5. Реализуйте вызов добавленныех методов в основном методе приложения после успешной аутентификации.

      Реализация вызова методов
      static void Main(string[] args)
      {
          if (!TryLogin("Supervisor", "Supervisor"))
          {
              Console.WriteLine("Wrong login or password. Application will be terminated.");
          }
          else
          {
              try
              {
                  /* Вызывает методы запуска бизнес-процессов. */
                  AddContact("John Johanson", "+1 111 111 1111");
                  GetAllContacts();
              }
              catch (Exception)
              {
                  /* Обрабатывает исключения. */
                  throw;
              }
          };
          Console.WriteLine("Press ENTER to exit...");
          Console.ReadLine();
      }
      
    scr_result.png
Запустить процесс из клиентского модуля
Средний

Пример. На страницу контрагента и страницу раздела Контрагенты (Accounts) добавить пользовательское действие Назначить встречу (Schedule a meeting), которое запускает пользовательский бизнес-процесс Проведение встречи (Holding a meeting). Действие активно при наличии основного контакта для выбранного контрагента (т. е. заполнено поле Основной контакт (Primary contact) страницы контрагента). В качестве параметра бизнес-процесса указать основной контакт контрагента.

1. Реализовать пользовательский бизнес-процесс Проведение встречи 

  1. Создайте бизнес-процесс Проведение встречи (Conducting a meeting). Для этого реализуйте пример, который приведен в статье Отправить email-сообщение при помощи процесса документации по настройке процессов.
  2. Добавьте параметр бизнес-процесса.

    Заполните значения параметра бизнес-процесса.

    • Заголовок (Title) — "Meeting contact".
    • Код (Code) — "ProcessSchemaContactParameter".
    • Тип данных (Data type) — "Уникальный идентификатор" ("Unique identifier").
    scr_process_parameter.png
  3. В свойство Контакт (Contact) действия процесса Позвонить клиенту (Call customer) добавьте входящий параметр "[#Meeting contact#]".

    scr_add_task_parameter.png

2. Реализовать пользовательское действие страницы контрагента 

  1. Создать схему замещающей модели представления страницы контрагента. Для этого воспользуйтесь инструкцией, которая приведена в статье Добавить действие на страницу записи.
  2. Добавьте локализуемую строку с текстом пункта меню, который планируется добавить.

    1. В контекстном меню узла Локализуемые строки (Localizable strings) нажмите кнопку scr_add_button.png.
    2. Заполните свойства локализуемой строки.

      • Код (Code) — "CallProcessCaption".
      • Значение (Value) — "Назначить встречу" ("Schedule a meeting").
    3. Для добавления локализуемой строки нажмите Добавить (Add).
  3. Реализуйте логику работы пункта меню.

    1. В качестве зависимости подключите модуль ProcessModuleUtilities.
    2. В свойстве methods реализуйте методы:

      • callCustomProcess() — метод-обработчик действия. Реализует метод executeProcess() модуля ProcessModuleUtilities, в который в качестве параметра передаются имя созданного бизнес-процесса и объект с проинициализированными входящими параметрами для процесса.
      • isAccountPrimaryContactSet() — проверяет наличие у контрагента основного контакта.
      • getActions() — переопределенный базовый метод. Возвращает коллекцию действий замещающей страницы.

    Исходный код схемы замещающей модели представления страницы контрагента представлен ниже.

    AccountPageV2
    define("AccountPageV2", ["ProcessModuleUtilities"], function(ProcessModuleUtilities) {
        return {
            /* Название схемы объекта страницы записи. */
            entitySchemaName: "Account",
            /* Методы модели представления страницы записи. */
            methods: {
                /* Проверяет заполнение поля [Основной контакт] страницы контрагента. */
                isAccountPrimaryContactSet: function() {
                    return this.get("PrimaryContact") ? true : false;
                },
                /* Переопределяет базовый виртуальный метод, который возвращает коллекцию действий страницы записи. */
                getActions: function() {
                    /* Вызывает родительскую реализацию метода для получения коллекции проинициализированных действий базовой страницы. */
                    var actionMenuItems = this.callParent(arguments);
                    /* Добавляет линию-разделитель. */
                    actionMenuItems.addItem(this.getActionsMenuItem({
                        Type: "Terrasoft.MenuSeparator",
                        Caption: ""
                    }));
                    /* Добавляет пункт меню в перечень действий страницы записи. */
                    actionMenuItems.addItem(this.getActionsMenuItem({
                        /* Привязывает заголовок пункта меню к локализуемой строке схемы. */
                        "Caption": { bindTo: "Resources.Strings.CallProcessCaption" },
                        /* Привязывает метод-обработчик действия. */
                        "Tag": "callCustomProcess",
                        /* Привязывает свойство видимости пункта меню к значению, которое возвращает метод isAccountPrimaryContactSet(). */
                        "Visible": { bindTo: "isAccountPrimaryContactSet" }
                    }));
                    return actionMenuItems;
                },
                /* Метод-обработчик действия. */
                callCustomProcess: function() {
                    /* Получает идентификатор основного контакта контрагента. */
                    var contactParameter = this.get("PrimaryContact");
                    /* Объект, который передается в качестве параметра метода executeProcess(). */
                    var args = {
                        /* Имя процесса, который необходимо запустить. */
                        sysProcessName: "UsrCustomProcess",
                        /* Объект со значением входящего параметра ContactParameter для процесса CustomProcess. */
                        parameters: {
                            ProcessSchemaContactParameter: contactParameter.value
                        }
                    };
                    /* Запускает пользовательский бизнес-процесс. */
                    ProcessModuleUtilities.executeProcess(args);
                }
            }
        };
    });
    
  4. На панели инструментов дизайнера модуля нажмите Сохранить (Save).

3. Реализовать пользовательское действие страницы раздела 

  1. Создать схему замещающей модели представления страницы раздела. Для этого воспользуйтесь инструкцией, которая приведена в статье Добавить действие на страницу записи.
  2. Добавьте локализуемую строку с текстом пункта меню, который планируется добавить. Для этого выполните шаг 2 алгоритма создания схемы замещающей модели представления страницы контрагента.
  3. Реализуйте логику работы пункта меню. Для этого в свойстве methods реализуйте метод isAccountPrimaryContactSet(), который проверяет наличие основного контакта у выбранного контрагента.

    Исходный код схемы замещающей модели представления страницы раздела представлен ниже.

    AccountSectionV2
    define("AccountSectionV2", [], function() {
        return {
            /* Название схемы страницы раздела. */
            entitySchemaName: "Account",
            /* Методы модели представления страницы раздела. */
            methods: {
                /* Проверяет заполнение поля [Основной контакт] у выбранного контрагента. */
                isAccountPrimaryContactSet: function() {
                    /* Определяет активную запись. */
                    var activeRowId = this.get("ActiveRow");
                    if (!activeRowId) {
                        return false;
                    }
                    /* Получает коллекцию данных списочного представления реестра раздела. Получает модель выбранного контрагента по заданому значению первичной колонки. */
                    var selectedAccount = this.get("GridData").get(activeRowId);
                    if (selectedAccount) {
                        /* Получает свойство модели — основной контакт. */
                        var selectedPrimaryContact = selectedAccount.get("PrimaryContact");
                        /* Возвращает true, если основной контакт заполнен, в другом случае — false. */
                        return selectedPrimaryContact ? true : false;
                    }
                    return false;
                }
            }
        };
    });
    
  4. На панели инструментов дизайнера модуля нажмите Сохранить (Save).

Результат выполнения примера 

Чтобы посмотреть результат выполнения примера:

  1. Очистите кэш браузера.
  2. Обновите страницу раздела Контрагенты (Accounts).

В результате выполнения примера на страницу контрагента добавлено действие Назначить встречу (Schedule a meeting). Это действие активно при наличии основного контакта контрагента.

scr_result01.png

В результате выбора действия Назначить встречу (Schedule a meeting) запускается пользовательский бизнес-процесс Проведение встречи (Holding a meeting). В качестве параметра бизнес-процесса используется основной контакт контрагента.

scr_result02.png
Веб-сервис ProcessEngineService.svc
Сложный
/* Строка запроса. */
GET Creatio_application_address/0/ServiceModel/ProcessEngineService.svc/[processSchemaName/]methodName[?ResultParameterName=resultParameterName&inputParameter=inputParameterValue][/processElementUID]

/* Заголовки запроса. */
ForceUseSession: true
BPMCSRF: authentication_cookie_value
/* Код состояния. */
Status: code

/* Тело ответа. */
<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">
    "[
        {\"Id\":\"object1_id\",\"object1 field1\":\"object1 field_value1\",\"object1 field2\":\"object1 field_value2\"},
        {\"Id\":\"object2_id\",\"object2 field1\":\"object2 field_value1\",\"object2 field2\":\"object2 field_value2\"},
		...
		{},
    ]"
</string>

Строка запроса 

GET required

Метод запроса на запуск бизнес-процессов.

Creatio_application_address required

Адрес приложения Creatio.

ServiceModel required

Путь к сервису запуска бизнес-процессов. Неизменяемая часть запроса.

ProcessEngineService.svc required

Адрес веб-сервиса запуска бизнес-процессов. Неизменяемая часть запроса.

methodName required

Метод веб-сервиса запуска бизнес-процессов.

Основные методы:

  • Execute() — запуск бизнес-процесса. Позволяет передавать набор входящих параметров и возвращать результат выполнения веб-сервиса.
  • ExecProcElByUId() — запуск отдельного элемента бизнес-процесса. Запускать на выполнение можно только элемент выполняющегося процесса. Если элемент процесса выполнен на момент вызова метода, то повторно такой элемент не выполняется.
ProcessSchemaName optional

Используется для метода Execute().

Название схемы бизнес-процесса. Название схемы бизнес-процесса можно узнать в разделе Конфигурация (Configuration).

ResultParameterName optional

Используется для метода Execute().

Переменная для кода параметра процесса. Неизменяемая часть запроса.

resultParameterName optional

Используется для метода Execute().

Код параметра процесса, который хранит результат выполнения процесса. Если параметр не задан, то веб-сервис запустит указанный бизнес-процесс без ожидания результата его выполнения. Если в вызываемом процессе отсутствует данный код параметра, веб-сервис вернет значение null.

inputParameter optional

Используется для метода Execute().

Переменная для кода входящих параметров бизнес-процесса. Если передается несколько входящих параметров, то объедините их символом &.

inputParameterValue optional

Используется для метода Execute().

Значения входящих параметров бизнес-процесса.

ProcessElementUID optional

Используется для метода ExecProcElByUId().

Идентификатор запускаемого элемента процесса.

Заголовки запроса 

ForceUseSession true required

Принудительное использование существующей сессии.

BPMCSRF authentication_cookie_value required

Аутентификационный cookie.

Тело ответа 

[]

Коллекция объектов.

{}

Экземпляры объектов коллекции.

Id

Название поля Id.

object1_id, object2_id, ...

Идентификаторы экземпляров объектов коллекции.

object1 field1, object1 field2, ..., object2 field1, object2 field2, ...

Имена полей field1, field2, ... экземпляров объектов object1, object2, ... коллекции.

object1 field_value1, object1 field_value2, ..., object2 field_value1, object2 field_value2, ...

Значения полей field1, field2, ... экземпляров объектов object1, object2, ... коллекции. Может присутствовать только для GET и POST запросов.