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();
+ });
}
}