Platforma dostarcza możliwość tworzenia logiki zadań skryptowych handlerów z poziomu Eximee Designer. Projektant procesu musi jedynie napisać logikę handlera oraz podpiąć go w procesie.
Tworzenie zadania skryptowego
Zadania skryptowe możemy tworzyć i edytować za pomocą aplikacji Eximee Designer. W tym celu należy w module Biblioteka wybrać zakładkę Zadania skryptowe:
Ilustracja 1. Okno zakładki zadań skryptowych
Szczegółowy opis tworzenia skryptów dostępny jest w: Zadania skryptowe.
API handlerów
Ustawienie listy grup, które będą miały dostęp do instancji procesu na liście spraw
Przykład zadania skryptowego z pobraniem konfiguracji:
Wywołanie Eximee Status w ScriptCode Handlerze
Aby wywołanie działało poprawnie należy uzupełnić parametr EXIMEE_STATUS_URL wskazujący na api eximee-status.
Metody wywołujące eximee-status wymagają zmiennej procesowej statusId, która powinna zawierać numer wniosku, dla którego ma zajść wskazana aktualizacja.
Status API
Przykład ScriptCodeHandler z wywołaniem eximee-status:
Pobieranie zawartości Treści
Funkcjonalność dostępna od wersji platformy: 3.332.0
Z poziomu zadania skryptowego można pobrać zawartość artefaktu Treść (textContent) utworzonego w Eximee Designer, wykorzystując do tego funkcję: api.repository.v1.textContent. Funkcja ta zwraca obiekt, który posiada treści dla każdego ze zdefiniowanych tłumaczeń. By pobrać treść dla danego tłumaczenia używamy funkcji language. Przykład użycia:
Funkcja textContent rzuca wyjątek jeśli nie znajdzie artefaktu o podanych parametrach.
Funkcja language rzuca wyjątek jeśli nie znajdzie tłumaczenia w podanym języku.
Jeśli nie mamy pewności, że podane przez nas parametry są prawidłowe, możemy obsłużyć wyjątki używając try catch:
W zadaniach skryptowych możemy zapisać dane do modelu za pomocą metody 'complete', pierwszy parametr zapisuje dane do procesu, a drugi parametr zapisuje dane do modelu:
Klucz modelu musi istnieć w modelu danych żeby poprawnie zostało zapisane
interface Task {
getVariable(name): string; // Pobieranie zmiennej procesu o identyfikatorze wskazanym w parametrze
getAllVariables(): {[key: string]: string}; // Pobieranie wszystkich zmiennych w procesie
getProcessIntanceId(): string; // Zwraca identyfikator instancji procesu
}
interface Context {
complete(variables: [key: string]: string, modelChanges?: [key: string]: string): void; // Zakończenie zadania i przekazanie do procesu zmiennych wskazanych w parametrze oraz opcjonalnie zmian w modelu danych
handleFailure(cause: string): void; // Zgłoszenie na zadaniu incydentu (np. błąd systemowy) wraz z określeniem powodu wskazanego w parametrze (proces zatrzymuje się do czasu interwencji)
handleBpmnError(errorCode: string, cause?: string): void; // Zgłoszenie na zadaniu przewidzianego błędu biznesowego wraz z kodem błędu oraz powodem wskazanym w parametrze (uruchamiana jest ścieżka obsługi błędu w BPMN)
// Deprected
getModel(String processInstanceId, List<String> fieldsNames): Map<String, String> // Wywołanie modelu danych podając id instancji procesu oraz listę kluczy, których wartość chcemy pobrać.
// Metoda przestarzała. Należy używać api.model
}
interface Logger {
info(message: string, ...args: any); // Logowanie na poziomie INFO
debug(message: string, ...args: any); // Logowanie na poziomie DEBUG
warn(message: string, ...args: any); // Logowanie na poziomie WARN
error(message: string, ...args: any); // Logowanie na poziomie ERROR
trace(message: string, ...args: any); // Logowanie na poziomie TRACE
}
function nonsensitive(arg: any): String;
function handle(task: Task, context: Context): void {}
function handle(task, context) {
Logger.info("Rozpoczęcie zadania skryptowego nazwaSensytywna={}, nazwaNieSensytywna={}", 'TAJNE_DANE', nonsensitive('NIETAJNE_DANE'))
const testVariableNumber = task.getVariable('testVariable');
const testVariablePower = testVariableNumber * testVariableNumber;
Logger.info("Zakończenie zadania skryptowego")
context.complete({'result': testVariablePower});
}
function handle(task, context) {
// Pobranie zmiennej procesowej o kluczu "testVariable"
const value = task.getVariable('testVariable');
// Pobranie zmiennej procesowej o kluczu "result"
const result = task.getVariable('result');
if (value == null || isNaN(value)) {
// Zgłoszenie na zadaniu błędu wraz z kodem błędu "errorCode"
context.handleBpmnError("errorCode", "Brak wartości dla zmiennej procesowej o kluczu testVariable");
}
value = value * 5
result = result * 5
Logger.info("Passed: [value={}, result={}]", value, result);
try {
let response = api.rest.v1.get("questionnaire", {}, {});
Logger.info("Task ended successfully");
context.complete({'variable1': value, 'variable2': result, 'Questionnaires': response.body});
}
catch(e) {
Logger.warn("Exception occured: {}", e.message);
context.handleFailure("Failed to retrieve questionnaire list " + e.message);
}
}
function handle(task, context) {
// Pobranie zmiennych z konfiguracji
const skipTask = api.config.v1.get("script.task.skip.task")
const titleName = api.config.v1.getOrDefault("script.task.title.name", "Domyślny tytuł")
// Zakończenie zadania i przekazanie zmiennych (skipTask, titleName) do procesu
context.complete({'skipTask': skipTask, 'titleName': titleName});
}
interface EximeeStatusClient {
updateStatus(statusName: string, statusDescription: string): void; // Aktualizacja nazwy oraz opisu statusu
updateMetadata(metadata: string): void; // Aktualizacja metadanych wniosku
getMetadata(): Object; // Pobranie metadanych wniosku
getClientFormsBasicInfo(): Object; // Pobranie listy statusów wniosków dla klienta zalogowanego (Metoda dostępna od wersji 4.154.0. Klient musi być zalogowany, aby funkcjonalność działała.)
}
function handle(task, context) {
try {
api.status.v1.updateStatus("NEW_STATUS", "STATUS_DESC");
Logger.info("Task ended successfully");
context.complete({});
}
catch(e) {
Logger.warn("Exception occured: {}", e.message);
context.handleFailure("Failed to retrieve questionnaire list " + e.message);
}
}