From 771bd6798b74e41c490924e04695f76f5df64aca Mon Sep 17 00:00:00 2001 From: hjhan Date: Fri, 21 Aug 2026 08:38:42 +0800 Subject: [PATCH] =?UTF-8?q?feat(swap):=20EQD-6977=20=E7=BD=9A=E6=81=AF?= =?UTF-8?q?=E6=89=BF=E6=8E=A5=E2=91=A0=E4=B8=89=E5=88=86=E6=94=AF=E8=A1=A5?= =?UTF-8?q?=E5=85=A8=E7=A8=8B=E6=8E=A8=E5=AF=BCtrace=E2=80=94=E2=80=94?= =?UTF-8?q?=E6=AE=B5=E4=B8=AD=E5=B9=B3=E4=BB=93+=E6=9C=89=E5=BF=AB?= =?UTF-8?q?=E7=85=A7=E4=B8=BB=E8=B7=AF=E5=BE=84=E6=AD=A4=E5=89=8D=E9=9B=B6?= =?UTF-8?q?=E7=95=99=E7=97=95(=E7=94=A8=E6=88=B7=E5=8F=8D=E9=A6=88?= =?UTF-8?q?=E5=AE=9A=E4=BD=8D=E9=9A=BE)=EF=BC=8C=E7=8E=B0=E6=89=93?= =?UTF-8?q?=E5=87=BA=E5=BF=AB=E7=85=A7=E6=97=A5=E6=9C=9F/TdInterestPrincip?= =?UTF-8?q?al/share/=E5=B9=B3=E4=BB=93=E6=9C=AC=E9=87=91/=E5=8E=9F?= =?UTF-8?q?=E5=A7=8B=E5=B7=AE/=E9=92=B30=E7=BB=93=E6=9E=9C=EF=BC=8C?= =?UTF-8?q?=E5=8E=9F=E5=A7=8B=E5=B7=AE=E4=B8=BA=E8=B4=9F=E9=A2=9D=E5=A4=96?= =?UTF-8?q?=E6=8F=90=E7=A4=BA=E7=96=91=E5=8F=A3=E5=BE=84=E4=B8=8D=E4=B8=80?= =?UTF-8?q?=E8=87=B4=EF=BC=9B=E9=87=8D=E7=BD=AE=E6=97=A5+=E6=9C=89?= =?UTF-8?q?=E5=BF=AB=E7=85=A7=E8=A1=A5InterestIncomeSum=C3=97share?= =?UTF-8?q?=E6=8E=A8=E5=AF=BC=EF=BC=9B=E6=97=A0=E5=BF=AB=E7=85=A7=E5=85=9C?= =?UTF-8?q?=E5=BA=95=E8=A1=A5=E4=BA=8B=E4=BB=B6=E5=9F=BA=E6=95=B0-?= =?UTF-8?q?=E5=B9=B3=E4=BB=93=E6=9C=AC=E9=87=91=E6=8E=A8=E5=AF=BC=EF=BC=9B?= =?UTF-8?q?=E2=91=A0=E5=BC=82=E5=B8=B8=E5=87=AD=E5=8D=95=E8=A1=8C=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E5=8D=B3=E5=8F=AF=E5=8C=BA=E5=88=86=E5=BF=AB=E7=85=A7?= =?UTF-8?q?=E5=9F=BA=E6=95=B0/=E4=BB=BD=E9=A2=9D/=E5=B9=B3=E4=BB=93?= =?UTF-8?q?=E6=9C=AC=E9=87=91=E4=B8=89=E5=9B=A0=EF=BC=9B27=E4=B8=AA?= =?UTF-8?q?=E7=BD=9A=E6=81=AF=E5=8D=95=E6=B5=8B=E5=85=A8=E8=BF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Penalty/PenaltyInterestFeeMerger.cs | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/YLErpDAL/Modules/SwapModule/Penalty/PenaltyInterestFeeMerger.cs b/YLErpDAL/Modules/SwapModule/Penalty/PenaltyInterestFeeMerger.cs index 91ab256f..aa0b4ce0 100644 --- a/YLErpDAL/Modules/SwapModule/Penalty/PenaltyInterestFeeMerger.cs +++ b/YLErpDAL/Modules/SwapModule/Penalty/PenaltyInterestFeeMerger.cs @@ -141,16 +141,29 @@ public static class PenaltyInterestFeeMerger if (unwindOnResetDay) { capitalized = (preEod?.InterestIncomeSum ?? 0m) * share; + if (preEod != null) + trace?.Note( + $"PENALTY|p{position.id} 承接①推导 重置日平仓+有快照:快照{preEod.ValueDate:yyyy-MM-dd} " + + $"昨日待实现利息InterestIncomeSum={preEod.InterestIncomeSum:F4} ×share={share:P4} → ①={capitalized:F4}"); if (preEod == null && (unwindDate - position.PosiStartDate).Days >= periodDays) trace?.Note($"PENALTY|p{position.id} 注意 无preEod且平仓日=重置日:①退化0(此前重置并入额缺失,请核对日终归档完整性)"); } else if (preEod != null) { - capitalized = Math.Max(0m, preEod.TdInterestPrincipal * share - closePrincipal); + // 段中平仓+有快照(复利承接主路径):① = 快照滚动基数×份额 − 平仓本金。全程留推导—— + // ①异常时凭此行即可区分"快照基数错 / share错 / 平仓本金错"三因,不必反推。 + var rawCarry = preEod.TdInterestPrincipal * share - closePrincipal; + capitalized = Math.Max(0m, rawCarry); + trace?.Note( + $"PENALTY|p{position.id} 承接①推导 段中平仓+有快照:快照{preEod.ValueDate:yyyy-MM-dd} " + + $"滚动基数TdInterestPrincipal={preEod.TdInterestPrincipal:F4} ×share={share:P4} −平仓本金{closePrincipal:F4} = {rawCarry:F4} → ①={capitalized:F4}" + + (rawCarry < 0m ? "(原始差为负已钳0:快照滚动基数×份额小于平仓本金,疑部分平仓比例与快照归档口径不一致,请核对eod_swap_position.TdInterestPrincipal)" : "")); } else { capitalized = Math.Max(0m, normalEvent.InterestPrincipal - closePrincipal); + trace?.Note( + $"PENALTY|p{position.id} 承接①推导 段中平仓+无快照兜底:事件基数InterestPrincipal={normalEvent.InterestPrincipal:F4} −平仓本金{closePrincipal:F4} → ①={capitalized:F4}"); // 兜底①=0 但账龄已过重置周期:复利每周期并本,理应 ①>0——多为 interestWindowEmpty // (当日已结息)早退未重放覆盖种子值、或日终归档缺失。留痕含两侧基数与账龄,供直接定位根因。 var ageDays = (unwindDate - position.PosiStartDate).Days;