From 253a89b79910ce72a72c4985e2f0c712d4c1219a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=90=8D=E9=94=90?= <1565842059@qq.com> Date: Fri, 7 Aug 2026 23:00:28 +0800 Subject: [PATCH] =?UTF-8?q?test(swap):=20=E6=B7=BB=E5=8A=A0=E6=B6=88?= =?UTF-8?q?=E8=B4=B9=E5=88=A9=E6=81=AF=E5=9C=BA=E6=99=AF=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E7=94=A8=E4=BE=8B=E5=B9=B6=E4=BF=AE=E5=A4=8D=E9=87=8D=E7=BD=AE?= =?UTF-8?q?=E6=97=A5=E5=88=A9=E6=81=AF=E8=AE=A1=E7=AE=97=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加CI_010_EodResetWithoutCloseCarriesFullPendingInterest测试方法 - 验证无平仓重置日必须完整并入上一期累计待实现利息的场景 - 修复CalcDailyCompoundInterestByEod方法中剩余百分比计算逻辑 - 使用posiPrincipal替代preEodPosition.TdInterestPrincipal进行计算 - 确保重置日期计算中本金比例的准确性 --- .../ConsumedInterestScenarioTest.cs | 42 +++++++++++++++++++ .../Modules/SwapModule/SwapDealService.cs | 4 +- 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/UnitTestProject/Modules/SwapModule/ConsumedInterestScenarioTest.cs b/UnitTestProject/Modules/SwapModule/ConsumedInterestScenarioTest.cs index ca3ea968..6ad2800d 100644 --- a/UnitTestProject/Modules/SwapModule/ConsumedInterestScenarioTest.cs +++ b/UnitTestProject/Modules/SwapModule/ConsumedInterestScenarioTest.cs @@ -473,5 +473,47 @@ namespace YLErp.Modules.SwapModule AssertDecimal(pendingInterest, result.InterestAmount, "calcLast=false must not accrue unwind-date interest after the previous EOD"); } + + [TestMethod] + public void CI_010_EodResetWithoutCloseCarriesFullPendingInterest() + { + const decimal principal = 303139117.80m; + const decimal previousBase = 303230391.742592383565m; + const decimal pendingInterest = 184331.611361300669m; + var startDate = new DateTime(2026, 4, 21); + var resetDate = new DateTime(2026, 4, 28); + var position = new swap_position + { + PosiStartDate = startDate, + InterestType = (int)InterestTypeEnum.复利, + InterestRateDefault = 0.0025m, + InterestSwapInterval = JsonConvert.SerializeObject(new List()), + IsAnnualized = true, + interest_rest_days = 7, + FloatRateUnderlyingCode = "FR007" + }; + var preEod = new eod_swap_position + { + id = 1, + ValueDate = resetDate.AddDays(-1), + TdInterestPrincipal = previousBase, + InterestIncomeSum = pendingInterest, + InterestProfitSum = pendingInterest, + FloatRate = 0.013502m + }; + var flowEvent = new swap_flow_event { InterestRate = 0.0025m }; + var service = new StubSwapDealService( + new OptUserInfo(0, nameof(ConsumedInterestScenarioTest), OptUserFrom.UnitTest), + d => 0.0139); + decimal interestAmount = 0m; + decimal tdInterestAmount = 0m; + + service.CalcDailyCompoundInterestByEod(preEod, resetDate, startDate, position, + principal, principal, flowEvent, AnnualDays, false, 0.013502m, 1m, principal, + ref interestAmount, ref tdInterestAmount); + + AssertDecimal(principal + pendingInterest, flowEvent.InterestPrincipal, + "无平仓重置日必须完整并入上一期累计待实现利息"); + } } } diff --git a/YLErpDAL/Modules/SwapModule/SwapDealService.cs b/YLErpDAL/Modules/SwapModule/SwapDealService.cs index b69b225b..bda12dda 100644 --- a/YLErpDAL/Modules/SwapModule/SwapDealService.cs +++ b/YLErpDAL/Modules/SwapModule/SwapDealService.cs @@ -1417,8 +1417,8 @@ namespace YLErp.Modules.SwapModule var days = (endDate - tradeDate).Days; if (days % interestPeriod == 0) { - var remainingPercent = preEodPosition.TdInterestPrincipal > 0m - ? principal / preEodPosition.TdInterestPrincipal + var remainingPercent = posiPrincipal > 0m + ? principal / posiPrincipal : 1m; remainingPercent = Math.Max(0m, Math.Min(1m, remainingPercent)); tdDynomicPrincipal = tdDynomicPrincipal + interestProfitSum * remainingPercent;