CM.Resource Pool - Ressourcenaktionen

Einleitung

Ressourcenaktionen sind Teil des ConSol CM Action Frameworks. Ressourcenaktionen sind Aktionen, die für eine Ressource ausgeführt werden, d. h. für ein im Ressourcenpool gespeichertes Objekt. Die Aktionen können automatisch vom System durchgeführt werden oder manuell von einem Bearbeiter mit den entsprechenden Berechtigungen angestoßen werden. Mögliche Anwendungsfälle für Ressourcenaktionen sind beispielsweise:

Sie können folgende Typen von Ressourcenaktionen verwenden:

Beachten Sie, dass nur Bearbeiter, die mindestens eine Rolle mit den folgenden Zugangsberechtigungen für den entsprechenden Ressourcentyp haben, die Ressourcenaktionen verwenden dürfen, d. h. nur bei ihnen werden die Aktivitäten im Web Client angezeigt!

Abbildung 551: ConSol CM Web Client - Ressourcenaktion (auf der Ressourcenseite)

Ressourcenaktionen werden als Groovy-Skripte definiert, die im Abschnitt Skripte und Templates des Admin Tools gespeichert werden.

Die Ausführung von Ressourcenaktionen kann mit Bedingungsskripten gesteuert werden, d. h. Sie können ein Bedingungsskript implementieren, das vor der Ressourcenaktion selber ausgeführt wird. Das Ausführungsscript wird nur ausgeführt, wenn das Bedingungsskript true zurückgibt.

Es gibt also zwei Arten von Skripten, mit denen Sie im Zusammenhang mit ConSol CM-Ressourcenaktionen arbeiten:

Führen Sie zur Implementierung einer Ressourcenaktion folgende drei Schritte durch:

  1. Erstellen Sie ein Skript für die Ressourcenaktion (entweder nur ein Ausführungsskript oder ein Ausführungsskript und ein Bedingungsskript).
  2. Erstellen Sie die Ressourcenaktionen, die die Skripte verwenden.
  3. Weisen Sie die Ressourcenaktionen den Ressourcentypen zu, in denen sie verfügbar sein sollen.

In den folgenden Abschnitten sind diese drei Schritte detailliert beschrieben.

Erstellen von Ressourcenaktionen mit dem Admin Tool

Schritt 1: Schreiben des Ressourcen-Ausführungsskripts

Erstellen Sie ein neues Admin-Tool-Skript des Typs Ressourcen-Aktion. Falls erforderlich, erstellen Sie ein anderes Skript des Typs Ressourcen-Bedingung.

Eine detaillierte Beschreibung der Admin-Tool-Skripte finden Sie im Abschnitt Admin-Tool-Skripte.

Abbildung 552: ConSol CM Admin Tool - Ressourcen-Ausführungsskripte im Bereich Skripte

// this script creates a new ticket for the resource from which the activity is executed, i.e., creates new ticket and links it to resource

// resource - ticket relation must be configured beforehand!

 

import com.consol.cmas.common.model.ticket.Ticket

import com.consol.cmas.common.model.customfield.Unit

import com.consol.cmas.common.model.resource.*

import com.consol.cmas.common.service.resource.*

import com.consol.cmas.common.model.ticket.Queue

import com.consol.cmas.common.model.resource.meta.*

 

println 'CreateTicketForResource.groovy started ...'

 

Ticket newtic = new Ticket()

 

Queue qu = queueService.getByName("ServiceDesk")

newtic.setQueue(qu)

 

newtic.setSubject("New Ticket for Resource: " + resource.getId())

newtic.set("helpdesk_standard.priority","low")

 

// use main contact person of the resource as main contact for the ticket

Unit maincont = new Unit()

def crit = new ResourceRelationWithTargetUnitCriteria()

crit.setResource(resource)

List<ResourceRelationWithTargetUnit> cont_list = resourceRelationService.getByCriteria(crit)

if (cont_list.size() == 0) {

//cmweb.rp.resource.action.no_contact_set has to be configured as label in the AT

return actionScriptResultFactory.getPostAction(PostActionType.FAILURE, "cmweb.rp.resource.action.no_contact_set")

} else {

def cont_rel = cont_list[0]

maincont = cont_rel.getTargetUnit()

}

 

ticketService.createWithUnit(newtic,maincont)

 

println 'New Ticket created for resource with ID' + resource.getId()

 

// link ticket to resource

 

def resRelationDefCriteria = new ResourceRelationDefinitionCriteria()

