using System.Collections.Concurrent; using YLErp.Abstract; namespace YLErp.Modules.DataProviderModule { /// /// 场外期权结算波动率提供 /// public class OtcEodOverrideVolProvider : IDataUpdater, IJsonSerializable { readonly DateTime _valueDate; //数据ID做为KEY readonly ConcurrentDictionary _dic; /// /// 构造函数 /// public OtcEodOverrideVolProvider(DateTime valueDate) { _valueDate = valueDate; _dic = new ConcurrentDictionary(); } public string TableName => nameof(eod_trade_vol_override); /// /// 获取交易波动率 /// public double? GetVol(int tradeId, DateTime valueDate) { System.Diagnostics.Debug.Assert(_valueDate == valueDate); if (!_dic.TryGetValue(tradeId, out double? vol)) { vol = DbContextFactory.GetYLDbContext().eod_trade_vol_override .Where(n => n.valuedate == valueDate && n.tradeid == tradeId) .Select(n => (double?)n.vol).FirstOrDefault(); _dic.AddOrUpdate(tradeId, vol, (n, m) => vol); } if (vol == null) { return null; } return Convert.ToDouble(vol.Value); } /// /// 更新数据 /// public void UpdateData(IEnumerable updateKeyIds) { var tradeIds = DataConvert.ConvertToInt32Array(updateKeyIds); foreach (var tradeId in tradeIds) { _dic.TryRemove(tradeId, out _); } } public string ToJson() { return new { _valueDate, _dic }.ToJson(); } } }