Notă
Accesul la această pagină necesită autorizare. Puteți încerca să vă conectați sau să modificați directoarele.
Accesul la această pagină necesită autorizare. Puteți încerca să modificați directoarele.
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
Mergeți la make.powerapps.com.
Accesați Setări Avansate>Customizări>Customizați sistemul>Procese>Nou.
În dialogul Creați proces, introduceți următoarele detalii:
- Introduceți un nume de proces, de exemplu, CustomPluginTime Calculation.
- Din lista verticală Categorie selectați Acțiune .
- Din lista verticală Entitate selectați Niciunul (global).
- Selectați opțiunea Proces nou dintr-un șablon existent (selectați din listă).
- Selectați șablonul SLACustomTimeCalculationTemplate din listă.
- Selectați OK.
Pe șablon, adăugați parametrii necesari (dacă există) și selectați Activare.
-
Pentru informații despre selectarea pluginului de care aveți nevoie, accesați Scenarii și pluginuri.
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.
În centrul de administrare Copilot Service, adăugați sau editați acțiunea personalizată creată anterior cu elementul SLA:
- Setați comutatorul Permiteți calcularea timpului personalizat la Da.
- În câmpul Proces personalizat de calcul al timpului, selectați acțiunea personalizată creată la pasul 3.
- Selectați Salvați și închideți.
Î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
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 estegetElapsedTime
, iar alte atribute pot fi preluate așa cum este definit în exemplul de cod de plug-in. - Calculul calculelor noi
WarningTime
șiFailureTime
pentru instanțe reluate. În acest caz,requestType
estegetEndTime
, 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.