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