139 lines
6.2 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|