using YLErp.Abstract.DataProviders; using YLErp.Modules.DataProviderModule; namespace YLErp.Modules.EodModule.SettlementModule { /// /// 这是一个多线程运行环境下的收盘上下文类 /// public abstract class EodSettlementContextBase { EodPriceProvider _eodPriceProvider; EodPriceProvider _preEodPriceProvider; ExchangeStatus _exchangeStatus; protected EodSettlementContextBase(EodSettlementRequest request, CancellationToken cancellationToken) { Request = request ?? throw new ArgumentNullException(nameof(request)); CancellationToken = cancellationToken; if (request.SettleDate.Year < 2000) { throw new ArgumentException("request参数错误:SettleDate"); } if (!request.IsSettleOtcTrades && !request.IsSettleExchangeTrades) { throw new ArgumentException("request参数错误"); } StartDate = request.SettleDate.AddYears(-3); PreSettleDate = BLL.valuedateBLL.GetNonHolidayDefore(SettleDate.AddDays(-1)); SystemValue = BLL.valuedateBLL.SystemDate; PredicateBuilder = new EodQueryPredicateBuilder(request); } public ExchangeStatus ExchangeStatus => _exchangeStatus ?? (_exchangeStatus = new ExchangeStatus(SettleDate, PreSettleDate)); /// /// 任务终止令牌 /// public CancellationToken CancellationToken { get; } /// /// 结算请求参数 /// public EodSettlementRequest Request { get; } /// /// 请求用户信息 /// public OptUserInfo UserInfo => Request.UserInfo; /// /// 结算日 /// public DateTime SettleDate => Request.SettleDate; /// /// 需要收盘得客户 /// public IEnumerable ClienIds => Request.ClientIds; /// /// 结算日 /// public string SettleDateStr => Request.SettleDate.ToString(ConsGlobal.DateFormat); /// /// 获取上个结算日(结算第一步就需要检查这个日期是否等于日历数据中的前一工作日) /// public DateTime PreSettleDate { get; } /// /// 获取上个结算日(结算第一步就需要检查这个日期是否等于日历数据中的前一工作日) /// public string PreSettleDateStr => PreSettleDate.ToString(ConsGlobal.DateFormat); /// /// 交易起始关注日 /// public DateTime StartDate { get; } /// /// 系统参数 /// public valuedate SystemValue { get; } /// /// 查询条件构造器 /// public EodQueryPredicateBuilder PredicateBuilder { get; } /// /// 是否当前交易日 /// public bool IsCurrentDay => SettleDate == SystemValue.ValueDate; /// /// 获取日终价格提供对象 /// public EodPriceProvider GetEodPriceProvider() { if (_eodPriceProvider == null) { _eodPriceProvider = new EodPriceProvider(SettleDate, isDiviendPrice: false); if (!Request.IsPartialSettlement) { _eodPriceProvider.Initialize(); } } return _eodPriceProvider; } /// /// 收盘日上一交易日日终价格提供 /// public EodPriceProvider GetPreEodPriceProvider() { if (_preEodPriceProvider == null) { _preEodPriceProvider = new EodPriceProvider(PreSettleDate); _preEodPriceProvider.SetPreValueDate(PreSettleDate); if (!Request.IsPartialSettlement) { _preEodPriceProvider.Initialize(); } } return _preEodPriceProvider; } #region----运行信息处理---- /// /// 记录日志 /// public void LogInfo(string message) { LogFactory.GetLogger("日终结算").Info(message); } /// /// 记录日志 /// public void LogError(string message, Exception ex = null) { LogFactory.GetLogger("日终结算").Error(message, ex); } /// /// 激发错误异常 /// public void RaiseError(string action, string error, Exception ex = null) { if (error == null) { error = "发生错误"; } throw new EodSettleException($"[{action}]{error}", ex); } /// /// 检查结算任务是否被取消 /// public void CheckCanceled() { CancellationToken.ThrowIfCancellationRequested(); } #endregion public override string ToString() { return SettleDateStr; } } /// /// 日终结算错误 /// public class EodSettleException : Exception { public EodSettleException(string message, Exception innerException) : base(message, innerException) { } } /// /// 交易所状态 /// public class ExchangeStatus { readonly DateTime _preDate; readonly Dictionary _dic; public ExchangeStatus(DateTime valueDate, DateTime preDate) { _preDate = preDate; _dic = new Dictionary(StringComparer.OrdinalIgnoreCase); foreach (var m in DataCacheProvider.GetMarketDataSource().AsQueryable()) { if (!string.IsNullOrEmpty(m.ExchangeNo)) { var calendar = m.CalendarName.TrimToNull() ?? ConsGlobal.DefaultCalendar; var isholidy = QdpModule.QdpCalendarHelper.IsHoliday(valueDate, calendar); var exPreDate = QdpModule.QdpCalendarHelper.GetNonHolidayDefore(_preDate, calendar); _dic[m.ExchangeNo] = (isholidy, exPreDate); } } } /// /// 交易所是否节假日 /// public bool IsHoliday(string exchangeNo) { return !string.IsNullOrEmpty(exchangeNo) && _dic.TryGetValue(exchangeNo, out var state) && state.isholidy; } /// /// 交易所的上一个交易日 /// public DateTime GetPreDate(string exchangeNo) { return !string.IsNullOrEmpty(exchangeNo) && _dic.TryGetValue(exchangeNo, out var state) ? state.exPreDate : _preDate; } } }