fix: 结算单中追加预付金字段取值

This commit is contained in:
马冰冰
2026-08-27 14:29:50 +08:00
parent e61378035d
commit ab9f67c347
@@ -64,7 +64,6 @@ public static class SwapSettlementBillRowBuilder
var positions = input.Positions ?? Array.Empty<swap_position>();
var eventFlows = input.EventFlows ?? Array.Empty<swap_flow_event>();
// 三个业务日期是结算单和文件命名的必填项,缺失时直接阻止生成不完整附件。
var startDate = input.Trade.StartDate
?? throw new ServiceException("结算单缺少交易起始日");
var eventDate = input.CloseFlow.UnwindDate
@@ -72,7 +71,7 @@ public static class SwapSettlementBillRowBuilder
var payDate = input.CloseFlow.PayDate
?? throw new ServiceException("结算单缺少支付日");
// 将同一事件的普通利息与预付金利息分开;预付金本金仅统计结算日前已生效的腿。
var settlementPosition = positions.FirstOrDefault(x => x.id == input.CloseFlow.PositionId);
var interestEvents = eventFlows
.Where(x => ConsTrade.InterestModels.Contains(x.InterestMode))
@@ -91,9 +90,13 @@ public static class SwapSettlementBillRowBuilder
var fee = -(input.CloseFlow.TradingFee + input.CloseFlow.TradingFeePending);
var marginInterest = -marginEvents.Sum(x => x.InterestClosePnL);
var initialMargin = SumMargin(effectiveMargins, InterestModeEnum.);
var additionalMargin = SumMargin(effectiveMargins, InterestModeEnum.);
var additionalMarginPositions = positions
.Where(x => x.InterestMode == (int)InterestModeEnum.)
.ToList();
var additionalMargin = SumMargin(additionalMarginPositions, InterestModeEnum.);
// 净额结算仅包含全部事件利息和浮动盈亏,不包含预付金返还本金。
var netSettlementAmount = -eventFlows.Sum(x => x.InterestClosePnL)
- input.CloseFlow.FloatPnlSum;
var maturitySettlementAmount = netSettlementAmount + initialMargin + additionalMargin;
@@ -101,10 +104,10 @@ public static class SwapSettlementBillRowBuilder
? 0m
: interestAmount / input.CloseNotionalValue;
// 日终持仓的当日浮动端分红按标的类型拆分:债券展示期间付息,非债券展示期间分红。
var isCashBond = ConsGlobal.InstrumentType.IsBond(input.UnderlyingInstrumentType);
// 此处集中完成模板字段映射和展示精度处理,生成器只负责组装原始业务数据。
return new ExcelReportModel
{
TradeNumber = input.ConfirmNo,
@@ -141,7 +144,9 @@ public static class SwapSettlementBillRowBuilder
.ToString("0.0000%"),
MarginInterestAmount = marginInterest.ToString("0.00"),
InitialMargin = initialMargin.ToString("0.00"),
AdditionalMargin = additionalMargin.ToString("0.00"),
AdditionalMargin = additionalMarginPositions.Count > 0
? additionalMargin.ToString("0.00")
: string.Empty,
MarginAmout = Math.Abs(initialMargin).ToString("0.00"),
MarkClosePnl = (-input.CloseFlow.FloatPnlSum).ToString("0.00"),
NetSettleAmout = netSettlementAmount.ToString("0.00"),