using System.Linq.Expressions;
using YLErp.Abstract;
using YLErp.Models;
namespace YLErp.Modules.TradeRiskCalcModule.TaskRunner
{
///
/// 自定义交易风险提供
///
class ManualRiskProvider : IDataUpdater, IJsonSerializable, IDataSource
{
readonly DateTime _valueDate;
readonly string _volType;
//使用tradeid做为主键
Dictionary _dic;
DateTime _lastUpateTime;
///
/// 构造函数
///
/// 当前结算日期
public ManualRiskProvider(DateTime valueDate, string volType)
{
_valueDate = valueDate;
_volType = volType;
}
public string TableName => nameof(eod_trade_risk_manual);
public int Count => throw new NotImplementedException();
public IQueryable AsQueryable(Expression> predicate = null)
{
lock (this)
{
return _dic.Values.ToArray().AsQueryable();
}
}
///
/// 获取自定义交易风险
///
public ManualRisk GetData(int tradeId)
{
var dic = _dic;
if (_dic == null || _lastUpateTime > DateTime.Now || _lastUpateTime.AddMinutes(10) < DateTime.Now)
{
lock (this)
{
if (_dic == null || _lastUpateTime > DateTime.Now || _lastUpateTime.AddMinutes(10) < DateTime.Now)
{
_lastUpateTime = DateTime.Now;
using (var db = DbContextFactory.GetYLDbContext())
{
var query = db.eod_trade_risk_manual
.Where(n => n.ValueDate == _valueDate)
.Select(n => new
{
n.TradeId,
n.VolType,
risk = new ManualRisk
{
Pv = n.Pv,
Delta = n.Delta,
Gamma = n.Gamma,
Theta = n.Theta,
Vega = n.Vega,
Rho = n.Rho
}
});
dic = _dic = query.ToDictionary(n => n.TradeId + "_" + (n.VolType != null ? n.VolType : ""), n => n.risk);
}
}
}
}
if (dic == null)
{
return null;
}
dic.TryGetValue(tradeId + "_" + _volType, out var dataByType);
if(dataByType == null)
{
dic.TryGetValue(tradeId + "_", out var data);
if(data != null)
{
dataByType.Pv = dataByType.Pv ?? data.Pv;
dataByType.Delta = dataByType.Delta ?? data.Delta;
dataByType.Gamma = dataByType.Gamma ?? data.Gamma;
dataByType.Theta = dataByType.Theta ?? data.Theta;
dataByType.Vega = dataByType.Vega ?? data.Vega;
dataByType.Rho = dataByType.Rho ?? data.Rho;
}
}
return dataByType;
}
public void ResetDataSource()
{
lock (this)
{
_dic = null;
}
}
public string ToJson()
{
return new { _valueDate, _dic }.ToJson();
}
///
/// 更新数据
///
public void UpdateData(IEnumerable updateKeyIds)
{
ResetDataSource();
}
}
}