280 lines
8.5 KiB
C#
280 lines
8.5 KiB
C#
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<calendar> AllcalendarModel = null;
|
|
|
|
/// <summary>
|
|
/// 获取今年及前2后3年的日历
|
|
/// </summary>
|
|
public static List<calendar> 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<calendar> GetAllcalendarModel()
|
|
{
|
|
if (IsListOld)
|
|
{
|
|
using (var con = new YLContext())
|
|
{
|
|
AllcalendarModel = con.calendar.ToList();
|
|
}
|
|
IsListOld = false;
|
|
}
|
|
return AllcalendarModel;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 在日历数据有变化时调用,以更新Qdp使用的日历数据
|
|
/// </summary>
|
|
public static void ResetCalendarForQdp()
|
|
{
|
|
Dictionary<string, CalendarHoliday> calendarHolidays;
|
|
|
|
try
|
|
{
|
|
List<calendar> calendars = null;
|
|
|
|
using (var db = new YLContext())
|
|
{
|
|
calendars = db.calendar.ToList();
|
|
AllcalendarModel = calendars;
|
|
}
|
|
|
|
calendarHolidays = new Dictionary<string, CalendarHoliday>(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<string>()
|
|
};
|
|
}
|
|
|
|
var json = x.HolidayJson?.Trim();
|
|
|
|
if (!string.IsNullOrEmpty(json) && json[0] == '[')
|
|
{
|
|
var list = JsonConvert.DeserializeObject<List<string>>(x.HolidayJson);
|
|
|
|
ch.HolidayList.AddRange(list);
|
|
}
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
LogFactory.GetLogger<CalendarBLL>().Error("初始化日历数据失败", ex);
|
|
return;
|
|
}
|
|
|
|
try
|
|
{
|
|
CalendarImpl.InitializeCalendarData(calendarHolidays);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
LogFactory.GetLogger<CalendarBLL>().Error("为Qdp初始化日历数据失败", ex);
|
|
}
|
|
|
|
try
|
|
{
|
|
//设置C++雪球计算引擎的假日日历
|
|
SetCalendarForCxxQdp(calendarHolidays);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
LogFactory.GetLogger<CalendarBLL>().Error("为C++Qdp初始化日历数据失败", ex);
|
|
}
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// 获取系统日期到所选日期的工作日天数
|
|
/// </summary>
|
|
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;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取可选的最小报价到期日
|
|
/// 最小报价到期日应为当前日期之后的第十个交易日
|
|
/// </summary>
|
|
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;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 设置model,如果不为空就设置,如果为空则和之前一样
|
|
/// </summary>
|
|
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;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 查询calendar
|
|
/// </summary>
|
|
public SearchListResult<calendar> 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;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 更新C++ 雪球计算引擎使用的日历数据
|
|
/// </summary>
|
|
private static void SetCalendarForCxxQdp(Dictionary<string, CalendarHoliday> 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));
|
|
// }
|
|
//}
|
|
}
|
|
}
|
|
}
|