fix: 结算单中的净额结算金额的修改

This commit is contained in:
马冰冰
2026-08-26 21:21:55 +08:00
parent b9a866c7e8
commit 313dade65b
2 changed files with 19 additions and 12 deletions
@@ -9,7 +9,7 @@ namespace YLErp.Modules.TradeModule.DocGenerateModule;
/// <summary>
/// 构造普通收益互换结算单单行数据所需的业务输入。
/// 数据来自平仓事件及其关联交易,避免依赖平仓后可能已不存在的日终持仓。
/// 数据来自平仓事件关联交易及结算日日终持仓。
/// </summary>
public sealed class SwapSettlementBillRowInput
{
@@ -40,6 +40,9 @@ public sealed class SwapSettlementBillRowInput
/// <summary>平仓事件浮动腿记录的期末结算收益率(展示态数值)。</summary>
public decimal? ExitYtm { get; set; }
/// <summary>结算日日终持仓中的当日浮动端分红,保留原始收付方向。</summary>
public decimal CurrentDayFloatingDividend { get; set; }
/// <summary>期间付息或分红是否计入本次净额结算。</summary>
public bool IncludePeriodPaymentInNetting { get; set; }
}
@@ -87,25 +90,19 @@ public static class SwapSettlementBillRowBuilder
var floatingAmount = -input.CloseFlow.MarkClosePnl;
var fee = -(input.CloseFlow.TradingFee + input.CloseFlow.TradingFeePending);
var marginInterest = -marginEvents.Sum(x => x.InterestClosePnL);
var periodAmount = -input.CloseFlow.DividendIn;
var initialMargin = SumMargin(effectiveMargins, InterestModeEnum.);
var additionalMargin = SumMargin(effectiveMargins, InterestModeEnum.);
var marginBackAmount = marginEvents.Sum(x => x.InterestPrincipal);
// 沿用原结算单口径:全部事件利息浮动盈亏预付金返还本金参与净额结算
// 净额结算仅包含全部事件利息浮动盈亏,不包含预付金返还本金。
var netSettlementAmount = -eventFlows.Sum(x => x.InterestClosePnL)
- input.CloseFlow.FloatPnlSum
+ marginBackAmount;
- input.CloseFlow.FloatPnlSum;
var maturitySettlementAmount = netSettlementAmount + initialMargin + additionalMargin;
var floatRateAbs = input.CloseNotionalValue == 0m
? 0m
: interestAmount / input.CloseNotionalValue;
// 同一数据库字段在模板中按标的类型拆分:券展示期间付息,ETF 展示期间分红。
// 日终持仓的当日浮动端分红按标的类型拆分:券展示期间付息,非债券展示期间分红。
var isCashBond = ConsGlobal.InstrumentType.IsBond(input.UnderlyingInstrumentType);
var isEtf = ConsGlobal.InstrumentType.Fund.Equals(
input.UnderlyingInstrumentType,
StringComparison.OrdinalIgnoreCase);
// 此处集中完成模板字段映射和展示精度处理,生成器只负责组装原始业务数据。
return new ExcelReportModel
@@ -120,8 +117,12 @@ 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 = periodAmount.ToString("0.00"),
PeriodDividend = isEtf ? periodAmount.ToString("0.00") : string.Empty,
DividendIn = isCashBond
? input.CurrentDayFloatingDividend.ToString("0.00")
: string.Empty,
PeriodDividend = isCashBond
? string.Empty
: input.CurrentDayFloatingDividend.ToString("0.00"),
PosiNetPrice = ((settlementPosition?.PosiGrossPrice ?? 0m) * 100m).ToString("0.00000000"),
InitYtm = isCashBond && input.Trade.InitYtm.HasValue
? input.Trade.InitYtm.Value.ToString("0.####%")