using System; namespace YLErp.Modules.RiskEngine { /// /// 风控规则应用配置。 /// /// 设计原因: /// 依据设计文档,风控规则需要区分“规则定义”和“规则应用”两个层面。 /// RiskRule 负责定义“规则是什么”,例如规则名称、规则编码、公式表达式、描述、版本等; /// RiskRuleApplication 负责定义“规则在什么场景下如何执行”,例如启用状态、校验策略、触发时点、适用范围。 /// /// 拆分后的好处是: /// 1. 同一条规则可以被多个应用配置复用,避免重复维护相同的公式定义。 /// 2. 不同业务场景可以对同一条规则配置不同的执行策略,例如在簿记确认时禁止,在平仓审核时提示。 /// 3. 调整触发时点、适用范围、控制策略时,不需要修改规则本身,降低配置耦合。 /// 4. 后续如果要做规则管理页面、规则启停、按场景灰度投放,也更容易扩展。 /// /// 当前文件先定义第一版最小模型,用于支撑基础流程跑通和示例数据加载。 /// /// /// 规则应用状态枚举。 /// 用于描述一条规则应用配置当前是否参与风控执行。 /// public enum RiskRuleApplicationStatusEnum { /// /// 已生效。 /// 当前应用配置可正常参与风控判断。 /// Active = 1, /// /// 已停用。 /// 当前应用配置暂不参与风控判断,但配置仍被保留。 /// Disabled = 2, /// /// 已删除。 /// 当前应用配置逻辑上已删除,通常不再参与任何执行。 /// Deleted = 3 } /// /// 风控控制策略枚举。 /// 用于描述规则命中后的处理方式。 /// public enum RiskControlStrategyEnum { /// /// 禁止。 /// 规则命中后直接拦截,不允许继续后续流程。 /// Block = 1, /// /// 审批。 /// 规则命中后不直接放行,需要进入审批流程。 /// Approval = 2, /// /// 提示。 /// 规则命中后只给出风险提示,不阻断流程。 /// Warning = 3 } public class RiskRuleApplication { /// /// 应用配置主键ID。 /// 用于唯一标识一条规则应用记录。 /// public int Id { get; set; } /// /// 关联的规则编码。 /// 通过该字段与 RiskRule.RuleCode 关联,表示当前应用配置对应哪一条规则定义。 /// 第一版先用字符串编码关联,后续如有需要也可以扩展为 RuleId。 /// public string RuleCode { get; set; } /// /// 应用状态。 /// 约定: /// 1 = Active(已生效) /// 2 = Disabled(已停用) /// 3 = Deleted(已删除) /// 在实际执行时,通常只加载 Active 状态的应用配置。 /// public RiskRuleApplicationStatusEnum Status { get; set; } /// /// 校验策略。 /// 约定: /// 1 = 禁止 /// 2 = 审批 /// 3 = 提示 /// 当规则命中时,由该字段决定最终处理方式。 /// public RiskControlStrategyEnum ControlStrategy { get; set; } /// /// 触发时点。 /// 多个时点使用逗号分隔,例如: /// BOOK_CONFIRM,CLOSE_REVIEW /// 表示该应用配置会在这些业务时点参与风控判断。 /// public string TriggerPoints { get; set; } /// /// 是否全局适用。 /// true 表示对所有交易都适用,此时通常忽略其他 Scope 字段; /// false 表示只在指定范围内适用,需要结合下方各 Scope 字段进行过滤。 /// public bool ScopeIsGlobal { get; set; } /// /// 适用的资产簿记账户范围。 /// 第一版使用逗号分隔的字符串保存,例如: /// 123,456,789 /// 后续执行时可按约定解析为账户ID集合。 /// public string ScopeAssetBookIds { get; set; } /// /// 适用的客户范围。 /// 第一版使用逗号分隔的字符串保存客户ID,例如: /// 10001,10002 /// 用于在执行前筛选该规则是否适用于当前客户。 /// public string ScopeClientIds { get; set; } /// /// 适用的标的类型范围。 /// 例如: /// 股票,ETF,债券 /// 用于控制规则仅对特定标的类型生效。 /// public string ScopeUnderlyingTypes { get; set; } /// /// 适用的交易类型范围。 /// 例如: /// 簿记交易,平仓交易 /// 用于控制规则仅在指定交易类型下生效。 /// public string ScopeTradeTypes { get; set; } /// /// 创建人ID。 /// 记录是谁创建了这条应用配置。 /// public int OptId { get; set; } /// /// 创建人名称。 /// 便于界面展示和审计追踪。 /// public string OptName { get; set; } /// /// 创建时间。 /// 记录应用配置的创建时刻。 /// public DateTime OptDate { get; set; } /// /// 最后更新人ID。 /// 记录最近一次修改该应用配置的操作人。 /// public int UpdateOptId { get; set; } /// /// 最后更新人名称。 /// 便于界面展示和审计追踪。 /// public string UpdateOptName { get; set; } /// /// 最后更新时间。 /// 记录最近一次修改该应用配置的时间。 /// public DateTime UpdateDate { get; set; } } }