Войти

Математические операции

Математические операции в ВКУ

При проектировании услуг на платформе ЕПГУ часто возникает необходимость в проведении элементарных математических операций для вычисления каких-либо величин, участвующих в формировании заявления пользователя. Примером такой операции может быть вычисление размера госпошлины в зависимости от параметра, указанного пользователем. Например, размер жилой площади, объём котлована, высота постройки, длина трубопровода

Пример: вычисление величины госпошлины, уплачиваемой получателем услуги при государственной регистрации судна в российском реестре судов. Размер уплачиваемой госпошлины зависит от валовой вместительности судна, измеряемой в единицах валовой вместительности (ЕВВ), и состоит из фиксированной части плюс ставки за каждую единицу валовой вместительности судна

Исходные условия для расчёта приведены в таблице

Категория судна

Тоннаж от, ЕВВ

Тоннаж до, ЕВВ

Фиксированная ставка, руб

Ставка за 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

Собранный пример на практике имеет некоторые особенности

  1. Экран s2, на котором расположен компонент vc, где выполняется расчёт, имеет тип EMPTY, то есть невидимый для пользователя. В услугах этот компонент можно располагать на обычных экранах. При этом нужно понимать, что данные, необходимые для расчёта, уже должны присутствовать в черновике до начала расчёта, а результат расчёта будет также помещен в черновик. Именно поэтому ввод данных, расчёт и отображение результатов находятся на трёх разных экранах
  2. В представленном примере сразу за экраном s2, на котором производится расчёт, располагается экран s5, где находится компонент vc_rnd, выполняющий функции округления величин, полученных при расчёте на экране s. Этот экран также имеет тип EMPTY. Компонент vc_rnd в услугах можно располагать на обычном экране, но данные для его работы должны уже находиться в черновике и результат его работы будет помещён в черновик
Авторизуйтесь, чтобы оставить комментарий к статье