feature: 结算报告单中字段取值

This commit is contained in:
马冰冰
2026-08-25 14:45:15 +08:00
parent aec0417b00
commit 670ff1e012
@@ -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"),