Поделиться через


Включение пользовательского расчета времени для ключевых показателей эффективности SLA

Эта статья описывает, как вы можете переопределить расчет времени по умолчанию.

Расчет времени в соглашениях об уровне обслуживания (SLA) рассчитывает WarningTime и FailureTime ключевых показателей эффективности (КПЭ) SLA с учетом входных параметров, таких как ApplicableFrom (StartTime поля типа DateTime), CalendarId (GUID) и Duration (длительность предупреждения или длительность сбоя в минутах). Конечные значения WarningTime или FailureTime рассчитываются на основе графика обслуживание клиентов и графика выходных дней, связанных с элементом SLA.

В дополнение к времени предупреждения и сбоя также рассчитывается прошедшее время, если для SLA настроен сценарий паузы и возобновления. Чтобы игнорировать рабочие часы, затраченные в приостановленном состоянии ключевого показателя эффективности SLA, прошедшее время добавляется к конечному времени нарушения.

Чтобы включить собственный расчет времени, вы можете определить интерфейс API с фиксированным набором входных и выходных параметров и добавить пользовательскую логику для расчета времени.

Заметка

Пользовательский расчет времени поддерживается только как часть подключаемого модуля, а не какой-либо другой сущности, например, пользовательского рабочего процесса.

Включение пользовательского расчета времени для ключевых показателей эффективности SLA

  1. Перейдите на сайт make.powerapps.com.

  2. Перейдите в раздел Дополнительные параметры>Настройки>Настроить систему>Процессы>Создать.

  3. В диалоговом окне Создание процесса введите следующие сведения:

    1. Введите имя процесса, например расчет CustomPluginTime.
    2. В раскрывающемся списке Категория выберите Действие.
    3. В раскрывающемся списке Сущность выберите Нет (глобальный).
    4. Выберите параметр Новый процесс из существующего шаблона (выберите из списка).
    5. Выберите шаблон SLACustomTimeCalculationTemplate из списка.
    6. Выберите ОК.

    Шаблон пользовательского расчета времени

  4. В шаблон добавьте необходимые параметры (если есть) и выберите Активировать.

    Включение аргументов процесса для любого элемента SLA

  5. Создание подключаемого модуля.

    Сведения по выбору нужного подключаемого модуля см. в разделе Сценарии и подключаемые модули.

  6. Чтобы связать его с пользовательским действием, созданным на шаге 3, перейдите в средство регистрации подключаемых модулей и зарегистрируйте созданный подключаемый модуль в своей организации. Дополнительные сведения о подключаемом модуле см. в разделе Регистрация подключаемого модуля.

    Регистрация и связывание подключаемого модуля

  7. В Центре администрирования службы Copilot добавьте или измените ранее созданное настраиваемое действие с помощью элемента SLA:

    1. Установите выключатель Разрешить пользовательский расчет времени в значение Да.
    2. В поле Процесс пользовательского расчета времени выберите пользовательское действие, созданное на шаге 3.
    3. Выберите Сохранить и закрыть.
  8. В форме SLA выберите Активировать и примените его к нужной сущности. Время предупреждения и сбоя ключевого показателя эффективности SLA отображаются в соответствии с логикой расчета времени, предоставленной в пользовательском действии.

    Для получения информации о том, как применять соглашения об уровне обслуживания, см. раздел Применение соглашений об уровне обслуживания

  9. Чтобы экспортировать решение в другую среду, сначала добавьте соглашение об уровне обслуживания (элемент которого имеет ссылку на настраиваемое действие) в настраиваемое решение. При добавлении SLA также экспортируется рабочий процесс настраиваемого действия. Затем включите сообщение пакета SDK в решение, которое экспортирует созданный вами ранее подключаемый модуль.

Сценарии и подключаемые модули

Обратитесь к следующим сценариям и их подключаемым модулям, чтобы реализовать код подключаемого модуля, связанный с вашим настраиваемым действием.

Сценарий 1:

Если у вас нет сценария паузы или возобновления, то только WarningTime и FailureTime подлежат расчету. Всякий раз, когда создаются какие-либо новые экземпляры ключевых показателей эффективности, 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}"} относится к идентификатору элемента SLA."

Причина

Ошибка возникает, если бизнес-процесс пользовательского расчета времени включен, но соответствующий шаг процесса обмена сообщениями 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.

Определение соглашений об уровнях обслуживания

Применение SLA

Включение записей для соглашения об уровне обслуживания