diff --git a/UnitTestProject/Modules/SwapModule/SwapDealSettlementTest.cs b/UnitTestProject/Modules/SwapModule/SwapDealSettlementTest.cs
index 85869479..a5c4b50a 100644
--- a/UnitTestProject/Modules/SwapModule/SwapDealSettlementTest.cs
+++ b/UnitTestProject/Modules/SwapModule/SwapDealSettlementTest.cs
@@ -223,6 +223,73 @@ namespace YLErp.Modules.SwapModule
Console.WriteLine($"SD_003 通过:TradeStatus={td.TradeStatus},StockEqvNotional={td.StockEqvNotional} ✅");
}
+ // ================================================================
+ // SD_007:SwapUnwind 部分平仓 —— HasPartialUnWind=1,TradeStatus 不变
+ // ================================================================
+
+ ///
+ /// [SD_007] SwapUnwind 部分平仓(借鉴 testable SwapUnwindScenarioTest.Scenario2)
+ /// ------------------------------------------------------------
+ /// 部分平仓(CloseMethod≠全部平仓 且 ClosePercent≠1)走 else 分支:
+ /// td.HasPartialUnWind = 1,TradeStatus 保持"确认成交"不变
+ /// StockEqvNotional/TradeAmount 仍按 CloseNotionalValue/CloseQty 扣减
+ ///
+ [TestMethod]
+ public void SD_007_SwapUnwind_部分平仓_设HasPartialUnWind且TradeStatus不变()
+ {
+ var td = CreateTrade();
+ var service = new StubDealService(td);
+ // 部分平仓:ClosePercent=0.5, CloseQty=5000, CloseNotionalValue=500000
+ var unwindData = CreateUnwindData(
+ swapRealizedPnL: 3000m, swapMarginAmount: 0m,
+ closeMethod: (int)CloseMethodEnum.部分平仓, closePercent: 0.5m,
+ closeQty: 5000m, closeNotionalValue: 500000m, positionQty: 10000m);
+
+ service.SwapUnwind(unwindData);
+
+ // 部分平仓:设 HasPartialUnWind=1,TradeStatus 不变
+ Assert.AreEqual(1, td.HasPartialUnWind, "部分平仓应设 HasPartialUnWind=1");
+ Assert.AreEqual("确认成交", td.TradeStatus, "部分平仓 TradeStatus 保持不变");
+ // 持仓扣减:原 StockEqvNotional=1000000 - 500000 = 500000
+ Assert.AreEqual(500000.0, td.StockEqvNotional, 0.001, "StockEqvNotional 扣减后=500000");
+ Assert.AreEqual(5000.0, td.TradeAmount, 0.001, "TradeAmount 扣减后=5000");
+ // 资金流水仍有(部分平仓也产生平仓费流水)
+ Assert.AreEqual(1, service.ClientCashCalls.Count, "部分平仓应1条资金流水");
+ Assert.AreEqual(-3000.0, service.ClientCashCalls[0].amount, 0.001, "资金流水=-SwapRealizedPnL");
+ Console.WriteLine($"SD_007 通过:HasPartialUnWind={td.HasPartialUnWind},TradeStatus={td.TradeStatus},StockEqvNotional={td.StockEqvNotional} ✅");
+ }
+
+ // ================================================================
+ // SD_008:SwapUnwind 含预付金 —— 两条资金流水(平仓费+应付预付金)
+ // ================================================================
+
+ ///
+ /// [SD_008] SwapUnwind 含预付金返还(SwapMarginAmount≠0)
+ /// ------------------------------------------------------------
+ /// SwapUnwind 内部:SwapMarginAmount≠0 时追加一条"应付预付金"资金流水。
+ /// 验证:2条流水(平仓费 + 应付预付金),金额和操作类型正确。
+ ///
+ [TestMethod]
+ public void SD_008_SwapUnwind_含预付金_两条资金流水()
+ {
+ var td = CreateTrade();
+ var service = new StubDealService(td);
+ var unwindData = CreateUnwindData(
+ swapRealizedPnL: 5000m, swapMarginAmount: 2000m,
+ closeMethod: (int)CloseMethodEnum.全部平仓, closePercent: 1m,
+ closeQty: 10000m, closeNotionalValue: 1000000m, positionQty: 10000m);
+
+ service.SwapUnwind(unwindData);
+
+ // 2条资金流水:平仓费 + 应付预付金
+ Assert.AreEqual(2, service.ClientCashCalls.Count, "含预付金时应2条资金流水");
+ Assert.AreEqual(-5000.0, service.ClientCashCalls[0].amount, 0.001, "第1条=平仓费 -SwapRealizedPnL");
+ Assert.AreEqual(ClientCashInCashOut.系统操作_平仓费, service.ClientCashCalls[0].action);
+ Assert.AreEqual(2000.0, service.ClientCashCalls[1].amount, 0.001, "第2条=应付预付金 SwapMarginAmount");
+ Assert.AreEqual(ClientCashInCashOut.系统操作_应付预付金, service.ClientCashCalls[1].action);
+ Console.WriteLine($"SD_008 通过:2条流水,平仓费={service.ClientCashCalls[0].amount},应付预付金={service.ClientCashCalls[1].amount} ✅");
+ }
+
// ================================================================
// SD_004:DealFloatPosition 含费价重算正确(后端唯二真做计算的地方)
// ================================================================