مشاركة عبر


تمكين حساب الوقت المخصص لمؤشرات الأداء الأساسية لاتفاقية مستوى الخدمة (SLA KPI)

يصف هذا المقال كيف يمكنك تجاوز حساب الوقت الافتراضي.

يقوم حساب الوقت في اتفاقيات مستوى الخدمة (SLA) بحساب مؤشرات الأداء الأساسية لاتفاقية مستوى الخدمة (SLA) WarningTimeوFailureTimeمع أخذ في الاعتبار معلمات الإدخال، مثل ApplicableFrom(وقت البدء من نوع حقل التاريخ/الوقت) وCalendarId ‏(GUID) وDuration(مدة التحذير أو مدة التعطل بالدقائق). يتم حساب WarningTime أو FailureTime النهائي بالاستناد إلى جدول خدمة العملاء وجدول العطلات المقترنة ببند اتفاقية SLA.

بالإضافة إلى وقت التحذير والتعطل، يتم أيضًا حساب الوقت المنقضي في حالة تكوين سيناريو إيقاف مؤقت واستئناف لاتفاقية SLA. لتجاهل ساعات العمل التي تم قضاؤها أثناء حالة الإيقاف المؤقت لمؤشرات الأداء الأساسية لاتفاقية مستوى الخدمة، تتم إضافة الوقت المنقضي إلى وقت الفشل النهائي.

لتمكين حساب وقتك المخصص، يمكنك تعريف واجهة برمجة تطبيقات (API) ذات مجموعة ثابتة من معلمات الإدخال والإخراج وإضافة منطق مخصص لحساب الوقت.

‏‫ملاحظة‬

يتم دعم حساب الوقت المخصص فقط كجزء من مكون إضافية وليس أي كيان آخر، على سبيل المثال، سير عمل مخصص.

تمكين حساب الوقت المخصص لمؤشرات الأداء الأساسية لاتفاقية مستوى الخدمة (SLA KPI)

  1. انتقل إلى make.powerapps.com.

  2. انتقل إلى الإعدادات‏‎ المتقدمة>التخصيصات>تخصيص النظام>العمليات>جديد.

  3. في مربع الحوار إنشاء عملية، أدخل التفاصيل التالية:

    1. أدخل اسم عملية، على سبيل المثال، حساب CustomPluginTime.
    2. من القائمة المنسدلة الفئة، حدد الإجراء.
    3. من القائمة المنسدلة الكيان، حدد بدون (عمومي).
    4. حدد الخيار عملية جديدة من قالب موجود (حدد من القائمة).
    5. حدد القالب SLACustomTimeCalculationTemplate من القائمة.
    6. ثم حدد موافق.

    قالب حساب الوقت المخصص

  4. في القالب، أضف المعلمات المطلوبة (في حالة وجودها)، وحدد تنشيط.

    تمكين وسيطات العملية لأي بند اتفاقية SLA

  5. كتابة المكون الإضافي.

    للحصول على معلومات حول تحديد المكون الإضافي الذي تحتاجه، انتقل إلى السيناريوهات والمكونات الإضافية.

  6. لربطه بالإجراء المخصص الذي تم إنشاؤه في الخطوة 3، انتقل إلى أداة تسجيل المكونات الإضافية وسجل المكون الإضافي الذي أنشأته مع مؤسستك. تعرف على المزيد حول المكون الإضافي، في تسجيل مكون إضافي.

    تسجيل المكون الإضافي وربطه

  7. في مركز إدارة Copilot Service، أضف الإجراء المخصص الذي تم إنشاؤه مسبقا باستخدام عنصر اتفاقية مستوى الخدمة أو قم بتحريره:

    1. عيّن مفتاح تبديل السماح بحساب الوقت المخصص إلى نعم.
    2. في الحقل عملية حساب الوقت المخصص‬، حدد الإجراء المخصص الذي أنشأته في الخطوة 3.
    3. حدد حفظ وإغلاق.
  8. على اتفاقية SLA، حدد تنشيط، وقم بتطبيقها على الكيان المطلوب. يظهر وقت التحذير والفشل لمؤشر الأداء الأساسي الخاص باتفاقية مستوى المستخدم (SLA KPI) وفقًا لمنطق حساب الوقت المتوفر في الإجراء المخصص.

    لمزيد من المعلومات حول كيفية تطبيق اتفاقيات SLA، انتقل إلى تطبيق اتفاقيات مستوى الخدمة.

  9. لتصدير الحل إلى بيئة أخرى، يمكنك أولًا إضافة اتفاقية SLA (التي يتضمن بندها مرجع الإجراء المخصص) إلى الحل المخصص. تؤدي إضافة اتفاقية مستوى الخدمة أيضًا إلى تصدير عملية سير عمل الإجراء المخصص. بعد ذلك، قم بتضمين رسالة SDK في الحل، والتي تقوم بتصدير المكون الإضافي الذي قمت بإنشائه مسبقًا.

