Skripte im Workflow

Skripte werden dazu verwendet, automatische Aktionen auszuführen und das Verhalten des Workflows anzupassen. Es gibt zwei grundlegende Skripttypen:

Einige Elemente und Adornments haben zusätzlich Skripte für bestimmte Zwecke, wie zum Beispiel das Entscheidungsskript, das festlegt, welchen Ausgang ein Vorgang nimmt, wenn er durch einen Entscheidungsknoten läuft.

Sie können Skripte auf zwei Arten verwalten:

Die folgende Tabelle zeigt einen Vergleich der beiden Arten:

Art

Beschreibung

Vorteile

Nachteile

Eingebettetes Skript

Der gesamte Inhalt des Skripts steht im Workflow-Editor zur Verfügung.

  • Die gesamte Prozesslogik ist an einem Ort gespeichert und kann direkt im Workflow-Editor überprüft werden.

  • Sie können workflowApi-Methoden mit allen implizit verfügbaren Objekten verwenden.

  • Sie können von der strengen Versionierung profitieren, da eine Workflow-Version alle dazugehörigen Änderungen enthält.

  • Wenn dieselbe Logik in mehreren Workflow-Elementen benötigt wird, muss der dazugehörige Code dupliziert werden.

  • Der Entwicklungsmodus muss aktiviert sein, damit Änderungen sofort wirksam werden.

Workflow-Skript

Das Skript wird als Skript des Typs Workflow auf der Seite Skripte gespeichert. Das eingebettete Skript referenziert dieses Workflow-Skript.

  • Dasselbe Skript kann an verschiedenen Stellen des Workflows verwendet werden.

  • Änderungen am Skript werden unabhängig vom gewählten Deployment-Modus sofort wirksam.

  • Um die Workflow-Logik zu verstehen, muss ein zweites Skript überprüft werden.

  • Objekte, die in eingebetteten Skripten implizit verfügbar sind, müssen als Parameter an das Skript weitergegeben werden.

  • Um eine neue Workflow-Version produktiv zu nehmen, muss ein Szenario exportiert werden, dass sowohl Workflows als auch Skripte enthält.

Skripte werden in Groovy geschrieben. Da der Groovy-Code auf einer Java Virtual Machine ausgeführt wird, können Sie auch Java-Code schreiben. Mit Groovy-Code können Sie dynamische Typisierung verwenden und getter- und setter-Methoden auslassen, wodurch die Syntax kürzer wird. Die folgende Tabelle zeigt Beispiele für die Unterschiede zwischen Groovy und Java:

Ziel

Groovy

Java

Thema eines Vorgangs abrufen

def mysubject = ticket.subject

String mysubject = ticket.getSubject();

Hauptkontakt eines Vorgangs abrufen

def mymaincontact = ticket.mainContact

Unit mymaincontact = ticket.getMainContact();

Wert eines bestimmten Vorgangsfeldes aus einem Vorgang abrufen

def myprio = ticket.get("helpdesk_fields.prio")

String myprio = ticket.get("helpdesk_fields", "prio");

Thema eines Vorgangs setzen

ticket.subject = "asd"

ticket.setSubject("asd");

ConSol CM-API-Methoden

Die ConSol CM-API stellt verschiedene Convenience-Schnittstellen und -Methoden zur Verfügung, die den Zugriff auf häufig verwendete Objekte erleichtern. Die meisten dieser Convenience-Schnittstellen gehören zum Paket com.consol.cmas.common.service und dessen Unterpaketen.

Die implementierende Instanz der Schnittstelle ist immer verfügbar, indem Sie den Anfangsbuchstaben im Klassennamen, der ein Großbuchstabe ist, durch einen Kleinbuchstaben ersetzen. Verwenden Sie z. B. engineerService, wenn Sie Methoden der Schnittstelle EngineerService aufrufen möchten. Die einzige Ausnahme zu dieser Regel bildet die Klasse WorkflowContextService, deren Objekt workflowApi viele nützliche Methoden bietet.

