diff --git a/UnitTestProject/Modules/SwapModule/SwapIncomeScenarioTest.cs b/UnitTestProject/Modules/SwapModule/SwapIncomeScenarioTest.cs index 5a1d4308..02aaf36d 100644 --- a/UnitTestProject/Modules/SwapModule/SwapIncomeScenarioTest.cs +++ b/UnitTestProject/Modules/SwapModule/SwapIncomeScenarioTest.cs @@ -63,5 +63,35 @@ namespace YLErp.Modules.SwapModule Assert.AreEqual(ClientCashInCashOut.系统操作_预付金返息, service.ClientCashCalls[1].action); Console.WriteLine($"SI_002: 互换={service.ClientCashCalls[0].amount}, 预付金返息={service.ClientCashCalls[1].amount} ✅"); } + + [TestMethod] + public void SI_003_SwapIncome_含预付金腿_不返还预付金本金() + { + var td = SwapDealTestFactory.CreateTrade(); + td.ExerciseDate = new DateTime(2026, 12, 31); + var service = new TestableSwapDealService(td); + var unwindData = SwapDealTestFactory.CreateUnwindData(swapRealizedPnL: 0m); + unwindData.FlowEvents.Add(new swap_flow_event + { + UnderlyingCode = "UT-FLOAT", + MarkClosePnl = 100m, + PayDirection = 1 + }); + unwindData.FlowEvents.Add(new swap_flow_event + { + InterestMode = (int)InterestModeEnum.初始预付金, + InterestDirection = 1, + InterestPrincipal = 10000m, + InterestClosePnL = 2m + }); + + service.SwapIncome(unwindData); + + Assert.AreEqual(0m, unwindData.SwapMarginAmount, "手动互换不应返还预付金本金"); + Assert.IsFalse(service.ClientCashCalls.Any(x => x.action == ClientCashInCashOut.系统操作_应付预付金), + "手动互换不应生成应付预付金流水"); + Assert.IsTrue(service.ClientCashCalls.Any(x => x.action == ClientCashInCashOut.系统操作_预付金返息), + "手动互换仍应结算预付金返息"); + } } } diff --git a/UnitTestProject/Modules/SwapModule/SwapUnwindScenarioTest.cs b/UnitTestProject/Modules/SwapModule/SwapUnwindScenarioTest.cs index 96b14d5f..e156f2b9 100644 --- a/UnitTestProject/Modules/SwapModule/SwapUnwindScenarioTest.cs +++ b/UnitTestProject/Modules/SwapModule/SwapUnwindScenarioTest.cs @@ -166,6 +166,35 @@ namespace YLErp.Modules.SwapModule Console.WriteLine($"UW_005: 反序列化SwapRealizedPnL=8000, 资金流水={service.ClientCashCalls[0].amount}, TradeStatus={td.TradeStatus} ✅"); } + [TestMethod] + public void UW_005A_ApproveSwapTrade_互换审核_不返还预付金本金() + { + var td = SwapDealTestFactory.CreateTrade(); + td.ExerciseDate = new DateTime(2026, 12, 31); + var unwindData = SwapDealTestFactory.CreateUnwindData( + swapRealizedPnL: 100m, swapMarginAmount: -10000m); + var swapEvent = new swap_event + { + id = 2, + SwapTradeId = SwapDealTestFactory.SwapTradeId, + EventType = (int)SwapEventTypeEnum.互换, + Invalid = false, + EventData = JsonConvert.SerializeObject(unwindData) + }; + var service = new TestableSwapDealService(td, + swapEvents: new Dictionary + { + [(int)SwapEventTypeEnum.互换] = swapEvent + }); + + service.ApproveSwapTrade(td, (int)SwapEventTypeEnum.互换); + + Assert.AreEqual(1, service.ClientCashCalls.Count, "互换审批只应生成互换结算流水"); + Assert.AreEqual(ClientCashInCashOut.系统操作_互换, service.ClientCashCalls[0].action); + Assert.IsFalse(service.ClientCashCalls.Any(x => x.action == ClientCashInCashOut.系统操作_应付预付金), + "互换审批不应生成应付预付金流水"); + } + // ================================================================ // 场景6:ApplySwapTrade 提交审核 —— 前置校验与保存事件 // ================================================================ diff --git a/YLErpDAL/Modules/SwapModule/SwapDealService.cs b/YLErpDAL/Modules/SwapModule/SwapDealService.cs index 6bb9a47b..cb07edae 100644 --- a/YLErpDAL/Modules/SwapModule/SwapDealService.cs +++ b/YLErpDAL/Modules/SwapModule/SwapDealService.cs @@ -144,6 +144,10 @@ namespace YLErp.Modules.SwapModule if (unwindData.FlowEvents.Any(x => !string.IsNullOrEmpty(x.UnderlyingCode))) { CalcCloseAmount(unwindData); + if (eventType == (int)SwapEventTypeEnum.互换) + { + unwindData.SwapMarginAmount = 0; + } return; } @@ -2013,7 +2017,7 @@ namespace YLErp.Modules.SwapModule } string action = eventType == (int)SwapEventTypeEnum.互换 ? ClientCashInCashOut.系统操作_互换 : ClientCashInCashOut.系统操作_平仓费; int clientCashId = AddClientCash(td, Convert.ToDouble(-swapEvent.unwindData.SwapRealizedPnL), action, swapEvent.unwindData.ValueDate); - if (swapEvent.unwindData.SwapMarginAmount != 0) + if (eventType == (int)SwapEventTypeEnum.平仓 && swapEvent.unwindData.SwapMarginAmount != 0) { AddClientCash(td, Convert.ToDouble(swapEvent.unwindData.SwapMarginAmount), ClientCashInCashOut.系统操作_应付预付金, swapEvent.unwindData.ValueDate); }