Merge branch 'feature/p132_74-risk-engine' of https://gitee.glmszq.com/gsty/onederiv/trs into feature/p132_74-risk-engine

This commit is contained in:
ruisu
2026-06-25 17:26:48 +08:00
11 changed files with 480 additions and 31 deletions
@@ -5,7 +5,7 @@ namespace YLErp.Modules.RiskEngine.Dto
{
public class QueryRiskApplicationReq : BaseSearchReq
{
public string Keyword { get; set; }
public string RuleName { get; set; }
public RiskRuleStatus? Status { get; set; }
public RiskControlStrategy? Strategy { get; set; }
public string TriggerPoint { get; set; }
@@ -6,6 +6,6 @@ namespace YLErp.Modules.RiskEngine.Dto
public class QueryRiskVariableReq : BaseSearchReq
{
public RiskVariableCategory? Category { get; set; }
public string Keyword { get; set; }
public string VariableName { get; set; }
}
}
@@ -8,6 +8,8 @@ namespace YLErp.Modules.RiskEngine.Dto
public long Id { get; set; }
public string RuleName { get; set; }
public string RuleText { get; set; }
public string ConditionJson { get; set; }
public string RuleExpr { get; set; }
public RiskRuleStatus Status { get; set; }
public int Version { get; set; }
public string OptName { get; set; }
@@ -12,6 +12,6 @@ namespace YLErp.Modules.RiskEngine.Dto
public string ScopeUnderlyingTypes { get; set; }
public string ScopeTradeTypes { get; set; }
public bool ScopeIsGlobal { get; set; }
public int ExpectedVersion { get; set; }
public int Version { get; set; }
}
}
@@ -6,6 +6,6 @@ namespace YLErp.Modules.RiskEngine.Dto
public string RuleText { get; set; }
public string ConditionJson { get; set; }
public string RuleExpr { get; set; }
public int ExpectedVersion { get; set; }
public int Version { get; set; }
}
}
@@ -12,6 +12,6 @@ namespace YLErp.Modules.RiskEngine.Dto
public string Description { get; set; }
public string VariableExpr { get; set; }
public int SortOrder { get; set; }
public int ExpectedVersion { get; set; }
public int Version { get; set; }
}
}
@@ -122,7 +122,7 @@ namespace YLErp.Modules.RiskEngine
public static RiskEngineService GetInstance() => _instance.Value;
private RiskEngineService() : base((OptUserInfo)null)
private RiskEngineService() : base(OptUserInfo.SystemUser)
{
}
+17 -25
View File
@@ -185,7 +185,6 @@ namespace YLErp.Modules.RiskEngine
public class RiskRuleService : YLBaseService
{
private readonly IYcLogger _logger = LogFactory.GetLogger("RiskRuleService");
private readonly RiskEngineService _riskEngineService;
private HashSet<string> _variableExprCache;
private DateTime _variableCacheUpdateTime;
@@ -208,17 +207,14 @@ namespace YLErp.Modules.RiskEngine
public RiskRuleService(OptUserInfo userInfo) : base(userInfo)
{
_riskEngineService = RiskEngineService.GetInstance();
}
public RiskRuleService(YLBaseService baseService) : base(baseService)
{
_riskEngineService = RiskEngineService.GetInstance();
}
public RiskRuleService(OptUserInfo optUser, YLContext dbContext) : base(optUser, dbContext)
{
_riskEngineService = RiskEngineService.GetInstance();
}
#region Private Helpers
@@ -399,7 +395,7 @@ namespace YLErp.Modules.RiskEngine
{
try
{
_riskEngineService.RefreshCache();
RiskEngineService.GetInstance().RefreshCache();
}
catch (Exception ex)
{
@@ -560,6 +556,8 @@ namespace YLErp.Modules.RiskEngine
Id = r.id,
RuleName = r.RuleName,
RuleText = r.RuleText,
ConditionJson = r.ConditionJson,
RuleExpr = r.RuleExpr,
Status = r.Status,
Version = r.Version,
OptName = r.OptName,
@@ -653,7 +651,7 @@ namespace YLErp.Modules.RiskEngine
{
var rule = GetRuleOrThrow(ruleId);
if (rule.Version != req.ExpectedVersion)
if (rule.Version != req.Version)
throw new ServiceException("规则已被其他用户修改,请重新加载后再编辑");
ValidateRuleParams(req.RuleName, req.ConditionJson, req.RuleExpr);
@@ -704,13 +702,11 @@ namespace YLErp.Modules.RiskEngine
throw new ServiceException("仅已停用的规则可以启用");
rule.Status = RiskRuleStatus.Active;
rule.Version = rule.Version + 1;
rule.UpdateOptId = UserId;
rule.UpdateOptName = UserName;
rule.UpdateDate = DateTime.Now;
WriteAuditLog("RULE_ENABLE", "RULE", ruleId, rule.RuleName, "启用规则",
snapshotData: JsonConvert.SerializeObject(new { Version = rule.Version }));
WriteAuditLog("RULE_ENABLE", "RULE", ruleId, rule.RuleName, "启用规则");
DbContext.SaveChanges();
TryRefreshCache();
@@ -723,7 +719,6 @@ namespace YLErp.Modules.RiskEngine
throw new ServiceException("仅已生效的规则可以停用");
rule.Status = RiskRuleStatus.Disabled;
rule.Version = rule.Version + 1;
rule.UpdateOptId = UserId;
rule.UpdateOptName = UserName;
rule.UpdateDate = DateTime.Now;
@@ -872,6 +867,14 @@ namespace YLErp.Modules.RiskEngine
query = query.Where(a => a.TriggerPoints.Contains(req.TriggerPoint));
}
if (!string.IsNullOrWhiteSpace(req.RuleName))
{
query = query.Where(a => DbContext.glms_risk_rule
.Any(r => r.Status != RiskRuleStatus.Deleted
&& a.RuleIds.Contains(r.id.ToString())
&& r.RuleName.Contains(req.RuleName)));
}
var pagedApps = query.OrderByDescending(a => a.UpdateDate)
.Select(a => new
{
@@ -937,13 +940,6 @@ namespace YLErp.Modules.RiskEngine
};
}).ToList();
if (!string.IsNullOrWhiteSpace(req.Keyword))
{
resultList = resultList
.Where(a => a.RuleNames.Contains(req.Keyword))
.ToList();
}
return new SearchListResult<RiskApplicationListItem>
{
rows = resultList,
@@ -1050,7 +1046,7 @@ namespace YLErp.Modules.RiskEngine
{
var app = GetApplicationOrThrow(applicationId);
if (app.Version != req.ExpectedVersion)
if (app.Version != req.Version)
throw new ServiceException("应用配置已被其他用户修改,请重新加载后再编辑");
if (!string.IsNullOrWhiteSpace(req.RuleIds))
@@ -1115,7 +1111,6 @@ namespace YLErp.Modules.RiskEngine
ValidateRuleIdsActive(app.RuleIds);
app.Status = RiskRuleStatus.Active;
app.Version = app.Version + 1;
app.UpdateOptId = UserId;
app.UpdateOptName = UserName;
app.UpdateDate = DateTime.Now;
@@ -1133,7 +1128,6 @@ namespace YLErp.Modules.RiskEngine
throw new ServiceException("仅已生效的应用配置可以停用");
app.Status = RiskRuleStatus.Disabled;
app.Version = app.Version + 1;
app.UpdateOptId = UserId;
app.UpdateOptName = UserName;
app.UpdateDate = DateTime.Now;
@@ -1161,7 +1155,6 @@ namespace YLErp.Modules.RiskEngine
foreach (var app in apps)
{
app.Status = RiskRuleStatus.Active;
app.Version = app.Version + 1;
app.UpdateOptId = UserId;
app.UpdateOptName = UserName;
app.UpdateDate = DateTime.Now;
@@ -1192,7 +1185,6 @@ namespace YLErp.Modules.RiskEngine
foreach (var app in apps)
{
app.Status = RiskRuleStatus.Disabled;
app.Version = app.Version + 1;
app.UpdateOptId = UserId;
app.UpdateOptName = UserName;
app.UpdateDate = DateTime.Now;
@@ -1224,9 +1216,9 @@ namespace YLErp.Modules.RiskEngine
query = query.Where(v => v.Category == req.Category.Value);
}
if (!string.IsNullOrWhiteSpace(req.Keyword))
if (!string.IsNullOrWhiteSpace(req.VariableName))
{
query = query.Where(v => v.VariableName.Contains(req.Keyword));
query = query.Where(v => v.VariableName.Contains(req.VariableName));
}
var result = query.OrderBy(v => v.SortOrder).ThenBy(v => v.VariableName)
@@ -1334,7 +1326,7 @@ namespace YLErp.Modules.RiskEngine
{
var variable = GetVariableOrThrow(variableId);
if (variable.Version != req.ExpectedVersion)
if (variable.Version != req.Version)
throw new ServiceException("变量已被其他用户修改,请重新加载后再编辑");
if (string.IsNullOrWhiteSpace(req.VariableName))