using YLErp.BLL; using YLErp.DBModels; using YLErp.Modules.EodModule; using YLErp.QdpModule; using YLErp; using YLErp.Jobs.Configs; namespace YLErp.Jobs.Imp { /// /// 每日计算整体VAR值 /// public class EodVARCalcJob : BaseJob { static readonly IYcLogger logger; static EodVARCalcJob() { logger = LogFactory.GetLogger(); } 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 } }