示例#1
0
        public async Task <IActionResult> Create([Bind("Id,Year,Value")] DollarRate dollarRate)
        {
            var dollarRates = _context.DollarRate.AsNoTracking().ToList();

            if (dollarRates.Select(d => d.Year).Contains(dollarRate.Year))
            {
                ModelState.AddModelError("Year", _sharedLocalizer["ErrorDublicateValue"]);
            }
            if (ModelState.IsValid)
            {
                _context.Add(dollarRate);
                _context.Log.Add(new Log()
                {
                    DateTime  = DateTime.Now,
                    Email     = User.Identity.Name,
                    Operation = "—оздание  урса доллара",
                    New       = $"{dollarRate.Year}; {dollarRate.Value}",
                    Old       = ""
                });
                await _context.SaveChangesAsync();

                List <Indicator> indicators = _context.Indicator.AsNoTracking().Where(i => i.Formula.Contains("$")).ToList();
                for (int i = 0; i < indicators.Count(); i++)
                {
                    new IndicatorsController(_context, _sharedLocalizer).CalculateIndicatorValues(indicators[i].Id);
                }
                return(RedirectToAction("Index"));
            }
            int year_min = Convert.ToInt32(Startup.Configuration["YearMin"]);

            ViewBag.Year = Enumerable.Range(year_min, DateTime.Now.Year - year_min + 1).Select(i => new SelectListItem {
                Text = i.ToString(), Value = i.ToString(), Selected = i == dollarRate.Year
            });
            return(View(dollarRate));
        }
示例#2
0
        public bool AddDollarRate(List <Rate> rateList, string Disclaimer, string Licence, string Timestamp, string Base, Dictionary <string, decimal> Rates)
        {
            bool result = false;

            using (GrainBarrelContext gbc = new GrainBarrelContext())
            {
                DollarRate dollarRate = new DollarRate()
                {
                    RateList = rateList, disclaimer = Disclaimer, licence = Licence, timestamp = Timestamp, @base = Base, rates = Rates
                };
                gbc.DollarRates.Add(dollarRate);
                gbc.SaveChanges();
            }
            result = true;
            return(result);
        }
示例#3
0
        public async Task <IActionResult> Edit(int id, [Bind("Id,Year,Value")] DollarRate dollarRate)
        {
            if (id != dollarRate.Id)
            {
                return(NotFound());
            }
            if (ModelState.IsValid)
            {
                try
                {
                    DollarRate dollarRate_old = _context.DollarRate.AsNoTracking().FirstOrDefault(d => d.Id == dollarRate.Id);
                    _context.Log.Add(new Log()
                    {
                        DateTime  = DateTime.Now,
                        Email     = User.Identity.Name,
                        Operation = "–едактирование  урса доллара",
                        New       = $"{dollarRate.Year}; {dollarRate.Value}",
                        Old       = $"{dollarRate_old.Year}; {dollarRate_old.Value}"
                    });
                    _context.Update(dollarRate);
                    await _context.SaveChangesAsync();
                }
                catch (DbUpdateConcurrencyException)
                {
                    if (!DollarRateExists(dollarRate.Id))
                    {
                        return(NotFound());
                    }
                    else
                    {
                        throw;
                    }
                }
                List <Indicator> indicators = _context.Indicator.AsNoTracking().Where(i => i.Formula.Contains("$")).ToList();
                for (int i = 0; i < indicators.Count(); i++)
                {
                    new IndicatorsController(_context, _sharedLocalizer).CalculateIndicatorValues(indicators[i].Id);
                }
                return(RedirectToAction("Index"));
            }
            int year_min = Convert.ToInt32(Startup.Configuration["YearMin"]);

            ViewBag.Year = Enumerable.Range(year_min, DateTime.Now.Year - year_min + 1).Select(i => new SelectListItem {
                Text = i.ToString(), Value = i.ToString(), Selected = i == dollarRate.Year
            });
            return(View(dollarRate));
        }
