Войти

Динамическая фильтрация справочников

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

В Визуальном конструкторе услуг разработчикам доступны для использования компоненты, позволяющие подключить справочник на форму: Lookup, MultipleChoiceDictionary, MapService, RestCall и прочие

Зачастую при разработке услуг, где используются справочники, необходимо настроить их фильтрацию. Для настройки фильтрации справочника по атрибуту нужно задать:

  • «Фильтрацию по выбранному словарю» в настройках Lookup
  • «Опциональный список фильтров для справочника, фильтры соединяются через AND в настройках MultipleChoiceDictionary
  • «Настройку фильтрации справочника» в настройках MapService
  • «Фильтры справочника» в настройках компонента RestCall

Механизм сложной фильтрации

Сложная фильтрация — универсальный механизм, позволяющий задавать условия фильтрации, передаваемые в запросах к NSI-справочникам. Механизм dictionaryFilterV2 поддерживается в следующих компонентах: Lookup, MultipleChoiceDictionary, механизм ref (тип filterOn)

Новый механизм позволяет задавать любую структуру фильтра, которая поддерживается справочником NSI:

  • задавать различные условия (CONDITIONS) для фильтрации: EQUALS, NOT_EQUALS, GREATER_THAN, LESS_THAN, GREATER_THAN_OR_EQUALS, LESS_THAN_OR_EQUALS, CONTAINS, STARTS_WITH, ENDS_WITH, FIAS, ADDRESS
  • задавать в фильтре условия подзапроса: IN, EXISTS, NOT_EXISTS
  • использовать в фильтре различные условия объединения: OR, AND, различные сочетания OR и AND

Механизм dictionaryFilterV2 позволяет указывать ссылки на значения атрибутов из черновика или текущего экрана, аналогично как при обычной фильтрации

Механизм dictionaryFilterV2 НЕ поддерживается в компонентах: RestCall, BackRestCall, MapService

Если в json компонента одновременно заданы сложная фильтрация и обычная фильтрация, то при формировании фильтра используется сложная фильтрация

В неактивном состоянии данный механизм выглядит следующим образом

image1.png

При нажатии на кнопку «Да» появляется поле для ввода кода фильтра json

image2.png

Настройка статической фильтрации

Простая статическая фильтрация

Статическая фильтрация по атрибуту задаётся явным указанием значения атрибута в поле «Константное значение для фильтра»

image3.png

Сложная статическая фильтрация

Статическое значение, value внутри dictionaryFilterV2 подставляется в запрос в явном виде

В значение подставляется null или подобный сериализованный объект: "value": "{"asString": "text"}"

Подстановка строки

{

   "attributeName": "ACTIVE",

   "condition": "EQUALS",

   "value": "{"asString":"Y"}",

   "valueType": "value"

}

Подстановка null

{

   "attributeName": "ACTIVE",

   "condition": "EQUALS",

   "value": null,

   "valueType": "value"

}

Пример настройки в компоненте

image4.png

Пример фильтрации по 2-ум атрибутам с объединением AND

{

   "union": {

      "unionKind": "AND",

      "subs": [

         {

            "simple": {

               "attributeName": "ACTIVE_EXTRACT",

               "condition": "EQUALS",

               "value": "{"asString":"Y"}",

               "valueType": "value"

            }

         },

         {

            "simple": {

               "attributeName": "ACTIVE_OBTAIN",

               "condition": "EQUALS",

               "value": "{"asString":"Y"}",

               "valueType": "value"

            }

         }

      ]

   }

}

Описание атрибутов

Опция Обязательность/значение по умолчанию Описание
attributeName Обязательное Атрибут, по которому производится поиск в справочнике
attributeType

Необязательное,

по умолчанию asString

Формат данных в котором хранится поле на стороне nsi. Возможные типы: "asString", "asLong", "asDecimal", "asDateTime", "asDate", "asBoolean", "asNumber"

condition Обязательное

Условия сравнения:

  • EQUALS — полное сравнение (точное соответствие строк)
  • CONTAINS — полнотекстовый поиск (подстрока содержится в строке)
  • ENDS_WITH (заканчивается на)
  • GREATER_THAN (больше чем)
  • GREATER_THAN_OR_EQUALS (больше или равно)
  • IN (одно из перечисленных)
  • LESS_THAN (меньше, чем)
  • LESS_THAN_OR_EQUALS (меньше или равно)
  • NOT_EQUALS (не равно)
  • STARTS_WITH (начинается с)
  • ADDRESS — строку адреса преобразует (пытается) в fias код и подставляет в запрос
value Обязательное

Значение, по которому осуществляется фильтрация. Всегда строка, может быть как путь в json, например: "q2.value", или строка — сериализованный объект, например: value: "{"asString": "text"}"

valueType Обязательное

Тип значения, по которому осуществляется фильтрация. Подробнее в возможных типах (ValueType)

dateFormat Необязательное Если данные являются датой, то они будут отформатированы согласно данному формату
formatValue.additionalString Необязательное

Параметры форматирования значения

"formatValue": {    "str": [       0,       2    ],    "additionalString": "000" }

additionalString Необязательное

"additionalString": "000"

Добавляет указанные символы к value

str Необязательное

"str": [ 0, 2 ], — при указании подобной конструкции у числа берутся только первые два символа

Первый аргумент показывает, с какого по счету символа брать данные, а второй аргумент — по какой символ НЕ включительно

excludeWrapper Необязательное

Если задан "excludeWrapper": true, то value передается в таком формате "value": "2",

Если "excludeWrapper": false, то value принимает такой формат "value": {asDecimal:"2"}

Настройка динамической фильтрации

Динамическая фильтрация подразумевает собой изменение значения для фильтра в зависимости от заданных условий. Вместо явного указания значения атрибута в поле «Константное значение для фильтра» может прописываться вычисляемый аргумент linkedValues, переменная, id другого компонента или его атрибут

