Вопрос

Обязательность поля в зависимости от результата фильтрации

В мобильном приложении есть поле "Модель оборудования".
К этому полю применяется фильтр вида:

Terrasoft.sdk.Model.addBusinessRule("Case", {
    ruleType: Terrasoft.RuleTypes.Filtration,
    events: [Terrasoft.BusinessRuleEvents.Load, Terrasoft.BusinessRuleEvents.ValueChanged],
    triggeredByColumns: ["WorkTypeEquipment"],//Тип оборудования
    filteredColumn: "WorkCategoryModelEquipment",//Модель оборудования связана с Тип оборудования по WorkTypeEquipmentId
    filters: Ext.create("Terrasoft.Filter", {
        property: "WorkTypeEquipment"
    })
});

Также это поле Должно быть обязательным, если приведенный выше фильтр возвращает хотя-бы одну запись, иначе поле НЕ обязательное.

Пока есть только идея  перед установкой признака Обязательное вручную формировать запрос Select Count(*).... и смотреть на результат....
Но как асинхронный результат выполнения будет сочетаться с бизнес-правилом поля не совсем понятно.

Может если перейти на фильтр, построенный как бизнес-правило можно-будет при определении Обязательности вычитать какие-то его свойства?

Какие могут быть еще решения?

Нравится

2 комментария

Вручную использовать запросы к базе крайне не рекомендуется, т.к. отвалится онлайн режим.

Можно использовать custom бизнес правило. Сначала строим фильтр. Потом этот же фильтр используем его для подсчёта кол-ва записей. Как-то так. Пример оформления custom правила в академии есть.

record.changeProperty("WorkCategoryModelEquipment", {
   removeFilter: "FilterName"
});
 
var filter = Ext.create("Terrasoft.BaseFilter", {
    name: "FilterName"
    //определение фильтра
});
 
record.changeProperty("WorkCategoryModelEquipment", {
    addFilter: filter
})
 
var store= Ext.create("Terrasoft.store.BaseStore", { model: "WorkCategoryModelEquipment" });
 
store.setFilters(filter);
var queryConfig = Ext.create("Terrasoft.QueryConfig", {
	modelName: "WorkCategoryModelEquipment",
	columns: ["Id", "Name"]
});
store.load({
    queryConfig: queryConfig,
    callback: function(records, operation, success) {
        var isRequired = store.data.length > 0;
        record.changePropery("WorkCategoryModelEquipment", {required: isRequired});
        Ext.callback(config.success, config.scope);
    }
})

 

Полученный конечный результат для одной колонки выглядит так:

//Причины поломки
Terrasoft.sdk.Model.addBusinessRule("Case", {
    name: "WorkReasonReqRule",
    ruleType: Terrasoft.RuleTypes.Custom,
    triggeredByColumns: ["Category", "Status", "WorkCategory", "WorkReason"],
    events: [
        Terrasoft.BusinessRuleEvents.Load,
        Terrasoft.BusinessRuleEvents.ValueChanged,
        Terrasoft.BusinessRuleEvents.Save
    ],
    executeFn: function(record, rule, column, customData, callbackConfig) {
        let vWorkCategoryId = record.get("WorkCategory.Id");//зона ответственности
        let vWorkCategoryEmpty = !!vWorkCategoryId;//зона ответственности
        if(!vWorkCategoryEmpty){//если зона ответственности = пусто, то причина поломки - не обязательна
            record.changeProperty("WorkReason",
                {isValid: {
                    value: true,
                    message: ""
                    }
                });
            Ext.callback(callbackConfig.success, callbackConfig.scope, [true]);
            return;
        }
        
        let vReasonValid = !!record.get("WorkReason.Id");//причины поломки не пустая
        if(vReasonValid){
            record.changeProperty("WorkReason",
                {isValid: {
                    value: true,
                    message: ""
                    }
                });
            Ext.callback(callbackConfig.success, callbackConfig.scope, [true]);
            return;
        }

        let vFilter = Ext.create("Terrasoft.Filter", {
            name: "WorkReasonFilter",
            property: "WorkCategory",
            value: vWorkCategoryId
        });

        let vStore = Ext.create("Terrasoft.store.BaseStore", { model: "WorkReason" });
        vStore.setFilters(vFilter);
        var vQueryConfig = Ext.create("Terrasoft.QueryConfig", {
            modelName: "WorkReason",
            columns: ["Id", "Name"]
        });
        vStore.load({
            queryConfig: vQueryConfig,
            callback: function(records, operation, success) {
                let vEmpty = records.length > 0;
                record.changeProperty("WorkReason",
                    {isValid: {
                        value: !vEmpty,
                        message: Terrasoft.LS["Sys.RequirementRule.message"]
                        }
                    });
                Ext.callback(callbackConfig.success, callbackConfig.scope, [!vEmpty]);
            },
            scope: this
        });
        return;
    }
});
 

Показать все комментарии