Das ConSol CM Action Framework bietet die Möglichkeit, Aktionen zu starten, die sich nicht auf Workflow-Aktivitäten beziehen, d. h. Aktionen können in einem anderen Kontext als im Workflow-Kontext gestartet oder angestoßen werden.
Das Action Framework besteht (in ConSol CM-Version 6.10) aus drei Komponenten, die in den entsprechenden Handbuchabschnitten detailliert beschrieben sind.
Im vorliegenden Abschnitt erfahren Sie mehr über die Programmierung mit dem Action Framework.
Jede Aktion basiert auf einem Admin-Tool-Skript, wie in den oben erwähnten Abschnitten beschrieben. Für jedes Admin-Tool-Skript muss der richtige Skripttyp gesetzt werden.
Beachten Sie, dass für jedes Ausführungsskript ein Bedingungsskript definiert werden kann. Es muss im Admin Tool in der Definition der Aktion mit dem Ausführungsskript verknüpft werden. Das Bedingungsskript wird vor dem Ausführungsskript ausgeführt.
Daher wird das Ausführungsskript nur ausgeführt, wenn entweder
oder
Es stehen folgende Skripttypen für das Action Framework zur Verfügung:
Der Rückgabewert eines Bedingungsskripts muss entweder true oder false sein.
Der Rückgabewert eines manuellen Ausführungsskripts muss einer der folgenden PostActionTypes sein:
Eine detaillierte Beschreibung finden Sie im folgenden Abschnitt.
Eine Aktion kann von einem der folgenden Typen sein:
Eine Kernkomponente der Programmierungsskripte für manuelle Aktionen im ConSol CM Action Framework ist die Klasse ActionScriptResultFactory. Alle Instanzen dieser Klasse stehen in jedem Ausführungsskript als actionScriptResultFactory zur Verfügung. Der Typ des zurückgegebenen PostActionScriptResult, d. h. der PostActionType, definiert den Schritt, der direkt auf die Ausführung eines manuellen Ausführungsskripts folgt. Mithilfe des PostActionType können Sie das gewünschte Systemverhalten implementieren.
return actionScriptResultFactory.getPostAction(PostActionType.CREATE_TICKET, ticket, unit)
Leitet auf die Seite Neues Ticket weiter, auf der Felder mit Ticketdaten gefüllt sind und eine vorhandene Unit als Hauptkontakt ausgewählt ist.
Beispiel:
import com.consol.cmas.core.server.service.action.PostActionType
import com.consol.cmas.common.model.ticket.Ticket
Ticket ticket = new Ticket();
ticket.setQueue(queueService.getByName("Helpdesk"))
ticket.setSubject("sample subject")
ticket.set("queue_fields.string", "test")
ticket.set("queue_fields", "boolean", "true")
return actionScriptResultFactory.getPostAction(PostActionType.CREATE_TICKET, ticket)
//to additionally set main contact use
//return actionScriptResultFactory.getPostAction(PostActionType.CREATE_TICKET, ticket, unit)
Code-Beispiel 66: Öffnen der Seite Neues Ticket
Beispiel:
UnitCriteria unitCriteria = new UnitCriteria();
Unit companyPattern = new Unit("company", customerGroup);
mdcmCriteriaBuilder.setReferencedCompanyCriteria(unitCriteria, companyPattern);
Code-Beispiel 67: Öffnen der Ticketseite im Anzeigemodus
ActivityControlFormService.getExecutionContext(Ticket, String)
aufgerufenes Aktivitäts-Formular.Beispiel:
(...)
def executionContext = activityFormDefinitionService.getExecutionContext(newtic, "defaultScope/TaskInProgress/AcceptTask")
if (!executionContext) {
return actionScriptResultFactory.getPostAction(PostActionType.FAILURE, "action.fail.wrong.activity")
}
// Modify entities from the execution context - not the original ones
// - since the user may still press cancel.
executionContext.ticket.add("SpecialTasks_Fields","Deadline", new Date());
return actionScriptResultFactory.getPostAction(PostActionType.GOTO_TICKET, newtic, executionContext);
Code-Beispiel 68: Öffnen der Ticketseite im Anzeigemodus, nach Anzeige eines ACFs
Beachten Sie Folgendes: Die Implementierungsklasse für das Bean activityFormDefinitionService ist ActivityControlFormService. Weitere Informationen dazu finden Sie in der Dokumentation der Klasse. Die Verwendung in Skripten erfolgt über den Bean-Namen, siehe obiges Skript.
Beispiel:
import com.consol.cmas.common.model.customfield.Unit
import com.consol.cmas.core.server.service.action.PostActionType
Unit contact = new Unit("customer", unit.getCustomerGroup());
contact.set("firstname", "Luke");
contact.set("name", "Skywalker");
return actionScriptResultFactory.getPostAction(PostActionType.CREATE_UNIT, contact);
Code-Beispiel 69: Unit-Ausführungsskript (Kunde implizit verfügbar), um die Seite Neuer Kunde zu öffnen
Beispiel:
import com.consol.cmas.common.model.customfield.Unit
import com.consol.cmas.core.server.service.action.PostActionType
Unit contact = unitService.getByCustomerGroup(unit.getCustomerGroup()).get(0)
return actionScriptResultFactory.getPostAction(PostActionType.GOTO_UNIT, contact)
Code-Beispiel 70: Unit-Ausführungsskript (Unit implizit verfügbar), um die Kundenseite im Anzeigemodus zu öffnen
Beispiel:
import com.consol.cmas.common.model.resource.Resource
import com.consol.cmas.common.model.resource.meta.ResourceType
import com.consol.cmas.core.server.service.action.PostActionType
ResourceType type = resourceTypeService.getByName("resource type 1")
Resource resource = new Resource(type)
resource.setFieldValue("group1", "stringField1", "value1")
resource.setFieldValue("group2", "numberField1", 1L)
return actionScriptResultFactory.getPostAction(PostActionType.CREATE_RESOURCE, resource)
Code-Beispiel 71: Öffnen der Seite Neue Ressource
Beispiel:
import com.consol.cmas.common.model.resource.Resource
import com.consol.cmas.core.server.service.action.PostActionType
Resource resource = resourceService.getAll().iterator().next()
return actionScriptResultFactory.getPostAction(PostActionType.GOTO_RESOURCE, resource);
Code-Beispiel 72: Öffnen einer Ressourcenseite im Anzeigemodus
Beispiel:
import com.consol.cmas.core.server.service.action.PostActionType
return actionScriptResultFactory.getPostAction(PostActionType.GOTO_PAGE, "http://consol.de");
Code-Beispiel 73: Öffnen einer URL
Eine detaillierte Beschreibung finden Sie im Abschnitt Rückgabewerte und Rückgabemeldungen.
Eine detaillierte Beschreibung finden Sie im Abschnitt Rückgabewerte und Rückgabemeldungen.
Um den Rückgabewert einer ConSol CM-Aktion für den Bearbeiter im Web Client anzuzeigen, müssen Sie einen der beiden PostActionTypes verwenden:
Sie müssen für jedes Ausführungsskript einen Rückgabewert setzen. Es ist nicht möglich, ein Ausführungsskript ohne Rückgabewert zu beenden (in diesem Fall tritt ein Laufzeitfehler auf).
Beispiel für positives Feedback:
return actionScriptResultFactory.getPostAction(PostActionType.SUCCESS, "cmweb.search.assigned").withRefreshContent();
Abbildung 404: ConSol CM Web Client - Erfolgsmeldung nach Suche-Aktion
Beispiel für negatives Feedback:
return actionScriptResultFactory.getPostAction(PostActionType.FAILURE, "cmweb.search.assigned").withRefreshContent();
Abbildung 405: ConSol CM Web Client - Fehlermeldung nach Suche-Aktion
Der angezeigte Text (z. B. Aktion erfolgreich oder Aktion gescheitert) kann mit einer der folgenden beiden Methoden abgerufen werden:
action.result.success=Action succeeded
action.result.failure=Aktion gescheitert
Sie können Ihre eigenen Labels für die Anzeige von Meldungen im Web Client definieren. Eine detaillierte Erklärung dazu finden Sie im Abschnitt Bezeichnungen.
Relationsaktionen sind in den CM-Versionen 6.10.5.4 und höher verfügbar. Sie sind für die drei wichtigsten Objekttypen verfügbar und werden im Admin Tool in den entsprechenden Navigationselementen definiert. Detaillierte Erklärungen finden Sie in den entsprechenden Abschnitten dieses Handbuchs.
Eine Relationsaktion wird ausgeführt, wenn die Relation
wird. Sie wird nicht ausgeführt, wenn der Kommentar einer Relation geändert wird.
Bedenken Sie, dass eine Relationsaktion immer ausgeführt wird, wenn der Objekttyp, für den die Relation definiert ist, beteiligt ist. Das bedeutet, dass zwei Aktionen ausgeführt werden, wenn sowohl das Quell- als auch das Zielobjekt zu einem Typ mit einer Relationsaktion gehören.
In Skripten, die Relationsaktionen definieren, sind folgende Objekte verfügbar:
Beachten Sie, dass es in CM-Version 6.10.5.4 nicht möglich ist, innerhalb eines Relationsaktions-Skripts zwischen den Vorgängen ERSTELLEN und LÖSCHEN zu unterscheiden.
Im folgenden Beispiel soll die Person, die der Ansprechpartner für eine SLA ist, eine E-Mail erhalten, wenn eine neue Relation zwischen der SLA und einem Kunden erstellt wird, oder eine vorhandene Relation gelöscht wird.
Gehen Sie folgendermaßen vor:
Beispiel für Relationsaktions-Skript SLA_CompanyRelationAction.groovy:
import com.consol.cmas.common.model.mail.MailSendHolder
log.info 'SLA to company relation action has been triggered!'
def myUnit = relation.targetUnit
def myUnitDef = relation.targetUnit.definition.name
log.info 'myUnitDef is ' + myUnitDef
def nameField
def groupField
switch(myUnitDef) {
case "ResellerCompany": nameField = "company_name";
break;
case "company": nameField = "name1";
break;
case "DirCustCompany": nameField = "dir_cust_company_name"
break;
}
def myCustName = myUnit.get(nameField)
log.info 'customer name is ' + myCustName
def contPersMail = resource.get("SLA_Fields_basic.responsible_person_email")
if (contPersMail) {
log.info ' Email about SLA will be sent to ' + contPersMail
// Send an email asynchronuously. Mail object is not available outside workflow context!
def pResName = resource.get("SLA_Fields_basic.SLA_Name")
// alternative to fixed text: use text template
def pText = "A relation has been modified from resource " + pResName + " to company " + myCustName
def pTo = contPersMail
def pSubject = " new or deleted SLA relation - please take care"
def pHtml = false
def pFromEmail = configurationService.getValue("cmweb-server-adapter","mail.reply.to")
def holder = MailSendHolder.createSelfSendHolder(pText, pHtml, null, null)
holder.setSubject(pSubject)
holder.setTo(pTo)
holder.setFrom(pFromEmail)
mailService.sendMailAsynchronous(holder)
} else {
log.info 'No mail sent to SLA contact person, no email address found'
}
Code-Beispiel 74: Relationsaktions-Skript, mit dem eine E-Mail gesendet wird, wenn eine Relation zwischen Ressource und Firma erstellt oder gelöscht wird