Zur Erleichterung der Programmierung von ConSol CM-Skripten bietet die CM-Workflow-API einfachen Zugriff auf die häufig verwendeten Objekte. Zudem können verschiedene Objekte und Methoden über Convenience-Klassen und -Methoden auf kurzem Weg aufgerufen werden.
Einige Objekte sind in Workflow-Skripten implizit verfügbar.
Die gleichen Objekte sind in Admin-Tool-Skripten nicht implizit verfügbar, d. h. in Admin-Tool-Skripten müssen Sie für die entsprechenden Klassen oder Pakete Import-Anweisungen verwenden!
In jedem Workflow-Skript kann man über das Objekt ticket einfach auf das aktuelle Ticket zugreifen. Es leitet sich aus der Klasse Ticket ab und ist implizit verfügbar. Es sind kein Import und keine Instanziierung erforderlich.
Beispiel:
def myId = ticket.getId()
//or shorter, Groovy-like:
def myId = ticket.id
Code-Beispiel 16: Verwenden des Ticket-Objekts
Das Objekt workflowApi ist ebenfalls implizit vorhanden. Es bietet einfachen Zugriff auf das Interface WorkflowContextService, das für viele Operationen verwendet wird.
Beispiele:
workflowApi.createChildTicket(myticket, pTicketText, pCustomer)
Code-Beispiel 17: Verwenden von workflowApi zum Erstellen eines Child-Tickets
workflowApi.deactivateTimer("defaultScope/Service_Desk/TimeTrigger1")
Code-Beispiel 18: Verwenden von workflowApi zum Deaktivieren eines Triggers
workflowApi.addValidationError("1", "The ticket cannot be closed before a solution is provided. Please fill-in solution and mark it with text class SOLUTION first.")
Code-Beispiel 19: Verwenden von workflowAppi zum Anzeigen einer GUI-Meldung für den Bearbeiter
Dieses Objekt ist implizit in Skripten von Zeit-Triggern (Skript zu Beginn, Skript nach Ablauf) verfügbar.
def addedEscalMillis = 0
switch (ticket.queue.name) {
case "HelpDesk_1st_Level":
addedEscalMillis = 12*60*60*1000L;
break;
case "HelpDesk_2nd_Level":
addedEscalMillis = 24*60*60*1000L;
break;
case "ServiceDesk":
addedEscalMillis = 4*60*60*1000L;
}
trigger.setDueTime(addedEscalMillis)
Code-Beispiel 20: Beispiel für ein Skript zu Beginn
Die ConSol CM-API bietet verschiedene Convenience-Interfaces und -Methoden, die den Zugriff auf die meisten Objekte der alltäglichen CM-Programmierung deutlich vereinfachen. Die meisten dieser Convenience-Interfaces gehören zum Paket com.consol.cmas.common.service und seinen Unterpaketen. Details dazu finden Sie in der ConSol CM-Java-API-Dokumentation. An dieser Stelle zeigen wir Ihnen einige Beispiele, die für die meisten CM-Programmierer nützlich sein können.
Die implementierende Instanz des Interface ist immer verfügbar, indem Sie den ersten Buchstaben (ein Großbuchstabe) im Klassennamen durch einen Kleinbuchstaben ersetzen, z. B. das Objekt (Singleton) mit dem Interface EngineerService ist mit dem Objekt engineerService verfügbar, siehe Beispiel 2.
def tic_nr = configurationService.getValue("custom-mycompany-properties","engineer_management.ticket.nr")
// then: ... do something with the engineer management ticket,
// e.g. find out the name of the next engineer a service ticket
//should be assigned
Code-Beispiel 21: Verwenden von ConfigurationService zum Abrufen der Nummer des Bearbeiterverwaltungs-Tickets
def baseUrl = configurationService.getValue("custom-mycompany-properties","base.url.mycompany")
def url = baseUrl + "/cm-client/ticket/ticket_name/" + ticket.getName()
def itComplete = url + " " + ticket.getName()
//alternative: def itComplete = "${url} ${ticket.name}"
// ... do something with the ticket url, e.g. place a link to a child ticket in a table of the parent ticket
Code-Beispiel 22: Verwenden von ConfigurationService zum Abrufen der Basis-URL des Systems
In vielen Prozessen ist es erforderlich, das Ticket dem Bearbeiter zuzuweisen, der die Workflow-Aktivität Ticket annehmen (oder ähnlich) ausführt. Dafür können Sie folgenden Code verwenden.
// retrieve the engineer who is currently logged in and who is executing the workflow activity
def eng = ticketService.current
//assign the current ticket to the current engineer:
ticket.engineer = eng
Code-Beispiel 23: Zuweisen des Tickets an den aktuell angemeldeten Bearbeiter
// Script does the following:
// Hand-over ticket to approver only when approver has been set in ticket as additional engineer
// Import package, because classes are not available in workflow otherwise:
import com.consol.cmas.common.model.ticket.user.function.*
// Get the name of the approver which has been written/stored in a Custom Field, // namely the field with the name
// CF_ApproverName in the Custom Field Group CF_GroupApproverData. The value could be for example Mr. Miller:
def gen = ticket.get("CF_GroupApproverData.CF_ApproverName").getName()
// Get the engineer object where the name Mr. Miller is set, i.e.
// the engineer object of the desired approver:
def gen_eng = engineerService.getByName(gen)
// Get the ticketFunction object which represents the ticketFunction (engineer role) Approver:
TicketFunction tf = ticketFunctionService.getByName("Approver")
// Add the engineer object of Mr. Miller as Approver. i.e.
// in the ticketFunction (engineer role) Approver to the ticket.
// One of the paramaters is ticket. This does not have to be instantiated,
// because it is implicitly present in workflow
// scripts:
def tu = ticketUserService.addTicketUser(ticket, gen_eng, tf, "Approver")
// Assign the ticket to the engineer, i.e. set the engineer Mr. Miller also as ticket owner.
def tic2 = workflowApi.assignEngineer(ticket, gen_eng)
Code-Beispiel 24: Verwendung von EngineerService
Es gibt zwei Zuweisungen:
def enumValueMLA = enumService.getValueByName( "priority", "REGULAR" )
ticket.set( "helpdesk_fields.prio", enumValueMLA )
Code-Beispiel 25: Verwenden von EnumService zum Abrufen eines Enum-Werts über den Namen
List<Ticket> mylist = ticketService.getByView(new ViewCriteria(
viewService.getByName("helpdesk_active_tickets"),
ViewAssignmentParameter.allAssignedTickets(),
ViewGroupParameter.allTickets(),
viewOrderParameter.addByName(true)))
Code-Beispiel 26: Verwenden von TicketService zum Finden der Tickets einer Sicht
// Send e-mail to all engineers of a regular role
def mail = new Mail()
mail.setTo(engineerRoleRelationService.getEngineersWithRoles(roleService.getByName("Supervisor"))*.email.join(","))
mail.setSubject("Ticket (${ticket.name}) -- Escalation!")
mail.setText(workflowApi.renderTemplate("Ticket escalation note to supervisor"))
mail.send()
Code-Beispiel 27: Verwenden von EngineerRoleRelationService zum Senden einer E-Mail an alle Bearbeiter einer Rolle