diff --git a/YLErpDAL/Modules/SwapModule/SwapEodPositionService.cs b/YLErpDAL/Modules/SwapModule/SwapEodPositionService.cs index 9007286c..4f885bb4 100644 --- a/YLErpDAL/Modules/SwapModule/SwapEodPositionService.cs +++ b/YLErpDAL/Modules/SwapModule/SwapEodPositionService.cs @@ -167,6 +167,51 @@ namespace YLErp.Modules.SwapModule return new BondPaymentService(UserInfo).CalcPayment(underlyingCode, fromDate, toDate, qty, shortRatio, directionRatio); } + // ---- SwapPositionCompose 路径专用 seam(借鉴 testable 分支)---- + + /// 查找收盘所需的活跃互换交易(生产: DbContext.trade.Where;测试: 内存列表) + protected virtual List FindActiveSwapTrades(DateTime settleDate, IEnumerable clientIds) + { + var tradePredicate = PredicateBuilder.Create(n => n.ValidState != ConsGlobal.InValid + && n.TradeType == "收益互换" + && n.TradeDate <= settleDate + && n.ExerciseDate >= settleDate + && (n.TradeStatus == ConsTrade.确认成交 || n.UnWindDate >= settleDate) + ); + if (clientIds != null && clientIds.Any()) + { + tradePredicate = tradePredicate.And(x => clientIds.Contains(x.ClientId)); + } + return DbContext.trade.Where(tradePredicate).ToList(); + } + + /// 查找交易的所有持仓(含初始+实际,生产: DbContext.swap_position;测试: 内存列表) + protected virtual List FindAllSwapPositions(List tradeIds) + { + return DbContext.swap_position.Where(t => tradeIds.Contains(t.SwapTradeId) && !t.Invalid).ToList(); + } + + /// 批量查找交易扩展(生产: DbContext.trade_extend;测试: 内存列表) + protected virtual List FindTradeExtends(List tradeIds) + { + return DbContext.trade_extend.Where(x => tradeIds.Contains(x.TradeId)).ToList(); + } + + /// 查找指定日期的日终汇总(生产: DbContext.eod_swap;测试: 内存列表) + protected virtual List FindEodSwapsByDate(DateTime valueDate) + { + return DbContext.eod_swap.Where(x => x.ValueDate == valueDate).ToList(); + } + + /// 查找交易在指定日期的完成流水事件(生产: DbContext.swap_flow_event;测试: 内存列表) + protected virtual List FindFlowEvents(int swapTradeId, DateTime settleDate) + { + Expression> eventExpression = x => x.SwapTradeId == swapTradeId + && x.DataState == (int)SwapFlowDateStateEnum.完成 + && x.EventDate == settleDate; + return DbContext.swap_flow_event.Where(eventExpression).ToList(); + } + #endregion /// @@ -205,28 +250,17 @@ namespace YLErp.Modules.SwapModule { var dateStr = settleDate.ToString("yyyy-MM-dd"); Log.Info("SwapPositionCompose:" + "settleDate:" + settleDate + " preSettleDate:" + preSettleDate + " ClientIds:" + JsonHelper.Serialize(ClientIds)); - var tradePredicate = PredicateBuilder.Create(n => n.ValidState != ConsGlobal.InValid - && n.TradeType == "收益互换" - && n.TradeDate <= settleDate - && n.ExerciseDate >= settleDate - && (n.TradeStatus == ConsTrade.确认成交 || n.UnWindDate >= settleDate) - ); - if (ClientIds != null && ClientIds.Any()) - { - tradePredicate = tradePredicate.And(x => ClientIds.Contains(x.ClientId)); - } - var tradeQueryList = DbContext.trade.Where(tradePredicate).ToList(); + var tradeQueryList = FindActiveSwapTrades(settleDate, ClientIds); var tradeIds = tradeQueryList.Select(s => s.id).ToList(); - var allTradePositionList = DbContext.swap_position.Where(t => tradeIds.Contains(t.SwapTradeId) && !t.Invalid).ToList(); + var allTradePositionList = FindAllSwapPositions(tradeIds); var tradePositionList = allTradePositionList.Where(t => t.IsInitial).ToList(); var tradeRealPositionList = allTradePositionList.Where(t => !t.IsInitial).ToList(); - var tradeExtendList = DbContext.trade_extend.Where(x => tradeIds.Contains(x.TradeId)).ToList(); - var eodSwapList = DbContext.eod_swap.Where(x => x.ValueDate == preSettleDate).ToList(); + var tradeExtendList = FindTradeExtends(tradeIds); + var eodSwapList = FindEodSwapsByDate(preSettleDate); List eventTyps = new List() { (int)SwapEventTypeEnum.平仓, (int)SwapEventTypeEnum.互换, (int)SwapEventTypeEnum.自动互换 }; foreach (var td in tradeQueryList) { - var trans = DbContext.Database.BeginTransaction(); - try + ExecuteInTransaction(() => { List removeEventTyps = new List() { (int)SwapEventTypeEnum.自动互换 }; bool longShort = td.StructureType == ClientMarginTypeEnum.多空组合.ToString(); @@ -243,7 +277,7 @@ namespace YLErp.Modules.SwapModule { throw new Exception($"交易{td.TradeNumber}在上一交易日【{preSettleDate:yyyy-MM-dd}】未收盘"); } - var allEodPositions = DbContext.eod_swap_position.Where(x => x.ValueDate >= preSettleDate && x.SwapTradeId == td.id && !x.Invalid); + var allEodPositions = FindEodSwapPositions(td.id, preSettleDate); var eodPositions = allEodPositions.Where(x => x.ValueDate == preSettleDate).ToList();//上一日终持仓信息 @@ -256,18 +290,7 @@ namespace YLErp.Modules.SwapModule { throw new Exception($"交易【{td.TradeNumber}】到期扔有持仓信息"); } - var flowEvents = new List(); - Expression> eventExpression = x => x.SwapTradeId == td.id && x.DataState == (int)SwapFlowDateStateEnum.完成; - eventExpression = eventExpression.And(x => x.EventDate == settleDate); - //if (settleDate == td.TradeDate) - //{ - // eventExpression = eventExpression.And(x => x.EventDate == settleDate); - //} - //else - //{ - // eventExpression = eventExpression.And(x => x.UnwindDate == settleDate); - //} - flowEvents = DbContext.swap_flow_event.Where(eventExpression).ToList(); + var flowEvents = FindFlowEvents(td.id, settleDate); var preDealDate = GetPreDealDate(td.id, settleDate, eventTyps);//上一次平仓/互换/自动互换处理日期 List autoInterests = new List();//自动互换利息腿信息 //处理浮动腿 @@ -296,18 +319,8 @@ namespace YLErp.Modules.SwapModule td.TradeStatus = "已到期"; td.UnWindDate = settleDate; } - DbContext.SaveChanges(); - trans.Commit(); - } - catch (Exception ex) - { - trans.Rollback(); - throw new Exception(ex.Message, ex); - } - finally - { - trans.Dispose(); - } + SaveAllChanges(); + }); } }