using Qdp.Foundation.Implementations; using Qdp.Pricing.Base.Implementations; using YLErp.BLL; using YLErp.BLL.Calculation; using YLErp.Model; using YLErp.Models; using YLErp.QdpModule; namespace YLErp.Modules.QuotationModule { public class flat_price_quotationBLL { private YLContext yldb = new YLContext(); public List GetContractViewModel() { var now = DateTime.Now.Date; var marketCode = new List() { "SHFE", "DCE", "ZCE", "CZCE", "SGE", "INE", "CFFEX", "GFEX" }; var maturityDate = QdpCalendarHelper.GetNonHoliday(valuedateBLL.ValueDate.AddMonths(1).AddDays(-1)); var underlyings = underlying_managerBLL.GetAllLiveunderlying_managerModel().Where(u => marketCode.Contains(u.MarketCode) && u.LaunchState == "1").ToList(); var total = underlying_managerBLL.GetAllLiveunderlying_managerModel().Where(u => marketCode.Contains(u.MarketCode) && u.LaunchState == "1").ToList(); //underlying_main_contractBLL.GetGtja_MaturityUnderlying(underlyings,maturityDate).ToList();// //需要展示的标的信息 var manager = total.GroupBy(s => s.UnderlyingType).Select(g => (new { Key = g.Key, UnderlyingCode = g.Select(v => (new { Code = v.UnderlyingCode, MarketCode = v.MarketCode })).ToList() })).ToList(); var main = (from underlyingMainContract in yldb.underlying_main_contract select underlyingMainContract).ToList(); var viewModelList = new List(); foreach (var item in manager) { var viewModel = new UnderlyingMainContractRecord(); viewModel.UnderlyingType = item.Key; var underlyingMainContract = main.FirstOrDefault(s => s.UnderlyingType == item.Key); viewModel.MinimumAmount = underlyingMainContract?.MinimumAmount; viewModel.StrikeInterval = underlyingMainContract?.StrikeInterval; if (underlyingMainContract?.OrderId != null) { viewModel.OrderId = underlyingMainContract.OrderId; } if (underlyingMainContract?.NeedQuote == null || underlyingMainContract.NeedQuote == 0) { viewModel.NeedQuote = false; } else { viewModel.NeedQuote = true; } foreach (var t in item.UnderlyingCode) { var selectListItem = new SelectItem { Text = t.Code, Value = t.MarketCode }; viewModel.UnderlyingCodeList.Add(selectListItem); } if (string.IsNullOrEmpty(underlyingMainContract?.UnderlyingCode)) { //viewModel.UnderlyingCodeList[0].Selected = true; } else { var underlyingCodeList = underlyingMainContract.UnderlyingCode.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToList(); foreach (var underlyingCode in underlyingCodeList) { var firstOrDefault = viewModel.UnderlyingCodeList.FirstOrDefault(s => s.Text == underlyingCode); if (firstOrDefault != null) { firstOrDefault.Selected = true; } else { //需要更新下数据库,因为已经过期,所以主标的的去掉,新的默认的需要加上 //如果 勾选的品种,显示的标的都到期了, 系统不能擅自报其他的标的。需要用户自己去选择该报的合约 //viewModel.UnderlyingCodeList[0].Selected = true; } } } viewModelList.Add(viewModel); } //underlying表没有了,但是underlyingmaincontract表还有的启用数据需要设为不启用 bool isNeedUpdate = false; main.ForEach(m => { var mList = manager.FirstOrDefault(w => w.Key == m.UnderlyingType); if (mList == null && m.NeedQuote != 0) { isNeedUpdate = true; m.NeedQuote = 0; } }); if (isNeedUpdate) { underlying_main_contractBLL.IsListOld = true; yldb.SaveChanges(); } ////排序 viewModelList = viewModelList.OrderBy(s => s.OrderId).ToList(); //NetCacheHelper.Add(cacheKey, viewModelList, DateTime.Now.AddMinutes(10)); return viewModelList; } /// /// 计算报价预览页面的平值期权的到期日。 /// 手机端实时报价的平值到期日计算逻辑请参考CalculationHelper.AtmQuoteDefaultMaturity /// /// public static Date GetAtmOptionQuotePreviewMaturity() { // 1个月平值期权的到期日是报价日后一个月减一天 var maturityDate = valuedateBLL.ValueDate.AddMonths(1).AddDays(-1); return CalculatorHelper.AtmQuoteMaturityDateShift(maturityDate); } /// /// 得到排序的主合约 /// public static IEnumerable GetSortFlat_Quotation(DateTime? date, string userGroup) { if (date == null) { date = GetAtmOptionQuotePreviewMaturity().DateTime; } var quotationList = new List(); var calendar = CalendarImpl.Get("chn"); var qdpDate = new Date(DateTime.Parse(date.Value.ToString())); var mDate = calendar.IsBizDay(qdpDate) ? qdpDate : calendar.NextBizDay(qdpDate); var result = AtMoneyOptionQuotes_API(mDate.DateTime, userGroup); if (result != null && result.Count > 0) { foreach (var res in result) { var quotation = new flat_price_quotationDto { MarketCode = res.marketCode, MarketName = res.marketName, UnderlyingType = res.underlyingType, UnderlyingCode = res.underlyingCode, SpotPrice = res.spotPrice, BuyOptionPrice = res.buyOptionPrice, SellOptionPrice = res.sellOptionPrice, ComparedToLastDayPrice = res.comparedToLastDayPrice, OptDate = DateTime.Now, LastUpdateTime = DateTime.Now, BuyOptionVol = res.buyOptionVol, SellOptionVol = res.sellOptionVol }; quotationList.Add(quotation); } } var underlyingList = underlying_main_contractBLL.GetDefaultAtMoneyQuoteList(date.Value); foreach (var flat in quotationList) { var um = underlyingList.FirstOrDefault(c => string.Equals(c.UnderlyingCode, flat.UnderlyingCode, StringComparison.OrdinalIgnoreCase)) ?? underlyingList.FirstOrDefault(c => c.UnderlyingType == flat.UnderlyingType);//补丁 没有order if (um != null) { flat.order = um.order; flat.VarietyCode = um.CommodityCode; } } return quotationList; } private static List AtMoneyOptionQuotes_API(DateTime maturityDate, string userGroup, bool onlyMainContract = true) { //string pathAndQuery = $"AtMoneyOptionQuotes?maturityDate={maturityDate.ToString("yyyy-MM-dd")}&userGroup={userGroup}&onlyMainContract={onlyMainContract}"; //return ApiHelper.Get>(pathAndQuery); return CalculatorHelper.AtMoneyOptionQuotesV2(maturityDate.ToString("yyyy-MM-dd"), userGroup, onlyMainContract); } } }