Добавление нового правила расчета сроков в обращении
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. — Результат выполнения примера