resRelationDefCriteria.addDefinitionName("PC_Desktop_to_Ticket_Relation")

def s_res_type = resource.getResourceType()

resRelationDefCriteria.addSourceResourceType(s_res_type)

resRelationDefCriteria.addTargetQueue(qu)

 

//log.info "resRelationDefCriteria = " + resRelationDefCriteria

//log.info "resRelationDefCriteria.definitionName = " + resRelationDefCriteria.getDefinitionsNames()

 

def resRelationDef = resourceRelationDefinitionService.getByCriteriaUniqueResult(resRelationDefCriteria)

def resRelation = new ResourceTicketRelation(resRelationDef, resource, newtic)

// log.info "resRelation" + resRelation

resourceRelationService.create(resRelation)

Code-Beispiel 83: Ressourcen-Ausführungsskript

Schritt 2: Erstellen der Ressourcenaktionen, die das Skript verwenden

Öffnen Sie zum Erstellen, Editieren oder Löschen von Ressourcenaktionen das Navigationselement Aktionen der Navigationsgruppe Ressourcen im Admin Tool.

Um eine neue Aktion zu erstellen oder hinzuzufügen, klicken Sie auf den Button Hinzufügen und geben Sie die erforderlichen Daten im Pop-up-Fenster ein. Es wird das gleiche Pop-up-Fenster für das Hinzufügen und das Editieren von einer Ressourcenaktion angezeigt.

Abbildung 553: ConSol CM Admin Tool - Erstellen einer Ressourcenaktion

Speichern Sie die Aktion. Danach können Sie sie Ressourcentypen zuweisen. Siehe folgenden Schritt.

Schritte 3: Zuweisen von Ressourcenaktionen zu Ressourcentypen

Um bereits definierte Ressourcen-Ausführungs- und/oder Ressourcen-Bedingungsskripte den Ressourcentypen zuzuweisen, müssen die entsprechenden manuellen oder automatischen Aktionen einem Ressourcentyp zugewiesen werden. Öffnen Sie das Navigationselement Datenmodelle der Navigationsgruppe Ressourcen im Admin Tool. Wählen Sie den Ressourcentyp, den Sie editieren möchten, und klicken Sie auf den Button Bearbeiten, um das Pop-up-Fenster zu öffnen, in dem Sie die Ressourcenaktionen zuweisen können. Eine Aktion kann nur ein Ressourcen-Ausführungsskript enthalten oder sowohl ein Ressourcen-Ausführungsskript als auch ein Ressourcen-Bedingungsskript.

Im folgenden Beispiel (nächste Abbildung) wird eine manuelle Ressourcenaktion dem Ressourcentyp PC_Desktops zugewiesen.

Abbildung 554: ConSol CM Admin Tool - Zuweisen von manuellen Ressourcenaktionen zu einem Ressourcentyp

Sie können Ressourcenaktionen folgender Aktionstypen zuweisen:

Verwendung von Ressourcenaktionen im Web Client (als Bearbeiter)

Als Bearbeiter (Benutzer) sind die beiden Ressourcenaktionstypen relevant für Sie, die als Aktivitäten im Web Client angezeigt werden:

Die Aktionen Löschen, Aktualisieren und Erzeugen laufen im Hintergrund.

Programmieren von Ressourcen-Ausführungs- und Bedingungsskripten

Eine allgemeine Einführung in die Grundprinzipien, Klassen und Methoden für Ausführungs- und Bedingungsskripte finden Sie im Abschnitt Skripte für das Action Framework.

Beispiele für Ressourcenaktionen

Beispiel 1: Einfache manuelle Aktion

Anwendungsfall: Der Bearbeiter soll in der Lage sein, ein neues ServiceDesk-Ticket direkt auf der Ressourcenseite eines PCs zu erstellen. Das neue Ticket soll mit der Ressource (PC) verknüpft sein. Der Hauptkontakt des neuen ServiceDesk-Tickets soll die für den PC verantwortliche Person sein. Dies wird als Ressource-Kontakt-Relation im Ressourcentyp PC_Desktop implementiert. Um die Ressourcenaktion zu implementieren, führen Sie folgende Schritte durch.

Schreiben Sie das Ressourcen-Ausführungsskript:

// this script creates a new ticket for the resource from which the activity is executed, i.e., creates new ticket and links it to resource

// resource - ticket relation must be configured beforehand!

 

import com.consol.cmas.common.model.ticket.Ticket

import com.consol.cmas.common.model.customfield.Unit

