public async Task <Task> ProcessCsv(string csv, Dictionary <string, string> attr) { var path = attr["FilePath"]; var machine = attr["MachineName"]; string key = path + "-" + machine; var epexRows = _parser.Parse(csv, CultureInfo.GetCultureInfo("en-US")); var posHelp = new PositionsHelper(_context, key); var currentPos = await posHelp.GetCurrentPosition(); var tradeNo = Int32.MinValue; foreach (var row in epexRows.OrderBy(r => r.TradeNo)) { tradeNo = Convert.ToInt32(row.TradeNo); if (tradeNo > currentPos) { // Quantity bestemmes af buy/sell: Hvis vi har købt skal quantity angives med positivt fortegn. // Hvis vi har solgt skal quantity angives med negativt fortegn decimal quant = row.Quantity; decimal price = row.Price; int fact = row.BuySell.ToUpper() == "B" ? 1 : -1; Effect effect = Effect.FromMegawatts(quant * fact); Money money = new Money(price, new Currency(row.Currency)); // Hent alias og heraf grid ud fra landekoden i CSV filen (aflæses i EIC feltet). TsoAlias alias = GetTsoAliases(row.EIC.Substring(3, 2), "TsoAlias"); Grid grid = alias.Grid; // Vi henter tidszonen fra grid var timeZone = grid.TimeZoneInfo; //CSV timeperiod format : 20200123 15:00-20200123 15:30 DateTimeOffset from = GetEpexDateTimeOffSet(row.Contract.Substring(0, 14), timeZone); DateTimeOffset to = GetEpexDateTimeOffSet(row.Contract.Substring(15, 14), timeZone); TimePeriod timePeriod = new TimePeriod(from, to); var sourceBook = _context.Books.Where(tso => (tso.ShortName == row.TSO || tso.ShortName == row.TSO + " INTRA")).FirstOrDefault() ?? throw new ArgumentException($"Could not get exchange book for TSO {row.TSO}"); var targetBook = grid.DefaultTradeBook ?? throw new ArgumentException($"Could not get default trade book for grid {grid}"); var traderId = _context.Traders.Where(trader => trader.ExternalTraderId == row.TraderId && trader.TradingPlatform == "EPEX").FirstOrDefault() ?? throw new ArgumentException($"Could not validate trader {row.TraderId}"); var transaction = Model.Entities.Transaction.CreateTrade(grid, timePeriod, sourceBook, targetBook, effect, money, traderId.ExternalTraderId, row.Text); transaction.SetExternalReference(new ExternalReference("EPEX-" + row.TSO + "-" + row.OrderNo + "-" + row.TradeNo)); var ex = await _context.Transactions.FindByExternalReferenceAsync(transaction.ExternalReference); if (ex == null) { await _context.Transactions.AddAsync(transaction); } } } await posHelp.SetPosition(tradeNo); _context.SaveChanges(); return(Task.CompletedTask); }
private void UpdateData() { try { Dictionary <long, Position> oldPositions = PositionsHelper.GetLastLoadPositions() .ToDictionary(el => el.Auc); IAucJsonFile file = GetAucJsonFile(); List <Position> newPositions = file.AucPositions.ToList(); List <Position> oldHardPositions = new List <Position>(); List <Position> newHardPositions = new List <Position>(); List <Position> toUpdatePositions = new List <Position>(); foreach (Position newPos in newPositions) { Position oldPos = null; // Если не получилось найти, значит лот новый (раньше такого лота не было, позможно перевыставили). if (!oldPositions.TryGetValue(newPos.Auc, out oldPos)) { newHardPositions.Add(newPos); } } // Обновляем старые лоты. AucTraderDbContextHelper.SavePositionsAsPackages(newHardPositions); } catch (Exception) { } }
private void UpdateData2() { try { Dictionary <long, Position> oldPositions = PositionsHelper.GetLastLoadPositions2() .ToDictionary(el => el.Auc); IAucJsonFile file = GetAucJsonFile(); List <Position> newPositions = file.AucPositions.ToList(); Dictionary <long, Position> toUpdatePositions = new Dictionary <long, Position>(); List <Position> newHardPositions = new List <Position>(); List <Position> oldHardPositions = new List <Position>(); DateTime withdrwanDateTime = newPositions.First().LoadDateTime; foreach (Position newPos in newPositions) { Position oldPos = null; // Если не получилось найти, значит лот новый (раньше такого лота не было, позможно перевыставили). if (!oldPositions.TryGetValue(newPos.Auc, out oldPos)) { // Не нашли старой позиции, значит новая, может быть перевыставили и пох, пока что. newHardPositions.Add(newPos); continue; } // Нашли старую идентичную позицию, обновим ее новыми даннымы. if (oldPos != null) { newPos.Id = oldPos.Id; toUpdatePositions.Add(newPos.Auc, newPos); } } foreach (var oldPos in oldPositions.Values) { Position pos; if (!toUpdatePositions.TryGetValue(oldPos.Auc, out pos)) { // Не смогли найти, значит лот выбыл. oldPos.WithdrawnDateTime = withdrwanDateTime; oldHardPositions.Add(oldPos); } } // Закрываем старые лоты. AucTraderDbContextHelper.SavePositionsAsPackages(oldHardPositions); // Обновляем старые данные. AucTraderDbContextHelper.SavePositionsAsPackages(toUpdatePositions.Values.ToList()); // Обновляем старые лоты. AucTraderDbContextHelper.SavePositionsAsPackages(newHardPositions); } catch (Exception e) { AppLogHelper.TraceError("", e); } }