Files
zszq-trs/YLErpDAL/BLL/CalendarBLL.cs
T
2024-05-09 14:06:26 +08:00

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));
// }
//}
}
}
}