السيناريوهات والمكونات الإضافية

راجع السيناريوهات التالية والمكونات الإضافية الخاصة بها لتنفيذ رمز مكون إضافي مقترن بإجرائك المخصص.

السيناريو 1:

إذا لم يكن لديك سيناريو إيقاف مؤقت أو استئناف، فيجب عندئذٍ حساب WarningTime وFailureTime فقط. في أي وقت يتم فيه إنشاء أية مثيلات جديدة لمؤشرات الأداء الأساسي (KPI)، تبدأ اتفاقية SLA واجهة API لحساب الوقت المخصص لحساب WarningTime وFailureTime فقط في استدعاء واحد.

في حالة كهذه، فإن requestType يكون getEndTime ويمكن إحضار سمات أخرى كما تم تعريفها في المثال التالي:

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

السيناريو 2:

في حالة وجود سيناريو إيقاف مؤقت أو استئناف، سيتم إجراء الحسابات التالية:

  • حساب elapsedTime بين حالتي الإيقاف المؤقت والاستئناف. لهذا السيناريو، تستدعي اتفاقية SLA واجهة API لحساب الوقت المخصص لحساب الوقت المنقضي بين الإيقاف المؤقت والاستئناف. في حالة كهذه، فإن requestType يكون getElapsedTime ويمكن إحضار سمات أخرى كما تم تعريفها في المثال التعليمات البرمجية للمكون الإضافي:
  • حساب حوسبة جديدة لكل من WarningTime وFailureTime للمثيلات التي تم استئنافها. وفي هذا الحالة، فإن requestType يكون getEndTime ويمكن إحضار سمات أخرى كما تم تعريفها في المثال التالي:
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;
}

رموز الأخطاء في حساب الوقت المخصص

فيما يلي رموز الأخطاء لسيناريوهات الأخطاء العديدة التي قد تحدث أثناء حساب الوقت المخصص.

رمز الخطأ: 10000004

رسالة الخطأ: يجب أن يكون سير عمل واجهة API لحساب الوقت المخصص لبند SLA {0} نشطًا.

السبب

يحدث الخطأ إذا تم تعطيل سير عمل حساب الوقت المخصص.

نوع الحل

عند فتح اتفاقية مستوى الخدمة، ترى إشعارًا بالنموذج مع زر تنشيط إذا كانت اتفاقية مستوى الخدمة نشطة ولكن تم تعطيل سير عمل حساب الوقت المخصص. لتجنب هذه المشكلة، تأكد من أن حالة عملية سير عمل حساب الوقت المخصص هي دائمًا نشطة . قم بإجراء نشر اتفاقية مستوى الخدمة، ثم قم بالتحقق فقط بعد اكتمالها. تأكد من عدم حذف أو إلغاء تنشيط عملية سير العمل يدويًا أو من خلال التخصيص.

رمز الخطأ: 10000005

رسالة الخطأ: "حدد عملية حساب الوقت المخصص."

السبب

يحدث الخطأ إذا تم تمكين سير عمل حساب الوقت المخصص ولكن لم يكن هناك إجراء عملية سير عمل مقترن مع بند SLA.

نوع الحل

أضف عملية سير العمل واحفظ بند SLA. لتجنب هذه المشكلة، تأكد من ملء عملية سير عمل حساب الوقت المخصص في قيمة البحث في حالة تعيين مفتاح التبديل إلى تشغيل.

رمز الخطأ: 10000006

رسالة الخطأ: "سير عمل عملية حساب الوقت المخصص لبند SLA {0} مفقود. {يشير العنصر النائب="{0}"} إلى معرف بند SLA."

السبب

يحدث الخطأ إذا تم تمكين سير عمل حساب الوقت المخصص أثناء تنشيط SLA، يتم إقران إجراء عملية سير العمل بعنصر SLA مع GUID صالح، ولكن يتم حذف سير العمل.

نوع الحل

