using Microsoft.EntityFrameworkCore; using YLErp.Commons; using YLErp.DBModels; namespace YLErp.Modules.TradeRiskCalcModule { class TradeDataSource : TestServiceBase, ITradeDataSource { readonly DateTime _valueDate; readonly TradeRiskCalcTestRequest2 _request; public TradeDataSource(DateTime valueDate, TradeRiskCalcTestRequest2 request) { _valueDate = valueDate; _request = request ?? throw new ArgumentNullException(nameof(request)); } public TraceWrap Trace { get; set; } public IEnumerable GetExchangeTrades() { if (!_request.IncludeExchange || _request.TradeId > 0 || _request.ClientId > 0) { return Enumerable.Empty(); } var lastSettleDate = BLL.Eod.EodOperationBase.GetLastSettlementDate(_valueDate, true); var predicate = PredicateBuilder.Create(trad => trad.TradeDate > lastSettleDate && trad.TradeDate <= _valueDate && (trad.MaturityDate >= _valueDate || trad.MaturityDate == null) && trad.IsValid); if (_request.UnderlyingCodes != null && _request.UnderlyingCodes.Any()) { predicate = predicate.And(n => _request.UnderlyingCodes.Contains(n.UnderlyingCode)); } if (!string.IsNullOrEmpty(_request.TradeType)) { predicate = predicate.And(n => _request.TradeType == n.TradeType); } if (_request.AssetBookId > 0) { predicate = predicate.And(n => n.AssetBookId == _request.AssetBookId); } var db = DbContextFactory.GetYLDbContext(); //构建Linq查询语句 var hedgeTradeQuery = db.ExchangeTrade.AsNoTracking().Where(predicate); //从数据库中获取数据 return hedgeTradeQuery.ToArray(); } public IEnumerable GetOtcTrades() { var valueDate = _valueDate; var startDate = _valueDate.AddYears(-1); var predicate = PredicateBuilder.Create(n => n.ClientId > 0 && n.TradeDate > startDate && n.TradeType != "结构化交易" && n.ValidState != "InValid" && n.TradeStatus != ConsTrade.已拒绝); if (_request.TradeId > 0) { predicate = predicate.And(n => n.id == _request.TradeId); } else { predicate = predicate.And(n => (!ConsTrade.TradeCompleteStatus.Contains(n.TradeStatus) || n.TradeDate == valueDate || n.UnWindDate == valueDate) && (n.ExerciseDate == null || n.ExerciseDate >= valueDate)); if (_request.ClientId > 0) { predicate = predicate.And(n => n.ClientId == _request.ClientId); } if (_request.UnderlyingCodes != null && _request.UnderlyingCodes.Any()) { predicate = predicate.And(n => _request.UnderlyingCodes.Contains(n.UnderlyingCode)); } if (!string.IsNullOrEmpty(_request.TradeType)) { predicate = predicate.And(n => _request.TradeType == n.TradeType); } if (_request.AssetBookId > 0) { predicate = predicate.And(n => n.AssetId == _request.AssetBookId); } } var datas = DbContext.trade.AsNoTracking().Where(predicate).ToArray(); Trace?.WriteLine($"(实时风险)获取到场外交易数据${datas.Length}条"); Trace?.WriteData(datas, "(实时风险)场外交易数据"); return datas; } } }