[ELMA3] Сбор данных персональных показателей и запись итогового значения в общий показатель
Пусть существует персональный ежедневный показатель "Количество звонков", в данном показателе подсчитывается количество звонков в день, сделанное каждым менеджером. Необходимо обладать статистикой, сколько всего было сделано звонков (всеми менеджерами). При этом общее количество звонков (сумма по всем персональным показателям) будет записано в отдельный показатель "Общее количество звонков", который уже не будет являться персональным.
Чтобы автоматически подсчитывать общее количество звонков, необходимо создать сценарий по сбору данных персональных показателей. Для этого на вкладке Показатели в Дизайнере ELMA в разделе Сбор данных необходимо добавить новый скрипт. В методе Execute пишется текст сценария (приведен ниже).
После этого следует создать задание планировщика, по которому в указанное на вкладке Общие время будет выполняться сценарий, суммирующий данные. На вкладке Задачи этого задания планировщика следует выбрать написанный скрипт.
Опубликовать модель.
Пример сценария с использованием PublicAPI
Пространство имен:
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);
}
}