95 lines
4.1 KiB
C#
95 lines
4.1 KiB
C#
namespace YLErp.Modules.EodModule.SettlementModule
|
|
{
|
|
/// <summary>
|
|
/// 检查所有当日交易,是否全部确认,股票期权期初价格是否已确认
|
|
/// </summary>
|
|
class EodCheckNewTrade : EodSettleServiceBase
|
|
{
|
|
public const string Step = "检查当日交易";
|
|
|
|
public EodCheckNewTrade(EodSettlementContextBase context) : base(context)
|
|
{
|
|
|
|
}
|
|
|
|
/// <summary>
|
|
/// 检查交易期初价格未确认则收盘停止
|
|
/// 当日成交交易是否全部确认,
|
|
/// 当日到期期权是否处理完成
|
|
/// </summary>
|
|
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);
|
|
}
|
|
}
|
|
}
|
|
}
|