using System.Linq.Expressions; using YLErp.Model.Enum; namespace YLErp.Modules.EodModule.SettlementModule { public class EodQueryPredicateBuilder { readonly DateTime _startDate; readonly EodSettlementRequest _request; Expression> _otcTradePredicate; Expression> _exchangeTradePredicate; Expression> _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); } /// /// 构建结算用的衍生品交易筛选条件 /// /// 国君是否需要互换交易--国君互换持仓计算暂时自己导入 true 需要 /// public Expression> GetOtcTradePredicate(bool isGuoJunNeedBesideSwapTrade = false) { if (_otcTradePredicate != null && !PS.Config.IsGuoJun) { return _otcTradePredicate; } if (!_request.IsSettleOtcTrades) { return _otcTradePredicate = PredicateBuilder.False(); } //如果前一天是假日,要显示包含假日的交易 var preday = BLL.valuedateBLL.GetNonHolidayDefore(_request.SettleDate.AddDays(-1)); var predicate = PredicateBuilder.Create(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(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> GetOtcSwapTradePredicate() { //如果前一天是假日,要显示包含假日的交易 var preday = BLL.valuedateBLL.GetNonHolidayDefore(_request.SettleDate.AddDays(-1)); var predicate = PredicateBuilder.Create(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; } /// /// 构建结算用的场内交易筛选条件 /// public Expression> GetExchangeTradePredicate() { if (_exchangeTradePredicate != null) { return _exchangeTradePredicate; } if (!_request.IsSettleExchangeTrades) { return _exchangeTradePredicate = PredicateBuilder.False(); } var predicate = PredicateBuilder.Create(t => t.TradeDate == _request.SettleDate && t.IsValid); return _exchangeTradePredicate = predicate; } /// /// 客户抵押品查询 /// public Expression> GetClientProductPredicate() { if (_clientProductPredicate != null) { return _clientProductPredicate; } if (!_request.IsSettleOtcTrades) { return _clientProductPredicate = PredicateBuilder.False(); } var settleDateEnd = _request.SettleDate.AddDays(1); var predicate = PredicateBuilder.Create(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; } } }