-- ============================================================ -- 规则初始数据(对应当前 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');