diff --git a/YLErpDAL/Modules/RiskEngine/RiskEngineService.cs b/YLErpDAL/Modules/RiskEngine/RiskEngineService.cs index 3d040b9f..2e0e68a8 100644 --- a/YLErpDAL/Modules/RiskEngine/RiskEngineService.cs +++ b/YLErpDAL/Modules/RiskEngine/RiskEngineService.cs @@ -157,7 +157,7 @@ namespace YLErp.Modules.RiskEngine var rules = LoadRulesFromDb(); var applications = LoadApplicationsFromDb(); - List res = new List(); + List res = new List(); foreach(var i in applications) { if(i.Status!= RiskRuleStatus.Active) diff --git a/YLErpDAL/Modules/RiskEngine/RiskRule.cs b/YLErpDAL/Modules/RiskEngine/RiskRule.cs index 5558c2b4..bc6c6910 100644 --- a/YLErpDAL/Modules/RiskEngine/RiskRule.cs +++ b/YLErpDAL/Modules/RiskEngine/RiskRule.cs @@ -10,7 +10,7 @@ namespace YLErp.Modules.RiskEngine public class RiskRule { // === 基础信息 === - public int Id { get; set; } + public long Id { get; set; } public string RuleName { get; set; } public string RuleText { get; set; } diff --git a/YLErpDAL/Modules/RiskEngine/RiskRuleApplication.cs b/YLErpDAL/Modules/RiskEngine/RiskRuleApplication.cs index 9e186dbf..68219350 100644 --- a/YLErpDAL/Modules/RiskEngine/RiskRuleApplication.cs +++ b/YLErpDAL/Modules/RiskEngine/RiskRuleApplication.cs @@ -25,7 +25,7 @@ namespace YLErp.Modules.RiskEngine /// 应用配置主键ID。 /// 用于唯一标识一条规则应用记录。 /// - public int Id { get; set; } + public long Id { get; set; } /// /// 关联的规则ID列表。 diff --git a/YLErpDAL/Modules/RiskEngine/RiskRuleService.cs b/YLErpDAL/Modules/RiskEngine/RiskRuleService.cs index d8f1316f..7e79f074 100644 --- a/YLErpDAL/Modules/RiskEngine/RiskRuleService.cs +++ b/YLErpDAL/Modules/RiskEngine/RiskRuleService.cs @@ -534,6 +534,41 @@ namespace YLErp.Modules.RiskEngine return string.Join(", ", names); } + /// + /// 构建 Scope 字段的 OR 过滤谓词(逗号分隔值精确匹配) + /// + private static IQueryable ApplyScopeFilter( + IQueryable query, + Expression> fieldSelector, + string csvValues) + { + var ids = csvValues.Split(',', StringSplitOptions.RemoveEmptyEntries); + if (ids.Length == 0) + return query; + + Expression> predicate = null; + var param = fieldSelector.Parameters[0]; + var member = fieldSelector.Body; + + foreach (var trimmed in ids.Select(id => id.Trim())) + { + var eq = Expression.Equal(member, Expression.Constant(trimmed)); + var startsExpr = Expression.Call(member, nameof(string.StartsWith), null, + Expression.Constant(trimmed + ",")); + var endsExpr = Expression.Call(member, nameof(string.EndsWith), null, + Expression.Constant("," + trimmed)); + var containsExpr = Expression.Call(member, nameof(string.Contains), null, + Expression.Constant("," + trimmed + ",")); + + var orExpr = Expression.OrElse(Expression.OrElse(eq, startsExpr), + Expression.OrElse(endsExpr, containsExpr)); + var lambda = Expression.Lambda>(orExpr, param); + predicate = predicate == null ? lambda : predicate.Or(lambda); + } + + return predicate != null ? query.Where(predicate) : query; + } + private static string GetStrategyName(RiskControlStrategy strategy) { return strategy switch @@ -930,76 +965,16 @@ namespace YLErp.Modules.RiskEngine } if (!string.IsNullOrWhiteSpace(req.ScopeClientIds)) - { - var ids = req.ScopeClientIds.Split(',', StringSplitOptions.RemoveEmptyEntries); - Expression> scopePredicate = null; - foreach (var id in ids) - { - var idCopy = id; - Expression> expr = a => - a.ScopeClientIds == idCopy || - a.ScopeClientIds.StartsWith(idCopy + ",") || - a.ScopeClientIds.EndsWith("," + idCopy) || - a.ScopeClientIds.Contains("," + idCopy + ","); - scopePredicate = scopePredicate == null ? expr : scopePredicate.Or(expr); - } - if (scopePredicate != null) - query = query.Where(scopePredicate); - } + query = ApplyScopeFilter(query, a => a.ScopeClientIds, req.ScopeClientIds); if (!string.IsNullOrWhiteSpace(req.ScopeUnderlyingTypes)) - { - var types = req.ScopeUnderlyingTypes.Split(',', StringSplitOptions.RemoveEmptyEntries); - Expression> scopePredicate = null; - foreach (var type in types) - { - var typeCopy = type; - Expression> expr = a => - a.ScopeUnderlyingTypes == typeCopy || - a.ScopeUnderlyingTypes.StartsWith(typeCopy + ",") || - a.ScopeUnderlyingTypes.EndsWith("," + typeCopy) || - a.ScopeUnderlyingTypes.Contains("," + typeCopy + ","); - scopePredicate = scopePredicate == null ? expr : scopePredicate.Or(expr); - } - if (scopePredicate != null) - query = query.Where(scopePredicate); - } + query = ApplyScopeFilter(query, a => a.ScopeUnderlyingTypes, req.ScopeUnderlyingTypes); if (!string.IsNullOrWhiteSpace(req.ScopeTradeTypes)) - { - var types = req.ScopeTradeTypes.Split(',', StringSplitOptions.RemoveEmptyEntries); - Expression> scopePredicate = null; - foreach (var type in types) - { - var typeCopy = type; - Expression> expr = a => - a.ScopeTradeTypes == typeCopy || - a.ScopeTradeTypes.StartsWith(typeCopy + ",") || - a.ScopeTradeTypes.EndsWith("," + typeCopy) || - a.ScopeTradeTypes.Contains("," + typeCopy + ","); - scopePredicate = scopePredicate == null ? expr : scopePredicate.Or(expr); - } - if (scopePredicate != null) - query = query.Where(scopePredicate); - } + query = ApplyScopeFilter(query, a => a.ScopeTradeTypes, req.ScopeTradeTypes); if (!string.IsNullOrWhiteSpace(req.ScopeAssetBookIds)) - { - var ids = req.ScopeAssetBookIds.Split(',', StringSplitOptions.RemoveEmptyEntries); - Expression> scopePredicate = null; - foreach (var id in ids) - { - var idCopy = id; - Expression> expr = a => - a.ScopeAssetBookIds == idCopy || - a.ScopeAssetBookIds.StartsWith(idCopy + ",") || - a.ScopeAssetBookIds.EndsWith("," + idCopy) || - a.ScopeAssetBookIds.Contains("," + idCopy + ","); - scopePredicate = scopePredicate == null ? expr : scopePredicate.Or(expr); - } - if (scopePredicate != null) - query = query.Where(scopePredicate); - } + query = ApplyScopeFilter(query, a => a.ScopeAssetBookIds, req.ScopeAssetBookIds); var pagedResult = query.OrderByDescending(a => a.UpdateDate) .Select(a => new RiskApplicationListItem