#EQD-7214 资金不足拦截:修改交易的时候不应该过大拦截
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user