Files
zszq-trs/Framework/YLErp.Jobs/Imp/EodVARCalcJob.cs
T
2024-05-09 14:06:26 +08:00

121 lines
4.7 KiB
C#

using YLErp.BLL;
using YLErp.DBModels;
using YLErp.Modules.EodModule;
using YLErp.QdpModule;
using YLErp;
using YLErp.Jobs.Configs;
namespace YLErp.Jobs.Imp
{
/// <summary>
/// 每日计算整体VAR值
/// </summary>
public class EodVARCalcJob : BaseJob
{
static readonly IYcLogger logger;
static EodVARCalcJob()
{
logger = LogFactory.GetLogger<EodVARCalcJob>();
}
EodVARCalcJobConfig _eodVARCalcJobConfig;
public EodVARCalcJob(EodVARCalcJobConfig eodVARCalcJobConfig)
{
_eodVARCalcJobConfig= eodVARCalcJobConfig;
}
public override Task JobImp()
{
logger.Info("执行EodVARCalcJob");
var StartDateStr = _eodVARCalcJobConfig.StartDate;
DateTime.TryParse((StartDateStr ?? ""), out var startDate);
using (var db = new YLContext())
{
//最后收盘日
var lastEodDate = db.eodStatus.Any() ? db.eodStatus.Where(O => O.Status == "已收盘").Max(O => O.ValueDate) : DateTime.MinValue;
//最后计算日期
var query = db.SensitiveData.Where(O => O.ValueDate <= lastEodDate && O.dataType == DataType.VaR && O.tradeId == "0");
var lastCalcDate = query.Any() ? query.Max(O => O.ValueDate) : DateTime.MinValue;
if (lastCalcDate <= startDate)
{
var firstEodDate = db.eodStatus.Any() ? db.eodStatus.Where(O => O.Status == "已收盘").Min(O => O.ValueDate) : DateTime.MinValue;
lastCalcDate = firstEodDate > startDate ? firstEodDate : startDate;
}
var dateList = QdpCalendarHelper.AllBizDays(lastCalcDate, lastEodDate);
dateList.Add(lastEodDate);
logger.Info($"{dateList.Count}");
foreach (var date in dateList)
{
try
{
//执行eod_var计算整体eod_var
var service = new EodVaRService(new OptUserInfo(0, "系统", OptUserFrom.System));
//组一个算整体的VAR的请求
var req = new eod_varReq()
{
ValueDate = date,
VaRType = 0,
DaysCount = 244,
};
logger.Info($"开始计算{date.ToString("yyyy-MM-dd")}");
service.CalcEodVaR(req);
logger.Info("计算完成");
//写入sensitive
var data = db.SensitiveData.FirstOrDefault(o => o.ValueDate == date && o.dataType == DataType.VaR && o.tradeId == "0");
if (data == null)
{
data = new SensitiveData();
data.ValueDate = date;
data.tradeId = "0";
data.dataType = DataType.VaR;
db.SensitiveData.Add(data);
}
var percent = PS.Config.ErpElement.EodVarPvPercent;
logger.Info("默认Percent:" + percent);
var eodVaRs = db.eod_var.Where(x => x.ValueDate == date && x.VaRType == (int)YLErp.DBModels.Enums.EnumVaRType.HistoricalSimulation && x.TradeType == "");
var totalVaR = eodVaRs.FirstOrDefault(o => o.UnderlyingCode == null || o.UnderlyingCode == "");
logger.Info("查询到:" + totalVaR);
if (totalVaR != null)
{
var pvList = totalVaR.PvObject.Split(',').Select(x => double.TryParse(x, out var temp) ? temp : 0).OrderBy(x => x).ToArray();
var index = (int)Math.Floor(pvList.Length * percent) - 1;
index = Math.Max(0, index);
data.param1 = pvList[index];
}
db.SaveChanges();
logger.Info("写入数据库操作完成");
}
catch (Exception ex)
{
logger.Error(ex);
throw;
}
}
}
return Task.CompletedTask;
}
#region JobStatus Manager
static JobStatus jobStatus = JobStatus.Init;
public override JobStatus GetJobStatus()
{
return jobStatus;
}
public override void SetJobStatus(JobStatus status)
{
jobStatus = status;
}
#endregion
}
}