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"),