示例#4
0
        public bool UpdateDollarRate(List <Rate> rateList, string Disclaimer, string Licence, string Timestamp, string Base, Dictionary <string, decimal> Rates)
        {
            bool result = false;

            using (GrainBarrelContext gbc = new GrainBarrelContext())
            {
                var        target     = gbc.DollarRates.SingleOrDefault(b => b.timestamp == Timestamp);
                DollarRate dollarRate = new DollarRate()
                {
                    RateList = rateList, disclaimer = Disclaimer, licence = Licence, timestamp = Timestamp, @base = Base, rates = Rates
                };
                if (target != null)
                {
                    target = dollarRate;
                    gbc.SaveChanges();
                    result = true;
                }
            }
            return(result);
        }
示例#5
0
        public List <IndicatorValue> CalculateIndicatorValues(string Formula, int IndicatorId)
        {
            List <IndicatorValue> indicatorValues = new List <IndicatorValue>();
            string        formula_test            = Formula;
            List <Region> regions = _context.Region.ToList();

            foreach (var region in regions)
            {
                IndicatorValue indicatorValue = _context.IndicatorValue.AsNoTracking().FirstOrDefault(iv => iv.RegionId == region.Id && iv.IndicatorId == IndicatorId);
                if (indicatorValue == null)
                {
                    indicatorValue = new IndicatorValue()
                    {
                        Id          = 0,
                        IndicatorId = IndicatorId
                    };
                }
                indicatorValue.RegionId = region.Id;
                indicatorValue.Region   = region;
                indicatorValue.Year     = region.Year;
                indicatorValues.Add(indicatorValue);
            }
            // => calculate values
            string code = $"decimal?[] r = new decimal?[{indicatorValues.Count().ToString()}];";

            for (int i = 0; i < indicatorValues.Count(); i++)
            {
                code += @"
                        ";
                string formula_code = formula_test;
                while (formula_code.IndexOf("Area") >= 0)
                {
                    formula_code = formula_code.Replace("Area", indicatorValues[i].Region.Area.ToString());
                }
                while (formula_code.IndexOf("Population") >= 0)
                {
                    formula_code = formula_code.Replace("Population", indicatorValues[i].Region.Area.ToString());
                }
                while (formula_code.IndexOf("$") >= 0)
                {
                    DollarRate dollarRate      = _context.DollarRate.AsNoTracking().FirstOrDefault(d => d.Year == indicatorValues[i].Region.Year);
                    decimal?   dollarRateValue = dollarRate == null ? null : dollarRate.Value;
                    formula_code = formula_code.Replace("$", dollarRateValue == null ? "null" : dollarRateValue.ToString());
                }
                while (formula_code.IndexOf("Min") >= 0)
                {
                    int M = formula_code.IndexOf("Min"),
                        I = formula_code.IndexOf(Startup.Configuration["FormulaIdFirstChar"], M),
                        d = formula_code.IndexOf(Startup.Configuration["FormulaIdLastChar"], I);
                    int            indicatorId    = Convert.ToInt32(formula_code.Substring(I + 1, d - I - 1));
                    ReferencePoint referencePoint = _context.ReferencePoint
                                                    .FirstOrDefault(r => r.IndicatorId == indicatorId);
                    decimal referencePointValue = referencePoint != null ? referencePoint.Min : 0;
                    formula_code = formula_code.Remove(M, d - M + 1 + 1);
                    formula_code = formula_code.Insert(M, referencePointValue.ToString());
                }
                while (formula_code.IndexOf("Max") >= 0)
                {
                    int M = formula_code.IndexOf("Max"),
                        I = formula_code.IndexOf(Startup.Configuration["FormulaIdFirstChar"], M),
                        d = formula_code.IndexOf(Startup.Configuration["FormulaIdLastChar"], I);
                    int            indicatorId    = Convert.ToInt32(formula_code.Substring(I + 1, d - I - 1));
                    ReferencePoint referencePoint = _context.ReferencePoint
                                                    .FirstOrDefault(r => r.IndicatorId == indicatorId);
                    decimal referencePointValue = referencePoint != null ? referencePoint.Max : 0;
                    formula_code = formula_code.Remove(M, d - M + 1 + 1);
                    formula_code = formula_code.Insert(M, referencePointValue.ToString());
                }
                while (formula_code.IndexOf(Startup.Configuration["FormulaIdFirstChar"]) >= 0)
                {
                    int I = formula_code.IndexOf(Startup.Configuration["FormulaIdFirstChar"]),
                        d = formula_code.IndexOf(Startup.Configuration["FormulaIdLastChar"]);
                    int            indicatorId    = Convert.ToInt32(formula_code.Substring(I + 1, d - I - 1));
                    IndicatorValue indicatorValue = _context.IndicatorValue
                                                    .AsNoTracking()
                                                    .FirstOrDefault(iv => iv.IndicatorId == indicatorId && iv.RegionId == indicatorValues[i].RegionId && iv.Year == indicatorValues[i].Year);
                    decimal?indicatorValueValue       = indicatorValue != null ? indicatorValue.Value : null;
                    string  indicatorValueValueString = indicatorValueValue != null?indicatorValueValue.ToString() : "null";

                    formula_code = formula_code.Remove(I, d - I + 1);
                    formula_code = formula_code.Insert(I, indicatorValueValueString);
                }
                formula_code = formula_code.Replace(',', '.');
                for (int j = formula_code.Length - 1; j >= 0; j--)
                {
                    bool insert = false;
                    if (Char.IsDigit(formula_code[j]))
                    {
                        insert = true;
                    }
                    if (j != formula_code.Length - 1)
                    {
                        if (formula_code[j + 1] == '.' || Char.IsDigit(formula_code[j + 1]))
                        {
                            insert = false;
                        }
                    }
                    if (insert)
                    {
                        formula_code = formula_code.Insert(j + 1, "M");
                    }
                }
                if (formula_code.Contains("null"))
                {
                    formula_code = "null";
                }
                code += $"r[{i.ToString()}] = null;" + "try{" + $"r[{i.ToString()}] = (decimal?)({formula_code});" + "} catch { }";
            }
            string     codeToCompile = @"using System;
                    namespace RoslynCompile
                    {
                        public class Calculator
                        {
                            public decimal?[] Calculate()
                            {
                                " + code + @"
                                return r;
                            }
                        }
                    }";
            SyntaxTree syntaxTree    = CSharpSyntaxTree.ParseText(codeToCompile);
            string     assemblyName  = Path.GetRandomFileName();

            MetadataReference[] references = new MetadataReference[]
            {
                MetadataReference.CreateFromFile(typeof(object).GetTypeInfo().Assembly.Location)
            };
            CSharpCompilation compilation = CSharpCompilation.Create(
                assemblyName,
                syntaxTrees: new[] { syntaxTree },
                references: references,
                options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));

            using (var ms = new MemoryStream())
            {
                EmitResult result = compilation.Emit(ms);
                if (!result.Success)
                {
                    IEnumerable <Diagnostic> failures = result.Diagnostics.Where(diagnostic =>
                                                                                 diagnostic.IsWarningAsError ||
                                                                                 diagnostic.Severity == DiagnosticSeverity.Error);
                    indicatorValues = new List <IndicatorValue>();
                }
                else
                {
                    ms.Seek(0, SeekOrigin.Begin);
                    Assembly   assembly = AssemblyLoadContext.Default.LoadFromStream(ms);
                    var        type     = assembly.GetType("RoslynCompile.Calculator");
                    var        instance = assembly.CreateInstance("RoslynCompile.Calculator");
                    var        meth     = type.GetMember("Calculate").First() as MethodInfo;
                    decimal?[] r        = meth.Invoke(instance, null) as decimal?[];
                    for (int i = 0; i < indicatorValues.Count(); i++)
                    {
                        indicatorValues[i].Value = r[i];
                    }
                }
            }
            // <=
            return(indicatorValues);
        }