Сигналы

События Citeck реализуются через сигналы. Каждый сигнал — глобальное событие, передающееся всем активным обработчикам.

Сигналы типов Throw и Catch выполняются по имени сигнала.

Определение событий (сигналов)

Форма

../../../../../../_images/signal_event_form.png

Атрибуты

Ручная настройка

Флаг, который позволяет переключить настройку сигнала в ручной режим — указание имени сигнала, а не выбор из предустановленных типов событий.

Имя сигнала

Служит для идентификации сигнала.
Данное поле становится доступно если включена опция Ручная настройка.
Если выбран тип события, то имя генерируется автоматически.

Модель данных

Каждое событие имеет свою полезную нагрузку (payload).
Например, событие Статус изменен содержит информацию о новом и предыдущем статусе.
Модель данных представляет собой map, где ключ — имя атрибута, по которому будет доступно вычисленное значение, а значениеRecords API атрибут.
Таким образом, модель данных позволяет указать какие данные будут передаваться в сигнале, при этом пользовательская модель данных имеет высший приоритет над payload по умолчанию.

Фильтр события по документу

Позволяет отфильтровать события на основе документа, по которому возникает данное событие.
Поле имеет 3 значения:
  • Любой документ — событие будет происходить для любого документа.

  • Текущий документ — событие будет происходить только для документа по которому идет бизнес процесс.

  • Документ из переменной процесса — событие будет возникать только для документа, который указан в поле Имя переменной.

Имя переменной

Поле становится доступно, если в Фильтр события по документу выбрано значение Документ из переменной процесса.
В данном поле указывается имя переменной процесса, по которой будет определяться документ, для которого будет возникать событие.
Переменная должна содержать EntityRef документа в виде String.

Фильтр события по предикатам

Используется для фильтрации catch событий.
Моделью для вычисления предиката является payload события. В предикатах можно ссылаться на атрибуты из payload события через {{someAttribute}}. Если атрибут используется только в предикате, то его можно использовать напрямую без объявления в модели.

Важно

При сохранении, сохранении/публикации процесса проверяется обязательность заполнения следующих полей:

  • «Тип события», если поле «Ручная настройка» = false;

  • «Имя сигнала», если поле «Ручная настройка» = true;

  • «Фильтр события по документу»;

  • «Имя переменной», если поле «Фильтр события по документу» = «Документ из переменной процесса»;

  • «Фильтр события по типу документа» или «Фильтр события по предикатам», если «Тип события» = «Record создан»

Иначе в линтере будет выдана ошибка.

Payload событий

Пример payload события Статус изменен
{
  "_meta": {
      "id": "0944c87d-7d4a-482f-881a-3b84ec9b740d",
      "type": "record-status-changed",
      "time": 1670576506017,
      "user": "system"
  },
  "record": "emodel/hr-person@7d2455c4-26b5-408a-913c-6affd9eb3a19",
  "recordType": "emodel/type@hr-person",
  "before": "prepare",
  "after": "fill-data"
}

Payload по умолчанию для всех событий

Каждое событие имеет payload по умолчанию, который содержит:

  • _meta — мета информация о событии. Содержит:

    • id — уникальный идентификатор события (UUID)

    • type — тип события (String)

    • time — время возникновения события (Instant)

    • user — username пользователя, который вызвал событие (String)

  • record — документ по которому произошло событие (EntityRef)

  • recordType — тип документа по которому произошло событие (EntityRef)

Примечание

По соглашению, каждое событие должно содержать атрибут record в виде EntityRef. Если событие не содержит этого поля, то фильтрация по документу не будет работать.

Payload по умолчанию для предопределенных событий

Record создан

Дополнительная модель отсутствует.

Record удален

Дополнительная модель отсутствует.

Record изменен

  • before — атрибуты до изменения (Map<String, Any>)

  • after — атрибуты после изменения (Map<String, Any>)

  • diff — объект описывающий изменения (Diff)

    • list — список изменений (List<DiffValue>), например diff.list?json

    • has — предоставляет возможность проверить был ли изменен атрибут (Boolean), например diff._has.youAttName?bool

