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)