Общая информация
linkedValues версии 2 — это новый механизм linkedValues, который предназначен для определения и вычисления выражений, заданных в конфигурации компонента
Поддерживаемые экраны и компоненты
linkedValues версии 2 может быть задействован на экране типа:
- Экран отображения информации (INFO)
- Экран со сложным компонентом (UNIQUE)
- Составной экран (CUSTOM)
- Экран для повторяющегося набора компонентов (REPEATABLE)
- Специальный экран, содержащий компонент типа Redirect (EMPTY)
linkedValues версии2 может быть задействован в компонентах типа:
- Выпадающий список со строкой поиска (Lookup)
- Компонент для отображения вопроса и возможных ответов (QuestionScr)
- Компонент подписания документов (PguEsepSign)
- Компонент ввода диапазона дат (DateRangeInput)
- Информационный блок с полями (FieldList)
- Компонент для загрузки файлов (FileUploadComponent)
- Универсальный компонент ввода или подтверждения адреса (AddressInput)
- Компонент Пояснения (Explanation)
- Компонент ввода паспортных данных (PassportLookup)
- Список с возможностью множественного выбора (MultipleChoiceDictionary)
- Компонент Дисклеймер (DisclaimerElk)
- Компонент выбора месяца и года (MonthPicker)
- Переключатель, позволяющий выбрать один из предложенных вариантов (RadioInput)
- Компонент ввода даты (DateInput)
- Компонент выпадающего списка (DropDown)
- Компонент для ввода строки (StringInput)
- Ввод реквизитов документов (Заграничный паспорт, Водительское удостоверение, Паспорт РФ, Свидетельство о рождении) (DocInput)
- Выпадающий список со строкой поиска и получением значений из rest api (RestLookup)
- Компонент вывода сопроводительного текста (LabelSection)
- Компонент отправки rest-запроса к внешней системе (RestCall)
- Вставка компонента через JSON в логические компоненты экрана (UniversalLogic)
Внешний вид linkedValues версии 2
В конструкторе
Пример объявления новой версии
{ "linkedValues": [ { "version": 2, "argument": "example", "definition": { "expression1": "arg1", "arg1": "'value'" } } ] } |
version — версия linkedValues, где «2» — новая версия, «1» — старая версия, используется по умолчанию, когда не указана версия
argument — ключ в «arguments», под которым будет записан результат выражения
definition — блок выражения, состоящий из аргументов и выражений, таких как:
- expression1..10 — строка содержащая выражение, которое необходимо вычислить
- arg1..10 — строка содержащая определение переменной, используемой в выражении
Результат выражения
{ "arguments": { "example": "value" } } |
Стандартные методы и константы
// Методы приведения к типу asString(Object) asJson(Object) asMap(String) asList(String) asDate(String) asDate(String, String) // Второй параметр — формат даты первого аргумента asDateTime(String) asDateTime(String, String) // Второй параметр — формат даты первого аргумента asInt(String) asLong(String) asLong(String, String) — Приведение к «Long» с предварительным выпиливанием лидирующих нулей asDouble(String) — привидение к вещественным числам: «asDouble("'1'") -> 1.0» // Методы проверок массива allMatch(String) noneMatch(String) anyMatch(String) // Метод для выполнения нескольких «expression» друг за другом пока первый параметр не станет «true» getIf(boolean, Object) // Константы // Строковая константа в «arg1» и в «expression1» "expression1": "arg1 + 'string_constanta'", "arg1": "'value'" // «int» константа в «arg1» и в «expression1» "expression1": "arg1 + arg2 + 3", "arg1": "1" "arg1": "2" Особенности работы при выполнении математических операций: «arg1»: «2», «arg2»: «1» ( а не «arg1»: «'1'» — в противном случае выполнится конкатенация строк и в результате будет «21», а не «3»), либо явно приведены к нужному типу числа, использую методы «asInt(String)», «asDouble(String)», «asLong(String)» |
Ограничения и особенности работы
Максимальное количество выражений «expression»: 10
Максимальное количество переменных «arg»: 10
В выражениях «expression» можно использовать только «arg» переменные, стандартные методы и константы
В переменных «arg» можно использовать ссылки на поля, стандартные методы и константы
Порядок вычисления:
- Расчёт переменных «arg»
- Расчёт выражений «expression»
- Возврат результата
ВАЖНО!
- Все переменные «arg» рассчитываются по порядку следования «arg1, arg2, ... arg10»
- Если во время расчёта arg будет пустым, расчёт будет остановлен
- Все выражения «expression» рассчитываются по порядку следования «expression1», «expression2», «... expression10», если используется конструкция «getIf()»
- Если во время расчёта «expression» будет пустым, расчёт будет остановлен и возвращён, как результат строки «EMPTY_VALUE»
Логические выражения и операторы сравнения
"expression1": "(arg1 == arg2) ? 'equals' : 'not equals'" |
В качестве логических операторов используются стандартные операторы: «&&, ||, ==, !=», а также тернарный оператор «?:»
Для сравнения используются стандартные операторы сравнения «>, >=, <, <=, ==, !=»
Варианты использования
Один из основных вариантов применения linkedValues версии 2 — это использования «ValueCalculator» в компоненте UniversalLogic на специальном экране, содержащий компонент типа Redirect, данный способ позволяет собрать нужную информацию и преобразовать её на последующие экраны
Разберём несколько типовых примеров для преобразования данных:
- Пример приведения типов в формате «as* : asString, asInt, asList и др.»
- Пример конкатенации строк, в контексте строковых аргументов. В данном пример используется оператор: «+»
- 3) Пример с использованием специфичных вызовов для типа «методы», таких как: «"expression1":
"asString(asList(arg1).get(0))" вызов метода .get(index) на объекте списка», «"expression1": "asString(asList(arg1).size())" вызов метода size()», «"expression1": "asString(arg1).length()" вызов метода length() для вычисления длины строки» - Пример приведения типов и методов для работы с коллекциями: «allMatch(arg, key, value)», «anyMatch (arg, key, value)», «noneMatch(arg, key, value)». В данном примере необходимо реализовать эти методы в классе «ru.gosuslugi.pgu.fs.common.service.functions.ExpressionMethods.»
Пример приведения типов
{ "linkedValues": [ { "version": 2, "argument": "example", "definition": { "expression1": "arg1 == 501", "arg1": "asInt('000501')" } } ] } |
Результат выражения
{ "arguments": { "example": "true" } } |
Пример конкатенации строк
{ "linkedValues": [ { "version": 2, "argument": "example", "definition": { "expression1": "arg1 + ' ' + arg2 + ' ' + arg3", "arg1": "'Linked'", "arg2": "'Values'", "arg3": "'v2'" } } ] } |
Результат выражения
{ "arguments": { "example": "Linked Values v2" } } |
Пример преобразования номера для СНИЛС
{ "linkedValues": [ { "version": 2, "argument": "example", "definition": { "expression1": "arg1.replaceAll('[-s]', '')", "arg1": "'000-000-*** 00'" } } ] } |
Результат выражения
{ "linkedValues": [ { "version": 2, "argument": "example", "definition": { "expression1": "arg1.replaceAll('[-s]', '')", "arg1": "'000-000-*** 00'" } } ] } |
Результат выражения
{ "arguments": { "example": "00000000000" } } |
Ответы пользователя при прохождении сценария
{ "applicantAnswers": { "pd1": { "visited": true, "value": "{"id":"a8ed6bc8-4fb4-46da-affc-417b6dd93dcc","persons":[{"fullName":"Mikella Cash","sex ":"FEMALE","age":23,"status":"ACTIVE"},{"fullName":"Jurel Newell","sex":"MALE","age":28,"status ":"ACTIVE"},{"fullName":"Elijio Woolley","sex":"MALE","age":25,"status":"ACTIVE"}]}" } } } |
Пример приведения типов и методов
{ "linkedValues": [ { "version": 2, "argument": "example", "definition": { "expression1": "allMatch(arg1, 'status', 'ACTIVE') ? 'active' : 'non-active'", "arg1": "asList('${pd1.persons}')" } } ] } |
Результат выражения
{ "arguments": { "example": "active" } } |
Примеры шаблонов ВКУ ЕПГУ
- Вычисление длины массива и работа с полученными атрибутами массива
- Вычисление и сравнение дат JsonLogic
- Динамическое количество блоков в RepeatbleFields
- Анализ массива и настройка правил переходов
- Анализ количества приложенных файлов
- Преобразование значения строковых компонентов в массив
- Калькулятор (ValueCalculator)
- Математические операции
- Циклический экран с условными переходами внутри