Статус изменен



Тип изменения:

  • Предыдущий — статус до изменения;

  • Новый — статус после изменения.

Статус выбирается из выпадающего списка. Список статусов формируется из привязанного типа данных.

Комментарий создан

  • text — текст комментария (String)

  • commentRecord — рекорд созданного комментария (EntityRef)

Комментарий изменен

  • textBefore — текст комментария до изменения (String)

  • textAfter — текст комментария после изменения (String)

  • commentRecord — рекорд созданного комментария (EntityRef)

Комментарий удален

  • text — текст удаленного комментария (String)

  • commentRecord — рекорд удаленного комментария (EntityRef)

Пользовательское действие

Реализована возможность из виджета «Действия» тригерить Citeck-events.

Примечание

Предварительно создайте действия с типом user-event

При выборе типа Пользовательское действие появляется возможность выбора действий из выпадающего списка.

../../../../../../_images/user_event_01.png

При этом работает стандартный функционал фильтрации эвентов, позволяющий фильтровать события:

../../../../../../_images/user_event_02.png

Использование payload события в Script Task

После возникновении события, его payload доступен в переменной event в рамках текущей транзакции. Если необходимо сохранить какую-то информацию из payload в execution процесса, то это можно осуществить через обычное сохранение переменных в execution.

Переменная event, это класс-обертка BpmnDataValue, который позволяет удобно работать с json представлением данных - безопасно обращаться к полям, получать значения по умолчанию, приводить к нужному типу и многое другое, подробнее см. методы класса.

Пример использования payload в скрипте:

print("---HELLO FROM SCRIPT---");


print("event id from base: " + event.get("_meta").get("id"));
print("event id from $: " + event.get("$._meta.id"));
print("event id from JsonPointer: " + event.get("/_meta/id"));

print("event time as instant: " + event.get("/_meta/time").takeAsInstant());
print("event field names list: " + event.fieldNamesList());

print("call undefined prop is safe: " + event.get("/_meta/a/b/c/"));

print("event id is boolean " + event.get("_meta").get("id").isBoolean());


print("-------END--------------");

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

---HELLO FROM SCRIPT---
event id from base: "5cf00981-6da6-414e-a82f-d0320f91f7a4"
event id from $: "5cf00981-6da6-414e-a82f-d0320f91f7a4"
event id from JsonPointer: "5cf00981-6da6-414e-a82f-d0320f91f7a4"
event time as instant: 2022-12-09T14:17:24.027Z
event field names list: [text, commentRecord, docDisp, myText, myText2, _meta, record, recordType]
call undefined prop is safe: null
event id is boolean: false
-------END--------------

Примеры конфигураций событий

Start Event - старт процесса

При изменении статуса по любому документу будет запущен процесс, который выполнит скрипт.



Start Event - старт событийного подпроцесса

Каждый раз при создании комментария по текущему документу, пока основной процесс активен, будет запущен подпроцесс, который отправит уведомление.



Boundary Event - событие с предикатом

При активной задаче, если был добавлен комментарий, который содержит текст «Галя, отмена!», то задача будет отменена и отправлено уведомление.



End Throw Event - ручная настройка и события с фильтрами

При завершении подпроцесса сработает signal end event и будет сформировал сигнал с именем «manual-throw-signal» с фильтрацией - любой документ, тип «Найм сотрудника». При этом запустится событийный подпроцесс, так как он подходит по названию сигнала, документу и типу документа.




Intermediate Catch Event - событие с пользовательской моделью и предикатом с expression

Создается задача, в результате которой, пользователь определяет, комментарий с каким текстом нужно удалить, текст комментария сохраняется в переменную документа textForDelete.
После выполнения задачи процесс ожидается события Комментарий удален по текущему документу и предикатом, который проверяет, что текст удаленного комментария совпадает с текстом переменной delText, которая определена в модели данных и ссылается на атрибут документа.

