Files
zszq-trs/YLErpDAL/Modules/EodModule/SettlementModule/EodCheckMaturityTrade.cs
T
2024-05-09 14:06:26 +08:00

88 lines
4.1 KiB
C#

namespace YLErp.Modules.EodModule.SettlementModule
{
/// <summary>
/// 检查当日到期交易,是否全部操作完毕。
/// </summary>
class EodCheckMaturityTrade : EodSettleServiceBaseV2
{
public const string Step = "检查当日到期交易";
public EodCheckMaturityTrade(EodSettlementContextV2 context) : base(context)
{
}
/// <summary>
/// 检查当日到期,是否全部操作完成。
/// </summary>
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<trade>(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));
}
}
}
}
}