From 9b98a0dd887520a435afe473af34eb993d978c7b Mon Sep 17 00:00:00 2001 From: ruisu Date: Fri, 17 Jul 2026 14:29:44 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E9=A3=8E=E6=8E=A7=E5=BC=95=E6=93=8E?= =?UTF-8?q?=E6=89=A7=E8=A1=8C=E5=BC=82=E5=B8=B8=E6=88=96=E8=80=85=E7=8E=B0?= =?UTF-8?q?=E5=9C=BA=E7=BC=96=E8=AF=91=E5=BC=82=E5=B8=B8=E6=97=B6=E8=A7=86?= =?UTF-8?q?=E4=B8=BA=E4=B8=8D=E9=80=9A=E8=BF=87=EF=BC=8C=E5=B9=B6=E4=B8=94?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E5=89=8D=E7=AB=AF=EF=BC=8C=E8=90=BD=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RiskEngine/Compile/RuleCompiler.cs | 4 +-- .../Modules/RiskEngine/RiskEngineService.cs | 36 +++++++++++++------ YLErpDAL/Modules/RiskEngine/RiskResult.cs | 5 +++ .../Modules/RiskModule/QuotaMonitorService.cs | 7 +++- 4 files changed, 38 insertions(+), 14 deletions(-) diff --git a/YLErpDAL/Modules/RiskEngine/Compile/RuleCompiler.cs b/YLErpDAL/Modules/RiskEngine/Compile/RuleCompiler.cs index 6d48174c..e9797395 100644 --- a/YLErpDAL/Modules/RiskEngine/Compile/RuleCompiler.cs +++ b/YLErpDAL/Modules/RiskEngine/Compile/RuleCompiler.cs @@ -168,9 +168,9 @@ namespace YLErp.Modules.RiskEngine } catch (Exception ex) { - // 脚本执行异常(如空引用、类型转换失败)视为规则不触发 + // 脚本执行异常(如空引用、类型转换失败)交由执行层按阻断处理 _logger.Error($"规则执行异常 - RuleId: {ruleIdText}, Error: {ex.Message}\n脚本代码:{scriptCode}"); - return false; + throw; } }; } diff --git a/YLErpDAL/Modules/RiskEngine/RiskEngineService.cs b/YLErpDAL/Modules/RiskEngine/RiskEngineService.cs index 36e9222c..d16a4911 100644 --- a/YLErpDAL/Modules/RiskEngine/RiskEngineService.cs +++ b/YLErpDAL/Modules/RiskEngine/RiskEngineService.cs @@ -405,7 +405,9 @@ namespace YLErp.Modules.RiskEngine var compileResult = RuleCompiler.ValidateAndCompileRule(rule); if (!compileResult.Success) { - _logger.Info($"[风控引擎] 规则编译失败 - RuleId: {rule.Id}, Error: {compileResult.ErrorMessage}"); + var errorMessage = $"规则[{rule.RuleName}]编译失败,已按阻断处理,请检查规则表达式配置:{compileResult.ErrorMessage}"; + _logger.Info($"[风控引擎] 规则编译失败,按阻断处理 - RuleId: {rule.Id}, Error: {compileResult.ErrorMessage}"); + AddBlockError(result, rule.Id.ToString(), rule.RuleName, rule.RuleText, errorMessage); continue; } @@ -423,7 +425,9 @@ namespace YLErp.Modules.RiskEngine } catch (Exception ex) { - _logger.Info($"[风控引擎] 规则执行异常 - RuleId: {rule.Id}, Error: {ex.Message}"); + var errorMessage = $"规则[{rule.RuleName}]执行异常:{ex.Message}"; + _logger.Error($"[风控引擎] 规则执行异常,按阻断处理 - RuleId: {rule.Id}, Error: {ex.Message}"); + AddBlockError(result, ruleId, rule.RuleName, rule.RuleText, errorMessage); continue; } @@ -502,21 +506,31 @@ namespace YLErp.Modules.RiskEngine } catch (Exception ex) { - result.NeedApproval = true; - result.Passed = false; - result.TriggeredRules.Add(new TriggeredRuleInfo - { - RuleId = "ENGINE_ERROR", - RuleName = "风控引擎执行异常", - RuleText = ex.Message, - Message = $"风控引擎异常:{ex.Message}" - }); + var errorMessage = $"风控引擎异常:{ex.Message}"; + AddBlockError(result, "ENGINE_ERROR", "风控引擎执行异常", ex.Message, errorMessage); _logger.Error($"[风控引擎] EvaluateRisk 异常 - TradeId: {context?.TradeId}, Error: {ex.Message}"); } return result; } + private static void AddBlockError(RiskResult result, string ruleId, string ruleName, string ruleText, string errorMessage) + { + result.Blocked = true; + result.Passed = false; + result.ErrorMessage = string.IsNullOrWhiteSpace(result.ErrorMessage) + ? errorMessage + : $"{result.ErrorMessage};{errorMessage}"; + result.TriggeredRules.Add(new TriggeredRuleInfo + { + RuleId = ruleId, + RuleName = ruleName, + ControlStrategy = RiskControlStrategy.Block, + RuleText = ruleText, + Message = errorMessage + }); + } + /// /// 从数据库加载规则列表 /// diff --git a/YLErpDAL/Modules/RiskEngine/RiskResult.cs b/YLErpDAL/Modules/RiskEngine/RiskResult.cs index 69edbd57..cbc12d79 100644 --- a/YLErpDAL/Modules/RiskEngine/RiskResult.cs +++ b/YLErpDAL/Modules/RiskEngine/RiskResult.cs @@ -27,6 +27,11 @@ namespace YLErp.Modules.RiskEngine /// public bool ShowTip { get; set; } + /// + /// 错误信息 + /// + public string ErrorMessage { get; set; } + /// /// 触发的规则列表 /// diff --git a/YLErpDAL/Modules/RiskModule/QuotaMonitorService.cs b/YLErpDAL/Modules/RiskModule/QuotaMonitorService.cs index 5cf1e08e..eab45af4 100644 --- a/YLErpDAL/Modules/RiskModule/QuotaMonitorService.cs +++ b/YLErpDAL/Modules/RiskModule/QuotaMonitorService.cs @@ -5265,7 +5265,12 @@ namespace YLErp.Modules.RiskModule result.RiskWarningDetails += "[风控引擎] 规则触发:禁止\n"; foreach (var triggeredRule in riskResult.TriggeredRules.Where(r => r.ControlStrategy == RiskControlStrategy.Block)) { - result.RiskWarningDetails += $"规则ID:{triggeredRule.RuleId};规则名称:{triggeredRule.RuleName};规则说明:{triggeredRule.RuleText}\n"; + result.RiskWarningDetails += $"规则ID:{triggeredRule.RuleId};规则名称:{triggeredRule.RuleName};规则说明:{triggeredRule.RuleText}"; + if (!string.IsNullOrWhiteSpace(triggeredRule.Message)) + { + result.RiskWarningDetails += $";信息:{triggeredRule.Message}"; + } + result.RiskWarningDetails += "\n"; } } if (riskResult.NeedApproval)