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)); }
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); }
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)); }
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); }
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); }