using System;
namespace YLErp.Modules.RiskEngine
{
///
/// 风控规则(合并模型:规则定义 + 应用配置合一)
///
/// 最终设计说明:
/// 业务上不需要 "一个 Rule 对应多个 Application" 的复杂关系。
/// 每条规则自身包含:公式定义 + 校验策略 + 触发时点 + 适用范围。
/// 规则创建时即完成脚本编译,判风控时直接执行已编译委托(零解析开销)。
///
public class RiskRule
{
// === 基础信息 ===
public int Id { get; set; }
public string RuleCode { get; set; }
public string RuleName { get; set; }
public string Description { get; set; }
///
/// 【核心】用户输入的规则内容字符串,如"名义本金>1亿"
/// 在规则创建/加载时由 RuleCompiler 解析并编译为 CompiledScript
///
public string FormulaText { get; set; }
///
/// 【核心】公式 JSON(条件列表的结构化存储),如
/// {"conditions":[{"variableCode":"trade.StockEqvNotional","operator":">","value":100000000}]}
/// 由 RuleCompiler 解析并编译为 CompiledScript
///
public string FormulaJson { get; set; }
// === 校验策略(原 Application.ControlStrategy)===
///
/// 校验策略:1=禁止, 2=审批, 3=提示
///
public int ControlStrategy { get; set; }
// === 触发时点(原 Application.TriggerPoints)===
///
/// 触发时点,逗号分隔(如 BOOK_CONFIRM,CLOSE_REVIEW)
///
public string TriggerPoints { get; set; }
// === 适用范围(原 Application.Scope*)===
///
/// 是否全局适用(true=所有交易适用,忽略其他 Scope 字段)
///
public bool ScopeIsGlobal { get; set; }
public string ScopeAssetBookIds { get; set; }
public string ScopeClientIds { get; set; }
public string ScopeUnderlyingTypes { get; set; }
public string ScopeTradeTypes { get; set; }
// === 生命周期 ===
///
/// 状态:1=已生效(Active), 2=已停用(Disabled), 3=已删除(Deleted)
///
public int Status { get; set; }
public int Version { get; set; }
public bool IsDeleted { get; set; }
// === 审计字段 ===
public int OptId { get; set; }
public string OptName { get; set; }
public DateTime OptDate { get; set; }
public int UpdateOptId { get; set; }
public string UpdateOptName { get; set; }
public DateTime UpdateDate { get; set; }
// === 运行时内存字段(不持久化到数据库)===
///
/// 【核心】预编译的可执行委托
/// 在规则创建/加载时由 RuleCompiler.Compile(this) 生成
/// 判风控时直接调用:rule.CompiledScript(context) → bool
///
public Func CompiledScript { get; set; }
}
}