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(); } } }