Partajați prin


Activarea calculului particularizat al timpului pentru KPI-urile SLA

Acest articol descrie cum puteți înlocui calculul implicit al timpului.

Calculul timpului în acordurile de nivel de serviciu (SLA) calculează WarningTime și FailureTime a indicatorilor de performanță cheie (KPI) SLA, luând în considerare parametrii de intrare, cum ar fi ApplicableFrom (StartTime de tipul câmp DateTime), CalendarId (GUID) și Duration (durata avertismentului sau durata defecțiunii în minute). WarningTime sau FailureTime final este calculat pe baza programului serviciu pentru relații cu clienții și de planificare zile libere asociate articolului SLA.

Pe lângă timpul de avertizare și de eșec, timpul scurs este calculat și dacă există un scenariu de pauză și reluare configurat pentru SLA. Pentru a ignora orele de lucru petrecute în timpul stării de pauză a KPI-ului SLA, timpul scurs este adăugat la timpul final de eșec.

Pentru a vă activa propriul calcul personalizat al timpului, definiți o interfață API care are un set fix de parametri de intrare și ieșire și adăugați o logică personalizată pentru a calcula timpul.

Notă

Calculul personalizat al timpului este acceptat numai ca parte a plug-in-ului și nu orice altă entitate, de exemplu, fluxul de lucru personalizat.

Activarea calculului particularizat al timpului pentru KPI-urile SLA

  1. Mergeți la make.powerapps.com.

  2. Accesați Setări Avansate>Customizări>Customizați sistemul>Procese>Nou.

  3. În dialogul Creați proces, introduceți următoarele detalii:

    1. Introduceți un nume de proces, de exemplu, CustomPluginTime Calculation.
    2. Din lista verticală Categorie selectați Acțiune .
    3. Din lista verticală Entitate selectați Niciunul (global).
    4. Selectați opțiunea Proces nou dintr-un șablon existent (selectați din listă).
    5. Selectați șablonul SLACustomTimeCalculationTemplate din listă.
    6. Selectați OK.

    Șablon personalizat de calcul al timpului

  4. Pe șablon, adăugați parametrii necesari (dacă există) și selectați Activare.

    Activați argumentele procesului pentru orice element SLA

  5. Scrieți plug-in-ul.

    Pentru informații despre selectarea pluginului de care aveți nevoie, accesați Scenarii și pluginuri.

  6. Pentru a-l conecta la acțiunea personalizată creată la pasul 3, accesați instrumentul de înregistrare a plug-in-ului și înregistrați plug-in-ul pe care l-ați creat cu organizația dvs. Aflați mai multe despre plug-in, în Înregistrați un plug-in.

    Înregistrați-vă și conectați pluginul

  7. În centrul de administrare Copilot Service, adăugați sau editați acțiunea personalizată creată anterior cu elementul SLA:

    1. Setați comutatorul Permiteți calcularea timpului personalizat la Da.
    2. În câmpul Proces personalizat de calcul al timpului, selectați acțiunea personalizată creată la pasul 3.
    3. Selectați Salvați și închideți.
  8. În formularul SLA, selectați Activați și aplicați-l entității necesare. Timpul de avertizare și eșec al KPI-ului SLA apare în conformitate cu logica de calcul a timpului furnizată în acțiunea personalizată.

    Pentru informații despre cum să aplicați SLA-uri, accesați Aplicați SLA-uri

  9. Pentru a exporta soluția într-un alt mediu, mai întâi adăugați SLA (al cărui articol are referința la acțiune personalizată) la soluția personalizată. Adăugarea SLA exportă și procesul de flux de lucru cu acțiuni personalizate. Apoi, includeți mesajul SDK în soluție, care exportă pluginul pe care l-ați creat mai devreme.

Scenarii și pluginuri

Consultați următoarele scenarii și pluginurile acestora pentru a implementa un cod de plugin asociat cu acțiunea dvs. personalizată.

Scenariul 1:

Dacă nu aveți un scenariu de pauză sau de reluare, trebuie calculate numai WarningTime și FailureTime . Ori de câte ori sunt create instanțe KPI noi, SLA inițiază API-ul personalizat de calcul al timpului pentru a calcula numai WarningTime și FailureTime într-un singur apel.

Într-un astfel de caz, requestType is getEndTime, iar alte atribute pot fi preluate așa cum este definit în următorul exemplu:

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;
}

Scenariul 2:

Dacă există un scenariu de pauză sau reluare, trebuie făcute următoarele calcule:

  • Calcul elapsedTime între stările întrerupte și reluate. Pentru acest scenariu, SLA invocă API-ul personalizat de calcul al timpului pentru a calcula timpul scurs între pauză și reluare. Într-un astfel de caz, requestType este getElapsedTime, iar alte atribute pot fi preluate așa cum este definit în exemplul de cod de plug-in.
  • Calculul calculelor noi WarningTime și FailureTime pentru instanțe reluate. În acest caz, requestType este getEndTime, iar alte atribute pot fi preluate după cum este definit în următorul exemplu:
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;
}

Coduri de eroare pentru calcularea timpului personalizat

Următoarele sunt codurile de eroare pentru diferitele scenarii de eroare care pot apărea în timpul calculului personalizat de timp.

Cod de eroare: 10000004

Mesaj de eroare: „Fluxul de lucru pentru API-ul de calcul particularizat al timpului pentru elementul SLA {0} trebuie să fie activ.”

Motiv

Eroarea apare dacă fluxul de lucru personalizat pentru calculul timpului este dezactivat.

Rezolvare

