logo

[ELMA3] Сбор данных персональных показателей и запись итогового значения в общий показатель

Пусть существует персональный ежедневный показатель "Количество звонков", в данном показателе подсчитывается количество звонков в день, сделанное каждым менеджером. Необходимо обладать статистикой, сколько всего было сделано звонков (всеми менеджерами). При этом общее количество звонков (сумма по всем персональным показателям) будет записано в отдельный показатель "Общее количество звонков", который уже не будет являться персональным.
Чтобы автоматически подсчитывать общее количество звонков, необходимо создать сценарий по сбору данных персональных показателей. Для этого на вкладке Показатели в Дизайнере ELMA в разделе Сбор данных необходимо добавить новый скрипт. В методе Execute пишется текст сценария (приведен ниже).
После этого следует создать задание планировщика, по которому в указанное на вкладке Общие время будет выполняться сценарий, суммирующий данные. На вкладке Задачи этого задания планировщика следует выбрать написанный скрипт.
Опубликовать модель.

Пример сценария с использованием PublicAPI

Примечание
Актуальная документация по PublicAPI доступна по ссылке.
Внимание!
Сценарий, указанный ниже, актуален для версий системы ELMA до 3.12.1 включительно.

Пространство имен:

using EleWise.ELMA.API;

Текст сценария:

//загружаем показатель, хранящий общее количество, в локальную переменную по его имени
var sum_indicator = PublicAPI.KPI.Indicator.FindByName("Общее количество звонков");         
// Количество звонков - персональный показатель для каждого менеджера
//его также загружаем в локальную переменную по имени
var sub_indicator = PublicAPI.KPI.Indicator.FindByName("Количество звонков");
// Получаем пользователей, которые являются ответственными за показатель
var users = PublicAPI.KPI.Indicator.GetPersonals(sub_indicator);
    
double user_sum_value = 0;
    
// Перебираем всех пользователей
foreach(var user in users)
{
    // Получаем значение показателя за период для конкретного пользователя
    var user_value = PublicAPI.KPI.Indicator.GetFactValue(sub_indicator,DateTime.Now,user);
    //Если значение от имени текущего пользователя существует
    //то наращиваем сумму
    if (user_value.HasValue)
                user_sum_value += user_value.Value;    
}
//после того как сумма была подсчитана, записываем ее в фактическое значение общего показателя
//чтобы заполнить плановое значение показателя, используйте метод PublicAPI.KPI.Indicator.SetPlanValue()
PublicAPI.KPI.Indicator.SetFactValue(sum_indicator,user_sum_value,DateTime.Now,PublicAPI.Portal.Security.User.GetCurrentUser()); //устанавливает фактическое значение

Пример сценария без использования PublicAPI

Для корректной работы сценария необходимо подключить пространства имен:

using EleWise.ELMA.Services;
using EleWise.ELMA.KPI.Security;
using EleWise.ELMA.KPI.Managers;
using EleWise.ELMA.Security.Models;

Текст сценария следующий:

//загружаем показатель, хранящий общее количество, в локальную переменную по его имени
var sum_indicator = IndicatorsService.Instance.LoadByName("Общее количество звонков");        	
// Количество звонков – персональный показатель для каждого менеджера
//его также загружаем в локальную переменную по имени
var sub_indicator = IndicatorsService.Instance.LoadByName("Количество звонков");
// Создаем пару дат, которая будет обозначать период показателя
Pair<DateTime, DateTime> period = null;			 
// Служба для работы с периодичностями
var periodicityService = Locator.GetService<EleWise.ELMA.KPI.Common.Interfaces.IPeriodicityService>();
if (periodicityService != null)
{
	// Определяем период, за который записываем значение
	period = periodicityService.GetPeriod(sub_indicator.Periodicity, dateToRun);
}			 
if (period != null)
{
	// Создаем контекст для вычисления значений показателей
	var calc_context = IndicatorsService.Instance.CreateContext(period, false);				
	if (calc_context != null)
		{
			// Получаем ответственных за показатель
			var users = ((OrganizationItem)sub_indicator.Responsible).Users;			     
			double user_sum_value = 0;    			    
			// Перебираем всех пользователей
			foreach(var user in users)
			{
				// Получаем значение показателя за период для конкретного пользователя
				var user_value = calc_context.GetValue(sub_indicator, period, user);
				//Если значение от имени текущего пользователя существует
				//то наращиваем сумму
				if (user_value.HasValue)
					user_sum_value += user_value.Value;				        
			}
			//после того как сумма была подсчитана, записываем ее в фактическое значение общего показателя
			//чтобы заполнить плановое значение показателя, используйте метод SetPeriodPlanValue()
			IndicatorsService.Instance.SetPeriodValue(sum_indicator, period, user_sum_value);
		}
}