Weitere Informationen zu den verfügbaren Klassen und Methoden finden Sie in der ConSol CM-API-Dokumentation.

Funktionen des Skripteditors

Der Skripteditor bietet die folgenden Funktionen:

Skript-Beispiele

Die folgenden Abschnitte enthalten kurze Beschreibungen der wichtigsten Aspekte beim Schreiben von Skripten. Größere Themen werden auf Unterseiten behandelt:

Referenzieren von Workflow-Elementen

Workflow-Elemente werden immer durch ihren Pfad referenziert. Der Pfad spiegelt die hierarchische Struktur des Workflows wieder. Er beginnt mit defaultScope und enthält die technischen Namen der Bereiche, in denen das Element liegt, sowie den technischen Namen des Elements.

Beispiel: Aktivität information_received im Unterbereich on_hold des Bereichs work_in_progress:

defaultScope/work_in_progress/on_hold/information_received

Sie können den Pfad über den Button Kopieren im Detailbereich des entsprechenden Elements kopieren.

Arbeiten mit Datenfeldern

Datenfelder werden immer über ihre technischen Namen nach dem folgenden Muster referenziert:

<ticket|unit|resource>.<get|set|add|remove>("<technischer Name der Feldgruppe>.<technischer Name des Feldes>")

Der Inhalt eines Datenfeldes hängt vom Datentyp ab. Er kann sowohl ein Wert als auch ein Objekt sein.

Details zu den verfügbaren Methoden für verschiedene Objekte und Feldtypen finden Sie in Verwenden von Datenfeldern in Skripten.

Verwenden von Datenfeldern als Variablen

Manchmal benötigen Sie Variablen, die für die Workflow-Programmierung erforderlich sind, aber nicht auf der Oberfläche des Web Clients und von CM/Track sichtbar sein sollen. Abhängig vom Objekt, für welches sie benötigt werden, können Sie Vorgangs-, Kontakt- oder Ressourcenfelder für diese Variablen verwenden.

  1. Erstellen Sie ein Datenfeld mit dem erforderlichen Datentyp.

  2. Setzen Sie Sichtbarkeit auf Nie, um das Feld auf der Oberfläche zu verbergen.

Arbeiten mit Benutzerdaten

Bei der Arbeit mit Benutzerdaten ist es oft nötig, zwischen dem aktuellen Benutzer, d. h. dem Benutzer, der angemeldet ist und die Aktion durchführt, die zur Ausführung des Skripts führt, und dem zugewiesenen Bearbeiter eines Vorgangs zu unterscheiden.

Anzeigen von Meldungen

Über Meldungen kann der Benutzer dynamische Informationen zum Prozess oder zu den eingegebenen Daten erhalten. Sie können in einer roten Box unterhalb der Menüleiste oder neben einem Vorgangsfeld in einem Aktivitätsformular angezeigt werden. Wenn die Meldung lokalisiert werden soll, ist es empfehlenswert, Bezeichnungen zu verwenden, siehe Bezeichnungen.

Arbeiten mit Overlays

Overlays bleiben während der gewählten Overlay-Gültigkeit am Vorgangs-Icon. Mit folgendem Code können Sie ein Overlay in einem Skript entfernen:

def si = ticket.scopeInfo

for (ov in si.getActivatedOverlays().toArray() ) {

if (ov.parent.name == "defaultScope/ServiceDeskTicketInProgressScope/Email_received") {

si.removeOverlay(ov)

}

}

Das Overlay wird mithilfe des Pfads der Aktivität, durch die es angehängt wurde, identifiziert.

Arbeiten mit System-Properties

Sie können Methoden der Klasse ConfigurationService verwenden, um den Wert von System-Properties abzurufen.

configurationService.getValue("module name","property name")

Arbeiten mit Textklassen

