logo

[ELMA3] Заполнение метрик процесса через сценарии

В системе ELMA предусмотрена возможность создавать метрики/показатели процесса или экземпляра процесса.

В данной статье рассмотрены примеры заполнения значений метрик через сценарии процесса.

Например, время обработки заявки в бизнес-процессе «Рассмотрение заявки» заносится пользователем в контекстную переменную VremyaNaObrabotku. Требуется записать это время в метрику экземпляра процесса VremyaObrabotkiZayavki.

Для этого в бизнес-процессе необходимо разместить следующий сценарий:

1
2
3
4
5
6
// Получить метрику экземпляра процесса и привести его к типу P_ProcessSMetrikami_IM
var metricValues = context.WorkflowInstance.MetricValues as P_ProcessSMetrikami_IM;
// Присвоить метрике экземпляра процесса значение из контекстной переменной VremyaNaObrabotku
metricValues.VremyaObrabotkiZayavki = Convert.ToInt32(context.VremyaNaObrabotku);
// Сохранить метрику экземпляра процесса
metricValues.Save();

Тип, к которому требуется привести метрику, можно узнать в Дизайнере ELMA в карточке процесса на вкладке "Настройки":

Рис. 1. Дизайнер ELMA. Карточка процесса. Вкладка "Метрики и показатели". Структура метрик экземпляра процесса

Другая часто возникающая задача – сохранение количества запусков процесса для персональной метрики.

В данном случае идёт работа с метрикой процесса, а не с метрикой экземпляра процесса.

Необходимо создать метрику процесса в карточке процесса на вкладке "Метрики и показатели" со следующими параметрами:

Рис. 2. Шаг 1. Название показателя

Рис 3. Шаг 2. Значение показателя

Рис. 4. Шаг 3. Правило вычисления

В сценарии процесса для заполнения метрики необходимо использовать следующий код:

1
2
3
4
5
6
7
8
9
var processMetrics = context.WorkflowInstance.Process.ProcessMetrics.EntityProperties.Cast<ProcessMetric>();
if(processMetrics != null){
    //поиск метрики процесса по названию
    var isp = processMetrics.FirstOrDefault(pm => pm.Name == "KolichestvoZapuskov");
     if (isp != null){    
        //если метрика является персональной, то необходимо указать контекстную переменную, в которой будет храниться пользователь, запустивший процесс; в противном случае вместо context.Ispolnitelj надо подставить null         
        SaveMetricValue(isp, context.Ispolnitelj);
    }
}

Также в сценарий процесса необходимо добавить метод сохранения значения метрики:

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

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

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

1
2
3
4
5
using EleWise.ELMA.Workflow.Models;
using EleWise.ELMA.Security.Models;
using EleWise.ELMA.Services;
using EleWise.ELMA.KPI.Common.Interfaces;
using EleWise.ELMA.Logging;

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

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
private void SaveMetricValue(ProcessMetric metric, User responsible)
        {
            var filter = PublicAPI.Processes.Objects.ProcessMetricValue.Filter().Responsible(responsible).ProcessMetricUid(metric.Uid);
                       
            if (metric.UsePeriodicity && metric.PeriodicityUid.HasValue)
            {
                var periodService = Locator.GetServiceNotNull<IPeriodicityService>();
                var periodicity = periodService.Load(metric.PeriodicityUid.Value);
                if (periodicity != null)
                {
                    var period = periodService.GetPeriod(periodicity, DateTime.Now);
                    filter = filter.PeriodStart(period.First).PeriodEnd(period.Second);
                }
            }
                        
            var ispValue = filter.Find().FirstOrDefault();
            if (ispValue != null)
            {
                double doubleValue;
                if (double.TryParse(ispValue.Value.ToString(), out doubleValue))
                {
                    PublicAPI.Processes.Objects.ProcessMetricValue. SetMetricValue(metric,doubleValue + 1,DateTime.Now,responsible);
                } else
                {
                    Logger.Log.Error(String.Format("Ошибка при вычислении показателя {0}", metric.DisplayName));
                }
            } else
            {
                PublicAPI.Processes.Objects.ProcessMetricValue. SetMetricValue(metric,1,DateTime.Now,responsible);
            }
        }

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

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

1
2
3
4
5
6
7
using EleWise.ELMA.Workflow.Models;
using EleWise.ELMA.Security.Models;
using EleWise.ELMA.Model.Services;
using EleWise.ELMA.Services;
using EleWise.ELMA.KPI.Common.Interfaces;
using EleWise.ELMA.Workflow.Managers;
using EleWise.ELMA.Logging;

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

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
private void SaveMetricValue(ProcessMetric metric, IUser responsible){
    var filter = InterfaceActivator.Create<IProcessMetricValueFilter>();
     filter.DisableSecurity = true;
     filter.Responsible = responsible;
     filter.ProcessMetricUid = metric.Uid;
                      
     if(metric.UsePeriodicity && metric.PeriodicityUid.HasValue){
         var periodService = Locator.GetServiceNotNull<IPeriodicityService>();
         var periodicity = periodService.Load(metric.PeriodicityUid.Value);
         if (periodicity != null){
             var period = periodService.GetPeriod(periodicity, DateTime.Now);
             filter.PeriodStart = period.First;
             filter.PeriodEnd = period.Second;
         }
     }
                       
     IProcessMetricValue ispValue = ProcessMetricValueManager.Instance.Find(filter, FetchOptions.All).FirstOrDefault();
     if (ispValue != null){
         double doubleValue;
         if (double.TryParse(ispValue.Value.ToString(), out doubleValue)){
             ProcessMetricValueManager.Instance.MetricSave(metric, responsible, doubleValue + 1);
         } else {
             Logger.Log.Error(String.Format("Ошибка при вычислении показателя {0}", metric.DisplayName));
         }
     }
     else{
         ProcessMetricValueManager.Instance.MetricSave(metric, responsible, 1);
     }
}