Freigeben über


Aktivieren Sie die benutzerdefinierte Zeitberechnung von SLA-KPIs

Dieser Artikel beschreibt, wie Sie die Standardzeitberechnung überschreiben können.

Die Zeitberechnung in Vereinbarung zum Servicelevel (SLAs) berechnet die WarningTime und FailureTime von SLA Key Performance Indicators (KPIs) unter Berücksichtigung von Eingangsparametern, wie ApplicableFrom (StartTime vom Typ DateTime-Feld), CalendarId (GUID) und Duration (Warndauer bzw. Ausfalldauer in Minuten). Das endgültige WarningTime oder FailureTime wird basierend auf dem Kundenservice-Zeitplan und den mit dem SLA-Element verknüpften Feiertagsplänen berechnet.

Zusätzlich zur Warn- und Ausfallzeit wird auch die verstrichene Zeit berechnet, wenn für das SLA ein Pausen- und Wiederaufnahmeszenario konfiguriert ist. Die verstrichene Zeit wird zur endgültigen Ausfallzeit addiert, um die während des angehaltenen Zustands des SLA KPI verbrachten Arbeitsstunden zu ignorieren.

Um Ihre eigene benutzerdefinierte Zeitberechnung zu aktivieren, können Sie eine API-Schnittstelle definieren, die über einen festen Satz von Eingabe- und Ausgabeparametern verfügt, und eine benutzerdefinierte Logik zum Berechnen der Zeit hinzufügen.

Notiz

Die benutzerdefinierte Zeitberechnung wird nur als Teil des Plug-Ins unterstützt und nicht für andere Entitäten, z. B. benutzerdefinierte Workflows.

Aktivieren Sie die benutzerdefinierte Zeitberechnung von SLA-KPIs

  1. Gehen Sie zu make.powerapps.com.

  2. Gehen Sie zu Erweiterte Einstellungen>Anpassungen>System-Anpassungen>Prozesse>Neu

  3. Geben Sie im Dialogfeld Prozess erstellen die nachfolgenden Details ein:

    1. Geben Sie einen Prozessnamen ein, z. B. CustomPluginTime Calculation.
    2. Wählen Sie in der Aswahlliste unter KategorieAktion aus.
    3. Wählen Sie aus der Entität-Auswahlliste Nein (global) aus.
    4. Wählen Sie die Option Neuer Prozess aus vorhandener Vorlage (aus Liste auswählen) aus.
    5. Wählen Sie die aus der Liste die Vorlage SLACustomTimeCalculationTemplate.
    6. Klicken Sie auf OK.

    Vorlage benutzerdefinierte Zeitberechnung

  4. Fügen Sie in der Vorlage die erforderlichen Parameter (falls vorhanden) hinzu und wählen Sie Aktivieren.

    Aktivieren Sie die Prozessargumente für alle SLA-Elemente

  5. Schreiben Sie das Plug-In

    Informationen zum Auswählen des benötigten Plug-Ins finden Sie unter Szenarien und Plug-Ins.

  6. Um es mit dem in Schritt 3 erstellten benutzerdefinierte Aktion zu verknüpfen, wechseln Sie zum Plug-In-Registrierungstool, und registrieren Sie das Plug-In, das Sie erstellt haben, bei Ihrer Organisation. Weitere Informationen zu Plug-Ins finden Sie unter Registrieren eines Plug-Ins.

    Registrierung und Verknüpfung des Plug-ins

  7. Fügen Sie im Copilot Service Admin Center die zuvor erstellte benutzerdefinierte Aktion mit dem SLA-Element hinzu oder bearbeiten Sie sie:

    1. In dem Abschnitt Benutzerdefinierte Zeitberechnung zulassen legen Sie den Schieber auf Ja fest.
    2. Im Feld Benutzerdefinierter Zeitberechnungsprozess wählen Sie die benutzerdefinierte Aktion aus, die Sie in Schritt 3 erstellt haben.
    3. Wählen Sie Speichern und Schließen.
  8. Aktivieren Sie Ihr SLA und wählen Aktivieren und wenden Sie es auf die erforderliche Entität an. Die Warn- und Fehlerzeit des SLA-KPI wird gemäß der in der benutzerdefinierten Aktion bereitgestellten Zeitberechnungslogik angezeigt.

    Weitere Informationen zur Anwendung der SLAs finden Sie unter SLAs anwenden

  9. Um die Lösung in eine andere Umgebung zu exportieren, können Sie zuerst das SLA (dessen Element die benutzerdefinierte Aktionsreferenz hat) zur benutzerdefinierten Lösung hinzufügen. Durch das Hinzufügen der SLA wird auch der benutzerdefinierte Aktions-Workflow-Prozess exportiert. Fügen Sie als Nächstes die SDK-Nachricht in die Lösung ein, die das zuvor erstellte Plug-In exportiert.

