Сбор данных персональных показателей и запись итогового значения в общий показатель
Пусть существует персональный ежедневный показатель "Количество звонков", в данном показателе подсчитывается количество звонков в день, сделанное каждым менеджером. Необходимо обладать статистикой, сколько всего было сделано звонков (всеми менеджерами). При этом общее количество звонков (сумма по всем персональным показателям) будет записано в отдельный показатель "Общее количество звонков", который уже не будет являться персональным.
Чтобы автоматически подсчитывать общее количество звонков, необходимо создать сценарий по сбору данных персональных показателей. Для этого на вкладке Показатели в Дизайнере ELMA в разделе Сбор данных необходимо добавить новый скрипт. В методе Execute пишется текст сценария (приведен ниже).
После этого следует создать задание планировщика, по которому в указанное на вкладке Общие время будет выполняться сценарий, суммирующий данные. На вкладке Задачи этого задания планировщика следует выбрать написанный скрипт.
Опубликовать модель.
Пример сценария с использованием PublicAPI
Пространство имен:
1 | using EleWise.ELMA.API; |
Текст сценария:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | //загружаем показатель, хранящий общее количество, в локальную переменную по его имени 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
Для корректной работы сценария необходимо подключить пространства имен:
1 2 3 4 | using EleWise.ELMA.Services; using EleWise.ELMA.KPI.Security; using EleWise.ELMA.KPI.Managers; using EleWise.ELMA.Security.Models; |
Текст сценария следующий:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | //загружаем показатель, хранящий общее количество, в локальную переменную по его имени 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); } } |