From f4ffe7107165a5cb4b35bdaa723ba1efc6617774 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=90=8D=E9=94=90?= <1565842059@qq.com> Date: Mon, 20 Jul 2026 15:28:40 +0800 Subject: [PATCH] =?UTF-8?q?fix(swap):=20=E4=BF=AE=E5=A4=8D=E6=9C=9F?= =?UTF-8?q?=E6=9C=AB=E5=A4=B4=E5=AF=B8=E5=B7=B2=E5=AE=9E=E7=8E=B0=E7=9B=88?= =?UTF-8?q?=E4=BA=8F=E8=AE=A1=E7=AE=97=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在新创建的期末付款头寸中添加已实现盈亏字段计算 - 对历史数据的利息和已实现利息进行符号标准化处理 - 添加预付金腿利息方向与保证金本金方向的反向逻辑 - 兼容修复前已落库的利息腿数据缺失已实现盈亏字段问题 - 统一风险报表按绝对金额和业务方向的数据口径 --- .../SwapModule/SwapEodPositionService.cs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/YLErpDAL/Modules/SwapModule/SwapEodPositionService.cs b/YLErpDAL/Modules/SwapModule/SwapEodPositionService.cs index 38004aa4..44b5400b 100644 --- a/YLErpDAL/Modules/SwapModule/SwapEodPositionService.cs +++ b/YLErpDAL/Modules/SwapModule/SwapEodPositionService.cs @@ -1023,6 +1023,7 @@ namespace YLErp.Modules.SwapModule //累计已实现 newEodPayPosition.RealizedInterest = eodPayPosition.RealizedInterest + newEodPayPosition.TdCloseInterest * ratio; newEodPayPosition.RealizedInterestFee = eodPayPosition.RealizedInterestFee + newEodPayPosition.TdCloseInterestFee; + newEodPayPosition.RealizedPnl = newEodPayPosition.RealizedInterest + newEodPayPosition.RealizedInterestFee; var currencyRate = GetCurrencyRate(td.QuoteCurrency, td.SettlementCurrency, valueDate, true, position.InterestDirection == (int)SwapDirectionEnum.收取 ? CurrencyRateType.Buy : CurrencyRateType.Sell); newEodPayPosition.TdCurrency = Convert.ToDecimal(currencyRate); @@ -2178,6 +2179,22 @@ namespace YLErp.Modules.SwapModule item.eodPosition.PosiNetFeePrice *= multiplier; item.eodPosition.PosiNetNoFeePrice *= multiplier; item.eodPosition.UnderlyingPrice *= multiplier; + if (item.eodPosition.InterestDirection > 0) + { + // 历史数据的 TdCloseInterest、RealizedInterest 存在两种符号口径, + // 风险报表统一按绝对金额和业务方向还原:普通利息腿收取为正、支付为负, + // 预付金腿的利息方向与保证金本金方向相反。 + var interestRatio = item.eodPosition.InterestDirection == (int)SwapDirectionEnum.收取 ? 1m : -1m; + if (ConsTrade.InterestMarginModels.Contains(item.eodPosition.InterestMode)) + { + interestRatio = -interestRatio; + } + item.eodPosition.TdCloseInterest = Math.Abs(item.eodPosition.TdCloseInterest) * interestRatio; + item.eodPosition.RealizedInterest = Math.Abs(item.eodPosition.RealizedInterest) * interestRatio; + // 兼容修复前已落库的利息腿:当时只累计了明细字段,未同步写入 RealizedPnl。 + item.eodPosition.RealizedPnl = item.eodPosition.RealizedInterest + + item.eodPosition.RealizedInterestFee; + } } return retListResult;