Szenarien und Plug-Ins

Sehen Sie sich die folgenden Szenarien und ihre Plug-Ins an, um einen Plug-In-Code zu implementieren, der Ihrer benutzerdefinierten Aktion zugeordnet ist.

Szenario 1:

Wenn Sie kein Pausen- oder Fortsetzungsszenario haben, dann müssen nur WarningTime und FailureTime berechnet werden. Immer wenn neue KPI-Instanzen erstellt werden, initiiert SLA die benutzerdefinierte Zeitberechnungs-API, um nur WarningTime und FailureTime in einem einzigen Anruf zu berechnen.

In einem solchen Fall ist requestTypegetEndTime und andere Attribute können wie im folgenden Beispiel definiert abgerufen werden:

public void Execute(IServiceProvider serviceProvider)
{

	IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
	IOrganizationServiceFactory factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
	_service = factory.CreateOrganizationService(context.UserId);

	// Step 1: Retrieving Input Parameters.
	string regardingId = context.InputParameters["regardingId"] as string;
	string calendarId = context.InputParameters["calendarId"] as string;
	string requestType = context.InputParameters["requestType"] as string;
	string slaItemId = context.InputParameters["slaItemId"] as string;
	string entityName = context.InputParameters["entityName"] as string;
	

	try
	{
		// implement this requestType for any new SLA KPi instance creation.
		if (requestType.Equals("getEndTime", StringComparison.CurrentCultureIgnoreCase))
		{
			int warningDuration = (int)context.InputParameters["firstInputDuration"];
			int failureDuration = (int)context.InputParameters["secondInputDuration"];
			DateTime warningStartTime = (DateTime)context.InputParameters["firstInputDate"];
			DateTime failureStartTime = (DateTime)context.InputParameters["secondInputDate"];

			// Step 2 : Add the custom Logic to calculate the WarningTime and FailureTime
			string returnCalendarId = CalculateWarningAndFailureTime(regardingId, calendarId, slaItemId, entityName, warningStartTime, failureStartTime, warningDuration, failureDuration, out DateTime warningTime, out DateTime failureTime);

			// Step 3 : return the output values.
			context.OutputParameters["firstOutputValue"] = DateTime.SpecifyKind(warningTime, DateTimeKind.Utc).ToString();
			context.OutputParameters["secondOutputValue"] = DateTime.SpecifyKind(failureTime, DateTimeKind.Utc).ToString();
			context.OutputParameters["returnCalendarId"] = returnCalendarId;			
			return;
		}

		// implement this requestType for finding Paused time for any new SLA KPi instance after it resumed.
		if (requestType.Equals("getElapsedTime", StringComparison.CurrentCultureIgnoreCase))
		{
			DateTime casePausedTime = (DateTime)context.InputParameters["firstInputDate"];
			DateTime caseResumedTime = (DateTime)context.InputParameters["secondInputDate"];
			int existingElapsedTime = (int)context.InputParameters["firstInputDuration"];
			// Step 2 : Add the custom Logic to calculate the elapsedTime between startTime(paused) and endTime(resumed)
			double elapsedTimeInMinutes = CalculateElapsedTime(regardingId, calendarId, slaItemId, entityName, casePausedTime, caseResumedTime, existingElapsedTime);

			// Step 3 : return the output values.
			context.OutputParameters["firstOutputValue"] = elapsedTimeInMinutes.ToString();
			context.OutputParameters["secondOutputValue"] = elapsedTimeInMinutes.ToString();			
			return;
		}
	} catch (Exception ex) {
		return;			
	}

	throw new Exception("Invalid requestType:" + requestType+ " for entityName:" + entityName + " of id:" + regardingId);
}

