Скриптовая задача
Данная задача запускает скрипт (т.е. последовательность действий) или программный код, который выполняется автоматически.
Атрибуты и форма
Используется язык JavaScript.
Указать Имя |
|
Указать скрипт |
|
Настройки асинхронности, см. подробнее о асинхронных задачах |
Важно
При сохранении, сохранении/публикации процесса проверяется обязательность заполнения следующих полей:
«Скрипт»
Иначе в линтере будет выдана ошибка.
Доступные переменные
Переменные процесса
Во время выполнения скриптов доступны все переменные процесса, видимые в текущей области.
//someVar - переменная процесса
print("someVar: " + someVar);
documentRef
- строковое представление entityRef документа
documentType
- id типа документа
lastTaskCompletor
- username пользователя, который завершил последнюю задачу
comment
- комментарий из последней завершенной задачи
workflowInitiator
- username инициатора БП
Execution
execution
- переменная, которая всегда доступна, если скрипт выполняется в области выполнения (например, в Script Task). (DelegateExecution)
// получение переменной процесса
var sum = execution.getVariable('x');
// установление переменной процесса
execution.setVariable('y', x + 15);
Document
document
- является скриптовым представлением документа AttValueScriptCtx , по которому идет БП.
//получение атрибута документа
var created = document.load("_created");
//установление атрибуту документа указанного значения
document.att("firArchiveBoxNumber", 123);
//сохранение
document.save();
//сброс состояния документа, если ранее были внесены изменения через att()
document.att("firArchiveBoxNumber", 123);
document.reset();
Records
Records
- это сервис, который предоставляет доступ к функциям работы с рекордами RecordsScriptService.
//Получение скриптового представление указанного рекорда
var doc = Records.get("emodel/doc@111");
//Query рекордов
var queryCommentsResult = Records.query({
sourceId: "emodel/comment",
language: "predicate",
query: {
a: "record",
t: "eq",
v: "emodel/doc@123"
}
}, {
text: "text",
created: "_created"
});
var firstComment = queryCommentsResult.records[0];
var text = firstComment.text;
var created = firstComment.created;
print("comment: " + text + " created on " + created);
Ecos Config
Config
- предоставляет доступ к Конфигурации ECOS по ключу в формате <область>$<идентификатор>
.
get(key: String): DataValue
- получение значения по ключу
getOrDefault(key: String, defaultValue: Any): DataValue
- получение значения по ключу, если значение не найдено, то возвращается значение по умолчанию
getNotNull(key: String): DataValue
- получение значения по ключу, если значение null, то выбрасывается исключение
//получение значения конфигурации по ключу и приведение к типу String
var serviceDeskEmailFrom = Config.get("app/service-desk$send-sd-email-from").asText()
DataValue
DataValue
- объект, позволяющий сконвертировать данные в стркутуру BpmnDataValue для удобной работы с json представлением, это позволяет безопасно обращаться к полям, получать значения по умолчанию, приводить к нужному типу, сохранять данные в execution и многое другое, подробнее см. методы класса.
DataValue.of(content: Any?)
- создает объект DataValue из любого объекта, если объект не может быть сконвертирован в DataValue, то возвращается пустой объект DataValue.
DataValue.createObj()
- создает пустой объект DataValue.
DataValue.createArr()
- создает пустой массив DataValue.
DataValue.createStr(value: Any?)
- создает строковое представление переданного значения.
Пример использования:
var event = DataValue.of(someExampleEventStructure);
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--------------");
DataValue может быть сохранен в execution процесса с последующим извлечением и использованием.
Сохраняем в execution:
var arr = ["a", "b"];
var obj = {
a: "b"
}
var dArr = DataValue.of(arr);
var dObj = DataValue.of(obj);
execution.setVariable("dArr", dArr);
execution.setVariable("dObj", dObj);
Обращаемся к сохраненным в execution переменным в другом скрипте
print("----------");
print("dArr: " + dArr);
print("dArr 0: " + dArr.get("0"));
print("dObj: " + dObj);
print("dObj a: " + dObj.get("a"));
print("----------");
Результат:
----------
dArr: {"0":"a","1":"b"}
dArr 0: "a"
dObj: {"a":"b"}
dObj a: "b"
----------
WebUrl
webUrl
- переменная возвращает настроенный веб url сервера
Tasks
tasks
- сервис для манипуляций над задачами.
completeActiveTasks(execution: DelegateExecution)
- завершает все активные задачи по инстансу процесса из [DelegateExecution.getProcessInstanceId]. Задачи завершаются с результатом defaultDone: Выполнено.
Templated content
templatedContent
- сервис для работы с шаблонизированным контентом.
write(record: String, template: String)
- генеририрует контент по указанному шаблону [template], на основе данных рекорда [record] и записывает сгенерированный контент в [record] в атрибут контент по умолчанию content.
write(record: String, template: String, attribute: String)
- генеририрует контент по указанному шаблону [template], на основе данных рекорда [record] и записывает сгенерированный контент в [record] в переданный атрибут [attribute].
В качестве [template] можно передать строковое представление EntityRef шаблона или его id.
Events
events
- сервис для работы с ECOS events.
send(type: String, data: BpmnDataValue)
- отправляет событие с указанным типом (именем) и данными.
Например, можно отправить ECOS событие через скрипт:
var data = DataValue.of({
foo: "bar",
number: 123
});
events.send("test-topic", data);
И подписаться на него в bpmn event через ручную настройку с «test-topic» или программно через слушателя:
eventsService.addListener<ObjectData> {
withEventType("test-topic")
withDataClass(ObjectData::class.java)
withTransactional(true)
withAttributes(
mapOf("foo" to "foo", "itsNum" to "number")
)
withAction { event ->
log.("event received: $event")
}
}
Logger
log
- логгер, пишет в микросервис ecos-process, дополнительно выводится информация о execution. Для настройки уровня логирования используется класс ru.citeck.ecos.process.domain.bpmn.engine.camunda.services.beans.ScriptLogger
.
Поддерживаемые методы:
log.info(message: String)
log.warn(message: String)
log.error(message: String)
log.debug(message: String)
log.trace(message: String)
Примечание
Читай подробнее о scripting в Camunda
Примеры
Скрипт, как в атрибут записать человека, который выполнил предыдущую задачу:
document.att("manager", "emodel/person@" + lastTaskCompletor);
document.save();
.. image:: _static/script_task/sample_01.png
:width: 700
:align: center
Получить локальную часть глобальной ссылки на сущность
document.load("requestCategory?localId") == "community"
requestCategory - ассоциация
?localId - скаляр из Records API, который возвращает локальную часть глобальной ссылки на сущность. Например для emodel/person@admin локальная часть - это «admin»