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

82 lines
2.3 KiB
C#

using System.Collections.Concurrent;
using YLErp.Abstract;
namespace YLErp.Modules.TradeRiskCalcModule.TaskRunner
{
/// <summary>
/// [线程安全]凤凰期权票息累积数据源
/// </summary>
class AutocallObservationDataSource : ITradeExtendUpdater, IDataUpdater
{
readonly Guid _eventGuid;
readonly ConcurrentDictionary<int, autocall_observation[]> _dic;
private AutocallObservationDataSource()
{
_dic = new ConcurrentDictionary<int, autocall_observation[]>();
_eventGuid = Events.EventBus.Subscribe<OtcTradeUpdateEvent>(t =>
{
UpdateData(t.TradeIds);
});
}
~AutocallObservationDataSource()
{
Events.EventBus.Unsubscribe(_eventGuid);
}
public List<autocall_observation> GetDatas(int tradId)
{
if (!_dic.TryGetValue(tradId, out var datas))
{
using (var db = DbContextFactory.GetYLDbContext())
{
_dic[tradId] = datas = db.autocall_observation.AsNoTracking()
.Where(n => n.TradeId == tradId).OrderBy(n => n.PaymentDate).ToArray();
}
}
return datas.Select(t => t.Clone()).ToList();
}
/// <summary>
/// 跟随trade更新
/// </summary>
public void UpdateData(IEnumerable<int> tradeIds)
{
if (_dic.Count > 5000)
{
_dic.Clear();
return;
}
if (tradeIds == null || !tradeIds.Any())
{
return;
}
foreach (var tradId in tradeIds)
{
_dic.TryRemove(tradId, out _);
}
}
public void UpdateData(IEnumerable<string> updateKeyIds)
{
var tradeIds = DataConvert.ConvertToInt32Array(updateKeyIds);
this.UpdateData(tradeIds);
}
/// <summary>
/// 偷个懒使用这个
/// </summary>
public static readonly AutocallObservationDataSource Default;
public string TableName => "autocall_observation";
static AutocallObservationDataSource()
{
Default = new AutocallObservationDataSource();
}
}
}