Документация

Документация по разработке bpm’online
PDF
Пользовательские бизнес-правила мобильного приложения

Glossary Item Box

Общие сведения

Бизнес-правила являются одним из механизмов bpm'online, позволяющим настраивать поведение полей на странице редактирования записи. С их помощью можно, например, настроить обязательность и видимость полей, их доступность и т. п. Подробно бизнес-правила рассмотрены в статье "Бизнес-правила мобильного приложения".

В мобильном приложении существует возможность добавлять бизнес-правило, реализующее пользовательскую логику — пользовательское бизнес-правило. Для такого бизнес-правила предусмотрен тип Terrasoft.RuleTypes.Custom.

Свойства конфигурационного объекта config

При добавлении пользовательского бизнес-правила с помощью метода Terrasoft.sdk.Model.addBusinessRule(name, config) можно использовать свойства конфигурационного объекта config базового бизнес-правила (см. "Бизнес-правила мобильного приложения"). Также дополнительно предусмотрено свойство executeFn.

Используемые свойства конфигурационного объекта config:

  • ruleType — тип правила. Для пользовательских правил должно содержать значение Terrasoft.RuleTypes.Custom.
  • triggeredByColumns — массив колонок, инициирующих срабатывание бизнес-правила.
  • events — массив событий, определяющий время запуска бизнес-правил. Должен содержать значения из перечисления Terrasoft.BusinessRuleEvents. Значение по умолчанию: Terrasoft.BusinessRuleEvents.ValueChanged.
  • executeFn — функция-обработчик, содержащая пользовательскую логику выполнения бизнес-правила.

Перечисление Terrasoft.BusinessRuleEvents содержит следующие значения:

  • Тerrasoft.BusinessRuleEvents.Save — правило стработает перед сохранением данных.
  • Terrasoft.BusinessRuleEvents.ValueChanged — правило стработает после изменения данных (при редактировании).
  • Terrasoft.BusinessRuleEvents.Load — правило стработает при открытии страницы редактирования.

Свойства функции-обработчика executeFn

Функция-обработчик, объявляемая в свойстве executeFn должна иметь следующую сигнатуру:

executeFn: function(record, rule, checkColumnName, customData, callbackConfig, event) {
}

Параметры функции:

  • record — запись, для которой выполняется бизнес-правило.
  • rule — экземпляр текущего бизнес-правила.
  • checkColumnName — название колонки, которая вызвала срабатывание бизнес-правила.
  • customData — объект, разделяемый между всем правилами. Не используется. Оставлен для совместимости с предыдущими версиями.
  • callbackConfig — конфигурационный объект асинхронного возврата Ext.callback.
  • event — событие, по которому было запущено бизнес-правило.

При завершении работы функции необходимо обязательно вызвать или callbackConfig.success , или callbackConfig.failure. Рекомендуются следующие варианты вызова:

Ext.callback(callbackConfig.success, callbackConfig.scope, [result]);
Ext.callback(callbackConfig.failure, callbackConfig.scope, [exception]);

Где:

  • result — возвращаемое логическое значение, полученное при выполнении функции (true/false).
  • exception — исключение типа Terrasoft.Exception, возникшее в функции-обработчике.

В исходном коде функции-обработчика удобно использовать следующие методы модели, передаваемой в параметре record:

  • get(columnName) — для получения значения колонки записи. Аргумент columnName должен содержать название колонки.
  • set(columnName, value, fireEventConfig) — для установки значения колонки записи. Параметры:
    • columnName — название колонки.
    • value — значение, присваиваемое колонке.
    • fireEventConfig — конфигурационный объект для установки свойств, передаваемых в событие изменения колонки.
  • changeProperty(columnName, propertyConfig) — для изменения свойств колонки, кроме ее значения. Аргумент columnName должен содержать название колонки, а propertyConfig — объект, устанавливающий свойства колонки. Возможные свойства объекта propertyConfig:
    • disabled — активность колонки. Если true, то элемент управления, связанный с колонкой, будет неактивным и закрытым для работы.
    • readOnly — признак "только для чтения". Если true, то элемент управления, связанный с колонкой, будет доступен только для чтения. Если false — для чтения и записи.
    • hidden — видимость колонки. Если true, то элемент управления, связанный с колонкой, будет скрыт. Если false — отображен.
    • addFilter — добавить фильтр. Если свойство указано, то в нем должен быть указан фильтр типа Terrasoft.Filter, который будет добавлен к фильтрации колонки. Свойство используется только для справочных полей.
    • removeFilter — удалить фильтр. Если свойство указано, то в нем должно быть указано имя фильтра, который будет удален из фильтрации колонки. Свойство используется только для справочных полей.
    • isValid — признак корректности колонки. Если свойство указано, то оно изменит признак корректности элемента управления, связанного с колонкой. Если колонка некорректна, то это может означать отмену событий по сохранению записи, а также может привести к признанию записи некорректной.

Например, для изменения свойств (но не значения) колонки "Owner":

record.changeProperty("Owner", {
    disabled: false,
    readOnly: false,
    hidden: false,
    addFilter: {
        property: "IsChief",
        value: true
    },
    isValid: {
        value: false,
        message: LocalizableStrings["Owner_should_be_a_chief_only"]
    }
 });

Примеры пользовательского бизнес-правила

Пример 1