Für Protokolleinträge von Vorgängen können Sie Textklassen abrufen oder setzen.

Arbeiten mit Attachments

Mit den folgenden Methoden können Sie Attachments abrufen oder hinzufügen:

Ändern der Sichtbarkeit von Datenfeldgruppen

Sie können die Anzeige von Datenfeldgruppen mit der Einstellung Sichtbar steuern. Ein häufiger Anwendungsfall ist, Feldgruppen anfangs durch Setzen auf false zu verbergen, Aktivitätsformulare zu implementieren, in denen die Daten gefüllt werden, und die Feldgruppen danach auf der Oberfläche anzuzeigen. Indem bestimmte Feldern, nur dann angezeigt werden, wenn sie im Prozess benötigt werden, können die Vorgangsdaten kompakt gehalten werden.

Mit den folgenden Methoden können Sie die Sichtbarkeit von Vorgangsfeldgruppen steuern:

Suchen nach Objekten

Mit criteria-Objekte können Sie nach Vorgängen, Kontakten und Ressourcen suchen.

Das criteria-Objekt wird durch die verfügbaren Methoden zum Hinzufügen von einem oder mehreren Kriterien konfiguriert. Wenn Sie ein Datenfeld als Suchkriterium verwenden, muss das entsprechende Datenfeld indiziert sein.

Die Suchmethoden geben die kompletten Objekte zurück. Sie können daher sehr viel Speicherplatz verbrauchen, wenn Sie eine Suche durchführen. Wenn Sie lediglich die Anzahl der Objekte, die bestimmte Kriterien erfüllen, benötigen, können Sie stattdessen mit den Methoden getCountByCriteria() der gleichen Klassen arbeiten. Mit den Methoden getIdsByCriteria() können Sie auch nur die IDs der passenden Objekte abrufen.

Berücksichtigen von Vorgangs-Update-Events

Bestimmte Methoden führen zu sogenannten Update-Events (Klasse TicketUpdateEvent). Diese Update-Events können die System-Performance verringern. Daher sollten sie vermieden werden, wenn sie nicht unbedingt für den Geschäftsprozess nötig sind.

Beispiel: Benutzer einem Vorgang zuweisen

Update-Events treten außerdem auf, wenn ein Workflow-Element ausgeführt wird. Wenn Elemente verkettet sind, sollten Sie vermeiden, dass ein Update-Event nach jedem einzelnen Element ausgeführt wird. Markieren Sie die Checkbox Kein Update-Event für alle Elemente mit Ausnahme des letzten, damit der Vorgang nur einmal nach dem letzten Workflow-Element aktualisiert wird.

Hinzufügen von Log-Informationen

Mit folgender Syntax können Sie Log-Informationen zu Ihren Skripten hinzufügen:

log.info "This is my debug message."

Sie können Meldungen auch auf anderen Log-Leveln protokollieren, indem Sie log.debug, log.warn oder log.error verwenden. Die Log-Meldungen werden in die Datei server.log geschrieben.

Details zu den verfügbaren Log-Dateien und ihrer Konfiguration finden Sie in Log-Dateien.

Ändern des Ausführungsablaufs

Mit der Methode skipInterruptRestore() der Klasse ScopeInfo können Sie eine Trigger-Ausführung mit automatischen Aktivitäten als Exception statt als Interrupt behandeln. Diese Methode kann nur in automatischen Aktivitäten, die mit Triggern verbunden sind, verwendet werden. Wenn Sie sie zum Skript solch einer Aktivität hinzufügen, kehrt der Vorgang nicht zur ursprünglichen Aktivität, an der er sich vor dem Feuern des Triggers befand, zurück, sondern verbleibt im Ablauf der Aktivität, in der die Methode aufgerufen wird.

Damit können beispielsweise Workflows implementiert werden, bei denen der Vorgang von einem Trigger in einen Wartebereich verschoben wird, und dort verbleibt, bis ein anderer Trigger feuert.