BugFix 追加预付金腿生成

This commit is contained in:
锦麟 王
2026-08-27 18:07:15 +08:00
parent 1eeed01914
commit a21013b590
7 changed files with 457 additions and 36 deletions
@@ -2046,6 +2046,44 @@ namespace YLErp.Modules.SwapModule
FinalizeInterestEodRoll(eodPayPosition, newEodPayPosition, ratio, td, valueDate, position.InterestDirection);
PersistEodSwapPosition(newEodPayPosition);
}
/// <summary>
/// EOD 追保腿化·方案ASettleAdditionalMargin 在当日 SwapPositionCompose/SwapEodCompose 之后生成 mode6 追保腿
/// (增量依赖当日 trade_span,无法前移),当日快照已落表,显式补写当日 eod_swap_position 行,
/// 使当日报表明细(风险页 PostionMarginGain 等按快照腿汇总的列)不漏计。
/// 字段填充参照 SaveEodInterestPosition 新腿形态(无当日流水、无上日归档:利息/损益字段为 0,TdCurrency 取当日汇率)。
/// 幂等:先清(PositionId+ValueDate)后建;下一结算日 SwapPositionCompose 先清(ClearSwapPositions ValueDate>=当日)
/// 再从实时腿重建,补写行不会跨日残留。
/// </summary>
public void SaveEodAdditionalMarginPosition(trade td, swap_position leg, DateTime valueDate)
{
var existing = DbContext.eod_swap_position
.Where(x => x.SwapTradeId == td.id && x.PositionId == leg.id && x.ValueDate == valueDate)
.ToList();
DbContext.eod_swap_position.RemoveRange(existing);
var row = new eod_swap_position
{
ClientId = td.ClientId,
SwapTradeId = td.id,
PosiStartDate = leg.PosiStartDate,
PosiMatuirityDate = td.ExerciseDate,
ValueDate = valueDate,
PositionId = leg.id,
PosiStatus = 0,
Invalid = false
};
UpdateDbOption(row);
//持仓内容-利息腿(无当日流水,FloatRate 取 0
CopyInterestLegFields(row, leg, 0);
row.InterestFeePending = 0;
var ratio = DirectionRatio.InterestLegPnl(leg.InterestDirection, leg.InterestMode);
row.SwapPositionValue = PositionValueCalc.Calc(row.InterestProfitSum, row.PosiProfitSum, ratio);
row.RealizedPnl = row.RealizedInterest + row.RealizedInterestFee;
row.TdCurrency = Convert.ToDecimal(GetCurrencyRate(td.QuoteCurrency, td.SettlementCurrency, valueDate, true,
DirectionRatio.RateType(leg.InterestDirection)));
PersistEodSwapPosition(row);
SaveAllChanges();
}
/// <summary>
/// 自动互换用,当日无互换,当日无平仓
/// </summary>