using System.Collections.Concurrent;
using YLErp.Abstract;
using YLErp.Modules.ExchangeOptionTradeModule;
namespace YLErp.Modules.DataProviderModule
{
///
/// 场内期权保存波动率提供
///
public class ExOptionSavedVolProvider : IDataUpdater, IJsonSerializable
{
readonly DateTime _valueDate;
//使用场内期权代码做为主键
readonly ConcurrentDictionary _dic;
//业务操作上来说,旧的波动率不会再变更
readonly ConcurrentDictionary _dicOld;
///
/// 构造函数
///
/// 当前结算日期
public ExOptionSavedVolProvider(DateTime valueDate)
{
_valueDate = valueDate;
_dic = new ConcurrentDictionary();
_dicOld = new ConcurrentDictionary();
}
public string TableName => nameof(ExchangeOptionVol);
///
/// 获取交易波动率
///
public double? GetSavedVol(string optionCode, DateTime valueDate)
{
var dic = valueDate < _valueDate ? _dicOld : _dic;
if (!dic.TryGetValue(optionCode, out var vol))
{
vol = new ExchangeOptionVolQueryService(OptUserInfo.SystemUser).GetSavedVol(optionCode, valueDate);
dic.AddOrUpdate(optionCode, vol, (n, m) => vol);
}
return vol;
}
///
/// 更新数据--keyid为optionCode
///
public void UpdateData(IEnumerable updateKeyIds)
{
foreach (var optionCode in updateKeyIds)
{
if (optionCode != null)
{
_dic.TryRemove(optionCode, out _);
}
}
}
public string ToJson()
{
return new { _valueDate, _dic, _dicOld }.ToJson();
}
}
}