Creatio development guide
PDF

Добавление нового правила расчета сроков в обращении

Glossary Item Box

Общая информация

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

Выбор конкретного правила для расчета происходит с использованием справочника [Правила расчета сроков по обращениям]. Для того чтобы добавить новое правило расчета, необходимо выполнить следующие шаги:

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

2. На основе созданной схемы объекта создать справочник и заполнить его значениями, необходимыми для расчета временных параметров.

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

4. Подключить новое правило.

Описание примера

Добавить пользовательское правило для расчета временных параметров обращений по сервису [Восстановление утерянных данных] согласно договора [78 — Elite Systems]. Для нового правила установить следующие значения:

  • время реакции — 2 календарных часа;
  • время разрешения — 1 рабочий день;
  • используемый календарь — [Типовой календарь].

Исходный код примера

Пакет с реализацией примера можно скачать по ссылке.

Алгоритм выполнения примера

1. Создать схему объекта, содержащего необходимые для расчета колонки

В разделе [Конфигурация] на вкладке [Схемы] выполните команду [Добавить] ([Add]) — [Объект] ([Object]) (рис. 1, 1).

Рис. 1. — Добавление схемы

Для созданной схемы объекта установите следующие свойства (рис. 2):

  • [Название] ([Name]) — "UsrServiceTestTerms";
  • [Заголовок] ([Title]) — "ServiceTestTerms";
  • [Родительский объект] ([Parent object]) — схема [Базовый объект] ([Base object]).

Рис. 2. — Свойства добавленной схемы объекта

В созданной схеме создайте набор колонок, основные свойства которых представлены в таблице 1.

Табл. 1. — Свойства добавляемых колонок

Название Заголовок Тип Описание
UsrReactionTimeUnit Единица измерения времени реакции (Response time unit) Справочник [Единица времени] ([Time unit]) Указывает единицу измерения времени (календарные дни, часы и т.д), по которой будет рассчитан параметр [Время реакции].
UsrReactionTimeValue Значение времени реакции (Response time) Целое (Integer) Колонка для хранения значения срока реакции.
UsrSolutionTimeUnit Единица измерения времени разрешения (Resolve time unit) Справочник [Единица времени] ([Time unit]) Указывает единицу измерения времени (календарные дни, часы и т.д.), по которой будет рассчитан параметр [Время разрешения].
UsrSolutionTimeValue Время разрешения (Resolution time) Целое (Integer) Колонка для хранения значения срока разрешения.
UsrCalendarId Используемый календарь (Calendar that is used) Справочник [Календарь] ([Calendar]) Календарь, по которому будут считаться сроки в обращении.
UsrServicePactId Сервисный договор (Service agreement) Справочник [Сервисный договор] ([Service agreement]) Ссылка на объект [Сервисный договор]. Добавлена для возможности осуществлять фильтрацию.
UsrServiceItemId Сервис (Service) Справочник [Сервис] ([Service]) Ссылка на объект [Сервис]. Добавлена для возможности осуществлять фильтрацию.

После добавления колонок опубликуйте схему объекта.

2. Создать справочник и заполнить его значениями, необходимыми для расчета временных параметров

Для расчета сроков реакции и разрешения обращения необходимо предоставить их конкретные значения. Для этого на основе добавленной схемы создайте справочник со следующими свойствами (рис. 3):

  • [Название] ([Name]) —"Пользовательские сроки реакции и разрешения" ("Custom response and resolution deadlines");
  • [Объект] ([Object]) — ServiceTestTerms.

Рис. 3. — Свойства добавляемого справочника

В наполнение созданного справочника добавьте запись со следующими данными (по условиям примера) (рис. 4):

Рис. 4. — Запись в добавленном справочнике, удовлетворяющая условиям примера

3. Реализовать класс с механизмом получения временных параметров

Добавьте схему исходного кода (рис. 1, 2). В исходный код схемы добавьте класс, унаследованный от абстрактного класса BaseTermStrategy, объявленного в пакете Calendar. В классе реализуйте параметризованный конструктор со следующими параметрами:

  • UserConnection userConnection — текущее подключение пользователя;
  • Dictionary<string, object> args — аргументы, на основании которых будет выполняться расчет.

Реализуйте объявленный в базовом классе абстрактный метод GetTermInterval(). Этот метод в качестве входного параметра принимает маску уже заполненных значений, на основании которой будет принято решение о заполнении конкретных временных параметров возвращаемого класса TermInterval, реализующего интерфейс ITermInterval<TMask>.

Полностью исходный код схемы:

namespace Terrasoft.Configuration
{
    using System;
    using System.Collections.Generic;
    using Terrasoft.Common;
    using Terrasoft.Configuration.Calendars;
    using Terrasoft.Core;
    using Terrasoft.Core.Entities;
    using CalendarsTimeUnit = Calendars.TimeUnit;
    using SystemSettings = Terrasoft.Core.Configuration.SysSettings;
    public class ServiceTestTermsStrategy: BaseTermStrategy<CaseTermInterval, CaseTermStates>
    {
        // Класс-контейнер для хранения данных, полученных из точки входа.
        protected class StrategyData
        {
            public Guid ServiceItemId {
                get;
                set;
            }
            public Guid ServicePactId {
                get;
                set;
            }
        }
        // Поле, хранящее данные, полученные из точки входа.
        protected StrategyData _strategyData;
        // Параметризированный конструктор, необходимый для корректной 
        // инициализации классом-селектором.
        public ServiceTestTermsStrategy(UserConnection userConnection, Dictionary<string, object> args)
            : base(userConnection) {
            _strategyData = args.ToObject<StrategyData>();
        }
        // Метод, который получает данные и возвращает их в экземпляре класса CaseTermInterval. 
        public override CaseTermInterval GetTermInterval(CaseTermStates mask) {
            var result = new CaseTermInterval();
            // Создание EntitySchemaQuery запроса.
            var esq = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "UsrServiceTestTerms");
            // Добавление колонок в запрос.
            string reactionTimeUnitColumnName = esq.AddColumn("UsrReactionTimeUnit.Code").Name;
            string reactionTimeValueColumnName = esq.AddColumn("UsrReactionTimeValue").Name;
            string solutionTimeUnitColumnName = esq.AddColumn("UsrSolutionTimeUnit.Code").Name;
            string solutionTimeValueColumnName = esq.AddColumn("UsrSolutionTimeValue").Name;
            string calendarColumnName = esq.AddColumn("UsrCalendarId.Id").Name;
            // Добавление фильтров в запрос.
            var esqFirstFilter = esq.CreateFilterWithParameters(FilterComparisonType.Equal, "UsrServiceItemId", _strategyData.ServiceItemId);
            var esqSecondFilter = esq.CreateFilterWithParameters(FilterComparisonType.Equal, "UsrServicePactId", _strategyData.ServicePactId);
            esq.Filters.Add(esqFirstFilter);
            esq.Filters.Add(esqSecondFilter);
            // Выполнение и обработка результатов запроса.
            EntityCollection entityCollection = esq.GetEntityCollection(UserConnection);
            if (entityCollection.IsNotEmpty()) {
                // Добавление к возвращаемому значению времени реакции.
                if (!mask.HasFlag(CaseTermStates.ContainsResponse)) {
                    result.ResponseTerm = new TimeTerm {
                        Type = entityCollection[0].GetTypedColumnValue<CalendarsTimeUnit>(reactionTimeUnitColumnName),
                        Value = entityCollection[0].GetTypedColumnValue<int>(reactionTimeValueColumnName),
                        CalendarId = entityCollection[0].GetTypedColumnValue<Guid>(calendarColumnName)
                    };
                }
                // Добавление к возвращаемому значению времени разрешения.
                if (!mask.HasFlag(CaseTermStates.ContainsResolve)) {
                    result.ResolveTerm = new TimeTerm {
                        Type = entityCollection[0].GetTypedColumnValue<CalendarsTimeUnit>(solutionTimeUnitColumnName),
                        Value = entityCollection[0].GetTypedColumnValue<int>(solutionTimeValueColumnName),
                        CalendarId = entityCollection[0].GetTypedColumnValue<Guid>(calendarColumnName)
                    };
                }
            }
            return result;
        }
    }
}

После добавления исходного кода опубликуйте схему.

4. Подключить новое правило

Добавьте значение в справочник [Правила расчета сроков по обращениям] ([Case deadline calculation schemas]). В колонке [Обработчик] ([Handler]) укажите полное квалифицированное имя созданного класса (с указанием пространства имен).

При необходимости в колонке [Альтернативное правило] ([Alternative schema]) можно указать правило, по которому будут рассчитаны сроки в том случае, если расчет сроков с учетом текущего правила не представляется возможным. При этом следует учитывать, что если любой из временных параметров не будет рассчитан классом стратегии, то будет создан экземпляр класса альтернативной стратегии. Если же и альтернативная стратегия не сможет рассчитать сроки, то будет создана ее альтернативная стратегия, таким образом формируется очередь правил.

Для добавленной записи необходимо установить признак [По умолчанию] ([Default]).

Пример добавленной в справочник [Правила расчета сроков по обращениям] ([Case deadline calculation schemas]) записи показан на рисунке 5.

Рис. 5. — Запись пользовательского правила расчета сроков

В результате для обращений по сервисному договору [78 — Elite Systems] для сервиса [Восстановление утерянных данных] ([Lost data recovery]) будут применены новые правила расчета сроков реакции и разрешения (рис. 6).

Рис. 6. — Результат выполнения примера

© Terrasoft 2002-2019.

Был ли данный материал полезен?

Как можно улучшить эту статью?