Математические операции в ВКУ
При проектировании услуг на платформе ЕПГУ часто возникает необходимость в проведении элементарных математических операций для вычисления каких-либо величин, участвующих в формировании заявления пользователя. Примером такой операции может быть вычисление размера госпошлины в зависимости от параметра, указанного пользователем. Например, размер жилой площади, объём котлована, высота постройки, длина трубопровода
Пример: вычисление величины госпошлины, уплачиваемой получателем услуги при государственной регистрации судна в российском реестре судов. Размер уплачиваемой госпошлины зависит от валовой вместительности судна, измеряемой в единицах валовой вместительности (ЕВВ), и состоит из фиксированной части плюс ставки за каждую единицу валовой вместительности судна
Исходные условия для расчёта приведены в таблице
Категория судна |
Тоннаж от, ЕВВ |
Тоннаж до, ЕВВ |
Фиксированная ставка, руб |
Ставка за 1 ЕВВ, руб |
Описание |
b |
80 |
3 000 |
85 000,00 |
9,40 |
Судно (самоходное либо несамоходное) валовой вместимостью от 80 до 3 000 единиц включительно |
c |
3 000,1 |
8 000 |
87 000,00 |
8,80 |
Судно (самоходное либо несамоходное) валовой вместимостью от 3 000 до 8 000 единиц включительно |
d |
8 000,1 |
20 000 |
155 000,00 |
5,00 |
Судно (самоходное либо несамоходное) валовой вместимостью от 8 000 до 20 000 единиц включительно |
e |
20 000,1 |
215 000,00 |
3,20 |
Судно (самоходное либо несамоходное) валовой вместимостью свыше 20 000 единиц |
Вводимая пользователем валовая вместимость судна вводится с точностью до десятых
Для проведения расчётов будем использовать компонент ValueCalculator, который будет помещен в нашу услугу с помощью другого компонента-адаптера UniversalLogicAfterValidation. В поле описания компонента поместим следующее:
{ "linkedValues": [ { "version": 2, "argument": "res", "definition": { "expression1": "getIf(((arg1 > 0) && (arg1 <= 3000)), 85000 + arg1 * 9.4)", "expression2": "getIf(((arg1 > 3000) && (arg1 <= 8000)), 87000 + arg1 * 8.8)", "expression3": "getIf(((arg1 > 8000) && (arg1 <= 20000)), 155000 + arg1 * 5)", "expression4": "getIf((arg1 > 20000), 215000 + arg1 * 3.2)", "arg1": "asDouble('${c1}')" } } ] |
В представленном примере используется механизм linkedValues второй версии — это механизм определения выражений, заданных в конфигурации компонента. В этой конфигурации определен один аргумент arg1, значение которого берётся из компонента с1, сохранённое в черновике. Далее вычисляются 4 выражения. Конструкция getIf работает таким образом, что выполняется вычисление нескольких выражений expression друг за другом до тех пор, пока первый параметр в выражении не станет равным true, то есть перебираются все строчки таблицы, и проверяется, попадает ли наш аргумент в интервал, указанный в выражении
Данный алгоритм получает значение, введённое пользователем в компонент с1. С помощью операторов сравнения определяется интервал, в который попадает значение и производятся необходимые вычисления с помощью элементарных математических операций. Полученное значение в виде аргумента помещается в черновик. Далее это значение может быть использовано на усмотрение разработчика. В нашем случае оно будет выведено на экран в поле компонента StringInput
Собранный пример на практике имеет некоторые особенности
- Экран s2, на котором расположен компонент vc, где выполняется расчёт, имеет тип EMPTY, то есть невидимый для пользователя. В услугах этот компонент можно располагать на обычных экранах. При этом нужно понимать, что данные, необходимые для расчёта, уже должны присутствовать в черновике до начала расчёта, а результат расчёта будет также помещен в черновик. Именно поэтому ввод данных, расчёт и отображение результатов находятся на трёх разных экранах
- В представленном примере сразу за экраном s2, на котором производится расчёт, располагается экран s5, где находится компонент vc_rnd, выполняющий функции округления величин, полученных при расчёте на экране s. Этот экран также имеет тип EMPTY. Компонент vc_rnd в услугах можно располагать на обычном экране, но данные для его работы должны уже находиться в черновике и результат его работы будет помещён в черновик