Când deschideți SLA, vedeți o notificare de formular împreună cu un buton Activați dacă SLA este activ, dar fluxul de lucru pentru calcularea timpului personalizat este dezactivat. Pentru a evita această problemă, asigurați-vă că procesul de flux de lucru personalizat pentru calculul timpului este întotdeauna în starea Activ . Efectuați implementarea SLA și apoi verificați numai după finalizarea acestuia. Asigurați-vă că nu ștergeți sau dezactivați procesul de flux de lucru manual sau prin personalizare.

Cod de eroare: 10000005

Mesaj de eroare: „Selectați procesul pentru calculul particularizat al timpului.”

Motiv

Eroarea apare dacă fluxul de lucru personalizat pentru calculul timpului este activat, dar nu este asociată nicio acțiune a procesului de flux de lucru cu elementul SLA.

Rezolvare

Adăugați procesul de flux de lucru și salvați elementul SLA. Pentru a evita această problemă, asigurați-vă că procesul de flux de lucru personalizat pentru calculul timpului este completat în valoarea de căutare dacă comutatorul este setat la Activat.

Cod de eroare: 10000006

Mesaj de eraore: „Fluxul de lucru pentru procesul de calcul particularizat al timpului pentru elementul SLA {0} lipsește {Placeholder="{0}"} se referă la ID-ul articolului SLA."

Motiv

Eroarea apare dacă fluxul de lucru personalizat pentru calculul timpului este activat în timpul activării SLA, acțiunea procesului de flux de lucru este asociată cu elementul SLA cu GUID valid, dar fluxul de lucru este șters.

Rezolvare

Trebuie să corectați fluxul de lucru nevalid. Eliminați fluxul de lucru existent din elementul SLA, creați un nou flux de lucru și apoi adăugați noul flux de lucru la același articol SLA. Pentru a evita această problemă, asigurați-vă că nu ștergeți niciun flux de lucru manual sau ca parte a procesului de implementare. De asemenea, asigurați-vă că verificați modificările înainte de a le importa direct într-un mediu de producție.

Cod de eroare: 10000007

Mesaj de eroare: „Implementarea pluginului lipsește pentru Procesul de calcul personalizat al timpului în articolul SLA {0} {Placeholder="{0}"} se referă la id-ul articolului slab."

Motiv

Eroarea apare dacă fluxul de lucru personalizat pentru calculul timpului este activat, dar pasul asociat procesului de mesagerie SDK al pluginului lipsește sau pluginul nu este înregistrat.

Rezolvare

Asigurați-vă că adăugați pasul SDK în timp ce exportați SLA din mediul sursă sau de dezvoltare. Pentru a evita această problemă, asigurați-vă că adăugați pasul mesajului SDK și ansamblul pluginului în soluția SLA.

Cod de eroare: 10000008

Mesaj de eroare: „Avertisment sau timpul de eșec returnat de Procesul personalizat de calcul al timpului pentru elementul SLA {0} are o valoare nevalidă. {Placeholder="{0}"} se referă la ID-ul articolului SLA."

Motiv

Eroarea apare dacă acțiunea Flux de lucru personalizat pentru calculul timpului returnează un mesaj nevalid Timp de eșec pentru requestType getEndTime.

Rezolvare

Trebuie să depanați pentru a afla de ce procesul de flux de lucru personalizat nu returnează valorile adecvate. Pentru a evita problema, asigurați-vă că adăugați și testați toate scenariile înainte de a implementa scenariile în producție. De exemplu, aceasta include diverse aplicații de articole SLA și scenarii de pauză sau reluare.

Cod de eroare: 10000009

Mesaj de eroare: „Timpul scurs returnat de procesul particularizat de calcul al timpului pentru elementul SLA {0} are o valoare nevalidă {Placeholder="{0}"} se referă la ID-ul articolului SLA."

Motiv

Eroarea apare dacă acțiunea Flux de lucru personalizat pentru calculul timpului returnează un mesaj nevalid Timp de scurs pentru requestType getElapsedTime.

Rezolvare

Trebuie să depanați pentru a afla de ce procesul de flux de lucru personalizat nu returnează valorile adecvate când cazul a fost întrerupt și reluat. Pentru a evita problema, asigurați-vă că adăugați și testați toate scenariile înainte de a implementa scenariile în producție. De exemplu, acestea includ scenariile de întrerupere sau reluare.

Cod de eroare: 10000010

Mesaj de eroare: „Fluxul de lucru pentru procesul personalizat de calcul al timpului {0} pentru articolul SLA {1} nu este găsit”.

Motiv

Eroarea apare dacă acțiunea personalizată pentru calcularea timpului personalizat nu este găsită în sistem.

Rezolvare

Trebuie să depanați și să aflați dacă acțiunea personalizată este prezentă în sistem cu același nume ca în eroare. Pentru a evita această problemă, asigurați-vă că creați același prefix de nume de acțiune personalizat așa cum este afișat în mesajul de eroare. Trebuie să schimbați prefixul soluției sau să evitați să-l exportați ca soluție negestionată. De asemenea, puteți evita crearea interfeței fluxului de lucru direct în soluție gestionată și, în schimb, creați soluție gestionată în personalizarea implicită și apoi adăugați-l la soluție.

Întrebări frecvente

Pentru mai multe informații despre calcularea personalizată a timpului a KPI-urilor SLA, accesați Întrebări frecvente despre calculul personalizat al timpului de KPI-uri SLA.

Definiți acordurile de nivel de servicii

Aplicați SLA-uri

Activați înregistrările pentru SLA