Добавление нового правила расчета сроков в обращении
Glossary Item Box
Общая информация
Bpm'online предоставляет возможность реализовать собственную логику получения временных параметров для расчета сроков. При расчете или перерасчете сроков в обращении вместо одной из базовых стратегий расчета будет использоваться стратегия, реализованная разработчиком.
Выбор конкретного правила для расчета происходит с использованием справочника [Правила расчета сроков по обращениям]. Для того чтобы добавить новое правило расчета, необходимо выполнить следующие шаги:
1. Создать схему объекта, в которую добавить колонки, необходимые для хранения расчетного времени реакции и разрешения, а также ссылки на календарь, сервисный договор и сервис.
2. На основе созданной схемы объекта создать справочник и заполнить его значениями, необходимыми для расчета временных параметров.
3. Добавить схему исходного кода, в которой объявить класс, унаследованный от абстрактного класса BaseTermStrategy. В классе реализовать пользовательский механизм получения временных параметров реакции и разрешения обращения.
4. Подключить новое правило.
Описание кейса
Добавить пользовательское правило для расчета временных параметров обращений по сервису [Восстановление утерянных данных] согласно договора [78 — Хризантема]. Для нового правила установить следующие значения:
- время реакции — 2 календарных часа;
- время разрешения — 1 рабочий день;
- используемый календарь — [Типовой календарь].
Алгоритм выполнения кейса
1. Создать схему объекта, содержащего необходимые для расчета колонки
Для этого необходимо выбрать пользовательский пакет и в разделе [Конфигурация] на вкладке [Схемы] выполнить команду [Добавить] — [Объект] (рис. 1, 1).
Рис. 1. — Добавление схемы
Для созданной схемы объекта необходимо установить следующие свойства (рис. 2):
- [Название] — "UsrServiceTestTerms";
- [Заголовок] — "ServiceTestTerms";
- [Пакет] — пользовательский пакет, в котором ведется разработка, например, Custom;
- [Родительский объект] — схема [Базовый объект] (BaseEntity) пакета Base.
Рис. 2. — Свойства добавленной схемы объекта
В созданной схеме необходимо создать набор колонок, основные свойства которых представлены в таблице 1.
Табл. 1. — Свойства добавляемых колонок
Название | Заголовок | Тип | Описание |
---|---|---|---|
UsrReactionTimeUnit | Единица измерения времени реакции | Справочник [Единица времени] | Указывает единицу измерения времени (календарные дни, часы и т.д), по которой будет рассчитан параметр [Время реакции]. |
UsrReactionTimeValue | Значение времени реакции | Целое | Колонка для хранения значения срока реакции. |
UsrSolutionTimeUnit | Единица измерения времени разрешения | Справочник [Единица времени] | Указывает единицу измерения времени (календарные дни, часы и т.д.), по которой будет рассчитан параметр [Время разрешения]. |
UsrSolutionTimeValue | Время разрешения | Целое | Колонка для хранения значения срока разрешения. |
UsrCalendarId | Используемый календарь | Справочник [Календарь] | Календарь, по которому будут считаться сроки в обращении. |
UsrServicePactId | Сервисный договор | Справочник [Сервисный договор] | Ссылка на объект [Сервисный договор]. Добавлена для возможности осуществлять фильтрацию. |
UsrServiceItemId | Сервис | Справочник [Сервис] | Ссылка на объект [Сервис]. Добавлена для возможности осуществлять фильтрацию. |
После добавления колонок схему объекта необходимо опубликовать.
2. Создать справочник и заполнить его значениями, необходимыми для расчета временных параметров
Для расчета сроков реакции и разрешения обращения необходимо предоставить их конкретные значения. Для этого необходимо на основе добавленной схемы создать справочник со следующими свойствами (рис. 3):
- [Название] —"Пользовательские сроки реакции и разрешения";
- [Объект] — 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, CaseTermFlags> { // Класс-контейнер для хранения данных, полученных из точки входа. 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(CaseTermFlags 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; // Добавление фильтров в запрос. esq.CreateFilterWithParameters(FilterComparisonType.Equal, "UsrServiceItemId", _strategyData.ServiceItemId); esq.CreateFilterWithParameters(FilterComparisonType.Equal, "UsrServicePactId", _strategyData.ServicePactId); // Выполнение и обработка результатов запроса. EntityCollection entityCollection = esq.GetEntityCollection(UserConnection); if (entityCollection.IsNotEmpty()) { // Добавление к возвращаемому значению времени реакции. if (!mask.HasFlag(CaseTermFlags.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(CaseTermFlags.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. Подключить новое правило
Для этого нужно добавить значение в справочник [Правила расчета сроков по обращениям]. В колонке [Обработчик] следует указать полное квалифицированное имя созданного класса (с указанием пространства имен).
При необходимости в колонке [Альтернативное правило] можно указать правило, по которому будут рассчитаны сроки в том случае, если расчет сроков с учетом текущего правила не представляется возможным. При этом следует учитывать, что если любой из временных параметров не будет рассчитан классом стратегии, то будет создан экземпляр класса альтернативной стратегии. Если же и альтернативная стратегия не сможет рассчитать сроки, то будет создана ее альтернативная стратегия, таким образом формируется очередь правил.
Для добавленной записи необходимо установить признак [По умолчанию].
Пример добавленной в справочник [Правила расчета сроков по обращениям] записи показан на рисунке 5.
Рис. 5. — Запись пользовательского правила расчета сроков
В результате для обращений по сервисному договору [78 — Хризантема] для сервиса [Восстановление утерянных данных] будут применены новые правила расчета сроков реакции и разрешения (рис. 6).
Рис. 6. — Результат выполнения кейса