import com.consol.cmas.common.model.resource.*

import com.consol.cmas.common.service.resource.*

import com.consol.cmas.common.model.ticket.Queue

import com.consol.cmas.common.model.resource.meta.*

import com.consol.cmas.core.server.service.action.*

 

println 'CreateTicketForResource.groovy started ...'

 

Ticket newtic = new Ticket()

 

Queue qu = queueService.getByName("ServiceDesk")

newtic.setQueue(qu)

 

 

def subj = resource.get("PC_Desktop_Fields_basic.name")

 

// newtic.setSubject("New Ticket for Resource: " + resource.getId())

newtic.setSubject("New Ticket for Resource: " + subj)

 

newtic.set("helpdesk_standard.priority","low")

 

// use main contact person of the resource as main contact for the ticket

Unit maincont = new Unit()

def crit = new ResourceRelationWithTargetUnitCriteria()

crit.setResource(resource)

List<ResourceRelationWithTargetUnit> cont_list = resourceRelationService.getByCriteria(crit)

if (cont_list.size() == 0) {

workflowApi.addValidationError("ERRROR","No contact set!")

} else {

def cont_rel = cont_list[0]

maincont = cont_rel.getTargetUnit()

}

 

ticketService.createWithUnit(newtic,maincont)

 

println 'New Ticket created for resource with ID' + resource.getId()

 

// link ticket to resource

 

def resRelationDefCriteria = new ResourceRelationDefinitionCriteria()

resRelationDefCriteria.addDefinitionName("PC_Desktop_to_Ticket_Relation")

def s_res_type = resource.getResourceType()

resRelationDefCriteria.addSourceResourceType(s_res_type)

resRelationDefCriteria.addTargetQueue(qu)

 

log.info "resRelationDefCriteria = " + resRelationDefCriteria

log.info "resRelationDefCriteria.definitionName = " + resRelationDefCriteria.getDefinitionsNames()

 

def resRelationDef = resourceRelationDefinitionService.getByCriteriaUniqueResult(resRelationDefCriteria)

def resRelation = new ResourceTicketRelation(resRelationDef, resource, newtic)

log.info "resRelation" + resRelation

resourceRelationService.create(resRelation)

 

// go to new ticket

return actionScriptResultFactory.getPostAction(PostActionType.GOTO_TICKET, newtic)

Code-Beispiel 84: Ressourcen-Ausführungsskript für PC_Desktops zur Erstellung eines neuen ServiceDesk-Tickets für den Kontakt, der für den PC zuständig ist

Erstellen Sie eine Ressourcenaktion, die auf dem Skript basiert:

Abbildung 555: ConSol CM Admin Tool - Erstellen einer Ressourcenaktion

Weisen Sie die Aktion dem richtigen Ressourcentyp zu:

Abbildung 556: ConSol CM Admin Tool - Zuweisen der Ressourcenaktion zum richtigen Ressourcentyp

Überprüfen Sie die Funktion mit dem Web Client:

Abbildung 557: ConSol CM Web Client - Ressourcenseite mit der Ressourcenaktion

Abbildung 558: ConSol CM Web Client - Mit der Ressourcenaktion erstelltes, neues ServiceDesk-Ticket

Abbildung 559: ConSol CM Web Client - Ressourcenseite mit einer oder mehreren Ticketrelationen (neues ServiceDesk-Ticket)

Beispiel 2: Öffnen eines Wartungstickets aus einer Ressource, mit ACF

Das Action Framework bietet die Möglichkeit, ein ACF (Activity Control Form) zu öffnen, wenn ein Ticket erstellt wird. Mit dem ACF werden Daten für die folgende Workflow-Aktivität gesammelt, d. h. das Ticket kann erstellt und einfach durch den ersten Workflow-Schritt bewegt werden. Diese Funktion wird im folgenden Beispiel dargestellt. Für die Ressource HP-Drucker soll ein Wartungsticket erstellt werden. Während dieses Vorgangs soll ein ACF geöffnet werden, um nach Daten zu fragen, die danach in der nächsten Workflow-Aktivität verwendet werden.

Um die Ressourcenaktion zu implementieren, führen Sie folgende Schritte durch.

Schreiben Sie das Ressourcen-Ausführungsskripts:

// this script creates a new ticket for the resource from which the activity is executed, i.e., creates new ticket and links it to resource

// resource - ticket relation must be configured beforehand!

// CreateTicketForHP_PrinterWithACF.groovy

 

import com.consol.cmas.common.model.ticket.Ticket

