-- ============================================================
-- 规则初始数据（对应当前 glms_risk_rule 数据库内容）
-- 依赖：seed_risk_engine_variables.sql（变量池数据需先插入）
--
-- 变量 ID 映射（seed_risk_engine_variables.sql 自增）：
--   1=合约名义本金    2=合约起息日      3=合约到期日      4=合约平仓日
--   5=合约支付日      6=期初净价        7=期初全价        8=期初收益率
--   9=期初价格       10=期末全价       11=期末价格       12=保证金利率
--  13=保证金比例     14=客户授信额度
--  15=上一收盘日中债估值净价  16=上一收盘日中债估值全价  17=上一收盘日中债估值收益率
--  18=上一日收盘价   19=借贷加权费率   20=FR007          21=当前日期
--  22=挂钩标的到期日  23=标的发行余额
--  24=挂钩标的集中度  25=授信占用率     26=合约期限       27=Delta
--  28=Gamma          29=Vega           30=Theta          31=利息端利率
--  32=对手方累计标的数量  33=同一标的累计名义本金  34=同一客户累计名义本金
--  35=总持仓名义本金
--  36=到期日是否银行间交易日  37=平仓日是否银行间交易日  38=支付日是否银行间交易日
--  39=利息端/浮动端方向是否同向  40=关键业务要素是否一致
--  41=多空方向为多头  42=多空方向为空头
--  43=保证金收支方向为支付  44=保证金收支方向为收取
--  45=期初净价偏离度  46=期初收益率偏离度  47=期初价格偏离度
--  48=利息端利率与FR007偏离度  49=利息端利率与借贷加权费率偏离度
--  50=执行价偏离度  51=执行价  52=客户品种最低保证金率  53=参考价格
--
-- ConditionJson 仅保存执行所需字段：普通比较使用 VariableId/Operator/ThresholdType/Value/ThresholdVariableId；
-- 区间比较使用 Lower/UpperThresholdType、Lower/UpperValue、Lower/UpperThresholdVariableId、IncludeLower/IncludeUpper。
-- 修改原因：Operator 使用 gt/lt 等稳定 token，避免 >、< 在接口传输中发生 HTML 转义。
-- RuleExpr 保持现有简洁 C# 公式；编译前类型转换由 RiskEngineCompiler 负责。
-- 展示字段（VariableName/VariableType/Unit/ThresholdVariableName）从变量接口关联获取
-- ============================================================


-- ============================================================
-- 插入当前数据库中的 6 条规则，保留原始 ID 以匹配规则应用表 RuleIds
-- ============================================================

INSERT INTO `yltrs_ylcms`.`glms_risk_rule` (`id`, `RuleName`, `RuleText`, `ConditionJson`, `RuleExpr`, `Description`, `Status`, `Version`, `OptId`, `OptName`, `OptDate`, `UpdateOptId`, `UpdateOptName`, `UpdateDate`) VALUES
(3,
 '名义本金超阈值',
 '合约名义本金 > 1亿',
 '[{"VariableId":1,"Operator":"gt","ThresholdType":"Fixed","Value":100000000}]',
 'DbContext.trade.First(t => t.id == TradeId).StockEqvNotional > 100000000',
 '',
 2,
 14,
 0,
 'SYSTEM',
 '2026-06-24 15:51:47',
 1,
 '初始用户',
 '2026-07-17 14:50:33'),
(12,
 '债券类净价偏离',
 '期初净价与上一收盘日中债估值净价绝对价差大于5元时触发审批',
 '',
 'Math.Abs(DbContext.swap_position.First(p => p.SwapTradeId == TradeId && p.IsInitial && !p.Invalid && p.PosiDirection == 2 && !string.IsNullOrEmpty(p.UnderlyingCode)).PosiNetNoFeePrice.Value * 100m - DbContext.china_bond_valuation.Where(v => v.bond_id == DbContext.swap_position.First(p => p.SwapTradeId == TradeId && p.IsInitial && !p.Invalid && p.PosiDirection == 2 && !string.IsNullOrEmpty(p.UnderlyingCode)).UnderlyingCode && v.valuation_date < DbContext.trade.First(t => t.id == TradeId).TradeDate.Value.Date).OrderBy(v => v.credibility).ThenByDescending(v => v.valuation_date).First().net_price.Value) > 5m',
 NULL,
 2,
 9,
 0,
 'SYSTEM',
 '2026-06-24 15:51:47',
 1,
 '初始用户',
 '2026-07-17 14:50:29'),
