namespace YLErp.Modules.EodModule.SettlementModule { /// /// 检查当日到期交易,是否全部操作完毕。 /// class EodCheckMaturityTrade : EodSettleServiceBaseV2 { public const string Step = "检查当日到期交易"; public EodCheckMaturityTrade(EodSettlementContextV2 context) : base(context) { } /// /// 检查当日到期,是否全部操作完成。 /// public void Execute() { var settleDate = _context.SettleDate; //获取处于停牌状态股票信息 var suspensionUnderlyingIds = _context.Request.SuspensionUnderlyingIds; var startDate = _context.PreSettleDate.AddDays(1); var clienIds = _context.Request.ClientIds; var predicate = PredicateBuilder.Create(t => t.ExerciseDate >= startDate && t.ExerciseDate <= settleDate && t.TradeStatus == ConsTrade.确认成交 && t.ClientId > 0 && !suspensionUnderlyingIds.Contains(t.UnderlyingId) //检查费停牌状态下所有 持仓交易的是否已执行到期 && t.ValidState != ConsGlobal.InValid && t.SettlementFlag != 1); #region 新增客户筛选 tw if (clienIds != null) { predicate = predicate.And(l => clienIds.Contains(l.ClientId)); } #endregion if (PS.Config.ErpElement.SupportMultiCalendar) { var holidayTids = _context.HolidayTrades.Select(n => n.id).ToArray(); if (holidayTids.Any()) { predicate = predicate.And(t => !holidayTids.Contains(t.id)); } } var unWindTrades = DbContext.trade.Where(predicate) .Select(n => new { n.id, n.TradeType, n.TradeNumber, n.IsGroup }).ToList(); //消除子交易已经全部了结的父结构化交易 var structurePids = unWindTrades.Where(n => n.TradeType == ConsGlobal.TradeType.Structure && n.IsGroup == 0).Select(n => n.id).ToArray(); if (structurePids.Any()) { var uncompletedTids = DbContext.trade.Where(n => structurePids.Contains(n.ParentTradeId) && !ConsTrade.TradeCompleteStatus.Contains(n.TradeStatus)) .Select(n => n.ParentTradeId).Distinct().ToArray(); var completedTids = uncompletedTids.Length > 0 ? structurePids.Where(n => !uncompletedTids.Contains(n)).ToArray() : structurePids; if (completedTids.Any()) { var sql = "update trade set TradeStatus='已平仓' where id in (" + string.Join(",", completedTids) + ")"; DbContext.Database.ExecuteSqlRaw(sql); unWindTrades = unWindTrades.Where(n => !completedTids.Contains(n.id)).ToList(); } } if (unWindTrades.Any()) { var tips = string.Join(",", unWindTrades.Select(n => n.TradeType + " " + n.TradeNumber).ToArray()); _context.RaiseError(Step, "当日到期的场外交易未全部操作完成,请操作完成后再执行收盘操作:" + tips); } //多交易日历情况下某交易日历假期到期的情况 if (PS.Config.ErpElement.SupportMultiCalendar) { var expireTrades = _context.OtcTrades.Where(t => t.TradeStatus == ConsTrade.确认成交 && t.ExerciseDate <= startDate && !suspensionUnderlyingIds.Contains(t.UnderlyingId) && !_context.IsHolidayTrade(t.id) && t.SettlementFlag != 1) .Select(n => n.TradeType + " " + n.TradeNumber).ToArray(); if (expireTrades.Any()) { _context.RaiseError(Step, "节假日到期的场外交易未全部操作完成,请操作完成后再执行收盘操作:" + string.Join(",", expireTrades)); } } } } }