82 lines
2.3 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|