Требуется выделить поле с результатом активности, если ее статус "Завершена", сам поле [результат] не заполнено и есть значение в колонке ProcessElementId.

// Правило для страницы редактирования активности.
Terrasoft.sdk.Model.addBusinessRule("Activity", {
    // Название бизнес-правила.
    name: "ActivityResultRequiredByStatusFinishedAndProcessElementId",
    // Тип бизнес-правила: пользовательское.
    ruleType: Terrasoft.RuleTypes.Custom,
    // Правило инициируется колонками Status и Result.
    triggeredByColumns: ["Status", "Result"],
    // Правило отработает перед сохранением данных и после изменения данных.
    events: [Terrasoft.BusinessRuleEvents.ValueChanged, Terrasoft.BusinessRuleEvents.Save],
    // Функция-обработчик.
    executeFn: function(record, rule, column, customData, callbackConfig) {
        // Признак корректности свойства и правила.
        var isValid = true;
        // Значение колонки ProcessElementId.
        var processElementId = record.get("ProcessElementId");
        // Если значение не пустое.
        if (processElementId && processElementId !== Terrasoft.GUID_EMPTY) {
            // Установка признака корректности.
            isValid = !(record.get("Status.Id") === Terrasoft.Configuration.ActivityStatus.Finished &&
                Ext.isEmpty(record.get("Result")));
        }
        // Изменение свойств колонки Result.
        record.changeProperty("Result", {
            // Установка признака корректности колонки.
            isValid: {
                value: isValid,
                message: Terrasoft.LS["Sys.RequirementRule.message"]
            }
        });
        // Асинхронный возврат значений. 
        Ext.callback(callbackConfig.success, callbackConfig.scope, [isValid]);
    }
});

Пример 2

Добавление и удаление фильтрации по пользовательской логике.

Terrasoft.sdk.Model.addBusinessRule("Activity", {
    name: "ActivityResultByAllowedResultFilterRule",
    position: 1,
    ruleType: Terrasoft.RuleTypes.Custom,
    triggeredByColumns: ["Result"],
    events: [Terrasoft.BusinessRuleEvents.ValueChanged, Terrasoft.BusinessRuleEvents.Load],
    executeFn: function(record, rule, column, customData, callbackConfig) {
        var allowedResult = record.get("AllowedResult");
        var filterName = "ActivityResultByAllowedResultFilter";
        if (!Ext.isEmpty(allowedResult)) {
            var allowedResultIds =  Ext.JSON.decode(allowedResult, true);
            var resultIdsAreCorrect = true;
            for (var i = 0, ln = allowedResultIds.length; i < ln; i++) {
                var item = allowedResultIds[i];
                if (!Terrasoft.util.isGuid(item)) {
                    resultIdsAreCorrect = false;
                    break;
                }
            }
            if (resultIdsAreCorrect) {
                var filter = Ext.create("Terrasoft.Filter", {
                    name: filterName,
                    property: "Id",
                    funcType: Terrasoft.FilterFunctions.In,
                    funcArgs: allowedResultIds
                });
                record.changeProperty("Result", {
                    addFilter: filter
                });
            } else {
                record.changeProperty("Result", {
                    removeFilter: filterName
                });
            }
        } else {
            record.changeProperty("Result", {
                removeFilter: filterName
            });
        }
        Ext.callback(callbackConfig.success, callbackConfig.scope, [true]);
    }
});

Пример 3

Пример логики сбрасывания отрицательных значений в 0.

Terrasoft.sdk.Model.addBusinessRule("Opportunity", {
    name: "OpportunityAmountValidatorRule",
    ruleType: Terrasoft.RuleTypes.Custom,
    triggeredByColumns: ["Amount"],
    events: [Terrasoft.BusinessRuleEvents.ValueChanged, Terrasoft.BusinessRuleEvents.Save],
    executeFn: function(model, rule, column, customData, callbackConfig) {
        var revenue = model.get("Amount");
        if ((revenue < 0) || Ext.isEmpty(revenue)) {
            model.set("Amount", 0, true);
        }
        Ext.callback(callbackConfig.success, callbackConfig.scope);
    }
});

Пример 4

Пример генерации заголовка активности для решения FieldForce.

Terrasoft.sdk.Model.addBusinessRule("Activity", {
    name: "FieldForceActivityTitleRule",
    ruleType: Terrasoft.RuleTypes.Custom,
    triggeredByColumns: ["Account", "Type"],
    events: [Terrasoft.BusinessRuleEvents.ValueChanged, Terrasoft.BusinessRuleEvents.Load],
    executeFn: function(record, rule, column, customData, callbackConfig, event) {
        if (event === Terrasoft.BusinessRuleEvents.ValueChanged || record.phantom) {
            var type = record.get("Type");
            var typeId = type ? type.get("Id") : null;
            if (typeId !== Terrasoft.Configuration.ActivityTypes.Visit) {
                Ext.callback(callbackConfig.success, callbackConfig.scope, [true]);
                return;
            }
            var account = record.get("Account");
            var accountName = (account) ? account.getPrimaryDisplayColumnValue() : "";
            var title = Ext.String.format("{0}: {1}", Terrasoft.LocalizableStrings.FieldForceTitlePrefix, accountName);
            record.set("Title", title, true);
        }
        Ext.callback(callbackConfig.success, callbackConfig.scope, [true]);
    }
});

© Terrasoft 2002-2018.

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

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