import com.consol.cmas.common.model.customfield.Unit

import com.consol.cmas.common.model.resource.*

import com.consol.cmas.common.service.resource.*

import com.consol.cmas.common.model.ticket.Queue

import com.consol.cmas.common.model.resource.meta.*

import com.consol.cmas.core.server.service.action.*

import com.consol.cmas.common.service.*

 

println 'CreateTicketForHP_PrinterWithACF.groovy started ...'

 

Ticket newtic = new Ticket()

 

Queue qu = queueService.getByName("SpecialTasks")

newtic.setQueue(qu)

 

newtic.setSubject("New Ticket for HP Printer: " + resource.getId())

newtic.set("SpecialTasks_Fields.SpecialTasksPrio","normal")

 

// use main contact person of the resource as main contact for the ticket

Unit maincont = new Unit()

def crit = new ResourceRelationWithTargetUnitCriteria()

crit.setResource(resource)

List<ResourceRelationWithTargetUnit> cont_list = resourceRelationService.getByCriteria(crit)

if (cont_list.size() == 0) {

log.info("ERRROR in script CreateTicketForHP_PrinterWithACF -- No contact set!")

} else {

def cont_rel = cont_list[0]

maincont = cont_rel.getTargetUnit()

}

 

ticketService.createWithUnit(newtic,maincont)

 

println 'New Ticket created for resource with ID' + resource.getId()

 

// link ticket to resource

 

def resRelationDefCriteria = new ResourceRelationDefinitionCriteria()

resRelationDefCriteria.addDefinitionName("HP_Printer_ToTicket_Relation")

def s_res_type = resource.getResourceType()

resRelationDefCriteria.addSourceResourceType(s_res_type)

resRelationDefCriteria.addTargetQueue(qu)

 

log.info "resRelationDefCriteria = " + resRelationDefCriteria

log.info "resRelationDefCriteria.definitionName = " + resRelationDefCriteria.getDefinitionsNames()

 

def resRelationDef = resourceRelationDefinitionService.getByCriteriaUniqueResult(resRelationDefCriteria)

def resRelation = new ResourceTicketRelation(resRelationDef, resource, newtic)

log.info "resRelation" + resRelation

resourceRelationService.create(resRelation)

 

// go to new ticket, but fill ACF before

 

def executionContext = activityFormDefinitionService.getExecutionContext(newtic, "defaultScope/TaskInProgress/Aufgabe_annehmen")

 

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 85: Ressourcen-Ausführungsskript, das ein Ticket mit ACF öffnet

Erstellen Sie eine Ressourcenaktion, die auf dem Skript basiert.

Abbildung 560: ConSol CM Admin Tool - Erstellen der Ressourcenaktion für das HP-Drucker-Wartungsticket

Weisen Sie die Aktion dem richtigen Ressourcentyp zu:

Abbildung 561: ConSol CM Admin Tool - Zuweisen der Ressourcenaktion zum richtigen Ressourcentyp (HP-Drucker)

Überprüfen Sie die Funktion mit dem Web Client:

Abbildung 562: ConSol CM Web Client - Ressourcenaktion für HP-Drucker

Abbildung 563: ConSol CM Web Client - Neues Wartungsticket für Ressource (HP-Drucker), ACF

Arbeiten mit dem Changes-Objekt in Ressourcenaktionen des Typs Aktualisieren

Ab CM-Version 10.5.4 ist es möglich, die Änderungen zu überwachen, die während einer Aktion zur Ressourcenaktualisierung durchgeführt wurden. (Dasselbe gilt für Aktionen zur Unit-Aktualisierung, siehe Arbeiten mit dem Changes-Objekt in Kundenaktionen des Typs Aktualisieren).

Mit dem Objekt der Klasse ResourceChanges in Ressourcenaktionen können Sie herausfinden, welche Änderungen erfolgt sind.

Denken Sie daran, dass das Skript Aktualisieren in folgenden Fällen ausgeführt wird:

Es gibt zwei Methoden des ResourceChanges-Objekts, die Informationen über die geänderten Daten bereitstellen: 

Da die Rückgabeparameter der Methode ziemlich komplexe Bestandteile haben, empfehlen wir, die API Doc der Klasse ResourceChanges zu lesen. Das folgende Codebeispiel enthält ein Skript, in dem das ResourceChanges-Objekt verwendet wird.

