private void CreatePortfolioNavDates(ISession session, NavDate currentNavDate) { using (var transaction = session.BeginTransaction()) { IList <Portfolio> portfolioList = portfolioRepository.GetPortfolioList(session); logger.Log(LogLevel.Info, $"Portfolio count: {portfolioList.Count}"); IList <PortfolioNavDate> portfolioNavDateList = portfolioNavDateRepository.GetPortfolioNavDateListByNavDate(session, currentNavDate); logger.Log(LogLevel.Info, $"Portfolio with NavDate {currentNavDate.Date} count: {portfolioNavDateList.Count}"); foreach (var portfolio in portfolioList) { if (portfolioNavDateList.Any(p => p.Portfolio.PortfolioId == portfolio.PortfolioId)) { continue; } PortfolioNavDate portfolioNavDate = new PortfolioNavDate() { NavDate = currentNavDate, Portfolio = portfolio, CreateDate = DateTime.Now }; portfolioNavDateRepository.SaveOrUpdate(session, portfolioNavDate); logger.Log(LogLevel.Info, $"Created NavDate {currentNavDate.Date} for Portfolio {portfolio.PortfolioId}"); } transaction.Commit(); } }
public void FixStatusOfPreviousNavDate(ISession session, NavDate currentNavDate) { if (session == null) { throw new ArgumentNullException(nameof(session)); } if (currentNavDate == null) { throw new ArgumentNullException(nameof(currentNavDate)); } IList <NavDate> navDateInErrorList = navDateRepository.GetNavDateByRefreshSecurityStaticDataStatus(session, RefreshSecurityStaticDataStatus.Error); IList <NavDate> navDateInProgressList = navDateRepository.GetNavDateByRefreshSecurityStaticDataStatus(session, RefreshSecurityStaticDataStatus.InProgress); IList <NavDate> navDateToDoList = navDateRepository.GetNavDateByRefreshSecurityStaticDataStatus(session, RefreshSecurityStaticDataStatus.ToDo); IList <NavDate> pendingNavDateList = navDateInErrorList.Concat(navDateInProgressList).Concat(navDateToDoList).ToList(); logger.Log(LogLevel.Info, $"Pending NavDate retrieved: {pendingNavDateList.Count}"); foreach (var pendingNavDate in pendingNavDateList) { if (pendingNavDate.NavDateId == currentNavDate.NavDateId) { continue; } logger.Log(LogLevel.Info, $"NavDate [{pendingNavDate.NavDateId}, {pendingNavDate.Date}]: RefreshSecurityStaticDataStatus {pendingNavDate.RefreshSecurityStaticDataStatus} will be set to Expired"); pendingNavDate.RefreshSecurityStaticDataStatus = RefreshSecurityStaticDataStatus.Expired; navDateRepository.SaveOrUpdate(session, pendingNavDate); logger.Log(LogLevel.Info, $"NavDate [{pendingNavDate.NavDateId}, {pendingNavDate.Date}]: RefreshSecurityStaticDataStatus {pendingNavDate.RefreshSecurityStaticDataStatus} has been set to Expired"); } }
public string GetDescription() { var description = $"{FundName}({FundCode}) 以 {AvgCost.ToString("F4")} 的价格持有 {Share.ToString("F2")} 份," + $"根据 {NavDate.ToString("yyyy-MM-dd")} 的净值({FundNav.ToString("F4")}) 计算," + $"市值达 {MarketValue.ToString("F2")},盈利 {PositionProfit.ToString("F2")}," + $"实现 {PositionProfitRate.ToString("P")} 收益率"; if (Abilities?.Any() ?? false) { Abilities.ForEach(a => description += $"\n{a.GetDescription()}"); } return(description); }
public void UpdateNavDate(IStatelessSession session, NavDate navDate) { if (session == null) { throw new ArgumentNullException(nameof(session)); } if (navDate == null) { throw new ArgumentNullException(nameof(navDate)); } navDateRepository.Update(session, navDate); }
private void CreatePortfolioNavDateSecurityPrices(ISession session, NavDate currentNavDate) { IList <PortfolioNavDate> portfolioNavDateList = portfolioNavDateRepository.GetPortfolioNavDateListByNavDate(session, currentNavDate); foreach (var portfolioNavDate in portfolioNavDateList) { logger.Log(LogLevel.Info, $"[PortfolioNavDate: PortfolioId {portfolioNavDate.Portfolio.PortfolioId}, NavDate {portfolioNavDate.NavDate.Date}]: Creating PortfolioNavDateSecurityPrices"); IList <Entities.PortfolioSecurity> portfolioSecurityList = portfolioSecurityRepository.GetPortfolioSecurityList(session, portfolioNavDate.Portfolio); logger.Log(LogLevel.Info, $"[PortfolioNavDate: PortfolioId {portfolioNavDate.Portfolio.PortfolioId}, NavDate {portfolioNavDate.NavDate.Date}]: {portfolioSecurityList.Count} PortfolioSecurity Count"); IList <PortfolioNavDateSecurityPrice> portfolioNavDateSecurityPriceList = portfolioNavDateSecurityPriceRepository.GetPortfolioNavDateSecurityPriceListByPortfolioNavDate(session, portfolioNavDate); IDictionary <long, Entities.PortfolioSecurity> portfolioSecurityDictionary = portfolioSecurityList.ToDictionary(x => x.PortfolioSecurityId); IDictionary <long, PortfolioNavDateSecurityPrice> portfolioNavDateSecurityPriceDictionary = portfolioNavDateSecurityPriceList.ToDictionary(x => x.PortfolioSecurity.PortfolioSecurityId); IList <long> missingPortfolioSecurityList = portfolioSecurityDictionary.Keys.Except(portfolioNavDateSecurityPriceDictionary.Keys).ToList(); logger.Log(LogLevel.Info, $"[PortfolioNavDate: PortfolioId {portfolioNavDate.Portfolio.PortfolioId}, NavDate {portfolioNavDate.NavDate.Date}]: {portfolioNavDateSecurityPriceList.Count}/{portfolioSecurityList.Count} PortfolioSecurityPrices already been created"); logger.Log(LogLevel.Info, $"[PortfolioNavDate: PortfolioId {portfolioNavDate.Portfolio.PortfolioId}, NavDate {portfolioNavDate.NavDate.Date}]: {missingPortfolioSecurityList.Count} PortfolioSecurityPrices need to be created"); using (var transaction = session.BeginTransaction()) { foreach (var portfolioSecurityId in missingPortfolioSecurityList) { Entities.PortfolioSecurity portfolioSecurity = portfolioSecurityDictionary[portfolioSecurityId]; PortfolioNavDateSecurityPrice portfolioNavDateSecurityPrice = new PortfolioNavDateSecurityPrice() { PortfolioNavDate = portfolioNavDate, PortfolioSecurity = portfolioSecurity, PriceStatus = PriceStatus.ToBeRequested, CreateDate = DateTime.Now, UpdateDate = DateTime.Now, Currency = portfolioSecurity.Security.Currency }; portfolioNavDateSecurityPriceRepository.SaveOrUpdate(session, portfolioNavDateSecurityPrice); } transaction.Commit(); logger.Log(LogLevel.Info, $"[PortfolioNavDate: PortfolioId {portfolioNavDate.Portfolio.PortfolioId}, NavDate {portfolioNavDate.NavDate.Date}]: {missingPortfolioSecurityList.Count} PortfolioSecurityPrices created"); } } }
public IList <PortfolioNavDateSecurityPrice> GetPortfolioNavDateSecurityPriceByNavDateSymbol(ISession session, DateTime navDate, string symbol) { PortfolioNavDate pnd = null; Entities.PortfolioSecurity ps = null; NavDate nd = null; Security sd = null; Portfolio pt = null; return(session.QueryOver <PortfolioNavDateSecurityPrice>() .Fetch(SelectMode.ChildFetch, p => p.PortfolioNavDate) .Fetch(SelectMode.ChildFetch, p => p.PortfolioSecurity) .JoinAlias(p => p.PortfolioNavDate, () => pnd).JoinAlias(() => pnd.NavDate, () => nd).JoinAlias(() => pnd.Portfolio, () => pt) .JoinAlias(p => p.PortfolioSecurity, () => ps).JoinAlias(() => ps.Security, () => sd) .Where(() => nd.Date == navDate.Date) .And(() => sd.Symbol == symbol) .List()); }
public async Task Execute(IJobExecutionContext context) { logger.Log(LogLevel.Info, "Begin"); try { using (var session = dbSessionFactory.OpenSession()) { NavDate currentNavDate = navDateService.GetCurrentNavDate(session); if (currentNavDate == null) { throw new Exception("Missing Current NavDate"); } if (currentNavDate.RefreshSecurityStaticDataStatus != RefreshSecurityStaticDataStatus.Done) { PublishSecurityListRequest(); currentNavDate.RefreshSecurityStaticDataStatus = RefreshSecurityStaticDataStatus.InProgress; navDateService.UpdateNavDate(session, currentNavDate); } } } catch (Exception exception) { logger.Log(LogLevel.Error, exception, exception.Message); using (var session = dbSessionFactory.OpenSession()) { SetCurrentNavDateInError(session); } } logger.Log(LogLevel.Info, "End"); await Task.CompletedTask; }
public async Task Execute(IJobExecutionContext context) { logger.Log(LogLevel.Info, "Begin"); try { using (var session = dbSessionFactory.OpenSession()) { NavDate currentNavDate = navDateService.CreateNavDateIfNotExists(session); navDateService.FixStatusOfPreviousNavDate(session, currentNavDate); } } catch (Exception exception) { logger.Log(LogLevel.Error, exception, exception.Message); } logger.Log(LogLevel.Info, "End"); await Task.CompletedTask; }
public Task Execute(IJobExecutionContext context) { logger.Log(LogLevel.Info, "Begin"); try { using (var session = sessionFactory.OpenSession()) { DateTime navDate = navDateCalculator.CalculateNavDate(DateTime.Today); NavDate currentNavDate = navDateRepository.GetNavDate(session, navDate); if (currentNavDate == null) { return(Task.CompletedTask); } logger.Log(LogLevel.Info, "[CreatePortfolioNavDates]: Begin"); CreatePortfolioNavDates(session, currentNavDate); logger.Log(LogLevel.Info, "[CreatePortfolioNavDates]: End"); logger.Log(LogLevel.Info, "[CreatePortfolioNavDateSecurityPrices]: Begin"); CreatePortfolioNavDateSecurityPrices(session, currentNavDate); logger.Log(LogLevel.Info, "[CreatePortfolioNavDateSecurityPrices]: End"); logger.Log(LogLevel.Info, "[CreateRequestForPortfolioNavDateSecurityPrices]: Begin"); CreateRequestForPortfolioNavDateSecurityPrices(session, currentNavDate); logger.Log(LogLevel.Info, "[CreateRequestForPortfolioNavDateSecurityPrices]: End"); } } catch (Exception ex) { logger.Log(LogLevel.Error, ex, ex.Message); } logger.Log(LogLevel.Info, "End"); return(Task.CompletedTask); }
public NavDate CreateNavDateIfNotExists(ISession session) { if (session == null) { throw new ArgumentNullException(nameof(session)); } var currentNavDate = GetCurrentNavDate(session); if (currentNavDate == null) { DateTime navDate = navDateCalculator.CalculateNavDate(DateTime.Today); currentNavDate = new NavDate() { Date = navDate, RefreshSecurityStaticDataStatus = RefreshSecurityStaticDataStatus.ToDo }; navDateRepository.SaveOrUpdate(session, currentNavDate); logger.Log(LogLevel.Info, $"NavDate {navDate} has been created"); } return(currentNavDate); }
public IList <PortfolioNavDate> GetPortfolioNavDateListByNavDate(ISession session, NavDate navDate) { return(session.QueryOver <PortfolioNavDate>() .Fetch(SelectMode.ChildFetch, x => x.NavDate) .Fetch(SelectMode.ChildFetch, x => x.Portfolio) .Where(p => p.NavDate.NavDateId == navDate.NavDateId).List()); }
private void ProcessResponse(IModel channel, BasicDeliverEventArgs e) { try { logger.Log(LogLevel.Info, "Processing SecurityListResponse"); var response = e.GetMessage <SecurityListResponse>(); logger.Log(LogLevel.Info, $"[SecurityListResponse] ErrorMessage: {response.ErrorMessage}, SecurityList count: {response.SecurityList?.Count}, RequestDate: {response.RequestDate}, MessageId: {response.MessageId}"); ILookup <SecurityKey, SecurityDataProvider.Entities.Requests.Security> securityFromResponseLookup = GetSecurityLookupFromResponse(response.SecurityList); using (var session = dbSessionFactory.OpenSession()) { NavDate currentNavDate = navDateService.GetCurrentNavDate(session); if (currentNavDate == null) { return; } if (DateTime.Today != response.RequestDate.Date) { logger.Log(LogLevel.Warn, $"[SecurityListResponse] RequestDate: {response.RequestDate} will be ignored because it is not related to today"); channel.SendAck(e.DeliveryTag); return; } if (currentNavDate.RefreshSecurityStaticDataStatus == RefreshSecurityStaticDataStatus.Done) { logger.Log(LogLevel.Warn, $"[SecurityListResponse] RequestDate: {response.RequestDate} will be ignored because Securities have been already updated"); channel.SendAck(e.DeliveryTag); return; } IDictionary <SecurityKey, Entities.Security> securityFromDbDictionary = GetSecurityDictionaryFromDb(session); IList <SecurityKey> securityKeyFromResponseList = securityFromResponseLookup.Select(x => x.Key).ToList(); IList <SecurityKey> newOrUpdatedSecurityList = securityKeyFromResponseList.Except(securityFromDbDictionary.Keys).ToList(); IDictionary <SecurityKey, Entities.Security> securityFromDbBySymbolDictionary = securityFromDbDictionary.Values.ToDictionary(x => new SecurityKey(x.Symbol, string.Empty, x.Currency)); int newSecurityCount = 0; int updateSecurityCount = 0; using (var statelessSession = dbSessionFactory.OpenStatelessSession()) using (var transaction = statelessSession.BeginTransaction()) { foreach (SecurityKey securityKey in newOrUpdatedSecurityList) { SecurityDataProvider.Entities.Requests.Security securityResponse = securityFromResponseLookup[securityKey].FirstOrDefault(); Entities.Security securityDb; SecurityKey securityKeyWithoutName = new SecurityKey(securityResponse.Symbol?.ToUpper(), string.Empty, securityResponse.Symbol?.ToUpper()); if (!securityFromDbBySymbolDictionary.TryGetValue(securityKeyWithoutName, out securityDb)) { securityDb = new Entities.Security() { Symbol = securityResponse.Symbol?.ToUpper(), Name = securityResponse.Name, Currency = securityResponse.Currency, CreateDate = DateTime.Now, UpdateDate = DateTime.Now, }; newSecurityCount++; } else { securityDb.Name = securityResponse.Name; securityDb.Currency = securityResponse.Currency; updateSecurityCount++; } securityRepository.Insert(statelessSession, securityDb); } currentNavDate.RefreshSecurityStaticDataStatus = RefreshSecurityStaticDataStatus.Done; navDateService.UpdateNavDate(statelessSession, currentNavDate); transaction.Commit(); logger.Log(LogLevel.Info, $"[SecurityListResponse] RequestDate {response.RequestDate} Processed: new {newSecurityCount}, updated {updateSecurityCount}"); } channel.SendAck(e.DeliveryTag); } } catch (JsonException jsonException) { logger.Log(LogLevel.Error, jsonException, jsonException.Message); channel.SendAck(e.DeliveryTag); } catch (Exception exception) { logger.Log(LogLevel.Error, exception, exception.Message); channel.SendNack(e.DeliveryTag); } }
private void CreateRequestForPortfolioNavDateSecurityPrices(ISession session, NavDate currentNavDate) { using (IConnection connection = connectionFactory.CreateConnection()) { using (IModel channel = connection.CreateModel()) { channel.CreateQueueIfNotExists(Queues.SecurityPriceRequestQueue); IList <PortfolioNavDate> portfolioNavDateList = portfolioNavDateRepository.GetPortfolioNavDateListByNavDate(session, currentNavDate); foreach (var portfolioNavDate in portfolioNavDateList) { logger.Log(LogLevel.Info, $"Portfolio {portfolioNavDate.Portfolio.PortfolioId} for NavDate {portfolioNavDate.NavDate.Date}: Creating Security Price Requests"); IList <PortfolioNavDateSecurityPrice> portfolioNavDateSecurityPriceList = portfolioNavDateSecurityPriceRepository.GetPortfolioNavDateSecurityPriceListByPortfolioNavDate(session, portfolioNavDate) .Where(p => p.PriceStatus == PriceStatus.ToBeRequested).ToList(); foreach (var portfolioNavDateSecurityPrice in portfolioNavDateSecurityPriceList) { SendSecurityPriceRequest(channel, session, portfolioNavDateSecurityPrice); } logger.Log(LogLevel.Info, $"Portfolio {portfolioNavDate.Portfolio.PortfolioId} for NavDate {portfolioNavDate.NavDate.Date}: {portfolioNavDateSecurityPriceList.Count} Security Price Requests created"); } } } }