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

139 lines
6.2 KiB
C#

using System.Linq.Expressions;
using YLErp.Model.Enum;
namespace YLErp.Modules.EodModule.SettlementModule
{
public class EodQueryPredicateBuilder
{
readonly DateTime _startDate;
readonly EodSettlementRequest _request;
Expression<Func<trade, bool>> _otcTradePredicate;
Expression<Func<ExchangeTrade, bool>> _exchangeTradePredicate;
Expression<Func<clientcashincashout_product, bool>> _clientProductPredicate;
public EodQueryPredicateBuilder(EodSettlementRequest request)
{
_request = request ?? throw new ArgumentNullException(nameof(request));
if (_request.SettleDate.Year < 2000)
{
throw new ArgumentException("无效request");
}
_startDate = request.SettleDate.AddYears(-5);
}
/// <summary>
/// 构建结算用的衍生品交易筛选条件
/// </summary>
/// <param name="isGuoJunNeedBesideSwapTrade">国君是否需要互换交易--国君互换持仓计算暂时自己导入 true 需要</param>
/// <returns></returns>
public Expression<Func<trade, bool>> GetOtcTradePredicate(bool isGuoJunNeedBesideSwapTrade = false)
{
if (_otcTradePredicate != null && !PS.Config.IsGuoJun)
{
return _otcTradePredicate;
}
if (!_request.IsSettleOtcTrades)
{
return _otcTradePredicate = PredicateBuilder.False<trade>();
}
//如果前一天是假日,要显示包含假日的交易
var preday = BLL.valuedateBLL.GetNonHolidayDefore(_request.SettleDate.AddDays(-1));
var predicate = PredicateBuilder.Create<trade>(t =>
t.TradeDate > _startDate && t.TradeDate <= _request.SettleDate
&& t.ValidState != ConsGlobal.InValid && t.ClientId > 0
&& t.TradeType != "结构化交易" && t.TradeType != "收益互换"
&& (t.ExerciseDate > preday || t.UnWindDate > preday || _request.SuspensionUnderlyingIds.Contains(t.UnderlyingId) || _request.DelayUnderlyIds.Contains(t.UnderlyingId) || t.SettlementFlag == 1)
&& (!ConsTrade.TradeCompleteStatus.Contains(t.TradeStatus) || t.UnWindDate > preday));
if (PS.Config.IsGuoJun && !isGuoJunNeedBesideSwapTrade)
{
predicate = PredicateBuilder.Create<trade>(t =>
t.TradeDate > _startDate && t.TradeDate <= _request.SettleDate
&& t.ValidState != ConsGlobal.InValid && t.ClientId > 0
&& t.TradeType != "结构化交易" && t.TradeType != "收益互换"
&& (t.ExerciseDate > preday || t.UnWindDate > preday || _request.SuspensionUnderlyingIds.Contains(t.UnderlyingId) || _request.DelayUnderlyIds.Contains(t.UnderlyingId) || t.SettlementFlag == 1)
&& (!ConsTrade.TradeCompleteStatus.Contains(t.TradeStatus) || t.UnWindDate > preday));
}
if (_request.ClientIds != null && _request.ClientIds.Any())
{
predicate = predicate.And(t => _request.ClientIds.Contains(t.ClientId));
}
return _otcTradePredicate = predicate;
}
public Expression<Func<trade, bool>> GetOtcSwapTradePredicate()
{
//如果前一天是假日,要显示包含假日的交易
var preday = BLL.valuedateBLL.GetNonHolidayDefore(_request.SettleDate.AddDays(-1));
var predicate = PredicateBuilder.Create<trade>(t =>
t.TradeDate > _startDate && t.TradeDate <= _request.SettleDate
&& t.ValidState != ConsGlobal.InValid
&& t.TradeType == "收益互换"
&& (t.ExerciseDate > preday || t.UnWindDate > preday || t.SettlementFlag == 1)
&& (!ConsTrade.TradeCompleteStatus.Contains(t.TradeStatus) || t.UnWindDate > preday));
if (_request.ClientIds != null && _request.ClientIds.Any())
{
predicate = predicate.And(t => _request.ClientIds.Contains(t.ClientId));
}
return _otcTradePredicate = predicate;
}
/// <summary>
/// 构建结算用的场内交易筛选条件
/// </summary>
public Expression<Func<ExchangeTrade, bool>> GetExchangeTradePredicate()
{
if (_exchangeTradePredicate != null)
{
return _exchangeTradePredicate;
}
if (!_request.IsSettleExchangeTrades)
{
return _exchangeTradePredicate = PredicateBuilder.False<ExchangeTrade>();
}
var predicate = PredicateBuilder.Create<ExchangeTrade>(t => t.TradeDate == _request.SettleDate && t.IsValid);
return _exchangeTradePredicate = predicate;
}
/// <summary>
/// 客户抵押品查询
/// </summary>
public Expression<Func<clientcashincashout_product, bool>> GetClientProductPredicate()
{
if (_clientProductPredicate != null)
{
return _clientProductPredicate;
}
if (!_request.IsSettleOtcTrades)
{
return _clientProductPredicate = PredicateBuilder.False<clientcashincashout_product>();
}
var settleDateEnd = _request.SettleDate.AddDays(1);
var predicate = PredicateBuilder.Create<clientcashincashout_product>(t => t.HappenDate < settleDateEnd
&& (t.Status == Clientcashincashout_productStatusEnum.抵押.ToString() && t.OptStatus == ClientCashInCashOut.已确认
|| t.Status == Clientcashincashout_productStatusEnum.赎回.ToString() && (t.OptStatus != ClientCashInCashOut.已确认 || t.BackDate >= settleDateEnd)));
if (_request.ClientIds != null && _request.ClientIds.Any())
{
predicate = predicate.And(t => t.ClientId != 0 && _request.ClientIds.Contains(t.ClientId));
}
return predicate;
}
}
}