/**

* Available script variables:

* Manual action:

* resource - Resource for which action is executed

*

* Create, Delete Action:

* resource - Resource for which action is executed

*

* Update Action:

* resource - Resource for which action is executed

* changes - ResourceChanges object containing information about changes done for resource entity

*

* Relation action:

* resource - Resource for which action is executed (resource-resource)

* relation - Relation object

* resourceExternalId - External resource id (resource, unit, ticket - ext resource)

*/

 

// Update Action Script displayPC_DesktpChangesInLog.groovy for resources in PC_Desktops

 

import com.consol.cmas.common.model.content.unit.UnitCommentEntry

import com.consol.cmas.common.model.content.unit.UnitAttachmentEntry

 

log.info 'Resource (PC_Desktop) data have been UPDATEd!'

// Are there any changes?

if (changes) {

log.info 'Yes, changes have been made to unit'

log.info 'Changes object is a ' + changes.class

}

 

// Have Custom Fields been changed? If yes - which?

if (changes.customFieldChangeInfo) {

log.info 'Yes, changes have been made to Custom Fields (Resource Fields)'

log.info changes.customFieldChangeInfo

log.info changes.customFieldChangeInfo.each { k, v ->

log.info "Changed field: ${k.groupName}/ ${k.fieldName}"

log.info "New value: ${v.value.value}"

log.info "Old value: ${v.previousValue.value}"

}

} else {

log.info 'No changes to Custom Fields'

}

 

// Have comments or attachmenst been changed? If yes - which?

 

log.info changes.contentChangeInfo

 

if (changes.contentChangeInfo){

log.info 'Yes, changes have been made in detail section'

if (changes.contentChangeInfo.value){

log.info changes?.contentChangeInfo.each { ctEntry ->

if (ctEntry?.value[0] instanceof UnitCommentEntry){

log.info 'A comment has been added.'

log.info 'Old value: ' + ctEntry?.previousValue

log.info 'New value: ' + ctEntry.value[0]?.text

log.info 'Made by the engineer ' + ctEntry.value[0]?.engineer?.name

log.info 'Creation date of the comment: ' + ctEntry.value[0]?.creationDate

} else if (ctEntry?.value[0] instanceof UnitAttachmentEntry){

log.info 'An attachment has been added.'

log.info 'Old value: ' + ctEntry?.previousValue

log.info 'New value text: ' + ctEntry.value[0]?.text

log.info 'New value file name: ' + ctEntry.value[0]?.filename

}

}

} else {

log.info 'Entry has been deleted.'

}

}

Code-Beispiel 86: Ressourcen-Aktualisierungsskript, in dem Änderungen überwacht und in die Datei server.log geschrieben werden

Wenn bei einer Ressource des Typs PC_Desktops der Inhalt der Ressourcenfelder modell und name geändert wird, wird folgender Text in die Datei server.log geschrieben.

PC_DesktpChangesInLog.groovy] [Susan-] Resource (PDC_Desktop) data have been UPDATEd!

PC_DesktpChangesInLog.groovy] [Susan-] Yes, changes have been made to unit

PC_DesktpChangesInLog.groovy] [Susan-] Changes object is a class com.consol.cmas.common.model.resource.history.ResourceChanges

PC_DesktpChangesInLog.groovy] [Susan-] Yes, changes have been made to Custom Fields (Resource Fields)

PC_DesktpChangesInLog.groovy] [Susan-] {(modell,PC_Desktop_Fields_basic)=Modification{value=AbstractField{key=(modell,PC_Desktop_Fields_basic), value=Computer-0815-01}, previousValue=AbstractField{key=(modell,PC_Desktop_Fields_basic), value=Computer-0815}}, (name,PC_Desktop_Fields_basic)=Modification{value=AbstractField{key=(name,PC_Desktop_Fields_basic), value=My cool PC11}, previousValue=AbstractField{key=(name,PC_Desktop_Fields_basic), value=My cool PC}}}

PC_DesktpChangesInLog.groovy] [Susan-] Changed field: PC_Desktop_Fields_basic/ modell

PC_DesktpChangesInLog.groovy] [Susan-] New value: Computer-0815-01

PC_DesktpChangesInLog.groovy] [Susan-] Old value: Computer-0815

PC_DesktpChangesInLog.groovy] [Susan-] Changed field: PC_Desktop_Fields_basic/ name

PC_DesktpChangesInLog.groovy] [Susan-] New value: My cool PC11

PC_DesktpChangesInLog.groovy] [Susan-] Old value: My cool PC

Code-Beispiel 87: Log-Ausgabe für das obige Skript