Files
zszq-trs/YLErpDAL/Modules/TradeRiskCalcModule/TaskRunner/OtcTradeRiskRunner.cs
T
2024-05-09 14:06:26 +08:00

161 lines
5.7 KiB
C#

using CsvHelper;
using Microsoft.Extensions.DependencyInjection;
using Qdp.Foundation.Utilities;
using System.Diagnostics;
using YieldChain.Commons;
using YLErp.Cache;
using YLErp.DBModels;
using YLErp.Models;
namespace YLErp.Modules.TradeRiskCalcModule.TaskRunner
{
/// <summary>
/// 场外交易风险计算运行
/// </summary>
class OtcTradeRiskRunner : InnerRunnerBase
{
readonly static IYLCache ylCache;
static OtcTradeRiskRunner()
{
ylCache = YLServiceLocator.ServiceProvider.GetService<IYLCache>();
}
public OtcTradeRiskRunner(string volTpe)
{
VolType = volTpe ?? throw new ArgumentNullException(nameof(volTpe));
}
/// <summary>
/// 波动率类型
/// </summary>
public string VolType { get; }
/// <summary>
/// 风险计算结果
/// </summary>
public TradingRiskResult Result { get; set; }
public override void StartTask(InnerRunTaskData taskData)
{
var valueDate = taskData.ValueDate;
AppManager.SetSysInfo("实时风险-" + VolType + "-计算开始", "开始");
InnerStartTask(() =>
{
var calcContext = new TradeRiskCalcContext(VolType, false, valueDate, taskData.PreSettleDate, taskData.DataProvider);
var list = new TradeRiskCalcService(calcContext, skipTradeTypes: PS.Config.ErpElement.RealtimeRisk_SkipTradeTypes)
.Calculate(taskData.TradeDataSource, VolType == "对冲" ? taskData.ManualRiskProviderHedge : taskData.ManualRiskProvider);
var result = GetResult();
if (result == null || result.CalcStartTime > DateTime.Now || result.CalcStartTime < StartTime)
{
result = new TradingRiskResult
{
ValueDate = valueDate,
PreDate = calcContext.PreSettleDate,
TradeRiskList = list,
CalcStartTime = StartTime,
CalcEndTime = DateTime.Now
};
SaveResult(result);
}
else
{
LogFactory.GetLogger("实时风险").Info($"[voltype:{VolType},valueDate:{valueDate}]抛弃一条过期数据");
}
var totalMilliSeconds = (DateTime.Now - StartTime).TotalSeconds.ToString("F");
AppManager.SetSysInfo("实时风险-" + VolType + "-计算完成", $"开始时间:{StartTime},耗时{totalMilliSeconds}毫秒");
}).ContinueWith(t =>
{
if (t.Exception != null)
{
LogFactory.GetLogger("实时风险").Error(t.Exception, $"[voltype:{VolType},valueDate:{valueDate}]计算出错");
}
else
{
LogFactory.GetLogger("实时风险").Debug($"[voltype:{VolType},valueDate:{valueDate}]计算完成");
}
InnerCompleteTask();
});
}
private const string TradingRiskResultRedisKey = "TradeRisk";
/// <summary>
/// 将结果保存
/// </summary>
private void SaveResult(TradingRiskResult result)
{
if (ylCache.CacheEnable())
{
var riskList = result.TradeRiskList.ToList();
//// 测试数据上线前暂时保存
//var baserisk = result.TradeRiskList.FirstOrDefault().Clone();
//for (int i = 0; i < 5000; i++)
//{
// var risk = baserisk.Clone();
// risk.BookId = i;
// riskList.Add(risk);
//}
Stopwatch stopwatch= Stopwatch.StartNew();
// batch delete from redis
ylCache.BatchDelete($"{TradingRiskResultRedisKey}:{VolType}:*");
stopwatch.Stop();
Console.WriteLine($"删除耗时:{stopwatch.ElapsedMilliseconds}");
stopwatch.Restart();
// batch add to redis
ylCache.BatchAdd($"{TradingRiskResultRedisKey}:{VolType}", riskList,1000).Wait();
stopwatch.Stop();
Console.WriteLine($"新增耗时:{stopwatch.ElapsedMilliseconds}");
// save Result Objec without TradeRiskList
result.TradeRiskList = null;
ylCache.StringSet<TradingRiskResult>($"{TradingRiskResultRedisKey}_Result:{VolType}", result);
}
else
{
// save result to memory
Result = result;
}
}
/// <summary>
/// 查询结果
/// </summary>
/// <returns></returns>
public TradingRiskResult GetResult()
{
if (ylCache.CacheEnable())
{
// get result object from redis
var result= ylCache.StringGet<TradingRiskResult>($"{TradingRiskResultRedisKey}_Result:{VolType}");
if (result == null)
{
return null;
}
// get risk list from redis
var risks= ylCache.BatchQuery<TradingRiskParameter>($"{TradingRiskResultRedisKey}:{VolType}:*");
result.TradeRiskList= risks.ToList();
return result;
}
else
{
// get result from memory
return Result;
}
}
public override string ToString()
{
return VolType;
}
}
}