/// <summary> /// обработать ответ от провайдера: раздать дилерам Execution reports по своим ордерам /// </summary> public void OnProviderReport(Dictionary <BrokerResponse, BrokerOrder> reports) { // сохранить отчеты об исполнении using (var ctx = DatabaseContext.Instance.Make()) { try { foreach (var report in reports.Keys) { var repoDbItem = LinqToEntity.UndecorateBrokerResponse(report); Logger.DebugFormat("report [{0}, {1:f5}, {2:ddMMyyyy HH:mm}, {3}", repoDbItem.ID, repoDbItem.Price ?? 0, repoDbItem.ValueDate, repoDbItem.Status); ctx.BROKER_RESPONSE.Add(repoDbItem); } ctx.SaveChanges(); } catch (Exception ex) { Logger.Error("Ошибка сохранения отчетов брокеров в БД", ex); } } // обработать сообщения foreach (var reqPair in reports) { var dealerCode = reqPair.Value.DealerCode; var dealer = dealers.Values.FirstOrDefault(d => d.DealerCode == dealerCode); if (dealer == null) { loggerNoFlood.LogMessageFormatCheckFlood(LogEntryType.Debug, LogMagicNoDealer, 1000 * 60 * 5, "OnProviderReport: дилер [{0}] не найден", dealerCode); continue; } var dealerFix = dealer as IFixDealer; if (dealerFix == null) { loggerNoFlood.LogMessageFormatCheckFlood(LogEntryType.Debug, LogMagicNoDealer, 1000 * 60 * 5, "OnProviderReport: сообщение для дилера \"{0}\" ({1}), " + "не являющегося FIX-дилером", dealerCode, dealer.GetType()); continue; } try { if (reqPair.Value == null) { Logger.ErrorFormat("OnProviderReport - для ответа сервера Id={0} (цена {1:f4}) не найден запрос", reqPair.Key.Id, reqPair.Key.Price); } else { dealerFix.ProcessExecutionReport(reqPair.Key, reqPair.Value); } } catch (Exception ex) { loggerNoFlood.LogMessageFormatCheckFlood(LogEntryType.Debug, LogMagicDealerExecutionError, 1000 * 60 * 5, "OnProviderReport: ошибка обработки ответа брокера дилером [{0}]: {1}", dealerCode, ex); } } }