From 014edaed45150bd196369dc21d2a449ea08996fc Mon Sep 17 00:00:00 2001 From: hjhan Date: Thu, 2 Jul 2026 08:28:13 +0800 Subject: [PATCH] =?UTF-8?q?refactor(swap):=20ComposePage=E6=8E=A5=E7=BC=9D?= =?UTF-8?q?-7=E8=99=9A=E6=96=B9=E6=B3=95+DB=E8=B0=83=E7=94=A8=E6=9B=BF?= =?UTF-8?q?=E6=8D=A2(testable=E8=BF=81=E7=A7=BB)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ComposePage(流水合成持仓)是swap_flow_event→swap_position的核心转换, 每笔开仓/平仓/互换都经过这里(176行)。 新增7个protected virtual虚方法(Seams): - FindTrade/FindTradeExtend/FindSwapPositions - FindEodSwapPositions/FindEodSwap - AddSwapEvent/ExecuteInTransaction ComposePage内部DB调用替换为调虚方法: - DbContext.trade.Find → FindTrade - DbContext.trade_extend.FirstOrDefault → FindTradeExtend - DbContext.eod_swap_position.Where → FindEodSwapPositions - DbContext.swap_position.Where → FindSwapPositions - DbContext.eod_swap.FirstOrDefault → FindEodSwap - new SwapEventService.AddSwapEventDate → AddSwapEvent - DbContext.SaveChanges → SaveAllChanges(已有) - ComposePage可见性private→protected 生产代码行为不变(虚方法默认实现=原逻辑)。 验证: 100个测试全通过(T0/T1=89+DealInterests=7+ConsumedInterest=4)。 --- .../SwapModule/SwapEodPositionService.cs | 79 +++++++++++++++---- 1 file changed, 65 insertions(+), 14 deletions(-) diff --git a/YLErpDAL/Modules/SwapModule/SwapEodPositionService.cs b/YLErpDAL/Modules/SwapModule/SwapEodPositionService.cs index e54156b8..1d685a0c 100644 --- a/YLErpDAL/Modules/SwapModule/SwapEodPositionService.cs +++ b/YLErpDAL/Modules/SwapModule/SwapEodPositionService.cs @@ -79,6 +79,62 @@ namespace YLErp.Modules.SwapModule grossPrice, orginPv, add, settment, newCalcLast, closeList); } + /// 查找交易(生产: DbContext.trade.Find;测试: 内存字典) + protected virtual trade FindTrade(int swapTradeId) + { + return DbContext.trade.Find(swapTradeId); + } + + /// 查找交易扩展(生产: DbContext.trade_extend;测试: 内存字典) + protected virtual trade_extend FindTradeExtend(int tradeId) + { + return DbContext.trade_extend.FirstOrDefault(x => x.TradeId == tradeId); + } + + /// 查找指定日期范围的 eod 持仓(生产: DbContext.eod_swap_position.Where;测试: 内存列表) + protected virtual List FindEodSwapPositions(int swapTradeId, DateTime preSettleDate) + { + return DbContext.eod_swap_position.Where(x => x.SwapTradeId == swapTradeId && !x.Invalid && x.ValueDate >= preSettleDate).ToList(); + } + + /// 查找交易持仓(生产: DbContext.swap_position.Where;测试: 内存列表) + protected virtual List FindSwapPositions(int swapTradeId) + { + return DbContext.swap_position.Where(x => x.SwapTradeId == swapTradeId && !x.Invalid).ToList(); + } + + /// 查找框架合约日终汇总(生产: DbContext.eod_swap.FirstOrDefault;测试: 内存字典) + protected virtual eod_swap FindEodSwap(int swapTradeId, DateTime valueDate) + { + return DbContext.eod_swap.FirstOrDefault(x => x.SwapTradeId == swapTradeId && x.ValueDate == valueDate); + } + + /// 添加互换事件(生产: new SwapEventService(this).AddSwapEventDate;测试: 收集到列表) + protected virtual swap_event AddSwapEvent(DateTime tradeDate, int swapTradeId, int eventType, string data, int clientCashId, bool save, string reason) + { + return new SwapEventService(this).AddSwapEventDate(tradeDate, swapTradeId, eventType, data, clientCashId, save, reason); + } + + /// 在事务中执行(生产: BeginTransaction/Commit/Rollback;测试: 直接执行不包事务) + protected virtual void ExecuteInTransaction(Action action) + { + var trans = DbContext.Database.BeginTransaction(); + try + { + action(); + trans.Commit(); + } + catch + { + trans.Rollback(); + throw; + } + finally + { + trans.Dispose(); + } + } + #endregion /// @@ -633,7 +689,7 @@ namespace YLErp.Modules.SwapModule /// /// 互换交易id /// 清算日期 - private void ComposePage(int swapTradeId, List flowEvents, DateTime tradeDate, bool needTrans = true) + protected void ComposePage(int swapTradeId, List flowEvents, DateTime tradeDate, bool needTrans = true) { // 同一标的 事件编码一致 var eventQuery = flowEvents.OrderBy(o => o.PositionId).ToList(); @@ -647,21 +703,16 @@ namespace YLErp.Modules.SwapModule { UnwindData unwindData = new UnwindData(); unwindData.SwapTradeId = swapTradeId; - var swapEvent = new SwapEventService(this).AddSwapEventDate(tradeDate, swapTradeId, (int)SwapEventTypeEnum.合成持仓, string.Empty, 0, true, "系统操作-自动合成持仓");//不用回退,回退时过滤该事件类型 - var td = DbContext.trade.Find(swapTradeId); + var swapEvent = AddSwapEvent(tradeDate, swapTradeId, (int)SwapEventTypeEnum.合成持仓, string.Empty, 0, true, "系统操作-自动合成持仓"); + var td = FindTrade(swapTradeId); var preSettleDate = GetPreValueDate(tradeDate);//上一交易日期 List eventTyps = new List() { (int)SwapEventTypeEnum.平仓, (int)SwapEventTypeEnum.互换, (int)SwapEventTypeEnum.自动互换 }; List removeEventTyps = new List() { (int)SwapEventTypeEnum.平仓, (int)SwapEventTypeEnum.互换, (int)SwapEventTypeEnum.自动互换 }; ClearSwapPositions(td, tradeDate, removeEventTyps, false); - td.trade_extend = DbContext.trade_extend.FirstOrDefault(x => x.TradeId == swapTradeId); - var allEodPositions = DbContext.eod_swap_position.Where(x => x.SwapTradeId == swapTradeId && !x.Invalid && x.ValueDate >= preSettleDate); - //var curentInvalidEodPostions = allEodPositions.Where(x => x.SwapTradeId == swapTradeId && !x.Invalid && x.ValueDate >= tradeDate);//废弃当前清算日期之后的归档数据 - //curentInvalidEodPostions.ForEach(x => - //{ - // x.Invalid = true; - //}); + td.trade_extend = FindTradeExtend(swapTradeId); + var allEodPositions = FindEodSwapPositions(swapTradeId, preSettleDate); var eodPositions = allEodPositions.Where(x => x.ValueDate == preSettleDate).ToList();//上一日终持仓信息 - var positions = DbContext.swap_position.Where(x => x.SwapTradeId == swapTradeId && !x.Invalid).ToList(); + var positions = FindSwapPositions(swapTradeId); var oriPositions = positions.Where(x => x.IsInitial).ToList(); var realPositions = positions.Where(x => !x.IsInitial).ToList(); var fpositions = positions.Where(x => x.PosiDirection > 0).ToList(); @@ -669,7 +720,7 @@ namespace YLErp.Modules.SwapModule decimal totalPosiNotionalValue = 0;//总剩余名义本金 decimal tdCloseNotionalValue = 0;//当日平仓名义本金 var preDealDate = GetPreDealDate(swapTradeId, tradeDate, eventTyps);//上一次平仓/互换/自动互换事件日期 - var lastEodSwap = DbContext.eod_swap.FirstOrDefault(x => x.SwapTradeId == swapTradeId && x.ValueDate == preSettleDate); + var lastEodSwap = FindEodSwap(swapTradeId, preSettleDate); decimal stockEqvNotional = lastEodSwap == null ? Convert.ToDecimal(td.OriginalStockEqvNotional ?? 0) : lastEodSwap.NotionalValue;//上一日名义本金 unwindData.NotionalValue = stockEqvNotional; List longshortCloseInterests = new List(); @@ -795,9 +846,9 @@ namespace YLErp.Modules.SwapModule unwindData.PosiNotionalValue = allPosiNotionalValue; unwindData.CloseNotionalValue = tdCloseNotionalValue; swapEvent.EventData = JsonHelper.Serialize(unwindData); - DbContext.SaveChanges(); + SaveAllChanges(); SaveEodSwap(td, tradeDate, preSettleDate); - DbContext.SaveChanges(); + SaveAllChanges(); trans?.Commit(); } catch (Exception ex)