/// <summary> /// Calculates formula column's values. /// </summary> /// <param name="parameters">Parameters.</param> /// <returns> /// Modified parameters. /// </returns> /// <exception cref="System.NotImplementedException"></exception> public ForecastCalcParams Calculate(ForecastCalcParams parameters) { parameters.ForecastId.CheckArgumentEmpty(nameof(parameters.ForecastId)); _parameters = parameters; InternalCalculation(); return(parameters); }
/// <summary> /// Calculates forecast object value column's values. /// </summary> /// <param name="parameters">Parameters.</param> /// <returns> /// Parameters with calculated cells. /// </returns> public ForecastCalcParams Calculate(ForecastCalcParams parameters) { InitData(parameters); var objectValueColumns = GetObjectValueColumns(); List <Cell> cells = new List <Cell>(); if (objectValueColumns.IsNotEmpty()) { CellRepository.DeleteCells(ForecastSheet, Periods, objectValueColumns); } _log.Info($"Forecast object value calculation. " + $"Columns to count: {objectValueColumns.Count()}"); foreach (ForecastColumn column in objectValueColumns) { var settings = ColumnSettingsMapper.GetForecastColumnSettingsData(UserConnection, column); if (settings == null) { _log.Info($"Settings for forecast {ForecastSheet.Name} - {ForecastSheet.Id} " + $"column {column.Name} - {column.Id} does not exists"); continue; } _log.Info($"Forecast object value calculation. " + $"Periods to count: {Periods.Count()}"); foreach (Period period in Periods) { var esq = new EntitySchemaQuery(UserConnection.EntitySchemaManager, settings.SourceEntityName); esq.IgnoreDisplayValues = true; string columnPath = GetEntityInCellColumnPath(settings); var refColumnName = esq.AddColumn(settings.ReferenceColumnName); var rowIdColumnName = esq.AddColumn($"{columnPath}.Row"); var valueColumn = esq.AddColumn(esq.CreateAggregationFunction( GetCalcFunction(settings.FuncCode), settings.FuncColumnName)); AddSettingsFilter(settings, esq); AddPeriodFilter(period, settings.PeriodColumnName, esq); AddEntitiesFilter(columnPath, esq); List <Cell> periodCells = new List <Cell>(); Select select = esq.GetSelectQuery(UserConnection); select.ExecuteReader((reader) => { decimal value = reader.GetColumnValue <decimal>(valueColumn.ValueQueryAlias); value = CalcValue(settings, value); periodCells.Add(new Cell { Value = value, ColumnId = column.Id, EntityId = reader.GetColumnValue <Guid>(refColumnName.ValueQueryAlias), RowId = reader.GetColumnValue <Guid>(rowIdColumnName.ValueQueryAlias), PeriodId = period.Id }); }); if (periodCells.Any()) { cells.AddRange(periodCells); _log.Info($"Forecast object value calculation. " + $"Has {periodCells.Count()} cells data for period {period.Name}"); } } } SaveCells(cells); parameters.Cells.AddRange(cells); return(parameters); }
/// <summary> /// Executes job operation. /// </summary> /// <param name="userConnection">The user connection.</param> /// <param name="parameters">The parameters.</param> public void Execute(UserConnection userConnection, IDictionary <string, object> parameters) { var forecastId = (Guid)parameters["ForecastId"]; var periodIds = parameters["PeriodIds"] as List <Guid>; var isUseSystemUser = (bool)parameters["IsUseSystemUser"]; _log.Info($"Forecast calculation started. ForecastId:{forecastId}"); var userConnectionForCalculation = userConnection; if (isUseSystemUser) { userConnectionForCalculation = userConnection.AppConnection.SystemUserConnection; } IForecastCalculator objectValueColumnsCalculator = GetForecastCalculator(userConnectionForCalculation, ForecastConsts.ObjectValueColumnTypeName); var forecastParams = new ForecastCalcParams(forecastId, periodIds); objectValueColumnsCalculator.Calculate(forecastParams); IForecastCalculator formulaColumnsCalculator = GetForecastCalculator(userConnectionForCalculation, ForecastConsts.FormulaColumnTypeName); formulaColumnsCalculator.Calculate(forecastParams); _log.Info($"Forecast calculation ended. ForecastId:{forecastId}"); CreateReminding(userConnection, forecastId); }
private void InitData(ForecastCalcParams parameters) { ForecastSheet = SheetRepository.GetSheet(parameters.ForecastId); InitPeriods(parameters.Periods); parameters.Cells = parameters.Cells ?? new List <Cell>(); EntityForecastSchema = UserConnection.EntitySchemaManager .GetInstanceByUId(ForecastSheet.ForecastEntityInCellUId); ReferenceSchemaName = UserConnection.EntitySchemaManager .GetItemByUId(ForecastSheet.ForecastEntityUId).Name; SchemaNamePrefix = Core.Configuration.SysSettings.GetDefValue(UserConnection, "SchemaNamePrefix") as string; }