From 670ff1e012b8e924ee2b58b9931a0dcd641b5fa4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E5=86=B0=E5=86=B0?= <437394478@qq.com> Date: Tue, 25 Aug 2026 14:45:15 +0800 Subject: [PATCH] =?UTF-8?q?feature:=20=E7=BB=93=E7=AE=97=E6=8A=A5=E5=91=8A?= =?UTF-8?q?=E5=8D=95=E4=B8=AD=E5=AD=97=E6=AE=B5=E5=8F=96=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SwapSettlementBillRowBuilder.cs | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/YLErpDAL/Modules/TradeModule/DocGenerateModule/SwapSettlementBillRowBuilder.cs b/YLErpDAL/Modules/TradeModule/DocGenerateModule/SwapSettlementBillRowBuilder.cs index 2f49e8e9..45a8497e 100644 --- a/YLErpDAL/Modules/TradeModule/DocGenerateModule/SwapSettlementBillRowBuilder.cs +++ b/YLErpDAL/Modules/TradeModule/DocGenerateModule/SwapSettlementBillRowBuilder.cs @@ -70,8 +70,7 @@ public static class SwapSettlementBillRowBuilder ?? throw new ServiceException("结算单缺少支付日"); // 将同一事件的普通利息与预付金利息分开;预付金本金仅统计结算日前已生效的腿。 - var floatingPosition = positions.FirstOrDefault(x => x.PositionType > 0) - ?? positions.FirstOrDefault(x => !ConsTrade.InterestMarginModels.Contains(x.InterestMode)); + var settlementPosition = positions.FirstOrDefault(x => x.id == input.CloseFlow.PositionId); var interestEvents = eventFlows .Where(x => ConsTrade.InterestModels.Contains(x.InterestMode)) .ToList(); @@ -91,10 +90,12 @@ public static class SwapSettlementBillRowBuilder var periodAmount = -input.CloseFlow.DividendIn; var initialMargin = SumMargin(effectiveMargins, InterestModeEnum.初始预付金); var additionalMargin = SumMargin(effectiveMargins, InterestModeEnum.追加预付金); + var marginBackAmount = marginEvents.Sum(x => x.InterestPrincipal); - // 净额结算按实际轧差项求和;到期结算在净额基础上返还或收取期初、追加预付金。 - var netSettlementAmount = interestAmount + floatingAmount + fee + marginInterest - + (input.IncludePeriodPaymentInNetting ? periodAmount : 0m); + // 沿用原结算单口径:全部事件利息、浮动盈亏和预付金返还本金参与净额结算。 + var netSettlementAmount = -eventFlows.Sum(x => x.InterestClosePnL) + - input.CloseFlow.FloatPnlSum + + marginBackAmount; var maturitySettlementAmount = netSettlementAmount + initialMargin + additionalMargin; var floatRateAbs = input.CloseNotionalValue == 0m ? 0m @@ -119,17 +120,17 @@ public static class SwapSettlementBillRowBuilder InterestRate = interestEvents.Sum(x => x.InterestRate).ToString("0.00%"), PosiNotionalValue = input.CloseNotionalValue.ToString("0.00"), Quantity = input.CloseFlow.Quantity.ToString("0.00"), - DividendIn = isCashBond ? periodAmount.ToString("0.00") : string.Empty, + DividendIn = periodAmount.ToString("0.00"), PeriodDividend = isEtf ? periodAmount.ToString("0.00") : string.Empty, - PosiNetPrice = ((floatingPosition?.PosiGrossPrice ?? 0m) * 100m).ToString("0.00000000"), + PosiNetPrice = ((settlementPosition?.PosiGrossPrice ?? 0m) * 100m).ToString("0.00000000"), InitYtm = isCashBond && input.Trade.InitYtm.HasValue ? input.Trade.InitYtm.Value.ToString("0.####%") : string.Empty, ClosePrice = (input.CloseFlow.TradingAmountAvg * 100m).ToString("0.00000000"), - ExitYtm = isCashBond && input.ExitYtm.HasValue + ExitYtm = input.ExitYtm.HasValue ? input.ExitYtm.Value.ToString("0.0000") : string.Empty, - RateDays = Math.Max(0, (eventDate - startDate).Days + 1).ToString(), + RateDays = Math.Max(0, (eventDate - startDate).Days).ToString(), FloatRateAbs = floatRateAbs.ToString("0.0000%"), FloatRate = floatRateAbs.ToString("0.0000%"), InterestAmount = interestAmount.ToString("0.00"),