Модуль выполнения расчета ячеек
Реализация модуля находится в файле ./classes/calculator/AssoiCalculatorHelper.js.
var Evaluator = function(Unmapper){
var self = this;
self.Context = Unmapper.Context;
// Ячейки, которые нужно посчитать
self.HowToCalculate = Unmapper.HowToCalculate;
// Посчитанные ячейки
self.Calculated = {};
// Какие поля нужно запросить при загрузке первичных ячеек
// в зависимости от кода валюты в контексте
self.Valutas = {"RUB":"ReportValue","USD":"ReportValue1","EUR":"ReportValue2"};
// Выбранное запрашиваемое поле
self.Field = 'Value';
// Публичная функция, которая вызвается снаружи
self.Calculate = function(done){...}
// Внутренние функции
// Убираем промежуточные переменнные
self.FilterResults = function(done){...}
// Хэш-таблица с информацией о загруженных первичных ячейках
self.PrimariesInfo = {...};
// Загрузка первичных ячеек
self.LoadPrimaries = function(Primaries,done){...}
// Ограничение на глубину вложенности переменных
self.maxRecursions = 200;
self.currentRecursion = 1;
// Рекурсивная функция вычисления
self._calculate = function(done){...}
// Проверка на то, что все зависимые переменные вычислены
self._isCalculateble = function(Vars){...}
// Вычисление формулы
self._calculateFormula = function(CellName,Formula,Vars){...}
}
При инициализации передается результат работы предыдущего модуля Unmapper
Логика работы заключается в следующем.
Загружаются все первичные переменные используемые в формулах LoadPrimaries
Вызывается рекурсивно функция _calculate, которая пробегает по всем не посчитанным переменным из hash-таблицы HowToCalculate, проверяет, что может их вычислить (все переменные, необходимые для вычисления, находятся в hash-таблице Calculated) с помощью функции _isCalculateble, вычисляет их с помощью функции _calculateFormula, заносит результат в hash-таблицу Calculated и исключает переменную из hash-таблицы HowToCalculate. Функция выполняется до тех пор пока все переменные не будут посчитаны
После окончания вычислений происходит фильтрация результата - FilterResults (отсеиваются промежуточные переменные - не запрошенные пользователем для расчета документа)
Возможные доработки:
В качестве оптимизации вычислений, можно упорядочить ячейки таким образом, чтобы вычисление произошло за 1 проход без рекурсий.
Вынести значения кодов валют для первичных ячеек в настройки системы
Информация о первичных ячейках возвращает IdUser (пользователя, который внес информацию). Необходимо переделать его на CodeUser.
Реализовать функцию возврата первичных значений в PostgreSQL с поддержкой механизма распараллеливания вручную через индекс по функции
При запросе первичных ячеек учитывать, что некоторые переменные требуют перевода валюты .tovaluta('NONE') в старом синтаксисе и ['NONE'] - в новом.
Last updated
Was this helpful?