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:
In den folgenden Abschnitten sind diese drei Schritte detailliert beschrieben.
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
Ö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
Relation
Dieses Skript wird automatisch ausgeführt, wenn eine Relation zu oder von einer Ressource dieses Typs
wird. (Das Skript wird nicht ausgeführt, wenn der Kommentar einer Relation geändert wird.)
Speichern Sie die Aktion. Danach können Sie sie Ressourcentypen zuweisen. Siehe folgenden Schritt.
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:
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.
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.
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)
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
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