diff --git a/YLErpDAL/BLL/EodSettlement/RealtimePnlCalc.cs b/YLErpDAL/BLL/EodSettlement/RealtimePnlCalc.cs index d3a5b788..1a2e485c 100644 --- a/YLErpDAL/BLL/EodSettlement/RealtimePnlCalc.cs +++ b/YLErpDAL/BLL/EodSettlement/RealtimePnlCalc.cs @@ -2328,6 +2328,31 @@ namespace YLErp.BLL.Eod var clientBalance = clientBalances[0]; using (var db = new YLContext()) { + //修改/复核已簿记交易(trade.id!=0)按增量口径校验:本笔自身已簿记的成交金额(期权费记录) + //与初始预付金流水已计入现金结存、初始授信占用已计入已使用授信,比较前先剔除—— + //否则改备注等无关字段保存会被存量预付金二次拦截(例:入金60万、初始预付金已付50万、余额10万)。 + //只剔除确认时会重写的记录;追保/票息/平仓等生命周期记录确认后仍保留,不剔除。 + var ownCashBooked = 0d; + var ownCreditBooked = 0d; + if (trade.id != 0) + { + ownCashBooked = db.ClientCashInCashOut + .Where(x => x.TradeId == trade.id && x.ValidState != "InValid") + .ToList() + .Where(x => (x.State == ClientCashInCashOut.已结算 || x.State == ClientCashInCashOut.已确认) + && (x.Action == ClientCashInCashOut.系统操作_期权费 || x.Action == ClientCashInCashOut.系统操作_应付预付金)) + .Sum(x => x.Money ?? 0); + ownCreditBooked = db.client_credit_inout + .Where(x => x.trade_id == trade.id) + .ToList() + .Where(x => !Modules.SwapModule.ClientCreditInoutService.IsAdditionalMarginRecord(x)) + .Sum(x => x.amount); + clientBalance.AmountFund -= ownCashBooked; + clientBalance.AvailableAmount -= ownCashBooked; + } + var ownBookedNote = trade.id != 0 + ? $"(已剔除本笔已簿记资金{ownCashBooked:#,##0.000}与初始授信占用{ownCreditBooked:#,##0.000})" + : ""; var tradePrice = trade.TradePrice * (-TradeCalcHelper.GetSign(trade.BuySell)); var AvailableAmount = clientBalance.AvailablePremium(); @@ -2381,14 +2406,15 @@ namespace YLErp.BLL.Eod } } var usedCredit = Modules.SwapModule.ClientCreditInoutService.GetUsedCredit(clientId, db); - var creditCap = Math.Max(clientBalance.TotalCredit - usedCredit, 0); + //授信上限剔除本笔自身初始占用(ownCreditBooked,增量口径,见上方净扣说明) + var creditCap = Math.Max(clientBalance.TotalCredit - (usedCredit - ownCreditBooked), 0); var creditCovered = Math.Min(creditPayable, creditCap); //授信覆盖不足的回落现金部分 + 走现金部分 + 成交金额,合计必须 ≤ 现金结存 var cashNeed = tradePrice + cashPayable + (creditPayable - creditCovered); if (cashNeed > clientBalance.AmountFund) { var totalPayable = tradePrice + cashPayable + creditPayable; - errorMsg = $"当前交易应付总额:{totalPayable:#,##0.000}(走现金:{cashPayable + tradePrice:#,##0.000},选授信:{creditPayable:#,##0.000})。当前现金结存:{clientBalance.AmountFund:F3}(走现金部分只认现金结存),授信额度:{clientBalance.TotalCredit:F3},已使用授信:{usedCredit:F3},剩余授信:{creditCap:F3}(授信仅覆盖选授信部分,不足回落现金)。现金不足以覆盖应付的现金部分。"; + errorMsg = $"当前交易应付总额:{totalPayable:#,##0.000}(走现金:{cashPayable + tradePrice:#,##0.000},选授信:{creditPayable:#,##0.000})。当前现金结存:{clientBalance.AmountFund:F3}(走现金部分只认现金结存),授信额度:{clientBalance.TotalCredit:F3},已使用授信:{usedCredit - ownCreditBooked:F3},剩余授信:{creditCap:F3}(授信仅覆盖选授信部分,不足回落现金)。现金不足以覆盖应付的现金部分。{ownBookedNote}"; return false; } }