../../../../../../_images/bpmn_intermediate_catch_event_with_model_expression_predicate_example.png

Если атрибут используется только в предикате, то его можно не объявлять в модели, а использоваться напрямую, таким образом, пример выше можно упростить до:

{
 "t": "eq",
 "att": "text",
 "val": "{{record.textForDelete}}"
}

Обработка события изменения исполнителя с использованием Signal Start Event (Non Interrupting)

../../../../../../_images/assignee-changed-listener-example.bpmn.png

В процесс добавляется Event Sub Process, внутри событие для старта - Signal Start Event (Non Interrupting)

См. демонстрационный процесс

Настройки события для старта:

Сигнал

Ручная настройка: Да

Имя сигнала: bpmn-user-task-assign

Модель данных:

{
  "procDefId": "procDefId", // id процесса
  "assignee": "assignee", // новый исполнитель задачи
  "assigneeDisp": "assigneeRef?disp", // отображаемое имя нового исполнителя задачи
  "taskDisp": "taskId?disp", // отображаемое имя задачи
  "taskId": "elementDefId" // id задачи
}

Полный список возможных атрибутов для загрузки можно посмотреть по ссылка

Фильтрация

Фильтр события по документу: Текущий документ

Фильтр события по предикатам:

{
  "t": "and",
  "val": [
    {
      "t": "eq",
      "att": "taskId",
      "val": "confirm_task_id"
    },
    {
      "t": "eq",
      "att": "procDefId",
      "val": "qwe"
    }
  ]
}

Проверяется id задачи и что событие произошло именно в текущем процессе (id процесса - «qwe»). При возникновении событий в лог микросервиса ecos-process выводятся следующие сообщения:

Нажата кнопка "Я выполню это"

2025-11-13 12:27:06.679  INFO [nio-8098-exec-6] [b1d4479fe130fcd812bbcc0f170bc8c1] [admin] r.c.e.p.d.b.e.c.s.beans.ScriptLogger     :
|businessKey: emodel/qwe@38792090-edcc-4255-81f5-4c157c5657e7
|activity: Activity_07d9oq2 Обрабатываем событие смены исполнителя
|processDefId: qwe:15:7d60c0af-c04e-11f0-a446-02422b79fab5, processInstId: 620034ef-c051-11f0-a446-02422b79fab5
|Message:
Задача Согласование (confirm_task_id) была назначена на Admin Ecos (admin)

Нажата кнопка "Вернуть на группу"

2025-11-13 12:27:41.210  INFO [nio-8098-exec-7] [291bc37043f3435e877b73092dcbdaf4] [admin] r.c.e.p.d.b.e.c.s.beans.ScriptLogger     :
|businessKey: emodel/qwe@38792090-edcc-4255-81f5-4c157c5657e7
|activity: Activity_07d9oq2 Обрабатываем событие смены исполнителя
|processDefId: qwe:15:7d60c0af-c04e-11f0-a446-02422b79fab5, processInstId: 620034ef-c051-11f0-a446-02422b79fab5
|Message:
Задача Согласование (confirm_task_id) была возвращена на группу

Задача назначена на пользователя из оргструктуры

2025-11-13 12:27:58.740  INFO [nio-8098-exec-3] [ba9befe170720b91e1ca3559417e6396] [admin] r.c.e.p.d.b.e.c.s.beans.ScriptLogger     :
|businessKey: emodel/qwe@38792090-edcc-4255-81f5-4c157c5657e7
|activity: Activity_07d9oq2 Обрабатываем событие смены исполнителя
|processDefId: qwe:15:7d60c0af-c04e-11f0-a446-02422b79fab5, processInstId: 620034ef-c051-11f0-a446-02422b79fab5
|Message:
Задача Согласование (confirm_task_id) была назначена на Павел Эльбрусов (pavel.elbrusov)