namespace YLErp.Modules.EodModule.SettlementModule { /// /// 检查所有当日交易,是否全部确认,股票期权期初价格是否已确认 /// class EodCheckNewTrade : EodSettleServiceBase { public const string Step = "检查当日交易"; public EodCheckNewTrade(EodSettlementContextBase context) : base(context) { } /// /// 检查交易期初价格未确认则收盘停止 /// 当日成交交易是否全部确认, /// 当日到期期权是否处理完成 /// public void Execute() { var settleDate = _context.SettleDate; var clienIds = _context.Request.ClientIds; var tradePredicate = _context.PredicateBuilder.GetOtcSwapTradePredicate(); #region 新增客户筛选 tw if (clienIds != null) { tradePredicate = tradePredicate.And(l => clienIds.Contains(l.ClientId)); } #endregion //a.期初价格未确认则收盘停止t(这段逻辑是否用不到了???) if (PS.Config.ComponentVersion == Configuration.ComponentVersion.Broker) { var predicate1 = tradePredicate.And(t => t.SpotPrice == null && t.IsMoneynessOption == "是" && t.UnderlyingInstrumentType == ConsGlobal.InstrumentType.Stock); var query1 = DbContext.trade.Where(predicate1).Select(t => new { t.TradeType, t.TradeNumber }); var moneynessOptionTradeList = query1.ToList(); if (moneynessOptionTradeList.Any()) { var msg = string.Join(",", moneynessOptionTradeList.Select(n => n.TradeType + " " + n.TradeNumber).ToArray()); _context.RaiseError("期初价格未填写", msg); } } //b.检查所有当日交易,是否全部确认 var checkTradeStatus = new string[] { ConsTrade.新增待确认, ConsTrade.修改待确认, ConsTrade.审批中 }; //当天收盘需要验证所有中间状态是否完成 if (_context.IsCurrentDay) { checkTradeStatus = new string[] { ConsTrade.新增待确认, ConsTrade.修改待确认, ConsTrade.审批中, ConsTrade.平仓待复核, ConsTrade.提前终止拒绝, ConsTrade.已拒绝, ConsTrade.行权待复核, ConsTrade.互换待复核 }; } var predicate2 = tradePredicate.And(t => checkTradeStatus.Contains(t.TradeStatus)); var unConfirmTrades = DbContext.trade.Where(predicate2).Select(t => new { t.TradeType, t.TradeNumber, t.TradeStatus }).ToList(); //历史收盘时降低未来状态的影响 if (!_context.IsCurrentDay) { var tcActions = new[] { "系统操作-平仓费", "系统操作-行权费", "系统操作-互换" }; checkTradeStatus = new string[] { ConsTrade.平仓待复核, ConsTrade.提前终止拒绝, ConsTrade.已拒绝, ConsTrade.行权待复核, ConsTrade.互换待复核 }; predicate2 = tradePredicate.And(t => checkTradeStatus.Contains(t.TradeStatus)); var query = from t in DbContext.trade.Where(predicate2) where !DbContext.trade_cash.Any(tc => tc.TradeId == t.id && tcActions.Contains(tc.Action) && tc.ValueDate > _context.SettleDate) select new { t.TradeType, t.TradeNumber, t.TradeStatus }; var unConfirmTrades2 = query.ToArray(); unConfirmTrades.AddRange(unConfirmTrades2); } if (unConfirmTrades.Any()) { var msg = string.Join(",", unConfirmTrades.Select(n => n.TradeType + " " + n.TradeNumber).ToArray()); _context.RaiseError("交易状态不符合结算要求", msg); } } } }