using Microsoft.Extensions.DependencyInjection; using Newtonsoft.Json; using Qdp.Foundation.Implementations; using Qdp.Pricing.Base.Implementations; using YLErp.BLL; using YLErp.BLL.Calculation; using YLErp.DBModels; using YLErp.Jobs.Configs; namespace YLErp.Jobs.Imp { /// /// 手机实时报价 /// public class AtMoneyOptionQuotesJob : BaseJob { static readonly IYcLogger logger = LogFactory.GetLogger(); private readonly IServiceScopeFactory _scopeFactory; private AtMoneyOptionQuotesJobConfig _atMoneyOptionQuotesJobConfig; public AtMoneyOptionQuotesJob(IServiceScopeFactory scopeFactory, AtMoneyOptionQuotesJobConfig atMoneyOptionQuotesJobConfig) { _scopeFactory = scopeFactory; _atMoneyOptionQuotesJobConfig = atMoneyOptionQuotesJobConfig; } public override Task JobImp() { var calendar = CalendarImpl.Get("chn"); var baseUrl = _atMoneyOptionQuotesJobConfig.QuotesUrl.TrimToNull(); if (string.IsNullOrWhiteSpace(baseUrl)) { logger.Error("未配置AtMoneyOptionQuotesUrl"); return Task.CompletedTask; } try { var today = new Date(DateTime.Now); if (calendar.IsHoliday(today)) { Console.WriteLine($"[{nameof(AtMoneyOptionQuotesJob)}]今天节假日"); } else { var dateStr = CalculatorHelper.RealtimeQuoteDefaultMaturityDate(); var httpClient = _scopeFactory.CreateScope().ServiceProvider.GetService().CreateClient(); var url = $"{baseUrl}?maturityDate={dateStr}&onlyMainContract=false"; Console.WriteLine("执行 " + url); return httpClient.GetAsync(url).ContinueWith(async t => { if (t.Exception != null) { logger.Error("请求API失败", t.Exception); } else { var resultStr = await t.Result.Content.ReadAsStringAsync(); SaveAtMoneyQuote(resultStr, dateStr); } }); } } catch (Exception ex) { logger.Error("报价计算出错", ex); } return Task.CompletedTask; } private static void SaveAtMoneyQuote(string dataJson, string dateStr) { List quotes = null; try { quotes = JsonConvert.DeserializeObject>(dataJson); } catch (Exception ex) { logger.Error("[AtMoneyOptionQuotes]对返回的数据解析失败", ex); } if (quotes == null) { return; } var underlyingCodes = quotes.Select(x => x.underlyingCode).ToList(); using (var con = new YLContext()) { var oldQuotesToRemove = con.flat_price_quotation.Where(x => !underlyingCodes.Contains(x.UnderlyingCode)); con.flat_price_quotation.RemoveRange(oldQuotesToRemove); quotes.ForEach(quote => { var underlyingQuote = con.flat_price_quotation.FirstOrDefault(u => u.UnderlyingCode == quote.underlyingCode); if (underlyingQuote == null) { underlyingQuote = new flat_price_quotation { MarketCode = quote.marketCode, MarketName = quote.marketName, UnderlyingCode = quote.underlyingCode, UnderlyingType = quote.underlyingType, UnderlyingTypeShortName = quote.underlyingTypeShortName, SpotPrice = quote.spotPrice, BuyOptionPrice = quote.buyOptionPrice, SellOptionPrice = quote.sellOptionPrice, BuyOptionVol = quote.buyOptionVol, SellOptionVol = quote.sellOptionVol, ComparedToLastDayPrice = quote.comparedToLastDayPrice, OptDate = DateTime.Now, LastUpdateTime = DateTime.Now }; con.flat_price_quotation.Add(underlyingQuote); } else // update { underlyingQuote.MarketCode = quote.marketCode; underlyingQuote.MarketName = quote.marketName; underlyingQuote.UnderlyingType = quote.underlyingType; underlyingQuote.UnderlyingTypeShortName = quote.underlyingTypeShortName; underlyingQuote.SpotPrice = quote.spotPrice; underlyingQuote.BuyOptionPrice = quote.buyOptionPrice; underlyingQuote.SellOptionPrice = quote.sellOptionPrice; underlyingQuote.BuyOptionVol = quote.buyOptionVol; underlyingQuote.SellOptionVol = quote.sellOptionVol; underlyingQuote.ComparedToLastDayPrice = quote.comparedToLastDayPrice; underlyingQuote.OptDate = DateTime.Now; underlyingQuote.LastUpdateTime = DateTime.Now; } }); con.SaveChanges(); } logger.Info($"[AtMoneyOptionQuotes]更新报价数据{quotes.Count}条,到期日{dateStr}"); } #region JobStatus Manager static JobStatus jobStatus = JobStatus.Init; public override JobStatus GetJobStatus() { return jobStatus; } public override void SetJobStatus(JobStatus status) { jobStatus=status; } #endregion } }