// in this example, we're using Custom Field(new_country) on the Case entity to apply the required calendar.

private string CalculateWarningAndFailureTime(string regardingId, string calendarId, string slaItemId, string entityName, DateTime warningStartTime, DateTime failureStartTime, int warningDuration, int failureDuration, out DateTime warningTime, out DateTime failureTime)
{
	OrganizationResponse customizedTimeCalculationResponse;
	warningTime = DateTime.UtcNow;
	failureTime = DateTime.UtcNow;
	int newWarningTime = warningDuration;
	int newFailureTime = failureDuration;
	int customCode = 0;

	// Step 1: fetch the Case Entity record	
	Entity caseRecord = FetchCaseRecord(entityName, regardingId);

	if (caseRecord.Attributes.Contains("new_country"))
	{
		customCode = (int)(((OptionSetValue)(caseRecord.Attributes["new_country"])).Value);

		// Example 1: Override calendar at runtime: Choose Calendar based on any custom logic
		if (customCode == 0)
		{
			// fetch IST calendar & override CalendarId
			IST_CALENDAR = FetchCalendar("IST_CALENDAR", _service);
			calendarId = IST_CALENDAR;
		}
		else if (customCode == 1)
		{
			// fetch PST calendar & override CalendarId
			PST_CALENDAR = FetchCalendar("PST_CALENDAR", _service);
			calendarId = PST_CALENDAR;
		}		
	}
	// use OOB SLATimeCalculation Custom Action to do actual calculation_
	OrganizationRequest requestTimeCalculation = new OrganizationRequest("msdyn_SLATimeCalculation");
	
	requestTimeCalculation["requestType"] = "getEndTime";
	requestTimeCalculation["calendarId"] = calendarId;

	// calculate warning time
	if (warningDuration != -1)
	{
		requestTimeCalculation["startTime"] = warningStartTime;
		requestTimeCalculation["minutes"] = newWarningTime;
		customizedTimeCalculationResponse = _service.Execute(requestTimeCalculation);
		customizedTimeCalculationResponse.Results.TryGetValue("returnValue", out object outputValue1);
		warningTime = DateTime.SpecifyKind(DateTime.Parse((string)outputValue1), DateTimeKind.Utc);
	}

	// calculate Failure time
	if (failureDuration != -1)
	{
		requestTimeCalculation["startTime"] = failureStartTime;
		requestTimeCalculation["minutes"] = newFailureTime;
		customizedTimeCalculationResponse = _service.Execute(requestTimeCalculation);
		customizedTimeCalculationResponse.Results.TryGetValue("returnValue", out object outputValue2);
		failureTime = DateTime.SpecifyKind(DateTime.Parse((string)outputValue2), DateTimeKind.Utc);				
	}

	return calendarId;
}

Szenario 2:

Wenn es ein Pause- oder Wiederaufnahmeszenario gibt, müssen die folgenden Berechnungen durchgeführt werden:

  • Berechnung von elapsedTime zwischen dem Status Unterbrechung und Wiederaufnahme. Für dieses Szenario ruft das SLA die benutzerdefinierte Zeitberechnungs-API auf, um die verstrichene Zeit zwischen Pause und Wiederaufnahme zu berechnen. In einem solchen Fall wird der angeforderte Typ getElapsedTime sein und andere Attribute können wie im folgenden Plug-In-Code definiert abgerufen werden:
  • Berechnung von neuer WarningTime und FailureTime Berechnungsergebnis für wieder aufgenommene Instanzen. In diesem Fall ist requestTypegetEndTime und andere Attribute können wie im folgenden Beispiel definiert abgerufen werden:
private double CalculateElapsedTime(string regardingId, string calendarId, string slaItemId, string entityName, DateTime casePausedTime, DateTime caseResumedTime, int existingElapsedTime)
{
    if (caseRecord.Attributes.Contains("new_country"))
    {
        if ((int)(((OptionSetValue)(caseRecord.Attributes["new_country"])).Value) == 0)
        {
        // fetch IST id
        IST_CALENDAR = FetchCalendar("IST_CALENDAR", _service);
        calendarId = IST_CALENDAR;
        }
        else if ((int)(((OptionSetValue)(caseRecord.Attributes["new_country"])).Value) == 1)
        {
        // fetch PST  id
        PST_CALENDAR = FetchCalendar("PST_CALENDAR", _service);
        calendarId = PST_CALENDAR;
        }
    }

	// use OOB SLATimeCalculation Custom Action to do actual calculation_
	OrganizationRequest requestTimeCalculation = new OrganizationRequest("msdyn_SLATimeCalculation");
	requestTimeCalculation["startTime"] = casePausedTime;
	requestTimeCalculation["endTime"] = caseResumedTime;
	requestTimeCalculation["requestType"] = "getElapsedTime";
	requestTimeCalculation["calendarId"] = calendarId;

	// calculate elapsed time
	customizedTimeCalculationResponse = _service.Execute(requestTimeCalculation);
	customizedTimeCalculationResponse.Results.TryGetValue("returnValue", out object outputValue1);
	double totalElapsedTime = existingElapsedTime + Double.Parse(outputValue1.ToString());
	return totalElapsedTime;
}

Fehlercodes für die angepasste Zeitberechnung

Im Folgenden finden Sie die Fehlercodes für die verschiedenen Fehlerszenarien, die bei der angepassten Zeitberechnung auftreten können.

Fehlercode: 10000004

Fehlermeldung: „Der Workflow für die angepasste Zeitberechnungs-API für das SLA-Element {0} muss aktiv sein.“

Ursache

Der Fehler tritt auf, wenn der Custom Time Calculation Workflow deaktiviert ist.

Lösung

Wenn Sie die SLA öffnen, sehen Sie eine Formularbenachrichtigung zusammen mit einer Schaltfläche Aktivieren, wenn die SLA aktiv, aber der benutzerdefinierte Zeitberechnungs-Workflow deaktiviert ist. Um dieses Problem zu vermeiden, stellen Sie sicher, dass der angepasste Zeitberechnungs-Workflow sich immer im Status Aktiv befindet. Führen Sie die SLA-Bereitstellung durch und überprüfen Sie sie erst nach dem Abschluss. Stellen Sie sicher, dass Sie den Workflow-Prozess nicht manuell oder durch Anpassung löschen oder deaktivieren.

Fehlercode: 10000005

Fehlermeldung: „Wählen Sie den angepassten Zeitberechnungsprozess.“

Ursache

Der Fehler tritt auf, wenn der Workflow für die benutzerdefinierte Zeitberechnung aktiviert ist, aber keine Workflow-Prozessaktion mit dem SLA-Element verknüpft ist.

Lösung

Fügen Sie den Workflow-Prozess hinzu und speichern Sie das SLA-Element. Um dieses Problem zu vermeiden, stellen Sie sicher, dass das Nachschlagefeld für den angepassten Time Calculation Workflow ausgefüllt ist, wenn der Schalter auf Ein festgelegt ist.

Fehlercode: 10000006

Fehlermeldung: „Workflow für den angepassten Zeitberechnungsprozess für das SLA Element {0} fehlt. {Platzhalter=„{0}“} bezieht sich auf die SLA-Element-ID.“

Ursache

Der Fehler tritt auf, wenn der benutzerdefinierte Zeitberechnungsworkflow während der SLA-Aktivierung aktiviert ist, die Workflowprozessaktion dem SLA-Element mit gültiger GUID zugeordnet ist, der Workflow jedoch gelöscht wird.

Lösung

Sie müssen den ungültigen Workflow korrigieren. Entfernen Sie den vorhandenen Workflow aus dem SLA-Element, erstellen Sie einen neuen Workflow und fügen Sie den neuen Workflow dann demselben SLA-Element hinzu. Um dieses Problem zu vermeiden, stellen Sie sicher, dass Sie keinen Workflow manuell oder als Teil des Bereitstellungsprozesses löschen. Stellen Sie außerdem sicher, dass Sie Ihre Änderungen überprüfen, bevor Sie sie direkt in eine Produktionsumgebung importieren.

Fehlercode: 10000007

