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:
@@ -2,17 +2,29 @@ using System.ComponentModel.DataAnnotations.Schema;
|
||||
|
||||
namespace YLErp.DBModels
|
||||
{
|
||||
/// <summary>
|
||||
/// 风控规则定义表
|
||||
/// </summary>
|
||||
[Table("glms_risk_rule")]
|
||||
public class glms_risk_rule : DBModelWithOperator
|
||||
{
|
||||
/// <summary>规则名称</summary>
|
||||
public string RuleName { get; set; }
|
||||
/// <summary>规则描述文本</summary>
|
||||
public string RuleText { get; set; }
|
||||
/// <summary>结构化条件 JSON(变量+操作符+阈值列表)</summary>
|
||||
public string ConditionJson { get; set; }
|
||||
/// <summary>规则执行表达式(C# 布尔表达式,引擎用 Roslyn 编译执行)</summary>
|
||||
public string RuleExpr { get; set; }
|
||||
/// <summary>规则状态</summary>
|
||||
public RiskRuleStatus Status { get; set; } = RiskRuleStatus.Active;
|
||||
/// <summary>版本号(乐观锁)</summary>
|
||||
public int Version { get; set; } = 1;
|
||||
/// <summary>最后更新人工号</summary>
|
||||
public int? UpdateOptId { get; set; }
|
||||
/// <summary>最后更新人姓名</summary>
|
||||
public string UpdateOptName { get; set; }
|
||||
/// <summary>最后更新时间</summary>
|
||||
public DateTime? UpdateDate { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,21 +2,37 @@ using System.ComponentModel.DataAnnotations.Schema;
|
||||
|
||||
namespace YLErp.DBModels
|
||||
{
|
||||
/// <summary>
|
||||
/// 风控规则应用配置表
|
||||
/// </summary>
|
||||
[Table("glms_risk_rule_application")]
|
||||
public class glms_risk_rule_application : DBModelWithOperator
|
||||
{
|
||||
/// <summary>关联规则 ID 列表(JSON 数组)</summary>
|
||||
public string RuleIds { get; set; }
|
||||
/// <summary>应用配置状态</summary>
|
||||
public RiskRuleStatus Status { get; set; } = RiskRuleStatus.Active;
|
||||
/// <summary>风控策略(预警/阻断)</summary>
|
||||
public RiskControlStrategy ControlStrategy { get; set; }
|
||||
/// <summary>触发点列表(JSON 数组)</summary>
|
||||
public string TriggerPoints { get; set; }
|
||||
/// <summary>适用范围-资产账簿 ID 列表(JSON 数组)</summary>
|
||||
public string ScopeAssetBookIds { get; set; }
|
||||
/// <summary>适用范围-客户 ID 列表(JSON 数组)</summary>
|
||||
public string ScopeClientIds { get; set; }
|
||||
/// <summary>适用范围-标的类型列表(JSON 数组)</summary>
|
||||
public string ScopeUnderlyingTypes { get; set; }
|
||||
/// <summary>适用范围-交易类型列表(JSON 数组)</summary>
|
||||
public string ScopeTradeTypes { get; set; }
|
||||
/// <summary>是否全局生效(0:否 1:是)</summary>
|
||||
public int ScopeIsGlobal { get; set; }
|
||||
/// <summary>版本号(乐观锁)</summary>
|
||||
public int Version { get; set; } = 1;
|
||||
/// <summary>最后更新人工号</summary>
|
||||
public int? UpdateOptId { get; set; }
|
||||
/// <summary>最后更新人姓名</summary>
|
||||
public string UpdateOptName { get; set; }
|
||||
/// <summary>最后更新时间</summary>
|
||||
public DateTime? UpdateDate { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,18 +2,31 @@ using System.ComponentModel.DataAnnotations.Schema;
|
||||
|
||||
namespace YLErp.DBModels
|
||||
{
|
||||
/// <summary>
|
||||
/// 风控操作审计日志表
|
||||
/// </summary>
|
||||
[Table("glms_risk_rule_audit_log")]
|
||||
public class glms_risk_rule_audit_log : DBModelBase
|
||||
{
|
||||
/// <summary>操作类型(创建/更新/删除/启用/禁用)</summary>
|
||||
public string OperationType { get; set; }
|
||||
/// <summary>操作目标类型(Rule/Variable/Application)</summary>
|
||||
public string TargetType { get; set; }
|
||||
/// <summary>操作目标 ID</summary>
|
||||
public long TargetId { get; set; }
|
||||
/// <summary>操作目标名称</summary>
|
||||
public string TargetName { get; set; }
|
||||
/// <summary>操作详情描述</summary>
|
||||
public string OperationDetail { get; set; }
|
||||
/// <summary>操作结果(成功/失败)</summary>
|
||||
public string Result { get; set; }
|
||||
/// <summary>操作前数据快照(JSON)</summary>
|
||||
public string SnapshotData { get; set; }
|
||||
/// <summary>操作人工号</summary>
|
||||
public long OptId { get; set; }
|
||||
/// <summary>操作人姓名</summary>
|
||||
public string OptName { get; set; }
|
||||
/// <summary>操作时间</summary>
|
||||
public DateTime OptDate { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,20 +2,35 @@ using System.ComponentModel.DataAnnotations.Schema;
|
||||
|
||||
namespace YLErp.DBModels
|
||||
{
|
||||
/// <summary>
|
||||
/// 风控变量池定义表
|
||||
/// </summary>
|
||||
[Table("glms_risk_variable")]
|
||||
public class glms_risk_variable : DBModelWithOperator
|
||||
{
|
||||
/// <summary>变量名称</summary>
|
||||
public string VariableName { get; set; }
|
||||
/// <summary>变量分类</summary>
|
||||
public RiskVariableCategory Category { get; set; }
|
||||
/// <summary>数据类型</summary>
|
||||
public RiskVariableDataType DataType { get; set; }
|
||||
/// <summary>单位</summary>
|
||||
public string Unit { get; set; }
|
||||
/// <summary>值域描述</summary>
|
||||
public string ValueDomain { get; set; }
|
||||
/// <summary>变量说明</summary>
|
||||
public string Description { get; set; }
|
||||
/// <summary>取值表达式(C# 表达式,用于计算变量值)</summary>
|
||||
public string VariableExpr { get; set; }
|
||||
/// <summary>版本号(乐观锁)</summary>
|
||||
public int Version { get; set; } = 1;
|
||||
/// <summary>排序序号</summary>
|
||||
public int SortOrder { get; set; }
|
||||
/// <summary>最后更新人工号</summary>
|
||||
public int? UpdateOptId { get; set; }
|
||||
/// <summary>最后更新人姓名</summary>
|
||||
public string UpdateOptName { get; set; }
|
||||
/// <summary>最后更新时间</summary>
|
||||
public DateTime? UpdateDate { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,10 +1,17 @@
|
||||
namespace YLErp.Modules.RiskEngine.Dto
|
||||
{
|
||||
/// <summary>
|
||||
/// 批量操作结果
|
||||
/// </summary>
|
||||
public class BatchOperationResult
|
||||
{
|
||||
/// <summary>是否全部成功</summary>
|
||||
public bool Success { get; set; }
|
||||
/// <summary>总数量</summary>
|
||||
public int TotalCount { get; set; }
|
||||
/// <summary>成功数量</summary>
|
||||
public int SuccessCount { get; set; }
|
||||
/// <summary>错误信息</summary>
|
||||
public string ErrorMessage { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,15 +2,26 @@ using YLErp.DBModels;
|
||||
|
||||
namespace YLErp.Modules.RiskEngine.Dto
|
||||
{
|
||||
/// <summary>
|
||||
/// 创建应用配置请求
|
||||
/// </summary>
|
||||
public class CreateRiskApplicationReq
|
||||
{
|
||||
/// <summary>关联规则 ID 列表(JSON 数组)</summary>
|
||||
public string RuleIds { get; set; }
|
||||
/// <summary>风控策略</summary>
|
||||
public RiskControlStrategy ControlStrategy { get; set; }
|
||||
/// <summary>触发点列表(JSON 数组)</summary>
|
||||
public string TriggerPoints { get; set; }
|
||||
/// <summary>适用范围-资产账簿 ID 列表</summary>
|
||||
public string ScopeAssetBookIds { get; set; }
|
||||
/// <summary>适用范围-客户 ID 列表</summary>
|
||||
public string ScopeClientIds { get; set; }
|
||||
/// <summary>适用范围-标的类型列表</summary>
|
||||
public string ScopeUnderlyingTypes { get; set; }
|
||||
/// <summary>适用范围-交易类型列表</summary>
|
||||
public string ScopeTradeTypes { get; set; }
|
||||
/// <summary>是否全局生效</summary>
|
||||
public int ScopeIsGlobal { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,10 +1,17 @@
|
||||
namespace YLErp.Modules.RiskEngine.Dto
|
||||
{
|
||||
/// <summary>
|
||||
/// 创建风控规则请求
|
||||
/// </summary>
|
||||
public class CreateRiskRuleReq
|
||||
{
|
||||
/// <summary>规则名称</summary>
|
||||
public string RuleName { get; set; }
|
||||
/// <summary>规则描述文本</summary>
|
||||
public string RuleText { get; set; }
|
||||
/// <summary>结构化条件 JSON</summary>
|
||||
public string ConditionJson { get; set; }
|
||||
/// <summary>规则执行表达式</summary>
|
||||
public string RuleExpr { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,15 +2,26 @@ using YLErp.DBModels;
|
||||
|
||||
namespace YLErp.Modules.RiskEngine.Dto
|
||||
{
|
||||
/// <summary>
|
||||
/// 创建变量请求
|
||||
/// </summary>
|
||||
public class CreateRiskVariableReq
|
||||
{
|
||||
/// <summary>变量名称</summary>
|
||||
public string VariableName { get; set; }
|
||||
/// <summary>变量分类</summary>
|
||||
public RiskVariableCategory Category { get; set; }
|
||||
/// <summary>数据类型</summary>
|
||||
public RiskVariableDataType DataType { get; set; }
|
||||
/// <summary>单位</summary>
|
||||
public string Unit { get; set; }
|
||||
/// <summary>值域描述</summary>
|
||||
public string ValueDomain { get; set; }
|
||||
/// <summary>变量说明</summary>
|
||||
public string Description { get; set; }
|
||||
/// <summary>取值表达式</summary>
|
||||
public string VariableExpr { get; set; }
|
||||
/// <summary>排序序号</summary>
|
||||
public int SortOrder { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,15 +3,26 @@ using YLErp.DBModels;
|
||||
|
||||
namespace YLErp.Modules.RiskEngine.Dto
|
||||
{
|
||||
/// <summary>
|
||||
/// 查询应用配置请求
|
||||
/// </summary>
|
||||
public class QueryRiskApplicationReq : BaseSearchReq
|
||||
{
|
||||
/// <summary>规则名称</summary>
|
||||
public string RuleName { get; set; }
|
||||
/// <summary>应用配置状态</summary>
|
||||
public RiskRuleStatus? Status { get; set; }
|
||||
/// <summary>风控策略</summary>
|
||||
public RiskControlStrategy? Strategy { get; set; }
|
||||
/// <summary>触发点</summary>
|
||||
public string TriggerPoint { get; set; }
|
||||
/// <summary>适用范围-客户 ID 列表</summary>
|
||||
public string ScopeClientIds { get; set; }
|
||||
/// <summary>适用范围-标的类型列表</summary>
|
||||
public string ScopeUnderlyingTypes { get; set; }
|
||||
/// <summary>适用范围-交易类型列表</summary>
|
||||
public string ScopeTradeTypes { get; set; }
|
||||
/// <summary>适用范围-资产账簿 ID 列表</summary>
|
||||
public string ScopeAssetBookIds { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,15 +3,26 @@ using BaseOUDAL;
|
||||
|
||||
namespace YLErp.Modules.RiskEngine.Dto
|
||||
{
|
||||
/// <summary>
|
||||
/// 查询审计日志请求
|
||||
/// </summary>
|
||||
public class QueryRiskAuditLogReq : BaseSearchReq
|
||||
{
|
||||
/// <summary>操作类型</summary>
|
||||
public string OperationType { get; set; }
|
||||
/// <summary>操作类型列表(多选,逗号分隔)</summary>
|
||||
public string OperationTypes { get; set; }
|
||||
/// <summary>操作目标类型</summary>
|
||||
public string TargetType { get; set; }
|
||||
/// <summary>操作目标名称</summary>
|
||||
public string TargetName { get; set; }
|
||||
/// <summary>操作人姓名</summary>
|
||||
public string OptName { get; set; }
|
||||
/// <summary>开始日期</summary>
|
||||
public DateTime? StartDate { get; set; }
|
||||
/// <summary>结束日期</summary>
|
||||
public DateTime? EndDate { get; set; }
|
||||
/// <summary>搜索关键词</summary>
|
||||
public string Keyword { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,10 +3,16 @@ using YLErp.DBModels;
|
||||
|
||||
namespace YLErp.Modules.RiskEngine.Dto
|
||||
{
|
||||
/// <summary>
|
||||
/// 查询风控规则请求
|
||||
/// </summary>
|
||||
public class QueryRiskRuleReq : BaseSearchReq
|
||||
{
|
||||
/// <summary>搜索关键词</summary>
|
||||
public string Keyword { get; set; }
|
||||
/// <summary>规则状态</summary>
|
||||
public RiskRuleStatus? Status { get; set; }
|
||||
/// <summary>关联变量 ID</summary>
|
||||
public long? VariableId { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,10 +3,16 @@ using YLErp.DBModels;
|
||||
|
||||
namespace YLErp.Modules.RiskEngine.Dto
|
||||
{
|
||||
/// <summary>
|
||||
/// 查询变量请求
|
||||
/// </summary>
|
||||
public class QueryRiskVariableReq : BaseSearchReq
|
||||
{
|
||||
/// <summary>变量分类</summary>
|
||||
public RiskVariableCategory? Category { get; set; }
|
||||
/// <summary>数据类型</summary>
|
||||
public RiskVariableDataType? DataType { get; set; }
|
||||
/// <summary>变量名称</summary>
|
||||
public string VariableName { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,22 +3,40 @@ using YLErp.DBModels;
|
||||
|
||||
namespace YLErp.Modules.RiskEngine.Dto
|
||||
{
|
||||
/// <summary>
|
||||
/// 应用配置详情响应
|
||||
/// </summary>
|
||||
public class RiskApplicationDetail
|
||||
{
|
||||
/// <summary>应用配置 ID</summary>
|
||||
public long Id { get; set; }
|
||||
/// <summary>关联规则 ID 列表(JSON 数组)</summary>
|
||||
public string RuleIds { get; set; }
|
||||
/// <summary>应用配置状态</summary>
|
||||
public RiskRuleStatus Status { get; set; }
|
||||
/// <summary>风控策略</summary>
|
||||
public RiskControlStrategy ControlStrategy { get; set; }
|
||||
/// <summary>触发点列表(JSON 数组)</summary>
|
||||
public string TriggerPoints { get; set; }
|
||||
/// <summary>适用范围-资产账簿 ID 列表</summary>
|
||||
public string ScopeAssetBookIds { get; set; }
|
||||
/// <summary>适用范围-客户 ID 列表</summary>
|
||||
public string ScopeClientIds { get; set; }
|
||||
/// <summary>适用范围-标的类型列表</summary>
|
||||
public string ScopeUnderlyingTypes { get; set; }
|
||||
/// <summary>适用范围-交易类型列表</summary>
|
||||
public string ScopeTradeTypes { get; set; }
|
||||
/// <summary>是否全局生效</summary>
|
||||
public int ScopeIsGlobal { get; set; }
|
||||
/// <summary>版本号</summary>
|
||||
public int Version { get; set; }
|
||||
/// <summary>创建人姓名</summary>
|
||||
public string OptName { get; set; }
|
||||
/// <summary>创建时间</summary>
|
||||
public DateTime OptDate { get; set; }
|
||||
/// <summary>最后更新人姓名</summary>
|
||||
public string UpdateOptName { get; set; }
|
||||
/// <summary>最后更新时间</summary>
|
||||
public DateTime UpdateDate { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,22 +3,40 @@ using YLErp.DBModels;
|
||||
|
||||
namespace YLErp.Modules.RiskEngine.Dto
|
||||
{
|
||||
/// <summary>
|
||||
/// 应用配置列表项
|
||||
/// </summary>
|
||||
public class RiskApplicationListItem
|
||||
{
|
||||
/// <summary>应用配置 ID</summary>
|
||||
public long Id { get; set; }
|
||||
/// <summary>关联规则 ID 列表(JSON 数组)</summary>
|
||||
public string RuleIds { get; set; }
|
||||
/// <summary>应用配置状态</summary>
|
||||
public int Status { get; set; }
|
||||
/// <summary>风控策略</summary>
|
||||
public RiskControlStrategy ControlStrategy { get; set; }
|
||||
/// <summary>触发点列表(JSON 数组)</summary>
|
||||
public string TriggerPoints { get; set; }
|
||||
/// <summary>适用范围-资产账簿 ID 列表</summary>
|
||||
public string ScopeAssetBookIds { get; set; }
|
||||
/// <summary>适用范围-客户 ID 列表</summary>
|
||||
public string ScopeClientIds { get; set; }
|
||||
/// <summary>适用范围-标的类型列表</summary>
|
||||
public string ScopeUnderlyingTypes { get; set; }
|
||||
/// <summary>适用范围-交易类型列表</summary>
|
||||
public string ScopeTradeTypes { get; set; }
|
||||
/// <summary>是否全局生效</summary>
|
||||
public int ScopeIsGlobal { get; set; }
|
||||
/// <summary>版本号</summary>
|
||||
public int Version { get; set; }
|
||||
/// <summary>创建人姓名</summary>
|
||||
public string OptName { get; set; }
|
||||
/// <summary>创建时间</summary>
|
||||
public DateTime OptDate { get; set; }
|
||||
/// <summary>最后更新人姓名</summary>
|
||||
public string UpdateOptName { get; set; }
|
||||
/// <summary>最后更新时间</summary>
|
||||
public DateTime UpdateDate { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,18 +2,32 @@ using System;
|
||||
|
||||
namespace YLErp.Modules.RiskEngine.Dto
|
||||
{
|
||||
/// <summary>
|
||||
/// 审计日志详情响应
|
||||
/// </summary>
|
||||
public class RiskAuditLogDetail
|
||||
{
|
||||
/// <summary>日志 ID</summary>
|
||||
public long Id { get; set; }
|
||||
/// <summary>操作类型</summary>
|
||||
public string OperationType { get; set; }
|
||||
/// <summary>操作目标类型</summary>
|
||||
public string TargetType { get; set; }
|
||||
/// <summary>操作目标 ID</summary>
|
||||
public long TargetId { get; set; }
|
||||
/// <summary>操作目标名称</summary>
|
||||
public string TargetName { get; set; }
|
||||
/// <summary>操作详情描述</summary>
|
||||
public string OperationDetail { get; set; }
|
||||
/// <summary>操作结果</summary>
|
||||
public string Result { get; set; }
|
||||
/// <summary>操作前数据快照(JSON)</summary>
|
||||
public string SnapshotData { get; set; }
|
||||
/// <summary>操作人工号</summary>
|
||||
public long OptId { get; set; }
|
||||
/// <summary>操作人姓名</summary>
|
||||
public string OptName { get; set; }
|
||||
/// <summary>操作时间</summary>
|
||||
public DateTime OptDate { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,16 +2,28 @@ using System;
|
||||
|
||||
namespace YLErp.Modules.RiskEngine.Dto
|
||||
{
|
||||
/// <summary>
|
||||
/// 审计日志列表项
|
||||
/// </summary>
|
||||
public class RiskAuditLogListItem
|
||||
{
|
||||
/// <summary>日志 ID</summary>
|
||||
public long Id { get; set; }
|
||||
/// <summary>操作类型</summary>
|
||||
public string OperationType { get; set; }
|
||||
/// <summary>操作目标类型</summary>
|
||||
public string TargetType { get; set; }
|
||||
/// <summary>操作目标 ID</summary>
|
||||
public long TargetId { get; set; }
|
||||
/// <summary>操作目标名称</summary>
|
||||
public string TargetName { get; set; }
|
||||
/// <summary>操作详情描述</summary>
|
||||
public string OperationDetail { get; set; }
|
||||
/// <summary>操作结果</summary>
|
||||
public string Result { get; set; }
|
||||
/// <summary>操作人姓名</summary>
|
||||
public string OptName { get; set; }
|
||||
/// <summary>操作时间</summary>
|
||||
public DateTime OptDate { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,11 +2,18 @@ using YLErp.DBModels;
|
||||
|
||||
namespace YLErp.Modules.RiskEngine.Dto
|
||||
{
|
||||
/// <summary>
|
||||
/// 规则关联应用摘要
|
||||
/// </summary>
|
||||
public class RiskRuleApplicationSummary
|
||||
{
|
||||
/// <summary>应用配置 ID</summary>
|
||||
public long Id { get; set; }
|
||||
/// <summary>应用配置状态</summary>
|
||||
public RiskRuleStatus Status { get; set; }
|
||||
/// <summary>风控策略</summary>
|
||||
public RiskControlStrategy ControlStrategy { get; set; }
|
||||
/// <summary>触发点列表</summary>
|
||||
public string TriggerPoints { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,19 +4,34 @@ using YLErp.DBModels;
|
||||
|
||||
namespace YLErp.Modules.RiskEngine.Dto
|
||||
{
|
||||
/// <summary>
|
||||
/// 风控规则详情响应
|
||||
/// </summary>
|
||||
public class RiskRuleDetail
|
||||
{
|
||||
/// <summary>规则 ID</summary>
|
||||
public long Id { get; set; }
|
||||
/// <summary>规则名称</summary>
|
||||
public string RuleName { get; set; }
|
||||
/// <summary>规则描述文本</summary>
|
||||
public string RuleText { get; set; }
|
||||
/// <summary>结构化条件 JSON</summary>
|
||||
public string ConditionJson { get; set; }
|
||||
/// <summary>规则执行表达式</summary>
|
||||
public string RuleExpr { get; set; }
|
||||
/// <summary>规则状态</summary>
|
||||
public RiskRuleStatus Status { get; set; }
|
||||
/// <summary>版本号</summary>
|
||||
public int Version { get; set; }
|
||||
/// <summary>创建人姓名</summary>
|
||||
public string OptName { get; set; }
|
||||
/// <summary>创建时间</summary>
|
||||
public DateTime OptDate { get; set; }
|
||||
/// <summary>最后更新人姓名</summary>
|
||||
public string UpdateOptName { get; set; }
|
||||
/// <summary>最后更新时间</summary>
|
||||
public DateTime UpdateDate { get; set; }
|
||||
/// <summary>关联应用列表</summary>
|
||||
public List<RiskRuleApplicationSummary> Applications { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,19 +3,34 @@ using YLErp.DBModels;
|
||||
|
||||
namespace YLErp.Modules.RiskEngine.Dto
|
||||
{
|
||||
/// <summary>
|
||||
/// 风控规则列表项
|
||||
/// </summary>
|
||||
public class RiskRuleListItem
|
||||
{
|
||||
/// <summary>规则 ID</summary>
|
||||
public long Id { get; set; }
|
||||
/// <summary>规则名称</summary>
|
||||
public string RuleName { get; set; }
|
||||
/// <summary>规则描述文本</summary>
|
||||
public string RuleText { get; set; }
|
||||
/// <summary>结构化条件 JSON</summary>
|
||||
public string ConditionJson { get; set; }
|
||||
/// <summary>规则执行表达式</summary>
|
||||
public string RuleExpr { get; set; }
|
||||
/// <summary>规则状态</summary>
|
||||
public RiskRuleStatus Status { get; set; }
|
||||
/// <summary>版本号</summary>
|
||||
public int Version { get; set; }
|
||||
/// <summary>创建人姓名</summary>
|
||||
public string OptName { get; set; }
|
||||
/// <summary>创建时间</summary>
|
||||
public DateTime OptDate { get; set; }
|
||||
/// <summary>最后更新人姓名</summary>
|
||||
public string UpdateOptName { get; set; }
|
||||
/// <summary>最后更新时间</summary>
|
||||
public DateTime UpdateDate { get; set; }
|
||||
/// <summary>关联应用数量</summary>
|
||||
public int ApplicationCount { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +1,15 @@
|
||||
namespace YLErp.Modules.RiskEngine.Dto
|
||||
{
|
||||
/// <summary>
|
||||
/// 风控规则简要信息
|
||||
/// </summary>
|
||||
public class RiskRuleSimpleItem
|
||||
{
|
||||
/// <summary>规则 ID</summary>
|
||||
public long Id { get; set; }
|
||||
/// <summary>规则名称</summary>
|
||||
public string RuleName { get; set; }
|
||||
/// <summary>规则描述文本</summary>
|
||||
public string RuleText { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,12 +2,20 @@ using System;
|
||||
|
||||
namespace YLErp.Modules.RiskEngine.Dto
|
||||
{
|
||||
/// <summary>
|
||||
/// 风控规则版本历史项
|
||||
/// </summary>
|
||||
public class RiskRuleVersionItem
|
||||
{
|
||||
/// <summary>版本号</summary>
|
||||
public int Version { get; set; }
|
||||
/// <summary>操作类型</summary>
|
||||
public string OperationType { get; set; }
|
||||
/// <summary>操作详情</summary>
|
||||
public string OperationDetail { get; set; }
|
||||
/// <summary>操作人姓名</summary>
|
||||
public string OptName { get; set; }
|
||||
/// <summary>操作时间</summary>
|
||||
public DateTime OptDate { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,22 +3,40 @@ using YLErp.DBModels;
|
||||
|
||||
namespace YLErp.Modules.RiskEngine.Dto
|
||||
{
|
||||
/// <summary>
|
||||
/// 变量详情响应
|
||||
/// </summary>
|
||||
public class RiskVariableDetail
|
||||
{
|
||||
/// <summary>变量 ID</summary>
|
||||
public long Id { get; set; }
|
||||
/// <summary>变量名称</summary>
|
||||
public string VariableName { get; set; }
|
||||
/// <summary>变量分类</summary>
|
||||
public RiskVariableCategory Category { get; set; }
|
||||
/// <summary>数据类型</summary>
|
||||
public RiskVariableDataType DataType { get; set; }
|
||||
/// <summary>单位</summary>
|
||||
public string Unit { get; set; }
|
||||
/// <summary>值域描述</summary>
|
||||
public string ValueDomain { get; set; }
|
||||
/// <summary>变量说明</summary>
|
||||
public string Description { get; set; }
|
||||
/// <summary>取值表达式</summary>
|
||||
public string VariableExpr { get; set; }
|
||||
/// <summary>版本号</summary>
|
||||
public int Version { get; set; }
|
||||
/// <summary>排序序号</summary>
|
||||
public int SortOrder { get; set; }
|
||||
/// <summary>创建人姓名</summary>
|
||||
public string OptName { get; set; }
|
||||
/// <summary>创建时间</summary>
|
||||
public DateTime OptDate { get; set; }
|
||||
/// <summary>最后更新人姓名</summary>
|
||||
public string UpdateOptName { get; set; }
|
||||
/// <summary>最后更新时间</summary>
|
||||
public DateTime UpdateDate { get; set; }
|
||||
/// <summary>被引用次数</summary>
|
||||
public int ReferenceCount { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,17 +2,30 @@ using YLErp.DBModels;
|
||||
|
||||
namespace YLErp.Modules.RiskEngine.Dto
|
||||
{
|
||||
/// <summary>
|
||||
/// 变量列表项
|
||||
/// </summary>
|
||||
public class RiskVariableListItem
|
||||
{
|
||||
/// <summary>变量 ID</summary>
|
||||
public long Id { get; set; }
|
||||
/// <summary>变量名称</summary>
|
||||
public string VariableName { get; set; }
|
||||
/// <summary>变量分类</summary>
|
||||
public RiskVariableCategory Category { get; set; }
|
||||
/// <summary>数据类型</summary>
|
||||
public RiskVariableDataType DataType { get; set; }
|
||||
/// <summary>单位</summary>
|
||||
public string Unit { get; set; }
|
||||
/// <summary>值域描述</summary>
|
||||
public string ValueDomain { get; set; }
|
||||
/// <summary>变量说明</summary>
|
||||
public string Description { get; set; }
|
||||
/// <summary>取值表达式</summary>
|
||||
public string VariableExpr { get; set; }
|
||||
/// <summary>版本号</summary>
|
||||
public int Version { get; set; }
|
||||
/// <summary>排序序号</summary>
|
||||
public int SortOrder { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,13 +2,22 @@ using YLErp.DBModels;
|
||||
|
||||
namespace YLErp.Modules.RiskEngine.Dto
|
||||
{
|
||||
/// <summary>
|
||||
/// 变量简要信息
|
||||
/// </summary>
|
||||
public class RiskVariableSimpleItem
|
||||
{
|
||||
/// <summary>变量 ID</summary>
|
||||
public long Id { get; set; }
|
||||
/// <summary>变量名称</summary>
|
||||
public string VariableName { get; set; }
|
||||
/// <summary>变量分类</summary>
|
||||
public RiskVariableCategory Category { get; set; }
|
||||
/// <summary>数据类型</summary>
|
||||
public RiskVariableDataType DataType { get; set; }
|
||||
/// <summary>单位</summary>
|
||||
public string Unit { get; set; }
|
||||
/// <summary>取值表达式</summary>
|
||||
public string VariableExpr { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,14 +1,23 @@
|
||||
namespace YLErp.Modules.RiskEngine.Dto
|
||||
{
|
||||
/// <summary>
|
||||
/// 规则条件项
|
||||
/// </summary>
|
||||
public class RuleCondition
|
||||
{
|
||||
/// <summary>条件变量 ID</summary>
|
||||
public long VariableId { get; set; }
|
||||
/// <summary>操作符(如 Equal、GreaterThan、Between 等)</summary>
|
||||
public string Operator { get; set; }
|
||||
/// <summary>阈值类型(FixedValue / VariableRef)</summary>
|
||||
public string ThresholdType { get; set; }
|
||||
/// <summary>阈值(固定值或变量引用)</summary>
|
||||
public object Value { get; set; }
|
||||
/// <summary>阈值变量 ID(当 ThresholdType 为 VariableRef 时)</summary>
|
||||
public long? ThresholdVariableId { get; set; }
|
||||
// 介于/不介于 的边界包含控制,默认 true
|
||||
/// <summary>介于/不介于的下边界是否包含,默认 true</summary>
|
||||
public bool IncludeLowerBound { get; set; } = true;
|
||||
/// <summary>介于/不介于的上边界是否包含,默认 true</summary>
|
||||
public bool IncludeUpperBound { get; set; } = true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,16 +2,28 @@ using YLErp.DBModels;
|
||||
|
||||
namespace YLErp.Modules.RiskEngine.Dto
|
||||
{
|
||||
/// <summary>
|
||||
/// 更新应用配置请求
|
||||
/// </summary>
|
||||
public class UpdateRiskApplicationReq
|
||||
{
|
||||
/// <summary>关联规则 ID 列表(JSON 数组)</summary>
|
||||
public string RuleIds { get; set; }
|
||||
/// <summary>风控策略</summary>
|
||||
public RiskControlStrategy ControlStrategy { get; set; }
|
||||
/// <summary>触发点列表(JSON 数组)</summary>
|
||||
public string TriggerPoints { get; set; }
|
||||
/// <summary>适用范围-资产账簿 ID 列表</summary>
|
||||
public string ScopeAssetBookIds { get; set; }
|
||||
/// <summary>适用范围-客户 ID 列表</summary>
|
||||
public string ScopeClientIds { get; set; }
|
||||
/// <summary>适用范围-标的类型列表</summary>
|
||||
public string ScopeUnderlyingTypes { get; set; }
|
||||
/// <summary>适用范围-交易类型列表</summary>
|
||||
public string ScopeTradeTypes { get; set; }
|
||||
/// <summary>是否全局生效</summary>
|
||||
public int ScopeIsGlobal { get; set; }
|
||||
/// <summary>版本号(乐观锁)</summary>
|
||||
public int Version { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,11 +1,19 @@
|
||||
namespace YLErp.Modules.RiskEngine.Dto
|
||||
{
|
||||
/// <summary>
|
||||
/// 更新风控规则请求
|
||||
/// </summary>
|
||||
public class UpdateRiskRuleReq
|
||||
{
|
||||
/// <summary>规则名称</summary>
|
||||
public string RuleName { get; set; }
|
||||
/// <summary>规则描述文本</summary>
|
||||
public string RuleText { get; set; }
|
||||
/// <summary>结构化条件 JSON</summary>
|
||||
public string ConditionJson { get; set; }
|
||||
/// <summary>规则执行表达式</summary>
|
||||
public string RuleExpr { get; set; }
|
||||
/// <summary>版本号(乐观锁)</summary>
|
||||
public int Version { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,16 +2,28 @@ using YLErp.DBModels;
|
||||
|
||||
namespace YLErp.Modules.RiskEngine.Dto
|
||||
{
|
||||
/// <summary>
|
||||
/// 更新变量请求
|
||||
/// </summary>
|
||||
public class UpdateRiskVariableReq
|
||||
{
|
||||
/// <summary>变量名称</summary>
|
||||
public string VariableName { get; set; }
|
||||
/// <summary>变量分类</summary>
|
||||
public RiskVariableCategory Category { get; set; }
|
||||
/// <summary>数据类型</summary>
|
||||
public RiskVariableDataType DataType { get; set; }
|
||||
/// <summary>单位</summary>
|
||||
public string Unit { get; set; }
|
||||
/// <summary>值域描述</summary>
|
||||
public string ValueDomain { get; set; }
|
||||
/// <summary>变量说明</summary>
|
||||
public string Description { get; set; }
|
||||
/// <summary>取值表达式</summary>
|
||||
public string VariableExpr { get; set; }
|
||||
/// <summary>排序序号</summary>
|
||||
public int SortOrder { get; set; }
|
||||
/// <summary>版本号(乐观锁)</summary>
|
||||
public int Version { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -221,6 +221,9 @@ namespace YLErp.Modules.RiskEngine
|
||||
|
||||
#region Private Helpers
|
||||
|
||||
/// <summary>
|
||||
/// 写入审计日志
|
||||
/// </summary>
|
||||
private void WriteAuditLog(string operationType, string targetType, long targetId,
|
||||
string targetName, string operationDetail, string result = "成功", string snapshotData = null)
|
||||
{
|
||||
@@ -240,6 +243,9 @@ namespace YLErp.Modules.RiskEngine
|
||||
DbContext.glms_risk_rule_audit_log.Add(log);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取变量表达式集合(5 分钟本地缓存)
|
||||
/// </summary>
|
||||
private HashSet<string> GetVariableExprSet()
|
||||
{
|
||||
if (_variableExprCache == null ||
|
||||
@@ -254,11 +260,17 @@ namespace YLErp.Modules.RiskEngine
|
||||
return _variableExprCache;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 失效变量表达式缓存
|
||||
/// </summary>
|
||||
private void InvalidateVariableCache()
|
||||
{
|
||||
_variableExprCache = null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 校验 ConditionJson(结构化模式:变量存在性、操作符、类型匹配)
|
||||
/// </summary>
|
||||
private void ValidateConditionJson(string conditionJson)
|
||||
{
|
||||
List<RuleCondition> conditions;
|
||||
@@ -341,6 +353,9 @@ namespace YLErp.Modules.RiskEngine
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 校验 RuleExpr(自由文本模式:括号匹配)
|
||||
/// </summary>
|
||||
private void ValidateRuleExpr(string ruleExpr)
|
||||
{
|
||||
if (ruleExpr.Length > 10000)
|
||||
@@ -358,6 +373,9 @@ namespace YLErp.Modules.RiskEngine
|
||||
throw new ServiceException("公式表达式括号不匹配:缺少右括号");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 校验触发时点
|
||||
/// </summary>
|
||||
private void ValidateTriggerPoints(string triggerPoints)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(triggerPoints))
|
||||
@@ -375,6 +393,9 @@ namespace YLErp.Modules.RiskEngine
|
||||
throw new ServiceException("至少需要指定一个触发时点");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 校验 Scope 适用范围字段
|
||||
/// </summary>
|
||||
private void ValidateScopeFields(CreateRiskApplicationReq req)
|
||||
{
|
||||
if (req.ScopeIsGlobal == 1)
|
||||
@@ -400,6 +421,9 @@ namespace YLErp.Modules.RiskEngine
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 校验 ID 列表格式
|
||||
/// </summary>
|
||||
private void ValidateIdList(string idList, string fieldName)
|
||||
{
|
||||
var parts = idList.Split(',');
|
||||
@@ -410,6 +434,9 @@ namespace YLErp.Modules.RiskEngine
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 尝试刷新引擎缓存(不抛异常)
|
||||
/// </summary>
|
||||
private void TryRefreshCache()
|
||||
{
|
||||
try
|
||||
@@ -422,6 +449,9 @@ namespace YLErp.Modules.RiskEngine
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取数据类型中文名
|
||||
/// </summary>
|
||||
private string GetDataTypeName(RiskVariableDataType dataType)
|
||||
{
|
||||
return dataType switch
|
||||
@@ -433,6 +463,9 @@ namespace YLErp.Modules.RiskEngine
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取规则实体,不存在则抛异常
|
||||
/// </summary>
|
||||
private glms_risk_rule GetRuleOrThrow(long ruleId)
|
||||
{
|
||||
var rule = DbContext.glms_risk_rule.FirstOrDefault(r => r.id == ruleId && r.Status != RiskRuleStatus.Deleted);
|
||||
@@ -441,6 +474,9 @@ namespace YLErp.Modules.RiskEngine
|
||||
return rule;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取应用配置实体,不存在则抛异常
|
||||
/// </summary>
|
||||
private glms_risk_rule_application GetApplicationOrThrow(long applicationId)
|
||||
{
|
||||
var app = DbContext.glms_risk_rule_application.FirstOrDefault(a => a.id == applicationId && a.Status != RiskRuleStatus.Deleted);
|
||||
@@ -449,6 +485,9 @@ namespace YLErp.Modules.RiskEngine
|
||||
return app;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取变量实体,不存在则抛异常
|
||||
/// </summary>
|
||||
private glms_risk_variable GetVariableOrThrow(long variableId)
|
||||
{
|
||||
var variable = DbContext.glms_risk_variable.FirstOrDefault(v => v.id == variableId);
|
||||
@@ -457,6 +496,9 @@ namespace YLErp.Modules.RiskEngine
|
||||
return variable;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 校验规则参数(名称 + ConditionJson + RuleExpr)
|
||||
/// </summary>
|
||||
private void ValidateRuleParams(string ruleName, string conditionJson, string ruleExpr)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(ruleName))
|
||||
@@ -475,6 +517,9 @@ namespace YLErp.Modules.RiskEngine
|
||||
ValidateRuleExpr(ruleExpr);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 解析逗号分隔的规则 ID 字符串为 List
|
||||
/// </summary>
|
||||
private List<long> ParseRuleIds(string ruleIds)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(ruleIds))
|
||||
@@ -495,6 +540,9 @@ namespace YLErp.Modules.RiskEngine
|
||||
return ids;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 校验规则 ID 列表是否全部 Active
|
||||
/// </summary>
|
||||
private void ValidateRuleIdsActive(string ruleIds)
|
||||
{
|
||||
var ids = ParseRuleIds(ruleIds);
|
||||
@@ -512,6 +560,9 @@ namespace YLErp.Modules.RiskEngine
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 根据规则 ID 字符串解析为规则名称字符串
|
||||
/// </summary>
|
||||
private string ResolveRuleNames(string ruleIds)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(ruleIds))
|
||||
@@ -569,6 +620,9 @@ namespace YLErp.Modules.RiskEngine
|
||||
return predicate != null ? query.Where(predicate) : query;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取控制策略中文名
|
||||
/// </summary>
|
||||
private static string GetStrategyName(RiskControlStrategy strategy)
|
||||
{
|
||||
return strategy switch
|
||||
@@ -589,6 +643,9 @@ namespace YLErp.Modules.RiskEngine
|
||||
["FUND_PAYMENT"] = "资金支付"
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// 将触发时点映射为中文
|
||||
/// </summary>
|
||||
private static string MapTriggerPointsToChinese(string triggerPoints)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(triggerPoints))
|
||||
@@ -603,6 +660,9 @@ namespace YLErp.Modules.RiskEngine
|
||||
|
||||
#region Rule Management
|
||||
|
||||
/// <summary>
|
||||
/// 查询规则列表(分页,含 ApplicationCount 子查询)
|
||||
/// </summary>
|
||||
public SearchListResult<RiskRuleListItem> QueryRuleList(QueryRiskRuleReq req)
|
||||
{
|
||||
var query = DbContext.glms_risk_rule
|
||||
@@ -646,6 +706,9 @@ namespace YLErp.Modules.RiskEngine
|
||||
return result.ToSearchList(req);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取规则详情(含关联应用摘要)
|
||||
/// </summary>
|
||||
public RiskRuleDetail GetRuleDetail(long ruleId)
|
||||
{
|
||||
var rule = GetRuleOrThrow(ruleId);
|
||||
@@ -679,6 +742,9 @@ namespace YLErp.Modules.RiskEngine
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 创建规则(ConditionJson 完整校验,事务包裹)
|
||||
/// </summary>
|
||||
public RiskRuleDetail CreateRule(CreateRiskRuleReq req)
|
||||
{
|
||||
ValidateRuleParams(req.RuleName, req.ConditionJson, req.RuleExpr);
|
||||
@@ -723,6 +789,9 @@ namespace YLErp.Modules.RiskEngine
|
||||
return GetRuleDetail(entity.id);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 更新规则(乐观锁校验,Version+1)
|
||||
/// </summary>
|
||||
public RiskRuleDetail UpdateRule(long ruleId, UpdateRiskRuleReq req)
|
||||
{
|
||||
var rule = GetRuleOrThrow(ruleId);
|
||||
@@ -749,6 +818,9 @@ namespace YLErp.Modules.RiskEngine
|
||||
return GetRuleDetail(ruleId);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 删除规则(软删除,有 Active 应用引用时拒绝)
|
||||
/// </summary>
|
||||
public void DeleteRule(long ruleId)
|
||||
{
|
||||
var rule = GetRuleOrThrow(ruleId);
|
||||
@@ -771,6 +843,9 @@ namespace YLErp.Modules.RiskEngine
|
||||
TryRefreshCache();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 启用规则(仅 Disabled → Active)
|
||||
/// </summary>
|
||||
public void EnableRule(long ruleId)
|
||||
{
|
||||
var rule = DbContext.glms_risk_rule.FirstOrDefault(r => r.id == ruleId && r.Status == RiskRuleStatus.Disabled);
|
||||
@@ -788,6 +863,9 @@ namespace YLErp.Modules.RiskEngine
|
||||
TryRefreshCache();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 停用规则(仅 Active → Disabled)
|
||||
/// </summary>
|
||||
public void DisableRule(long ruleId)
|
||||
{
|
||||
var rule = DbContext.glms_risk_rule.FirstOrDefault(r => r.id == ruleId && r.Status == RiskRuleStatus.Active);
|
||||
@@ -805,6 +883,9 @@ namespace YLErp.Modules.RiskEngine
|
||||
TryRefreshCache();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取规则版本历史(从审计日志 SnapshotData 提取)
|
||||
/// </summary>
|
||||
public List<RiskRuleVersionItem> GetRuleVersions(long ruleId)
|
||||
{
|
||||
GetRuleOrThrow(ruleId);
|
||||
@@ -842,6 +923,9 @@ namespace YLErp.Modules.RiskEngine
|
||||
return result;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 批量删除规则(逐条保护检查)
|
||||
/// </summary>
|
||||
public BatchOperationResult BatchDeleteRules(List<long> ruleIds)
|
||||
{
|
||||
var rules = DbContext.glms_risk_rule
|
||||
@@ -882,6 +966,9 @@ namespace YLErp.Modules.RiskEngine
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取规则关联的应用配置列表
|
||||
/// </summary>
|
||||
public List<RiskApplicationListItem> GetRuleApplications(long ruleId)
|
||||
{
|
||||
GetRuleOrThrow(ruleId);
|
||||
@@ -918,6 +1005,9 @@ namespace YLErp.Modules.RiskEngine
|
||||
return result;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取所有启用规则列表(轻量字段,供下拉选择)
|
||||
/// </summary>
|
||||
public List<RiskRuleSimpleItem> GetAllRuleList()
|
||||
{
|
||||
return DbContext.glms_risk_rule
|
||||
@@ -936,6 +1026,9 @@ namespace YLErp.Modules.RiskEngine
|
||||
|
||||
#region Application Management
|
||||
|
||||
/// <summary>
|
||||
/// 查询应用配置列表(多条件筛选,内存关联规则名称)
|
||||
/// </summary>
|
||||
public SearchListResult<RiskApplicationListItem> QueryApplicationList(QueryRiskApplicationReq req)
|
||||
{
|
||||
var query = DbContext.glms_risk_rule_application
|
||||
@@ -1000,6 +1093,9 @@ namespace YLErp.Modules.RiskEngine
|
||||
return pagedResult;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取应用配置详情(含关联规则信息)
|
||||
/// </summary>
|
||||
public RiskApplicationDetail GetApplicationDetail(long applicationId)
|
||||
{
|
||||
var app = DbContext.glms_risk_rule_application
|
||||
@@ -1027,6 +1123,9 @@ namespace YLErp.Modules.RiskEngine
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 创建应用配置(关联规则 Active 校验,事务包裹)
|
||||
/// </summary>
|
||||
public RiskApplicationDetail CreateApplication(CreateRiskApplicationReq req)
|
||||
{
|
||||
ValidateRuleIdsActive(req.RuleIds);
|
||||
@@ -1078,6 +1177,9 @@ namespace YLErp.Modules.RiskEngine
|
||||
return GetApplicationDetail(entity.id);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 更新应用配置(乐观锁校验)
|
||||
/// </summary>
|
||||
public RiskApplicationDetail UpdateApplication(long applicationId, UpdateRiskApplicationReq req)
|
||||
{
|
||||
var app = GetApplicationOrThrow(applicationId);
|
||||
@@ -1122,6 +1224,9 @@ namespace YLErp.Modules.RiskEngine
|
||||
return GetApplicationDetail(applicationId);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 删除应用配置(软删除)
|
||||
/// </summary>
|
||||
public void DeleteApplication(long applicationId)
|
||||
{
|
||||
var app = GetApplicationOrThrow(applicationId);
|
||||
@@ -1138,6 +1243,9 @@ namespace YLErp.Modules.RiskEngine
|
||||
TryRefreshCache();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 启用应用配置(校验关联规则状态)
|
||||
/// </summary>
|
||||
public void EnableApplication(long applicationId)
|
||||
{
|
||||
var app = DbContext.glms_risk_rule_application.FirstOrDefault(a => a.id == applicationId && a.Status == RiskRuleStatus.Disabled);
|
||||
@@ -1157,6 +1265,9 @@ namespace YLErp.Modules.RiskEngine
|
||||
TryRefreshCache();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 停用应用配置
|
||||
/// </summary>
|
||||
public void DisableApplication(long applicationId)
|
||||
{
|
||||
var app = DbContext.glms_risk_rule_application.FirstOrDefault(a => a.id == applicationId && a.Status == RiskRuleStatus.Active);
|
||||
@@ -1174,6 +1285,9 @@ namespace YLErp.Modules.RiskEngine
|
||||
TryRefreshCache();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 批量启用应用配置(逐条校验关联规则)
|
||||
/// </summary>
|
||||
public BatchOperationResult BatchEnableApplications(List<long> applicationIds)
|
||||
{
|
||||
var apps = DbContext.glms_risk_rule_application
|
||||
@@ -1209,6 +1323,9 @@ namespace YLErp.Modules.RiskEngine
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 批量停用应用配置
|
||||
/// </summary>
|
||||
public BatchOperationResult BatchDisableApplications(List<long> applicationIds)
|
||||
{
|
||||
var apps = DbContext.glms_risk_rule_application
|
||||
@@ -1243,6 +1360,9 @@ namespace YLErp.Modules.RiskEngine
|
||||
|
||||
#region Variable Management
|
||||
|
||||
/// <summary>
|
||||
/// 查询变量列表(全量返回,Category/Keyword 筛选)
|
||||
/// </summary>
|
||||
public SearchListResult<RiskVariableListItem> QueryVariableList(QueryRiskVariableReq req)
|
||||
{
|
||||
var query = DbContext.glms_risk_variable.AsQueryable();
|
||||
@@ -1280,6 +1400,9 @@ namespace YLErp.Modules.RiskEngine
|
||||
return result.ToSearchList(req);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取变量详情(含 ReferenceCount 引用统计)
|
||||
/// </summary>
|
||||
public RiskVariableDetail GetVariableDetail(long variableId)
|
||||
{
|
||||
var variable = GetVariableOrThrow(variableId);
|
||||
@@ -1310,6 +1433,9 @@ namespace YLErp.Modules.RiskEngine
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 创建变量(VariableExpr 长度校验 ≤10000,事务包裹)
|
||||
/// </summary>
|
||||
public RiskVariableDetail CreateVariable(CreateRiskVariableReq req)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(req.VariableName))
|
||||
@@ -1363,6 +1489,9 @@ namespace YLErp.Modules.RiskEngine
|
||||
return GetVariableDetail(entity.id);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 更新变量(乐观锁,DataType 变更保护,级联更新引用规则 RuleExpr)
|
||||
/// </summary>
|
||||
public RiskVariableDetail UpdateVariable(long variableId, UpdateRiskVariableReq req)
|
||||
{
|
||||
var variable = GetVariableOrThrow(variableId);
|
||||
@@ -1386,6 +1515,8 @@ namespace YLErp.Modules.RiskEngine
|
||||
throw new ServiceException($"该变量被 {activeRefCount} 个生效中的规则引用,无法修改数据类型");
|
||||
}
|
||||
|
||||
var oldVariableExpr = variable.VariableExpr;
|
||||
|
||||
variable.VariableName = req.VariableName;
|
||||
variable.Category = req.Category;
|
||||
variable.DataType = req.DataType;
|
||||
@@ -1399,8 +1530,52 @@ namespace YLErp.Modules.RiskEngine
|
||||
variable.UpdateOptName = UserName;
|
||||
variable.UpdateDate = DateTime.Now;
|
||||
|
||||
WriteAuditLog("VAR_UPDATE", "VARIABLE", variableId, req.VariableName, $"修改变量:{variable.VariableName}");
|
||||
DbContext.SaveChanges();
|
||||
var variableExprChanged = oldVariableExpr != req.VariableExpr;
|
||||
|
||||
if (variableExprChanged)
|
||||
{
|
||||
using (var transaction = DbContext.Database.BeginTransaction())
|
||||
{
|
||||
try
|
||||
{
|
||||
var affectedRules = DbContext.glms_risk_rule
|
||||
.Where(r => r.RuleExpr != null && r.RuleExpr.Contains(oldVariableExpr))
|
||||
.ToList();
|
||||
|
||||
foreach (var rule in affectedRules)
|
||||
{
|
||||
rule.RuleExpr = rule.RuleExpr.Replace(oldVariableExpr, req.VariableExpr);
|
||||
rule.Version = rule.Version + 1;
|
||||
rule.UpdateOptId = UserId;
|
||||
rule.UpdateOptName = UserName;
|
||||
rule.UpdateDate = DateTime.Now;
|
||||
}
|
||||
|
||||
DbContext.SaveChanges();
|
||||
|
||||
WriteAuditLog("VAR_UPDATE", "VARIABLE", variableId, req.VariableName, $"修改变量:{variable.VariableName}");
|
||||
|
||||
foreach (var rule in affectedRules)
|
||||
{
|
||||
WriteAuditLog("VAR_UPDATE_CASCADE", "RULE", rule.id, rule.RuleName,
|
||||
$"变量 [{variable.VariableName}] VariableExpr 变更,级联更新规则 RuleExpr");
|
||||
}
|
||||
|
||||
DbContext.SaveChanges();
|
||||
transaction.Commit();
|
||||
}
|
||||
catch
|
||||
{
|
||||
transaction.Rollback();
|
||||
throw;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
WriteAuditLog("VAR_UPDATE", "VARIABLE", variableId, req.VariableName, $"修改变量:{variable.VariableName}");
|
||||
DbContext.SaveChanges();
|
||||
}
|
||||
|
||||
InvalidateVariableCache();
|
||||
TryRefreshCache();
|
||||
@@ -1408,6 +1583,9 @@ namespace YLErp.Modules.RiskEngine
|
||||
return GetVariableDetail(variableId);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 删除变量(有 Active 引用时拒绝)
|
||||
/// </summary>
|
||||
public void DeleteVariable(long variableId)
|
||||
{
|
||||
var variable = GetVariableOrThrow(variableId);
|
||||
@@ -1429,6 +1607,9 @@ namespace YLErp.Modules.RiskEngine
|
||||
TryRefreshCache();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取所有变量列表(供下拉选择)
|
||||
/// </summary>
|
||||
public List<RiskVariableSimpleItem> GetAllVariableList()
|
||||
{
|
||||
var result = DbContext.glms_risk_variable
|
||||
@@ -1452,6 +1633,9 @@ namespace YLErp.Modules.RiskEngine
|
||||
|
||||
#region Audit Log
|
||||
|
||||
/// <summary>
|
||||
/// 查询审计日志列表(分页)
|
||||
/// </summary>
|
||||
public SearchListResult<RiskAuditLogListItem> QueryAuditLogs(QueryRiskAuditLogReq req)
|
||||
{
|
||||
var query = DbContext.glms_risk_rule_audit_log.AsQueryable();
|
||||
@@ -1516,11 +1700,17 @@ namespace YLErp.Modules.RiskEngine
|
||||
return result.ToSearchList(req);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 导出审计日志为 Excel
|
||||
/// </summary>
|
||||
public byte[] ExportAuditLogs(QueryRiskAuditLogReq req)
|
||||
{
|
||||
throw new ServiceException("导出功能暂未实现");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取审计日志详情
|
||||
/// </summary>
|
||||
public RiskAuditLogDetail GetAuditLogDetail(long logId)
|
||||
{
|
||||
var log = DbContext.glms_risk_rule_audit_log.FirstOrDefault(l => l.id == logId);
|
||||
|
||||
@@ -5,6 +5,7 @@ using YLErp.Modules.RiskEngine.Dto;
|
||||
|
||||
namespace YLErp.Web.Controllers
|
||||
{
|
||||
/// <summary>风控引擎管理控制器,提供规则、应用配置、变量池和审计日志的 CRUD 接口</summary>
|
||||
[Route("risk-engine")]
|
||||
public class RiskRuleController : BaseController
|
||||
{
|
||||
@@ -14,6 +15,7 @@ namespace YLErp.Web.Controllers
|
||||
|
||||
[HttpGet("risk-rules")]
|
||||
[MyAuthorize("风险控制-风控规则查看")]
|
||||
/// <summary>查询风控规则列表(分页)</summary>
|
||||
public JsonResult QueryRiskRules(QueryRiskRuleReq req)
|
||||
{
|
||||
try
|
||||
@@ -35,6 +37,7 @@ namespace YLErp.Web.Controllers
|
||||
|
||||
[HttpGet("risk-rules/{id}")]
|
||||
[MyAuthorize("风险控制-风控规则查看")]
|
||||
/// <summary>获取风控规则详情</summary>
|
||||
public JsonResult GetRiskRule(long id)
|
||||
{
|
||||
try
|
||||
@@ -56,6 +59,7 @@ namespace YLErp.Web.Controllers
|
||||
|
||||
[HttpGet("risk-rules/{id}/versions")]
|
||||
[MyAuthorize("风险控制-风控规则查看")]
|
||||
/// <summary>获取风控规则版本历史</summary>
|
||||
public JsonResult GetRiskRuleVersions(long id)
|
||||
{
|
||||
try
|
||||
@@ -77,6 +81,7 @@ namespace YLErp.Web.Controllers
|
||||
|
||||
[HttpPost("risk-rules")]
|
||||
[MyAuthorize("风险控制-风控规则新增")]
|
||||
/// <summary>创建风控规则</summary>
|
||||
public JsonResult CreateRiskRule([FromBody] CreateRiskRuleReq req)
|
||||
{
|
||||
try
|
||||
@@ -98,6 +103,7 @@ namespace YLErp.Web.Controllers
|
||||
|
||||
[HttpPut("risk-rules/{id}")]
|
||||
[MyAuthorize("风险控制-风控规则编辑")]
|
||||
/// <summary>更新风控规则</summary>
|
||||
public JsonResult UpdateRiskRule(long id, [FromBody] UpdateRiskRuleReq req)
|
||||
{
|
||||
try
|
||||
@@ -119,6 +125,7 @@ namespace YLErp.Web.Controllers
|
||||
|
||||
[HttpDelete("risk-rules/{id}")]
|
||||
[MyAuthorize("风险控制-风控规则删除")]
|
||||
/// <summary>删除风控规则(软删除)</summary>
|
||||
public JsonResult DeleteRiskRule(long id)
|
||||
{
|
||||
try
|
||||
@@ -140,6 +147,7 @@ namespace YLErp.Web.Controllers
|
||||
|
||||
[HttpDelete("risk-rules/batch")]
|
||||
[MyAuthorize("风险控制-风控规则删除")]
|
||||
/// <summary>批量删除风控规则</summary>
|
||||
public JsonResult BatchDeleteRiskRules([FromBody] List<long> ids)
|
||||
{
|
||||
try
|
||||
@@ -161,6 +169,7 @@ namespace YLErp.Web.Controllers
|
||||
|
||||
[HttpPost("risk-rules/{id}/enable")]
|
||||
[MyAuthorize("风险控制-风控规则启停")]
|
||||
/// <summary>启用风控规则</summary>
|
||||
public JsonResult EnableRiskRule(long id)
|
||||
{
|
||||
try
|
||||
@@ -182,6 +191,7 @@ namespace YLErp.Web.Controllers
|
||||
|
||||
[HttpPost("risk-rules/{id}/disable")]
|
||||
[MyAuthorize("风险控制-风控规则启停")]
|
||||
/// <summary>停用风控规则</summary>
|
||||
public JsonResult DisableRiskRule(long id)
|
||||
{
|
||||
try
|
||||
@@ -203,6 +213,7 @@ namespace YLErp.Web.Controllers
|
||||
|
||||
[HttpGet("risk-rules/{id}/applications")]
|
||||
[MyAuthorize("风险控制-风控规则查看")]
|
||||
/// <summary>获取规则关联的应用配置列表</summary>
|
||||
public JsonResult GetRuleApplications(long id)
|
||||
{
|
||||
try
|
||||
@@ -224,6 +235,7 @@ namespace YLErp.Web.Controllers
|
||||
|
||||
[HttpGet("risk-rules/list")]
|
||||
[MyAuthorize("风险控制-风控规则查看")]
|
||||
/// <summary>获取所有启用规则列表(供下拉选择)</summary>
|
||||
public JsonResult GetAllRiskRules()
|
||||
{
|
||||
try
|
||||
@@ -249,6 +261,7 @@ namespace YLErp.Web.Controllers
|
||||
|
||||
[HttpGet("risk-applications")]
|
||||
[MyAuthorize("风险控制-风控应用查看")]
|
||||
/// <summary>查询应用配置列表(分页)</summary>
|
||||
public JsonResult QueryRiskApplications(QueryRiskApplicationReq req)
|
||||
{
|
||||
try
|
||||
@@ -270,6 +283,7 @@ namespace YLErp.Web.Controllers
|
||||
|
||||
[HttpGet("risk-applications/{id}")]
|
||||
[MyAuthorize("风险控制-风控应用查看")]
|
||||
/// <summary>获取应用配置详情</summary>
|
||||
public JsonResult GetRiskApplication(long id)
|
||||
{
|
||||
try
|
||||
@@ -291,6 +305,7 @@ namespace YLErp.Web.Controllers
|
||||
|
||||
[HttpPost("risk-applications")]
|
||||
[MyAuthorize("风险控制-风控应用新增")]
|
||||
/// <summary>创建应用配置</summary>
|
||||
public JsonResult CreateRiskApplication([FromBody] CreateRiskApplicationReq req)
|
||||
{
|
||||
try
|
||||
@@ -312,6 +327,7 @@ namespace YLErp.Web.Controllers
|
||||
|
||||
[HttpPut("risk-applications/{id}")]
|
||||
[MyAuthorize("风险控制-风控应用编辑")]
|
||||
/// <summary>更新应用配置</summary>
|
||||
public JsonResult UpdateRiskApplication(long id, [FromBody] UpdateRiskApplicationReq req)
|
||||
{
|
||||
try
|
||||
@@ -333,6 +349,7 @@ namespace YLErp.Web.Controllers
|
||||
|
||||
[HttpDelete("risk-applications/{id}")]
|
||||
[MyAuthorize("风险控制-风控应用删除")]
|
||||
/// <summary>删除应用配置(软删除)</summary>
|
||||
public JsonResult DeleteRiskApplication(long id)
|
||||
{
|
||||
try
|
||||
@@ -354,6 +371,7 @@ namespace YLErp.Web.Controllers
|
||||
|
||||
[HttpPost("risk-applications/{id}/enable")]
|
||||
[MyAuthorize("风险控制-风控应用启停")]
|
||||
/// <summary>启用应用配置</summary>
|
||||
public JsonResult EnableRiskApplication(long id)
|
||||
{
|
||||
try
|
||||
@@ -375,6 +393,7 @@ namespace YLErp.Web.Controllers
|
||||
|
||||
[HttpPost("risk-applications/{id}/disable")]
|
||||
[MyAuthorize("风险控制-风控应用启停")]
|
||||
/// <summary>停用应用配置</summary>
|
||||
public JsonResult DisableRiskApplication(long id)
|
||||
{
|
||||
try
|
||||
@@ -396,6 +415,7 @@ namespace YLErp.Web.Controllers
|
||||
|
||||
[HttpPost("risk-applications/batch-enable")]
|
||||
[MyAuthorize("风险控制-风控应用启停")]
|
||||
/// <summary>批量启用应用配置</summary>
|
||||
public JsonResult BatchEnableRiskApplications([FromBody] List<long> ids)
|
||||
{
|
||||
try
|
||||
@@ -417,6 +437,7 @@ namespace YLErp.Web.Controllers
|
||||
|
||||
[HttpPost("risk-applications/batch-disable")]
|
||||
[MyAuthorize("风险控制-风控应用启停")]
|
||||
/// <summary>批量停用应用配置</summary>
|
||||
public JsonResult BatchDisableRiskApplications([FromBody] List<long> ids)
|
||||
{
|
||||
try
|
||||
@@ -442,6 +463,7 @@ namespace YLErp.Web.Controllers
|
||||
|
||||
[HttpGet("risk-variables")]
|
||||
[MyAuthorize("风险控制-风控变量查看")]
|
||||
/// <summary>查询变量列表</summary>
|
||||
public JsonResult QueryRiskVariables(QueryRiskVariableReq req)
|
||||
{
|
||||
try
|
||||
@@ -463,6 +485,7 @@ namespace YLErp.Web.Controllers
|
||||
|
||||
[HttpGet("risk-variables/{id}")]
|
||||
[MyAuthorize("风险控制-风控变量查看")]
|
||||
/// <summary>获取变量详情</summary>
|
||||
public JsonResult GetRiskVariable(long id)
|
||||
{
|
||||
try
|
||||
@@ -484,6 +507,7 @@ namespace YLErp.Web.Controllers
|
||||
|
||||
[HttpGet("risk-variables/list")]
|
||||
[MyAuthorize("风险控制-风控变量查看")]
|
||||
/// <summary>获取所有变量列表(供下拉选择)</summary>
|
||||
public JsonResult GetAllRiskVariables()
|
||||
{
|
||||
try
|
||||
@@ -505,6 +529,7 @@ namespace YLErp.Web.Controllers
|
||||
|
||||
[HttpPost("risk-variables")]
|
||||
[MyAuthorize("风险控制-风控变量新增")]
|
||||
/// <summary>创建变量</summary>
|
||||
public JsonResult CreateRiskVariable([FromBody] CreateRiskVariableReq req)
|
||||
{
|
||||
try
|
||||
@@ -526,6 +551,7 @@ namespace YLErp.Web.Controllers
|
||||
|
||||
[HttpPut("risk-variables/{id}")]
|
||||
[MyAuthorize("风险控制-风控变量编辑")]
|
||||
/// <summary>更新变量(含级联更新引用规则的 RuleExpr)</summary>
|
||||
public JsonResult UpdateRiskVariable(long id, [FromBody] UpdateRiskVariableReq req)
|
||||
{
|
||||
try
|
||||
@@ -547,6 +573,7 @@ namespace YLErp.Web.Controllers
|
||||
|
||||
[HttpDelete("risk-variables/{id}")]
|
||||
[MyAuthorize("风险控制-风控变量删除")]
|
||||
/// <summary>删除变量</summary>
|
||||
public JsonResult DeleteRiskVariable(long id)
|
||||
{
|
||||
try
|
||||
@@ -572,6 +599,7 @@ namespace YLErp.Web.Controllers
|
||||
|
||||
[HttpGet("trade-types")]
|
||||
[MyAuthorize("风险控制-风控应用查看")]
|
||||
/// <summary>获取合约类型列表</summary>
|
||||
public JsonResult GetTradeTypes()
|
||||
{
|
||||
try
|
||||
@@ -601,6 +629,7 @@ namespace YLErp.Web.Controllers
|
||||
|
||||
[HttpGet("risk-audit-logs")]
|
||||
[MyAuthorize("风险控制-风控日志查看")]
|
||||
/// <summary>查询风控操作日志列表(分页)</summary>
|
||||
public JsonResult QueryRiskAuditLogs(QueryRiskAuditLogReq req)
|
||||
{
|
||||
try
|
||||
@@ -622,6 +651,7 @@ namespace YLErp.Web.Controllers
|
||||
|
||||
[HttpGet("risk-audit-logs/{id}")]
|
||||
[MyAuthorize("风险控制-风控日志查看")]
|
||||
/// <summary>获取风控操作日志详情</summary>
|
||||
public JsonResult GetRiskAuditLogDetail(long id)
|
||||
{
|
||||
try
|
||||
@@ -643,6 +673,7 @@ namespace YLErp.Web.Controllers
|
||||
|
||||
[HttpGet("risk-audit-logs/export")]
|
||||
[MyAuthorize("风险控制-风控日志导出")]
|
||||
/// <summary>导出风控操作日志为 Excel</summary>
|
||||
public IActionResult ExportRiskAuditLogs(QueryRiskAuditLogReq req)
|
||||
{
|
||||
try
|
||||
|
||||
Reference in New Issue
Block a user