image5.png

Простая динамическая фильтрация

Пример динамической фильтрации Lookup по вычисляемому аргументу linkedValues

В данном примере используется справочник территориальных органов Directory_Of_Territorial. Справочник фильтруется по атрибуту ADDRESS, содержащему значение адреса ТО

image6.png

Отфильтровать значения необходимо по региону из адреса, подтверждённого пользователем в компоненте ConfirmAddress, для этого описан аргумент linkedValues, вычисляемый с помощью JsonLogic — var1

{

   "if": [

      {

         "==": [

            "answer.c28.value.address.region",

            "Москва"

         ]

      },

      "г. Москва",

      {

         "==": [

            "answer.c28.value.address.region",

            "Санкт-Петербург"

         ]

      },

      "г. Санкт-Петербург",

      ...

      {

         "==": [

            "answer.c28.value.address.region",

            "Самарская"

         ]

      },

      "г. Самара"

   ]

}

В результате фильтрации выводятся значения справочника, соответствующие региону адреса регистрации пользователя

gif1.gif

Пример динамической фильтрации MultipleChoiceDictionary по значению из другого компонента

В данном примере используется справочник типов документов, удостоверяющих личность, IDENTITY_DOC_TYPE. Справочник фильтруется по атрибуту country, содержащему значение страны принадлежности типа документа

image7.png

Отфильтровать значения необходимо по стране принадлежности типа документа, этот признак определяется ответом пользователя в квизе c5. Условие описывается в аргументе ValueCalculator'а — c4.value.arguments.country

{

   "visited": false,

   "linkedValues": [

      {

         "argument": "country",

         "jsonLogic": {

            "if": [

               {

                  "==": [

                     "answer.c5.value",

                     "да"

                  ]

               },

               "RUS",

               {

                  "==": [

                     "answer.c5.value",

                     "нет"

                  ]

               },

               "FOREIGN"

            ]

         }

      }

      ]

}

В результате фильтрации выводятся значения справочника согласно ответу пользователя в квизе о гражданстве

gif2.gif

Пример динамической фильтрации справочника в компоненте MapService по глобальной переменной

В данном примере используется справочник организаций PGS_CNSTR_ORG, который фильтруется по глобальной переменной userRegionCode, содержащей значение ОКАТО пользователя

image8.png

Значение глобальной переменной передаётся в вычисляемый аргумент, используемый в качестве значения для фильтра

image9.png

В результате фильтрации при изменении региона местонахождения пользователя выводится соответствующий перечень организаций для выбора на карте

gif3.gif

Пример динамической фильтрации справочников на одном экране

Для динамической фильтрации одного справочника по атрибуту другого справочника настраивается Зависимость с ранее введёнными данными, типом получения значения для фильтра устанавливается Значение из поддерживаемых. В данном примере справочник grls_ilp_nd, содержащий регистрационные номера лекарственных препаратов, фильтруется по значению id лекарственного препарата из справочника grls_ilp_lp

image10.png
image11.png

В результате фильтрации выводятся регистрационные номера выбранного лекарственного средства

gif4.gif

Сложная динамическая фильтрация

Пример динамической фильтрации по данным из applicantAnswers

В примере данные берутся из applicantAnswers — заполненных компонентов с предыдущих экранов, в качестве "valueType" указывается "ref". Например:

{

   "attributeName": "LIC_TYPE",

   "attributeType": "asDecimal",

   "condition": "EQUALS",

   "value": "s6lookup.value.originalItem.attributeValues.CODE",

   "valueType": "ref",

   "excludeWrapper": true,

}

Если задан "excludeWrapper": true, то value передается в таком формате "value": "2"

Если "excludeWrapper": false, то value принимает такой формат "value": {asDecimal:"2"}

Пример динамической фильтрации по данным из serviceInfo

В данном случае фильтр нужен для обращения к блоку serviceInfo в scenarioDto, в качестве "valueType" указывается "serviceInfo"

image12.png

Пример:

{

   "attributeName": "REGOKATO",

   "condition": "EQUALS",

   "value": "infSysCode",

   "valueType": "serviceInfo"

}

Пример динамической фильтрации по значениям компонентов текущего экрана

Позволяет использовать данные других компонентов текущего экрана, т.е. данных ещё нет в applicantAnswers, в качестве "valueType" указывается "formValue"

Используется при фильтрации внутри зависимостей (filterOn)

{

   "attributeName": "REGOKATO",

   "condition": "EQUALS",

   "valueType": "formValue",

   "attributeType": "asString",

   "value": "VKRegionName.value.id"

}

Пример динамической фильтрации по вычисляемым аргументам

Аргументы для вычисления в expr берутся из applicantAnswers и задаются, как в ref, в качестве "valueType" указывается "calc"

{

   "attributeName": "address",

   "condition": "EQUALS",

   "attributeType": "asDecimal",

   "value": "",

   "expr": [

      "$dict2_SanCheRest_is_fell.value.attributeValues.ADDRESS != '' ? $dict2_SanCheRest_is_fell.value.attributeValues.ADDRESS : ''",

      "$dict2_SanCheRest_is_good.value.attributeValues.address != '' ? $dict2_SanCheRest_is_good.value.attributeValues.address : ''",

      "$dict3_SanCheRest_is_fell.value.attributeValues.ADDRESS != '' ? $dict3_SanCheRest_is_fell.value.attributeValues.ADDRESS : ''",

      "$dict3_SanCheRest_is_good.value.attributeValues.address != '' ? $dict3_SanCheRest_is_good.value.attributeValues.address : ''"

   ],

   "valueType": "calc"

}

Авторизуйтесь, чтобы оставить комментарий к статье