Этот тип действия позволяет передать данные из ELMA365 внешнему сервису, обработать их и получить ответ.
Делегированные действия передаются в сторонний микросервис по стандартизированному Web API (HTTP REST). Один сервис может реализовывать несколько действий, которые разделяются кодом.
Данное действие не использует скрипты, поэтому настраивается только на вкладках Настройки и Контекст.
Вкладка «Настройки»
Заполните поля на вкладке Настройки:
- Название — наименование действия в настройках модуля и в дизайнере бизнес-процессов;
- Название по умолчанию — наименование элемента, отображающееся при его добавлении на схему процесса;
- Цвет блока — цвет блока на схеме процесса;
- Описание — описание функциональных возможностей действия и его особенностей;
- Устаревшее — опция позволяет скрыть элемент из дизайнера бизнес-процессов, чтобы пользователи не смогли добавлять его на схемы новых процессов. Устаревшие действия продолжат работать без изменений в уже созданных процессах. Например, можно включить опцию для блока после обновления модуля;
- URL делегирования — адрес внешнего сервиса с указанием кода определённого действия в виде:
schema://domain:port/base/path/action-code
. Нажмите на значок {+} в поле, чтобы использовать в адресе переменные, созданные в пользовательском модуле на вкладке Настройки. С помощью значка f(x) в адрес можно добавить функцию DateTime(); - Количество повторов при ошибке — количество попыток выполнения действия;
- Пауза между повторами при ошибке (сек)* — частота попыток выполнения действия при возникновении ошибки.
Вкладка «Контекст»
Добавьте переменные, которые будут использоваться в настройках элемента на схеме бизнес-процесса. Контекст можно запросить из внешнего сервиса-исполнителя или создать вручную, нажав + Добавить для каждой переменной. Подробнее о типах переменных читайте в статье «Типы данных в системе».
Отметьте, какие переменные являются входными и выходными. Это позволит сопоставить контекст действия и процесса, в котором оно используется. Подробнее о биндинге переменных читайте в статье «Особенности действий в бизнес‑процессах».
После внесения данных на вкладках нажмите Сохранить и Опубликовать на верхней панели окна настроек действия.
Принцип работы действия
Делегированное действие выполняется по следующему алгоритму:
- Заданный в настройках действия URL делегирования считывается сервисом-processor и вызывается его метод
/requests
. В теле запроса передаются Исполнители и Контекст — значения входных контекстных переменных из настроек действия. - Когда сервису-исполнителю передаётся запрос на
/requests
, происходит одно из следующих действий:
- действие выполняется, и выдаётся результат;
- запрашиваются дополнительные данные из сервиса-processor;
- при наличии всех данных, но невозможности синхронного выполнения действия, информация сохраняется, например, в базе данных. В сервис-processor отправляется ответ о том, что действие принято к исполнению, и передаётся URL метода, по которому отправляется идентификатор точки восстановления;
- при возникновении ошибки возвращается оповещение об этом.
- В зависимости от полученного ответа от сервиса-исполнителя, со стороны сервиса-processor происходит одно из следующих действий:
- при выполненном действии результат записывается в выходные переменные, настроенные в контексте действия. Выполнение бизнес-процесса продолжается;
- при необходимости запроса дополнительных данных, создаётся пользовательская задача. После её выполнения снова вызывается метод
/requests
; - если действие было принято к исполнению, создаётся точка восстановления. Её идентификатор передаётся в сервис-исполнитель с помощью полученного URL;
- в случае ошибки происходит её анализ. Отправляется повторный запрос, согласно указанным в действии настройкам. С помощью шлюза в процессе можно также настроить дополнительную ветку, по которой продолжится ход в случае возникновения ошибки.
Запрос дополнительных данных в задаче
Для выполнения действия сервису-исполнителю могут потребоваться дополнительные данные от пользователя, например, электронная подпись. Тогда в ответ на вызов /requests
сервис-исполнитель возвращает код 201. Инициатору процесса приходит задача, в которой прописываются: исполнители, контекст (данные), описание полей формы для задачи, список допустимых переходов.
Пользователь указывает нужную информацию. Затем сервис-processor снова вызывает метод /requests и передаёт сервису-исполнителю данные формы, выбранный переход, идентификатор исполнителя задачи. После этого сервис-исполнитель выполняет действие повторно.
Ожидание выполнения действия
В случае создания точки восстановления процесс останавливается до выполнения делегированного действия сервисом-исполнителем. Если на схеме процесса после действия настроено промежуточное событие-таймер, ожидание прервётся по истечении установленного времени.
После получения сервисом-исполнителем идентификатора точки восстановления, он сохраняется, например, в базе данных. Затем происходит выполнение действия.
По окончании действия в сервис-processor передаётся информация о необходимости продолжения бизнес-процесса с точки восстановления. Для передачи результата делегированному действию используется метод Web API:
POST /pub/v1/bpm/restore-point/{id}/restore
В теле запроса передаётся обновленный контекст действия.
Полученные данные записываются сервисом-processor в выходные переменные настроенные в элементе, и процесс продолжается.
Прерывание выполнения действия
Прерывание или отмена делегированного действия происходит:
- при прерывании бизнес-процесса;
- при эскалации по таймеру.
Инициатором прерывания действия является сервис-processor. Он удаляет созданную точку восстановления и информирует сервис-исполнитель о необходимости отмены действия с помощью вызова:
API сервиса-исполнителя
Подробное описание интерфейса сервиса-исполнителя вы можете посмотреть в OpenAPI-схеме:
openapi: 3.0.0 info: title: perfomer-service description: Сервис-исполнитель для делегированного действия version: 1.0.0 servers: - url: schema://domain:port/base/path paths: /{action-code}/context: get: summary: Получить описание контекста description: Метод предназначен для загрузки описания контекста из сервиса-исполнителя в элемент делегированного действия на этапе его создания блока operationId: getContext tags: - Context parameters: - name: action-code in: path description: Код действия required: true schema: type: string responses: '200': description: Описание контекста действия в виде массива свойств content: application/json: example: [ { "code": "firstName", "type": "STRING", "searchable": false, "indexed": false, "deleted": false, "array": false, "required": false, "single": true, "defaultValue": null, "calcByFormula": false, "formula": "", "data": null, "view": { "name": "Имя", "tooltip": "Имя без сокращений", "data": { "input": true } } }, { "code": "lastName", "type": "STRING", "searchable": false, "indexed": false, "deleted": false, "array": false, "required": false, "single": true, "defaultValue": null, "calcByFormula": false, "formula": "", "data": null, "view": { "name": "Фамилия", "tooltip": "Фамилия без сокращений", "data": { "input": true } } }, { "code": "fullName", "type": "STRING", "searchable": false, "indexed": false, "deleted": false, "array": false, "required": false, "single": true, "defaultValue": null, "calcByFormula": false, "formula": "", "data": null, "view": { "name": "Полное имя", "tooltip": "Фамилия и имя без сокращений", "data": { "output": true } } } ] /{action-code}/validate: post: summary: Проверить биндинги operationId: validateBingings tags: - Validation parameters: - name: action-code in: path description: Код действия required: true schema: type: string requestBody: description: "" content: application/json: schema: $ref: '#/components/schemas/Bindings' responses: '200': description: Успешная валидация content: application/json: schema: $ref: '#/components/schemas/ValidationResult' '400': description: Ошибка при валидации /{action-code}/requests: post: summary: Выполнить действия operationId: runActionRequest tags: - Action parameters: - name: action-code in: path description: Код действия required: true schema: type: string - name: x-company-alias in: header required: true schema: type: string - name: x-user-id in: header description: Текущий пользователь — в случае выполнения пользовательской задачи required: false schema: type: string - name: x-correlation-id in: header description: CorrelationID — в случае выполнения пользовательской задачи required: false schema: type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CreateAction' responses: '200': description: Задача выполнена content: application/json: schema: $ref: '#/components/schemas/Result' '201': description: Задача принята к обработке. Необходимо поставить задачу пользователю и после её исполнения повторить запрос content: application/json: schema: $ref: '#/components/schemas/CreateActionCreateTaskResponse' '202': description: Задача принята к обработке content: application/json: schema: $ref: '#/components/schemas/CreateActionResponse' '400': description: Ошибка в формате запроса content: application/json: schema: $ref: '#/components/schemas/BadRequest' '422': description: Ошибка в данных запроса content: application/json: schema: $ref: '#/components/schemas/BadRequest' '429': description: Необходимо повторить запрос позже '500': description: Внутренняя ошибка сервиса-исполнителя, действие не может быть продолжено /{action-code}/requests/{id}: delete: tags: - Action summary: Отменяет запрос operationId: cancelAction parameters: - name: action-code in: path description: Код действия required: true schema: type: string - name: id in: path description: ID действия (он же correlationID) required: true schema: type: string responses: '204': description: Действие успешно отменено /{action-code}/requests/{id}/restore-point: put: summary: Сохраняет точку останова operationId: saveRestorePointID tags: - Action - RestorePoint parameters: - name: action-code in: path description: Код межведа required: true schema: type: string - name: id in: path description: ID действия (он же correlationID) required: true schema: type: string requestBody: required: true content: plain/text: schema: type: string format: uuid description: ID точки останова responses: '200': description: Код сохранён '409': description: ID уже сохранён '400': description: Ошибка в формате запроса content: application/json: schema: $ref: '#/components/schemas/BadRequest' components: schemas: Result: type: object properties: context: type: object example: { "context": { "fullName": "Иванов Иван" } } Bindings: type: object properties: bindings: type: array items: type: object ValidationResult: type: array items: type: object BadRequest: type: object properties: errors: type: array items: type: object properties: source: type: string description: Указатель на элемент в запросе, где возникла ошибка title: type: string description: Краткое описание ошибки detail: type: string description: Детальное описание ошибки code: type: string description: Машиночитаемый код ошибки required: - code - title CreateAction: type: object properties: id: type: string format: uuid description: ID запроса, должен быть уникальным для каждого запроса. Используется для контроля над повторными запросами performers: type: array description: Исполнители items: type: string format: uuid context: type: object description: Сериализация контекста шага или данные с формы exitID: type: string description: Выбранный переход required: - id - performers - context CreateActionResponse: type: object properties: id: type: string format: uuid description: Уникальный Correlation ID restorePointURL: type: string format: url description: Адрес, на который отправляется restore-point-id CreateActionCreateTaskResponse: type: object properties: performers: type: array description: Исполнители для задачи items: type: string format: uuid context: type: object description: Описание полей и данные formFields: type: array description: Шаблон формы items: type: object description: Структура FormField exitIDs: type: array description: Список допустимых переходов items: type: string format: uuid required: - performers - context - exitIDs
|