Модуль выполнения расчета ячеек

Реализация модуля находится в файле ./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

Логика работы заключается в следующем.

  1. Загружаются все первичные переменные используемые в формулах LoadPrimaries

  2. Вызывается рекурсивно функция _calculate, которая пробегает по всем не посчитанным переменным из hash-таблицы HowToCalculate, проверяет, что может их вычислить (все переменные, необходимые для вычисления, находятся в hash-таблице Calculated) с помощью функции _isCalculateble, вычисляет их с помощью функции _calculateFormula, заносит результат в hash-таблицу Calculated и исключает переменную из hash-таблицы HowToCalculate. Функция выполняется до тех пор пока все переменные не будут посчитаны

  3. После окончания вычислений происходит фильтрация результата - FilterResults (отсеиваются промежуточные переменные - не запрошенные пользователем для расчета документа)

Возможные доработки:

  1. В качестве оптимизации вычислений, можно упорядочить ячейки таким образом, чтобы вычисление произошло за 1 проход без рекурсий.

  2. Вынести значения кодов валют для первичных ячеек в настройки системы

  3. Информация о первичных ячейках возвращает IdUser (пользователя, который внес информацию). Необходимо переделать его на CodeUser.

  4. Реализовать функцию возврата первичных значений в PostgreSQL с поддержкой механизма распараллеливания вручную через индекс по функции

  5. При запросе первичных ячеек учитывать, что некоторые переменные требуют перевода валюты .tovaluta('NONE') в старом синтаксисе и ['NONE'] - в новом.

Last updated