Files
zszq-trs/YLErpDAL/Modules/DataProviderModule/TradePnlStaticsDataProvider.cs
T
2024-05-09 14:06:26 +08:00

126 lines
3.4 KiB
C#

using YLErp.BLL;
using YLErp.Modules.EodModule;
namespace YLErp.Modules.DataProviderModule
{
/// <summary>
/// 获取历史交易累计盈亏统计盈亏统计信息
/// </summary>
public class TradePnlStaticsDataProvider
{
InnerProvider _provider;
bool _IncludeExchangeTrades;
readonly SortedList<DateTime, InnerProvider> _map;
private TradePnlStaticsDataProvider()
{
_map = new SortedList<DateTime, InnerProvider>();
}
public bool IncludeExchangeTrades
{
get
{
return _IncludeExchangeTrades;
}
set
{
if (_IncludeExchangeTrades != value)
{
_IncludeExchangeTrades = value;
Reset();
}
}
}
public void Reset()
{
_provider = null;
lock (_map)
{
_map.Clear();
}
}
/// <summary>
/// 获取历史交易累计盈亏统计信息
/// </summary>
public IEnumerable<TradePnlStatics> GetDatas(DateTime valueDate)
{
valueDate = valueDate.Date;
if (_provider?.ValueDate == valueDate)
{
return _provider.GetDatas(IncludeExchangeTrades);
}
lock (_map)
{
if (!_map.TryGetValue(valueDate, out _provider))
{
foreach (var item in _map.Values.ToArray())
{
if (item.LastRequestTime.AddHours(1) < DateTime.Now)
{
_map.Remove(item.ValueDate);
}
}
_map.Add(valueDate, _provider = new InnerProvider(valueDate));
}
return _provider.GetDatas(IncludeExchangeTrades);
}
}
/// <summary>
/// 单一实例
/// </summary>
public static readonly TradePnlStaticsDataProvider Default;
static TradePnlStaticsDataProvider()
{
Default = new TradePnlStaticsDataProvider();
}
class InnerProvider
{
IEnumerable<TradePnlStatics> _list;
public InnerProvider(DateTime valueDate)
{
ValueDate = valueDate.Date;
_list = Enumerable.Empty<TradePnlStatics>();
}
public DateTime ValueDate { get; }
/// <summary>
/// 最后一次请求时间
/// </summary>
public DateTime LastRequestTime { get; private set; }
/// <summary>
/// 获取数据
/// </summary>
public IEnumerable<TradePnlStatics> GetDatas(bool includeExchangeTrades)
{
LastRequestTime = DateTime.Now;
if (!_list.Any())
{
var startDate = valuedateBLL.SystemDate.AccruedTotalPnlStartDate ?? DateTime.MinValue;
_list = new AccruedTotalPnlService<eod_trade_position_hedgevol>(OptUserInfo.SystemUser)
.GetFinishedTradePnls(startDate, ValueDate, includeExchangeTrades);
}
//防止缓存数据被污染
return _list.Select(n => n.Clone()).ToArray();
}
}
}
}