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

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);
}
}
}
}