(13,
 '债券类收益率偏离',
 '',
 '',
 'Math.Abs(DbContext.swap_position.First(p => p.SwapTradeId == TradeId && p.IsInitial && !p.Invalid && p.PosiDirection == 2 && !string.IsNullOrEmpty(p.UnderlyingCode)).InitYtm.Value * 100m - DbContext.china_bond_valuation.Where(v => v.bond_id == DbContext.swap_position.First(p => p.SwapTradeId == TradeId && p.IsInitial && !p.Invalid && p.PosiDirection == 2 && !string.IsNullOrEmpty(p.UnderlyingCode)).UnderlyingCode && v.valuation_date < DbContext.trade.First(t => t.id == TradeId).TradeDate.Value.Date).OrderBy(v => v.credibility).ThenByDescending(v => v.valuation_date).First().yield.Value) > 0.4m',
 '',
 2,
 10,
 0,
 'SYSTEM',
 '2026-06-24 15:51:47',
 1,
 '初始用户',
 '2026-07-17 14:50:21'),
(14,
 '非债券类价格偏离',
 'TRS非债券价格偏离绝对值 > 5元',
 '[{"VariableId":47,"Operator":"gt","ThresholdType":"Fixed","Value":5}]',
 'Math.Abs(DbContext.swap_position.First(p => p.SwapTradeId == TradeId && p.IsInitial && !p.Invalid && p.PosiDirection == 2 && !string.IsNullOrEmpty(p.UnderlyingCode)).PosiGrossPrice * 100 - Convert.ToDecimal(DbContext.eod_commodity_future_price.Where(e => e.UnderlyingCode == DbContext.swap_position.First(p => p.SwapTradeId == TradeId && p.IsInitial && !p.Invalid && p.PosiDirection == 2 && !string.IsNullOrEmpty(p.UnderlyingCode)).UnderlyingCode && e.ValueDate < DbContext.trade.First(t => t.id == TradeId).TradeDate.Value.Date).OrderByDescending(e => e.ValueDate).First().ClosePrice)) > 5',
 '',
 2,
 8,
 0,
 'SYSTEM',
 '2026-06-24 15:51:47',
 1,
 '初始用户',
 '2026-07-17 14:50:37'),
(15,
 '单一交易对手累计标的数量超阈值',
 '对手方累计标的数量 > 10个',
 '[{"VariableId":32,"Operator":"gt","ThresholdType":"Fixed","Value":10}]',
 'DbContext.swap_position.Where(p => !string.IsNullOrEmpty(p.UnderlyingCode) && !p.IsInitial && p.PosiQuantity > 0 && !p.Invalid && p.PosiDirection > 0 && DbContext.trade.Any(t => t.id == p.SwapTradeId && t.ValidState != "InValid" && t.ClientId == DbContext.trade.First(x => x.id == TradeId).ClientId)).Select(p => p.UnderlyingCode).Distinct().Count() > 10',
 '',
 2,
 8,
 0,
 'SYSTEM',
 '2026-06-24 15:51:47',
 1,
 '初始用户',
 '2026-07-17 14:50:18'),
(16,
 '多头支付固定端利率偏离',
 '利息端利率与FR007偏离度 > 3%',
 '[{"VariableId":48,"Operator":"gt","ThresholdType":"Fixed","Value":3}]',
 'Math.Abs(DbContext.swap_position.First(p => p.SwapTradeId == TradeId && p.InterestDirection == 1).InterestRateDefault)*100m > 3',
 '',
 2,
 5,
 0,
 'SYSTEM',
 '2026-06-24 15:51:47',
 1,
 '初始用户',
 '2026-07-17 14:54:18');
