feat(swap): EQD-6953 平仓期末结算收益率字段载体+结算确认书Excel导出——[NotMapped]ExitYtm随UnwindData进swap_event.EventData(零表结构变更);生成器从浮动腿回读导出固定4位不去零(0.0000);模板nodma_01.xlsx新增S列;命名遵《互换价格字段命名规范决策文档》平仓=Exit(非End/Close/Final)

This commit is contained in:
hjhan
2026-08-20 17:29:10 +08:00
parent 828dc237ab
commit 71683083ef
4 changed files with 26 additions and 0 deletions
@@ -400,5 +400,18 @@ namespace YLErp.DBModels
[NotMapped]
public decimal? InitYtm { get; set; }
/// <summary>
/// 期末标的结算收益率(EQD-6953 平仓)。普通债券类收益互换平仓时由债券计算器按
/// 期末标的交割全价反算(估值日=平仓日 ValueDate),允许手工覆盖。
/// 命名遵循《互换价格字段命名规范决策文档》时点维度:平仓/了结用 Exit(勿用 End/Close/Final)。
/// [NotMapped]:不落 swap_flow_event 表列;仅随 UnwindData 序列化进 swap_event.EventData JSON
/// 由平仓待复核回显(GetSwapEvent)与结算确认书 Excel(TradeSettleBillGenerator) 消费。
/// ⚠️ 存储口径为【展示态百分数】(如 6.3721 表示 6.3721%),与同页期末交割全价(展示态)一致,
/// 区别于录入页 trade.InitYtm 的存储态小数(0.063721)——两者载体不同、互不干扰,勿"顺手统一"。
/// 精度:确认书导出固定 4 位小数不去零(ToString("0.0000"));本字段保留 4 位(四舍五入)。
/// </summary>
[NotMapped]
public decimal? ExitYtm { get; set; }
}
}
@@ -45,5 +45,11 @@ namespace YLErp.Models
public string DividendIn { get; set; }
public string Quantity { get; set; }
/// <summary>
/// 期末标的结算收益率(EQD-6953)。普通债券类收益互换平仓收益率,展示态百分数,
/// 固定 4 位小数不去零("0.0000");非债券/历史无值时为空串。
/// </summary>
public string ExitYtm { get; set; }
}
}
@@ -67,6 +67,9 @@ namespace YLErp.Plugins.GuoLian.DocumentGenerator
decimal interestRate = unwindFlowEvents.Where(x => ConsTrade.InterestModels.Contains(x.InterestMode)).Sum(s => s.InterestRate);
row.InterestRate = interestRate.ToString("0.00%");
var PosiNotionalValue = flowEventGroup.Quantity * flowEventGroup.ContractSize * posi.PosiGrossPrice;
// EQD-6953 期末标的结算收益率:平仓簿记时随 UnwindData 存进 swap_event.EventData
// 此处从浮动腿(PositionType>0)回读。存储态=展示态百分数(6.3721),导出固定 4 位不去零。
decimal? exitYtm = null;
if (flowEventGroup.EventId.HasValue)
{
var swapEvent = Context.GetEvent(flowEventGroup.EventId.Value);
@@ -74,8 +77,12 @@ namespace YLErp.Plugins.GuoLian.DocumentGenerator
{
swapEvent.unwindData = JsonHelper.Deserialize<UnwindData>(swapEvent.EventData);
PosiNotionalValue = swapEvent.unwindData.CloseNotionalValue;
exitYtm = swapEvent.unwindData.FlowEvents?
.FirstOrDefault(f => f.PositionType > 0)?
.ExitYtm;
}
}
row.ExitYtm = exitYtm?.ToString("0.0000") ?? string.Empty;
row.Quantity = flowEventGroup.Quantity.ToString("0.00");
row.PosiNotionalValue = PosiNotionalValue.ToString("0.00");