feat:增加内存刷新接口,优化rule日志记录,不再使用EXception。非ACTIVE的rule不再编译。

This commit is contained in:
ruisu
2026-07-02 16:46:28 +08:00
parent cc18bdafda
commit 917eacc7b7
6 changed files with 455 additions and 211 deletions
@@ -4380,9 +4380,11 @@ namespace YLErp.Modules.RiskModule
if (!string.IsNullOrWhiteSpace(quotaObj.QuotaWarningDetails))
detailParts.Add($"限额预警:{quotaObj.QuotaWarningDetails}");
res.ErrorMsg = string.Join("\n", detailParts);
//确认本次为需审批后,二次特批。因为只靠点击“交易特批”的ignoreRiskWarning,不能保证本次校验通过。
var isRiskApprovalWarning = quotaObj.TrialStatus == QuotaTrialStatusEnum.Warning
&& !string.IsNullOrWhiteSpace(quotaObj.RiskWarningDetails);
//需清除ErrorMsg,不然外部调用会认为失败
//触发需审批,交易特批逻辑
if (ignoreRiskWarning && isRiskApprovalWarning)
{
res.ErrorMsg = string.Empty;
@@ -4755,14 +4757,14 @@ namespace YLErp.Modules.RiskModule
_logger.Info($"[限额试算] 开始执行 - tradeId: {tradeId}, trialSource: {trialSource}");
var result = new QuotaTrial();
trade tradeObj = DbContext.trade.AsNoTracking().Where(O => O.id == tradeId).FirstOrDefault();
// 检查交易对象是否存在
if (tradeObj == null)
{
_logger.Info($"[限额试算] 找不到交易记录 - tradeId: {tradeId}");
throw new ArgumentNullException(nameof(tradeObj), $"找不到ID为 {tradeId} 的交易记录");
}
_logger.Info($"[限额试算] 交易信息 - tradeId: {tradeObj.id}, TradeNumber: {tradeObj.TradeNumber}, TradeType: {tradeObj.TradeType}, ClientId: {tradeObj.ClientId}");
//// 检查关键字段是否为null
@@ -4968,8 +4970,30 @@ namespace YLErp.Modules.RiskModule
TradeId = tradeId,
TriggerPoint = "BOOK_CONFIRM"
};
// 构造 DataMap(第一版只塞 trade 对象,后续按需扩展)
tradeObj.StockEqvNotional = 10000000000;
riskContext.DataMap["trade"] = tradeObj;
var sameUnderlyingTotalNotional = DbContext.trade
.Where(t => t.ValidState != "InValid"
&& t.UnderlyingId == tradeObj.UnderlyingId
&& t.ParentTradeId == 0
&& (ConsTrade.NeedMarginTradeStatusList.Contains(t.TradeStatus) || t.TradeStatus == "审批中"))
.Sum(t => (double?)t.StockEqvNotional) ?? 0d;
riskContext.DataMap["same_underlying_total_notional"] = sameUnderlyingTotalNotional;
var underlying = DataCacheProvider.GetUnderlyingDataSource().GetData(tradeObj.UnderlyingCode);
if (underlying != null)
{
if (underlying.IsBond() && !string.IsNullOrEmpty(underlying.ExJson))
{
var bond = JsonHelper.Deserialize<UnderlyingBond>(underlying.ExJson);
if (bond != null)
{
underlying.IssueSize = bond.IssueSize;
underlying.UnderlyingFullName = bond.UnderlyingFullName;
underlying.UnderlyingIssuer = bond.UnderlyingIssuer;
}
}
riskContext.DataMap["underlying_manager"] = underlying;
}
var riskResult = riskEngine.EvaluateRisk(riskContext, "BOOK_CONFIRM");
_logger.Info($"[风控引擎] 簿记交易确认 - TradeId: {tradeId}, Passed: {riskResult.Passed}, Blocked: {riskResult.Blocked}, NeedApproval: {riskResult.NeedApproval}, ShowTip: {riskResult.ShowTip}");
@@ -5016,7 +5040,7 @@ namespace YLErp.Modules.RiskModule
}
// ===== 新风控引擎接入结束 =====
_logger.Info($"[限额试算] 试算完成 - tradeId: {tradeId}, TrialStatus: {result.TrialStatus}, FundCheck: {fundStatus}, QuotaCheck: {quotaStatus}");
//_logger.Info($"[限额试算] 试算完成 - tradeId: {tradeId}, TrialStatus: {result.TrialStatus}, FundCheck: {fundStatus}, QuotaCheck: {quotaStatus}");
SaveQuotaTrial(result);
return result;
}