public ActionResult AddDeal() { FillFiltersToPositionList(); var newPosition = new PositionItem { State = PositionState.Opened }; return View(newPosition); }
public ActionResult AddDeal(PositionItem positionItem) { var dateTame = positionItem.StrTimeEnter.ToDateTimeUniformSafe(new DateTimeFormatInfo { DateSeparator = ".", ShortDatePattern = "dd.MM.yyyy" }); FillFiltersToPositionList(); if (ModelState.IsValid && dateTame.HasValue) { string msg; positionItem.TimeEnter = dateTame.Value; if (positionRepository.NewDeal(positionItem)) { msg = String.Format("{0}. {1} - {2}", Resource.MessageMarketOrderOpen, Resource.TitleStatus, positionItem.State); } else { msg = String.Format("{0}: {1}", Resource.ErrorMessage, Resource.MessageMarketOrderOpen); } return RedirectToAction("PositionList", new { message = msg }); } return View(positionItem); }
/// <summary> /// Открывает новую сделку в ручную /// </summary> /// <param name="positionItem">экземпляр модели данных</param> /// <returns>Удачно ли выполнено добавления сделки</returns> public bool NewDeal(PositionItem positionItem) { try { using (var ctx = DatabaseContext.Instance.Make()) { var acc = ctx.ACCOUNT.FirstOrDefault(a => a.ID == positionItem.AccountID); Logger.Error("NewDeal - ошибка открытия сделки в ручную. Не удалось найти счёт с номером " + positionItem.AccountID); if (acc == null) return false; var newPosition = new POSITION { AccountID = positionItem.AccountID, Symbol = positionItem.Symbol, TimeEnter = positionItem.TimeEnter, PriceEnter = positionItem.PriceEnter, Volume = positionItem.Volume, Side = positionItem.Side, State = (int) positionItem.State }; ctx.POSITION.Add(newPosition); ctx.SaveChanges(); } } catch (UpdateException ex) { Logger.Error("NewDeal - ошибка открытия сделки в ручную. Ошибка добавления в базу данных. Возможно сущьность с таким идентификатором уже существует или указаны некорректные параметры", ex); return false; } catch (Exception ex) { Logger.Error("NewDeal - ошибка открытия сделки в ручную", ex); return false; } return true; }
//TODO - Метод не оптимальный. Для каждой вытащенной записи из БД в цикле foreach производится мапинг в "PositionItem" (Для каждой по отдельности). //TODO - Метод не оптимальный. Происходи 2 обращения к БД - нуждо использовать join или unit /// <summary> /// Получить список сделок по их уникальным идентификаторам /// </summary> /// <param name="idList">Массив уникальных идентификаторов позиций, которые нужно получить</param> /// <remarks>Тестируется</remarks> public List<PositionItem> GetPositionsById(int[] idList) { var result = new List<PositionItem>(); if (idList == null || idList.Length == 0) return result; try { using (var ctx = DatabaseContext.Instance.Make()) { // ReSharper disable LoopCanBeConvertedToQuery foreach (var source in ctx.POSITION.Where(x => idList.Contains(x.ID))) // ReSharper restore LoopCanBeConvertedToQuery { var marketOrder = LinqToEntity.DecorateOrder(source); var positionItem = new PositionItem(marketOrder); result.Add(positionItem); } // ReSharper disable LoopCanBeConvertedToQuery foreach (var source in ctx.POSITION_CLOSED.Where(x => idList.Contains(x.ID))) // ReSharper restore LoopCanBeConvertedToQuery { var marketOrder = LinqToEntity.DecorateOrder(source); //var positionItem = marketOrder as PositionItem; var positionItem = new PositionItem(marketOrder); result.Add(positionItem); } } } catch (Exception ex) { Logger.Error("GetPositionsById()", ex); } return result; }