using BaseOUDAL; using CxxCalcLib; using Newtonsoft.Json; using Qdp.Foundation.Implementations; using Qdp.Pricing.Base.Implementations; namespace YLErp.BLL { public class CalendarBLL { private readonly YLContext db = new(); public static bool IsListOld = true; private static List AllcalendarModel = null; /// /// 获取今年及前2后3年的日历 /// public static List GetRecentCalendarModel() { var year = DateTime.Today.Year; var startYear = year - 2; var endYear = year + 3; return GetAllcalendarModel().Where(c => c.Year >= startYear && c.Year <= endYear && c.ValidState != ConsGlobal.InValid).ToList(); } public static List GetAllcalendarModel() { if (IsListOld) { using (var con = new YLContext()) { AllcalendarModel = con.calendar.ToList(); } IsListOld = false; } return AllcalendarModel; } /// /// 在日历数据有变化时调用,以更新Qdp使用的日历数据 /// public static void ResetCalendarForQdp() { Dictionary calendarHolidays; try { List calendars = null; using (var db = new YLContext()) { calendars = db.calendar.ToList(); AllcalendarModel = calendars; } calendarHolidays = new Dictionary(StringComparer.OrdinalIgnoreCase); foreach (var x in calendars) { if (!calendarHolidays.TryGetValue(x.Country, out var ch) || ch?.HolidayList == null) { calendarHolidays[x.Country] = ch = new CalendarHoliday() { HolidayList = new List() }; } var json = x.HolidayJson?.Trim(); if (!string.IsNullOrEmpty(json) && json[0] == '[') { var list = JsonConvert.DeserializeObject>(x.HolidayJson); ch.HolidayList.AddRange(list); } } } catch (Exception ex) { LogFactory.GetLogger().Error("初始化日历数据失败", ex); return; } try { CalendarImpl.InitializeCalendarData(calendarHolidays); } catch (Exception ex) { LogFactory.GetLogger().Error("为Qdp初始化日历数据失败", ex); } try { //设置C++雪球计算引擎的假日日历 SetCalendarForCxxQdp(calendarHolidays); } catch (Exception ex) { LogFactory.GetLogger().Error("为C++Qdp初始化日历数据失败", ex); } } /// /// 获取系统日期到所选日期的工作日天数 /// public static int GetNonHolidayDays(DateTime toDate, string country = "chn") { if (toDate <= valuedateBLL.ValueDate) { return 0; } var holidays = GetAllcalendarModel().Where(c => c.Year >= valuedateBLL.ValueDate.Year && c.Year <= toDate.Year && c.Country == country).ToList(); var count = 0; for (var to = toDate; to > valuedateBLL.ValueDate; to = to.AddDays(-1)) { if (!holidays.Any(h => h.HolidayJson.Contains(to.ToString("yyyy,MM,dd")))) { count++; } } return count; } /// /// 获取可选的最小报价到期日 /// 最小报价到期日应为当前日期之后的第十个交易日 /// public static DateTime GetMinQuoteDate() { var calendar = CalendarImpl.Get("chn"); var qdpDate = new Date(DateTime.Parse(valuedateBLL.ValueDate.ToString("yyyy-MM-dd").ToString())); return calendar.AddBizDays(qdpDate, 9).DateTime; } public calendar UpdateSingle(int id, CalendarReq data) { var model = db.calendar.Find(id); Setcalendar(model, data); db.SaveChanges(); IsListOld = true; ResetCalendarForQdp(); return model; } /// /// 设置model,如果不为空就设置,如果为空则和之前一样 /// public calendar Setcalendar(calendar model, CalendarReq data) { if (!string.IsNullOrEmpty(data.Country)) { model.Country = data.Country; } if (data.Year != null) { model.Year = data.Year.Value; } if (!string.IsNullOrEmpty(data.HolidayJson)) { model.HolidayJson = data.HolidayJson; } if (data.OptId != null) { model.OptId = data.OptId.Value; } if (!string.IsNullOrEmpty(data.OptName)) { model.OptName = data.OptName; } if (data.UpdateDate != null && data.UpdateDate != DateTime.MinValue) { model.UpdateDate = data.UpdateDate.Value; } if (!string.IsNullOrEmpty(data.ValidState)) { model.ValidState = data.ValidState; } return model; } /// /// 查询calendar /// public SearchListResult SearchList(CalendarReq req) { var query = from source in db.calendar select source; if (req.LargeYear != null) { query = query.Where(d => d.Year >= req.LargeYear); } if (!string.IsNullOrEmpty(req.Country)) { query = query.Where(d => d.Country.Contains(req.Country)); } if (req.Year != null) { query = query.Where(d => d.Year == req.Year); } if (!string.IsNullOrEmpty(req.HolidayJson)) { query = query.Where(d => d.HolidayJson.Contains(req.HolidayJson)); } if (req.OptId != null) { query = query.Where(d => d.OptId == req.OptId); } if (!string.IsNullOrEmpty(req.OptName)) { query = query.Where(d => d.OptName.Contains(req.OptName)); } if (req.ValidState == "InValid") { query = query.Where(d => d.ValidState.Equals(req.ValidState)); } else { query = query.Where(d => !d.ValidState.Equals("InValid")); } if (string.IsNullOrEmpty(req.sidx)) { req.sidx = "id"; req.sord = "desc"; } if (req.LargeYear != null) { req.sidx = "year"; req.sord = "asc"; } var retListResult = query.ToSearchList(req); return retListResult; } /// /// 更新C++ 雪球计算引擎使用的日历数据 /// private static void SetCalendarForCxxQdp(Dictionary calendarHolidays) { //using var wrapper = new CxxCalcApi(); //foreach (var item in calendarHolidays) //{ // var dates = item.Value.HolidayList.Select(g => // { // var date = g.Replace(",", "-"); // if (date.IndexOf("*") > 0) // { // date = date.Substring(0, date.IndexOf("*")); // } // return date; // }); // if (dates.Count() > 0) // { // wrapper.CalcPlatform_SetCalendar(item.Key, String.Join(",", dates)); // } //} } } }