يجب تصحيح سير العمل غير الصالح. قم بإزالة سير العمل الموجود من بند SLA، وأنشئ سير عمل جديدًا، ثم أضف سير العمل الجديد إلى نفس بند SLA. لتجنب هذه المشكلة، تأكد من عدم حذف أي سير عمل يدويًا أو كجزء من عملية النشر. تأكد أيضًا من التحقق من التغييرات التي تقوم بها قبل الاستيراد مباشرة إلى بيئة الإنتاج.

رمز الخطأ: 10000007

رسالة الخطأ: "تنفيذ المكون الإضافي مفقود لعملية حساب الوقت المخصص في عنصر SLA {0} {العنصر النائب = "{0}"} يشير إلى معرف عنصر اللوح."

السبب

يحدث الخطأ إذا تم تمكين سير عمل حساب الوقت المخصص ولكن خطوة عملية مراسلة SDK للمكون الإضافي المقترن مفقودة أو لم يتم تسجيل المكون الإضافي.

نوع الحل

تأكد من إضافة خطوة SDK أثناء تصدير SLA من المصدر أو بيئة التطوير. لتجنب هذه المشكلة، تأكد من إضافة خطوة رسالة SDK وتجميع البرنامج الإضافي في حل SLA.

رمز الخطأ: 10000008

رسالة الخطأ: وقت التحذير أو التعطّل الذي أرجعته عملية حساب الوقت المخصص لبند SLA {0} غير صالح {يشير العنصر النائب="{0}"} إلى معرف بند SLA."

السبب

يحدث الخطأ إذا أرجع إجراء سير عمل حساب الوقت المخصص قيمة وقت تعطل غير صالحة لـ requestType getEndTime.

نوع الحل

تحتاج إلى تصحيح الأخطاء لمعرفة سبب عدم قيام عملية سير العمل المخصصة بإرجاع القيم الصحيحة. لتجنب المشكلة، تأكد من إضافة كافة السيناريوهات واختبارها قبل نشر السيناريوهات للإنتاج. على سبيل المثال، يتضمن هذا العديد من تطبيقات بنود SLA وسيناريوهات الإيقاف المؤقت أو الاستئناف.

رمز الخطأ: 10000009

رسالة الخطأ: الوقت المنقضي الذي أرجعته عملية حساب الوقت المخصص لبند SLA {0} غير صالح {يشير العنصر النائب="{0}"} إلى معرف بند SLA."

السبب

يحدث الخطأ إذا أرجع إجراء سير عمل حساب الوقت المخصص قيمة وقت منقضٍ غير صالحة لـ requestType getElapsedTime.

نوع الحل

تحتاج إلى تصحيح الأخطاء لمعرفة سبب عدم قيام عملية سير العمل المخصصة بإرجاع القيم الصحيحة عندما تم إيقاف الحالة مؤقتًا واستئنافها. لتجنب المشكلة، تأكد من إضافة كافة السيناريوهات واختبارها قبل نشر السيناريوهات للإنتاج. على سبيل المثال، يتضمن ذلك سيناريوهات الإيقاف المؤقت أو الاستئناف.

رمز الخطأ: 10000010

رسالة خطأ: "لم يتم العثور على سير عمل عملية حساب الوقت المخصص {0} لبند SLA {1}

السبب

يحدث الخطأ إذا لم يتم العثور على الإجراء المخصص لحساب الوقت المخصص في النظام.

نوع الحل

تحتاج إلى تصحيح الأخطاء ومعرفة ما إذا كان الإجراء المخصص موجودًا في النظام بنفس الاسم كما هو موضح في الخطأ. لتجنب هذه المشكلة، تأكد من إنشاء بادئة اسم الإجراء المخصص نفسها كما هو موضح في رسالة الخطأ. تحتاج إلى تغيير البادئة الخاصة بالحل أو تجنب تصديراها كحل غير مُدار. يمكنك أيضًا تجنب إنشاء واجهة سير العمل مباشرة في حل مُدار، وبدلاً من ذلك إنشاء الحل المُدار في التخصيص الافتراضي ثم إضافته إلى الحل.

الأسئلة المتداولة

للحصول على مزيد من المعلومات حول حساب الوقت المخصص لمؤشرات الأداء الرئيسية لاتفاقية مستوى الخدمة، انتقل إلى الأسئلة المتداولة حول حساب الوقت المخصص لمؤشرات الأداء الأساسية لاتفاقية مستوى الخدمة.

تعريف اتفاقيات مستوى الخدمة

تطبيق اتفاقيات مستوى الخدمة

تمكين السجلات لاتفاقية SLA