Fehlermeldung: „Die Plug-In-Implementierung fehlt für den benutzerdefinierten Zeitberechnungsprozess in SLA-Element {0} {Platzhalter=„{0}“} bezieht sich auf die SLA-Element-ID.“

Ursache

Der Fehler tritt auf, wenn der Workflow für die benutzerdefinierte Zeitberechnung aktiviert ist, aber der zugehörige Plugin-SDK-Nachrichtenprozessschritt fehlt oder das Plugin nicht registriert ist.

Lösung

Stellen Sie sicher, dass Sie den SDK-Schritt beim Exportieren der SLA aus der Quell- oder Entwicklungsumgebung hinzufügen. Um dieses Problem zu vermeiden, stellen Sie sicher, dass Sie den SDK Nachrichtenschritt und die Plugin Montage in der SLA Lösung hinzufügen.

Fehlercode: 10000008

Fehlermeldung: „Warnung oder die von dem angepassten Zeitberechnungsprozess für das SLA-Element {0} zurückgegebene Ausfallzeit ist ungültig. {Platzhalter=„{0}“} bezieht sich auf Sla-Element-ID.“

Ursache

Der Fehler tritt auf, wenn die Workflow-Aktion Angepasste Zeitberechnung eine ungültige Verfallszeit für RequestType getEndTime zurückgibt.

Lösung

Sie müssen ein Debugging durchführen, um herauszufinden, warum der benutzerdefinierte Workflowprozess nicht die richtigen Werte zurückgibt. Um dieses Problem zu vermeiden, stellen Sie sicher, dass Sie alle Szenarien hinzufügen und testen, bevor Sie die Szenarien für die Produktion bereitstellen. Dazu gehören z.B. verschiedene SLA-Element-Anwendungen und Pause- oder Resume-Szenarien.

Fehlercode: 10000009

Fehlermeldung: „Die vom Prozess der angepassten Zeitberechnung für das SLA-Element {0} zurückgegebene verstrichene Zeit ist ungültig. {Platzhalter=„{0}“} bezieht sich auf Sla-Element-ID.“

Ursache

Der Fehler tritt auf, wenn die Workflow-Aktion für die angepasste Zeitberechnung eine ungültige Verstrichene Zeit für AbfrageTyp getElapsedTime zurückgibt.

Lösung

Sie müssen ein Debugging durchführen, um herauszufinden, warum der benutzerdefinierte Workflowprozess nicht die richtigen Werte zurückgibt, wenn die Anfrage angehalten und fortgesetzt wurde. Um dieses Problem zu vermeiden, stellen Sie sicher, dass Sie alle Szenarien hinzufügen und testen, bevor Sie die Szenarien für die Produktion bereitstellen. Dazu gehören zum Beispiel die Szenarien Pause oder Wiederaufnahme.

Fehlercode: 10000010

Fehlermeldung: „Workflow für den benutzerdefinierten Zeitberechnungsprozess {0} für das SLA-Element {1} wurde nicht gefunden.“

Ursache

Der Fehler tritt auf, wenn die angepasste Aktion für die benutzerdefinierte Zeitberechnung im System nicht gefunden wird.

Lösung

Sie müssen ein Debugging durchführen und herausfinden, ob die benutzerdefinierte Aktion im System mit demselben Namen wie im Fehler angezeigt vorhanden ist. Um dieses Problem zu vermeiden, stellen Sie sicher, dass Sie das gleiche Präfix für den Namen der angepassten Aktion erstellen, wie in der Fehlermeldung angegeben. Sie müssen das Präfix Ihrer Lösung ändern oder vermeiden, sie als nicht verwaltete Lösung zu exportieren. Sie können es auch vermeiden, die Workflow-Schnittstelle direkt in der verwalteten Lösung zu erstellen. Stattdessen erstellen Sie die verwaltete Lösung in der Standardanpassung und fügen sie dann der Lösung hinzu.

Häufig gestellte Fragen

Weitere Informationen zur benutzerdefinierten Zeitberechnung von SLA-KPIs finden Sie unter FAQ zur benutzerdefinierten Zeitberechnung von SLA-KPIs.

Vereinbarungen zum Service Level festlegen

Wenden Sie SLAs an

Datensätze für SLAs aktivieren