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:
ruisu
2026-06-24 15:44:07 +08:00
47 changed files with 3121 additions and 174 deletions
+14
View File
@@ -160,3 +160,17 @@ csharp_preserve_single_line_statements = true
# CA1819: Properties should not return arrays
dotnet_diagnostic.CA1819.severity = silent
# JavaScript 和 TypeScript 文件
[*.{js,jsx,ts,tsx}]
# 缩进和间距
indent_size = 4
indent_style = space
tab_width = 4
# 新行首选项
end_of_line = crlf
insert_final_newline = false
# 拖尾逗号不添加
trailing_comma = none
@@ -0,0 +1,9 @@
namespace YLErp.DBModels
{
public enum RiskControlStrategy
{
Block = 1,
Approval = 2,
Warning = 3
}
}
@@ -0,0 +1,9 @@
namespace YLErp.DBModels
{
public enum RiskRuleStatus
{
Active = 1,
Disabled = 2,
Deleted = 3
}
}
@@ -0,0 +1,10 @@
namespace YLErp.DBModels
{
public enum RiskVariableCategory
{
BookingElement = 1,
MarketData = 2,
SystemCalc = 3,
BooleanCheck = 4
}
}
@@ -0,0 +1,9 @@
namespace YLErp.DBModels
{
public enum RiskVariableDataType
{
Numeric = 1,
Date = 2,
Boolean = 3
}
}
@@ -0,0 +1,18 @@
using System.ComponentModel.DataAnnotations.Schema;
namespace YLErp.DBModels
{
[Table("glms_risk_rule")]
public class glms_risk_rule : DBModelWithOperator
{
public string RuleName { get; set; }
public string RuleText { get; set; }
public string ConditionJson { get; set; }
public string RuleExpr { get; set; }
public RiskRuleStatus Status { get; set; } = RiskRuleStatus.Active;
public int Version { get; set; } = 1;
public int? UpdateOptId { get; set; }
public string UpdateOptName { get; set; }
public DateTime? UpdateDate { get; set; }
}
}
@@ -0,0 +1,22 @@
using System.ComponentModel.DataAnnotations.Schema;
namespace YLErp.DBModels
{
[Table("glms_risk_rule_application")]
public class glms_risk_rule_application : DBModelWithOperator
{
public string RuleIds { get; set; }
public RiskRuleStatus Status { get; set; } = RiskRuleStatus.Active;
public RiskControlStrategy ControlStrategy { get; set; }
public string TriggerPoints { get; set; }
public string ScopeAssetBookIds { get; set; }
public string ScopeClientIds { get; set; }
public string ScopeUnderlyingTypes { get; set; }
public string ScopeTradeTypes { get; set; }
public bool ScopeIsGlobal { get; set; }
public int Version { get; set; } = 1;
public int? UpdateOptId { get; set; }
public string UpdateOptName { get; set; }
public DateTime? UpdateDate { get; set; }
}
}
@@ -0,0 +1,19 @@
using System.ComponentModel.DataAnnotations.Schema;
namespace YLErp.DBModels
{
[Table("glms_risk_rule_audit_log")]
public class glms_risk_rule_audit_log : DBModelBase
{
public string OperationType { get; set; }
public string TargetType { get; set; }
public long TargetId { get; set; }
public string TargetName { get; set; }
public string OperationDetail { get; set; }
public string Result { get; set; }
public string SnapshotData { get; set; }
public long OptId { get; set; }
public string OptName { get; set; }
public DateTime OptDate { get; set; }
}
}
@@ -0,0 +1,21 @@
using System.ComponentModel.DataAnnotations.Schema;
namespace YLErp.DBModels
{
[Table("glms_risk_variable")]
public class glms_risk_variable : DBModelWithOperator
{
public string VariableName { get; set; }
public RiskVariableCategory Category { get; set; }
public RiskVariableDataType DataType { get; set; }
public string Unit { get; set; }
public string ValueDomain { get; set; }
public string Description { get; set; }
public string VariableExpr { get; set; }
public int Version { get; set; } = 1;
public int SortOrder { get; set; }
public int? UpdateOptId { get; set; }
public string UpdateOptName { get; set; }
public DateTime? UpdateDate { get; set; }
}
}
@@ -0,0 +1,82 @@
SET FOREIGN_KEY_CHECKS=0;
CREATE TABLE `glms_risk_rule` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '主键Id',
`RuleName` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '规则名称',
`RuleText` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '规则文本',
`ConditionJson` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '条件JSON(结构化模式, FormulaCondition数组)',
`RuleExpr` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '规则表达式(自由文本模式, 类C#表达式)',
`Status` tinyint NOT NULL DEFAULT 1 COMMENT '状态: 1=Active, 2=Disabled, 3=Deleted',
`Version` int NOT NULL DEFAULT 1 COMMENT '版本号(乐观锁)',
`OptId` int NULL DEFAULT NULL COMMENT '创建人Id',
`OptName` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人名称',
`OptDate` datetime NULL DEFAULT NULL COMMENT '创建时间',
`UpdateOptId` int NULL DEFAULT NULL COMMENT '最后修改人Id',
`UpdateOptName` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '最后修改人名称',
`UpdateDate` datetime NULL DEFAULT NULL COMMENT '最后修改时间',
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_status`(`Status` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '风控规则定义表' ROW_FORMAT = Dynamic;
CREATE TABLE `glms_risk_rule_application` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '主键Id',
`RuleIds` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '关联规则Id列表(逗号分隔)',
`Status` tinyint NOT NULL DEFAULT 1 COMMENT '状态: 1=Active, 2=Disabled, 3=Deleted',
`ControlStrategy` tinyint NOT NULL COMMENT '控制策略: 1=Block, 2=Approval, 3=Warning',
`TriggerPoints` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '触发时点(逗号分隔)',
`ScopeAssetBookIds` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '适用账户Id列表',
`ScopeClientIds` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '适用对手方Id列表',
`ScopeUnderlyingTypes` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '适用标的类型',
`ScopeTradeTypes` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '适用合约类型',
`ScopeIsGlobal` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否全局适用: 0=否, 1=是',
`Version` int NOT NULL DEFAULT 1 COMMENT '版本号(乐观锁)',
`OptId` int NULL DEFAULT NULL COMMENT '创建人Id',
`OptName` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人名称',
`OptDate` datetime NULL DEFAULT NULL COMMENT '创建时间',
`UpdateOptId` int NULL DEFAULT NULL COMMENT '最后修改人Id',
`UpdateOptName` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '最后修改人名称',
`UpdateDate` datetime NULL DEFAULT NULL COMMENT '最后修改时间',
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_status`(`Status` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '风控规则应用配置表' ROW_FORMAT = Dynamic;
CREATE TABLE `glms_risk_rule_audit_log` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '主键Id',
`OperationType` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '操作类型(RULE_CREATE/RULE_UPDATE等)',
`TargetType` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '目标类型(RULE/APPLICATION/VARIABLE)',
`TargetId` bigint NOT NULL COMMENT '目标记录Id',
`TargetName` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '目标名称',
`OperationDetail` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '操作详情',
`Result` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '操作结果',
`SnapshotData` longtext CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '快照数据(JSON)',
`OptId` bigint NOT NULL COMMENT '操作人Id',
`OptName` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '操作人名称',
`OptDate` datetime NOT NULL COMMENT '操作时间',
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_opt_date`(`OptDate` ASC) USING BTREE,
INDEX `idx_operation_type`(`OperationType` ASC) USING BTREE,
INDEX `idx_target_type`(`TargetType` ASC) USING BTREE,
INDEX `idx_target_id`(`TargetId` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '风控规则操作审计日志表' ROW_FORMAT = Dynamic;
CREATE TABLE `glms_risk_variable` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '主键Id',
`VariableName` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '变量名称',
`Category` tinyint NOT NULL COMMENT '分类: 1=BookingElement, 2=MarketData, 3=SystemCalc, 4=BooleanCheck',
`DataType` tinyint NOT NULL COMMENT '数据类型: 1=Numeric, 2=Date, 3=Boolean',
`Unit` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '单位',
`ValueDomain` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '值域描述',
`Description` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '描述',
`VariableExpr` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '变量表达式(C#表达式)',
`Version` int NOT NULL DEFAULT 1 COMMENT '版本号(乐观锁)',
`SortOrder` int NOT NULL DEFAULT 0 COMMENT '排序',
`OptId` int NULL DEFAULT NULL COMMENT '创建人Id',
`OptName` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人名称',
`OptDate` datetime NULL DEFAULT NULL COMMENT '创建时间',
`UpdateOptId` int NULL DEFAULT NULL COMMENT '最后修改人Id',
`UpdateOptName` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '最后修改人名称',
`UpdateDate` datetime NULL DEFAULT NULL COMMENT '最后修改时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '风控变量池定义表' ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS=1;
@@ -0,0 +1,59 @@
-- ============================================================
-- 变量池初始数据(对应设计文档 §4.4 变量池完整清单)
-- ============================================================
-- 4.4.1 簿记要素类(Category=1
INSERT INTO `glms_risk_variable` (`VariableName`, `Category`, `DataType`, `Unit`, `ValueDomain`, `Description`, `VariableExpr`, `SortOrder`, `OptId`, `OptName`, `OptDate`) VALUES
('合约名义本金', 1, 1, '', '≥ 0', 'trade.StockEqvNotional 或 swap_position.PosiNotionalValue', 'trade.StockEqvNotional', 101, 0, 'SYSTEM', NOW()),
('合约起息日', 1, 2, NULL, NULL, 'trade.StartDate 或 swap_position.PosiStartDate', 'trade.StartDate', 102, 0, 'SYSTEM', NOW()),
('合约到期日', 1, 2, NULL, NULL, 'trade.ExerciseDate 或 swap_position.PosiMatuirityDate', 'trade.ExerciseDate', 103, 0, 'SYSTEM', NOW()),
('合约平仓日', 1, 2, NULL, NULL, 'trade.UnWindDate', 'trade.UnWindDate', 104, 0, 'SYSTEM', NOW()),
('合约支付日', 1, 2, NULL, NULL, 'trade.SettlementDate', 'trade.SettlementDate', 105, 0, 'SYSTEM', NOW()),
('期初净价', 1, 1, '', '≥ 0', 'swap_position.PosiNetNoFeePrice(债券 TRS', 'swap_position.PosiNetNoFeePrice', 106, 0, 'SYSTEM', NOW()),
('期初全价', 1, 1, '', '≥ 0', 'swap_position.PosiNetFeePrice(债券 TRS/ trade.SpotPrice(其他)', 'swap_position.PosiNetFeePrice', 107, 0, 'SYSTEM', NOW()),
('期初收益率', 1, 1, '%', NULL, 'trade.InitYtm 或 swap_position.InitYtm', 'trade.InitYtm', 108, 0, 'SYSTEM', NOW()),
('期初价格', 1, 1, '', '≥ 0', 'trade.SpotPrice(非债券类)', 'trade.SpotPrice', 109, 0, 'SYSTEM', NOW()),
('期末全价', 1, 1, '', '≥ 0', 'eod_swap_position.UnderlyingPrice(债券 TRS', 'eod_swap_position.UnderlyingPrice', 110, 0, 'SYSTEM', NOW()),
('期末价格', 1, 1, '', '≥ 0', 'trade.FinalPrice', 'trade.FinalPrice', 111, 0, 'SYSTEM', NOW()),
('保证金利率', 1, 1, '%', NULL, 'client_marginrate.InitMarginRebateRate', 'client_marginrate.InitMarginRebateRate', 112, 0, 'SYSTEM', NOW()),
('保证金比例', 1, 1, '%', '0~100', 'trade.MarginRate', 'trade.MarginRate', 113, 0, 'SYSTEM', NOW()),
('客户授信额度', 1, 1, '', '≥ 0', 'credit.Credit', 'credit.Credit', 114, 0, 'SYSTEM', NOW());
-- 4.4.2 行情类(Category=2,统一取上一交易日收盘价)
INSERT INTO `glms_risk_variable` (`VariableName`, `Category`, `DataType`, `Unit`, `ValueDomain`, `Description`, `VariableExpr`, `SortOrder`, `OptId`, `OptName`, `OptDate`) VALUES
('上一收盘日中债估值净价', 2, 1, '', '≥ 0', '资讯数据', 'market.CBValuationNetPrice', 201, 0, 'SYSTEM', NOW()),
('上一收盘日中债估值全价', 2, 1, '', '≥ 0', '资讯数据', 'market.CBValuationFullPrice', 202, 0, 'SYSTEM', NOW()),
('上一收盘日中债估值收益率', 2, 1, '%', NULL, '资讯数据', 'market.CBValuationYtm', 203, 0, 'SYSTEM', NOW()),
('上一日收盘价', 2, 1, '', '≥ 0', '行情数据,按标的区分', 'market.LastClosePrice', 204, 0, 'SYSTEM', NOW()),
('借贷加权费率', 2, 1, '%', NULL, 'CMDM 标的债券借贷费率行情表', 'market.BondLendingRate', 205, 0, 'SYSTEM', NOW()),
('FR007', 2, 1, '%', NULL, '上一交易日收盘价', 'market.FR007', 206, 0, 'SYSTEM', NOW()),
('当前日期', 2, 2, NULL, NULL, 'DateTime.Today', 'sys.CurrentDate', 207, 0, 'SYSTEM', NOW()),
('挂钩标的到期日', 2, 2, NULL, NULL, '资讯数据', 'market.UnderlyingMaturityDate', 208, 0, 'SYSTEM', NOW()),
('标的发行余额', 2, 1, '', '≥ 0', '资讯数据', 'market.UnderlyingIssueBalance', 209, 0, 'SYSTEM', NOW());
-- 4.4.3 系统计算值类(Category=3
INSERT INTO `glms_risk_variable` (`VariableName`, `Category`, `DataType`, `Unit`, `ValueDomain`, `Description`, `VariableExpr`, `SortOrder`, `OptId`, `OptName`, `OptDate`) VALUES
('挂钩标的集中度', 3, 1, '%', '0~100', '同一标的存续交易总名义本金 ÷ 标的发行余额 × 100', 'calc.UnderlyingConcentration', 301, 0, 'SYSTEM', NOW()),
('授信占用率', 3, 1, '%', '0~100', '(已占用授信 + 本笔授信占用) ÷ 授信总额 × 100', 'calc.CreditUsageRate', 302, 0, 'SYSTEM', NOW()),
('合约期限', 3, 1, '', '≥ 0', '(ExerciseDate - StartDate).Days', 'calc.MaturityDays', 303, 0, 'SYSTEM', NOW()),
('Delta', 3, 1, NULL, NULL, 'realtime_trade_risk.Delta(预留接口,一期不纳入)', 'realtime_trade_risk.Delta', 304, 0, 'SYSTEM', NOW()),
('Gamma', 3, 1, NULL, NULL, 'realtime_trade_risk.Gamma(预留接口,一期不纳入)', 'realtime_trade_risk.Gamma', 305, 0, 'SYSTEM', NOW()),
('Vega', 3, 1, NULL, NULL, 'realtime_trade_risk.Vega(预留接口,一期不纳入)', 'realtime_trade_risk.Vega', 306, 0, 'SYSTEM', NOW()),
('Theta', 3, 1, NULL, NULL, 'realtime_trade_risk.Theta(预留接口,一期不纳入)', 'realtime_trade_risk.Theta', 307, 0, 'SYSTEM', NOW()),
('利息端利率', 3, 1, '%', NULL, '固定利率 或 FR007 ± 加点', 'calc.InterestRate', 308, 0, 'SYSTEM', NOW()),
('对手方累计标的数量', 3, 1, '', '≥ 0', 'COUNT(DISTINCT UnderlyingId) 该对手方所有存续交易,含本笔', 'calc.CounterpartyUnderlyingCount', 309, 0, 'SYSTEM', NOW()),
('同一标的累计名义本金', 3, 1, '', '≥ 0', 'SUM(该标的所有存续交易的 StockEqvNotional),含本笔', 'calc.SameUnderlyingTotalNotional', 310, 0, 'SYSTEM', NOW()),
('同一客户累计名义本金', 3, 1, '', '≥ 0', 'SUM(该客户所有存续交易的 StockEqvNotional),含本笔', 'calc.SameClientTotalNotional', 311, 0, 'SYSTEM', NOW()),
('总持仓名义本金', 3, 1, '', '≥ 0', 'SUM(所有存续交易的 StockEqvNotional)', 'calc.TotalPositionNotional', 312, 0, 'SYSTEM', NOW());
-- 4.4.4 布尔判断类(Category=4
INSERT INTO `glms_risk_variable` (`VariableName`, `Category`, `DataType`, `Unit`, `ValueDomain`, `Description`, `VariableExpr`, `SortOrder`, `OptId`, `OptName`, `OptDate`) VALUES
('到期日是否银行间交易日', 4, 3, NULL, NULL, '查询银行间交易日历', 'calc.IsExerciseDateTradingDay', 401, 0, 'SYSTEM', NOW()),
('平仓日是否银行间交易日', 4, 3, NULL, NULL, '查询银行间交易日历', 'calc.IsUnwindDateTradingDay', 402, 0, 'SYSTEM', NOW()),
('支付日是否银行间交易日', 4, 3, NULL, NULL, '查询银行间交易日历', 'calc.IsSettlementDateTradingDay', 403, 0, 'SYSTEM', NOW()),
('利息端/浮动端方向是否同向', 4, 3, NULL, NULL, '利息端"收取"↔浮动端"多头",利息端"支付"↔浮动端"空头"', 'calc.IsInterestFloatSameDirection', 404, 0, 'SYSTEM', NOW()),
('关键业务要素是否一致', 4, 3, NULL, NULL, '交易确认书 vs 簿记要素(大模型方案)', 'calc.IsKeyElementsConsistent', 405, 0, 'SYSTEM', NOW()),
('多空方向为多头', 4, 3, NULL, NULL, 'trade.BuySell == "买入" 或浮动端为多头', 'calc.IsLongDirection', 406, 0, 'SYSTEM', NOW()),
('多空方向为空头', 4, 3, NULL, NULL, '与多头互斥', 'calc.IsShortDirection', 407, 0, 'SYSTEM', NOW()),
('保证金收支方向为支付', 4, 3, NULL, NULL, '保证金方向为支付', 'calc.IsMarginPay', 408, 0, 'SYSTEM', NOW()),
('保证金收支方向为收取', 4, 3, NULL, NULL, '与支付互斥', 'calc.IsMarginReceive', 409, 0, 'SYSTEM', NOW());
+6 -1
View File
@@ -1,4 +1,4 @@
using BaseOUDAL;
using BaseOUDAL;
using YLErp.Core.DBModels;
using YLErp.Model;
@@ -408,5 +408,10 @@ namespace YLErp.BLL
public DbSet<trade_contract_oa_result> tradeContractOaResult { get; set; }
public DbSet<BondPayment> bondPayment { get; set; }
public DbSet<glms_risk_rule> glms_risk_rule { get; set; }
public DbSet<glms_risk_rule_application> glms_risk_rule_application { get; set; }
public DbSet<glms_risk_rule_audit_log> glms_risk_rule_audit_log { get; set; }
public DbSet<glms_risk_variable> glms_risk_variable { get; set; }
}
}
@@ -32,7 +32,7 @@ namespace YLErp.Modules.RiskEngine
/// - 可调试:生成的脚本代码可直接阅读和理解
///
/// 示例:
/// FormulaJson: { "conditions": [{"variableCode":"trade.StockEqvNotional","operator":">","value":100000000}] }
/// ConditionJson: { "conditions": [{"variableId":1,"operator":">","value":100000000}] }
/// 生成脚本:Convert.ToDecimal(((YLErp.DBModels.trade)DataMap["trade"]).StockEqvNotional) > 100000000m
/// 编译结果:Func&lt;RiskContext, bool&gt;(内部通过 Roslyn 编译缓存)
/// </summary>
@@ -104,10 +104,10 @@ namespace YLErp.Modules.RiskEngine
if (string.IsNullOrWhiteSpace(rule.RuleCode))
{
return RuleCompileResult.Fail("规则 RuleCode 不能为空");
return RuleCompileResult.Fail("规则 Code 不能为空");
}
var result = ValidateAndCompileFormula(rule.FormulaExp);
var result = ValidateAndCompileFormula(rule.RuleExpr);
if (!result.Success)
{
return RuleCompileResult.Fail($"规则[{rule.RuleCode}]编译失败:{result.ErrorMessage}");
@@ -119,67 +119,81 @@ namespace YLErp.Modules.RiskEngine
}
/// <summary>
/// 解析 FormulaJson,提取条件列表
/// 要求 expression 明确描述实际取值路径
/// 解析 ConditionJson,提取条件列表
/// </summary>
private static List<(string variableCode, string expression, string op, object value, string variableType)> ParseFormulaJson(string formulaJson)
private static List<(long variableId, string op, object value, string variableType)> ParseConditionJson(string conditionJson)
{
var result = new List<(string, string, string, object, string)>();
var jObj = JObject.Parse(formulaJson);
var result = new List<(long, string, object, string)>();
var jObj = JObject.Parse(conditionJson);
var conditions = jObj["conditions"] as JArray;
if (conditions == null || !conditions.Any())
{
throw new ArgumentException("FormulaJson 中缺少 conditions");
throw new ArgumentException("ConditionJson 中缺少 conditions");
}
foreach (var cond in conditions)
{
string variableCode = cond["variableCode"]?.Value<string>();
string expression = cond["expression"]?.Value<string>();
long variableId = cond["variableId"]?.Value<long>() ?? 0;
string op = cond["operator"]?.Value<string>();
object value = cond["value"]?.Value<object>();
string variableType = cond["variableType"]?.Value<string>() ?? "numeric";
if (string.IsNullOrWhiteSpace(expression) || string.IsNullOrWhiteSpace(op))
if (variableId <= 0 || string.IsNullOrWhiteSpace(op))
{
throw new ArgumentException("条件中缺少 expression 或 operator");
throw new ArgumentException("条件中缺少 variableId 或 operator");
}
result.Add((variableCode, expression, op, value, variableType));
result.Add((variableId, op, value, variableType));
}
return result;
}
/// <summary>
/// 根据条件列表生成 Roslyn C# 脚本代码
/// 多条件自动用 &&AND)连接
/// 左值表达式统一基于 expression 构建。
/// 根据条件列表生成 Roslyn C# 脚本代码
/// 多条件自动用 &&AND)连接
/// TODO: 当前逻辑依赖 variableCode 的 "前缀.属性名" 格式,
/// 后续应改为通过 variableId 查变量池获取 VariableExpr,或直接使用 rule.RuleExpr
/// </summary>
private static string BuildScriptCode(List<(string variableCode, string expression, string op, object value, string variableType)> conditions)
{
var exprParts = new List<string>();
//private static string BuildScriptCode(List<(long variableId, string op, object value, string variableType)> conditions)
//{
// var exprParts = new List<string>();
foreach (var (_, expression, op, value, variableType) in conditions)
{
// 先根据 expression 构建左值访问表达式,再拼接比较符和右值字面量
string leftExpr = BuildMemberAccessExpression(expression, variableType);
// foreach (var (variableId, op, value, variableType) in conditions)
// {
// // TODO: 通过 variableId 查变量池获取 VariableExpr(如 "trade.StockEqvNotional"
// // 当前暂用 variableId.ToString() 占位,后续接入变量池查询
// string variableExpr = variableId.ToString();
// 格式化阈值
string valueLiteral = FormatValueLiteral(value, variableType);
// // 解析 variableExpr:前缀.属性名
// var parts = variableExpr.Split('.');
// if (parts.Length != 2)
// {
// throw new ArgumentException($"variableExpr 格式不正确:{variableExpr}variableId={variableId}");
// }
// 格式化操作符
string csharpOp = FormatOperator(op);
// string prefix = parts[0].Trim().ToLower();
// string propertyName = parts[1].Trim();
// 生成单条件表达式
string expr = $"{leftExpr} {csharpOp} {valueLiteral}";
exprParts.Add(expr);
}
// if (!VariableTypeMap.TryGetValue(prefix, out string typeFullName))
// {
// throw new ArgumentException($"未知前缀:{prefix}");
// }
// // 格式化阈值
// string valueLiteral = FormatValueLiteral(value, variableType);
// 多条件用 && 连接
return string.Join(" && ", exprParts);
}
// // 格式化操作符
// string csharpOp = FormatOperator(op);
// // 生成单条件表达式
// string expr = $"{leftExpr} {csharpOp} {valueLiteral}";
// exprParts.Add(expr);
// }
// // 多条件用 && 连接
// return string.Join(" && ", exprParts);
//}
/// <summary>
/// 将前端传入的 expression 转成 Roslyn 可执行的成员访问表达式。
@@ -0,0 +1,10 @@
namespace YLErp.Modules.RiskEngine.Dto
{
public class BatchOperationResult
{
public bool Success { get; set; }
public int TotalCount { get; set; }
public int SuccessCount { get; set; }
public string ErrorMessage { get; set; }
}
}
@@ -0,0 +1,16 @@
using YLErp.DBModels;
namespace YLErp.Modules.RiskEngine.Dto
{
public class CreateRiskApplicationReq
{
public string RuleIds { get; set; }
public RiskControlStrategy ControlStrategy { get; set; }
public string TriggerPoints { get; set; }
public string ScopeAssetBookIds { get; set; }
public string ScopeClientIds { get; set; }
public string ScopeUnderlyingTypes { get; set; }
public string ScopeTradeTypes { get; set; }
public bool ScopeIsGlobal { get; set; }
}
}
@@ -0,0 +1,10 @@
namespace YLErp.Modules.RiskEngine.Dto
{
public class CreateRiskRuleReq
{
public string RuleName { get; set; }
public string RuleText { get; set; }
public string ConditionJson { get; set; }
public string RuleExpr { get; set; }
}
}
@@ -0,0 +1,16 @@
using YLErp.DBModels;
namespace YLErp.Modules.RiskEngine.Dto
{
public class CreateRiskVariableReq
{
public string VariableName { get; set; }
public RiskVariableCategory Category { get; set; }
public RiskVariableDataType DataType { get; set; }
public string Unit { get; set; }
public string ValueDomain { get; set; }
public string Description { get; set; }
public string VariableExpr { get; set; }
public int SortOrder { get; set; }
}
}
@@ -0,0 +1,15 @@
namespace YLErp.Modules.RiskEngine.Dto
{
public class FormulaCondition
{
public long VariableId { get; set; }
public string VariableName { get; set; }
public string VariableType { get; set; }
public string Operator { get; set; }
public string ThresholdType { get; set; }
public object Value { get; set; }
public long? ThresholdVariableId { get; set; }
public string ThresholdVariableName { get; set; }
public string Unit { get; set; }
}
}
@@ -0,0 +1,10 @@
using System.Collections.Generic;
namespace YLErp.Modules.RiskEngine.Dto
{
public class FormulaDefinition
{
public string LogicOperator { get; set; }
public List<FormulaCondition> Conditions { get; set; }
}
}
@@ -0,0 +1,13 @@
using BaseOUDAL;
using YLErp.DBModels;
namespace YLErp.Modules.RiskEngine.Dto
{
public class QueryRiskApplicationReq : BaseSearchReq
{
public string Keyword { get; set; }
public RiskRuleStatus? Status { get; set; }
public RiskControlStrategy? Strategy { get; set; }
public string TriggerPoint { get; set; }
}
}
@@ -0,0 +1,14 @@
using System;
using BaseOUDAL;
namespace YLErp.Modules.RiskEngine.Dto
{
public class QueryRiskAuditLogReq : BaseSearchReq
{
public string OperationType { get; set; }
public string TargetType { get; set; }
public DateTime? StartDate { get; set; }
public DateTime? EndDate { get; set; }
public string Keyword { get; set; }
}
}
@@ -0,0 +1,12 @@
using BaseOUDAL;
using YLErp.DBModels;
namespace YLErp.Modules.RiskEngine.Dto
{
public class QueryRiskRuleReq : BaseSearchReq
{
public string Keyword { get; set; }
public RiskRuleStatus? Status { get; set; }
public long? VariableId { get; set; }
}
}
@@ -0,0 +1,11 @@
using BaseOUDAL;
using YLErp.DBModels;
namespace YLErp.Modules.RiskEngine.Dto
{
public class QueryRiskVariableReq : BaseSearchReq
{
public RiskVariableCategory? Category { get; set; }
public string Keyword { get; set; }
}
}
@@ -0,0 +1,27 @@
using System;
using YLErp.DBModels;
namespace YLErp.Modules.RiskEngine.Dto
{
public class RiskApplicationDetail
{
public long Id { get; set; }
public string RuleIds { get; set; }
public string RuleName { get; set; }
public string ConditionJson { get; set; }
public string RuleNames { get; set; }
public RiskRuleStatus Status { get; set; }
public RiskControlStrategy ControlStrategy { get; set; }
public string TriggerPoints { get; set; }
public string ScopeAssetBookIds { get; set; }
public string ScopeClientIds { get; set; }
public string ScopeUnderlyingTypes { get; set; }
public string ScopeTradeTypes { get; set; }
public bool ScopeIsGlobal { get; set; }
public int Version { get; set; }
public string OptName { get; set; }
public DateTime OptDate { get; set; }
public string UpdateOptName { get; set; }
public DateTime UpdateDate { get; set; }
}
}
@@ -0,0 +1,26 @@
using System;
using YLErp.DBModels;
namespace YLErp.Modules.RiskEngine.Dto
{
public class RiskApplicationListItem
{
public long Id { get; set; }
public string RuleIds { get; set; }
public string RuleName { get; set; }
public string RuleNames { get; set; }
public RiskRuleStatus Status { get; set; }
public RiskControlStrategy ControlStrategy { get; set; }
public string TriggerPoints { get; set; }
public string ScopeAssetBookIds { get; set; }
public string ScopeClientIds { get; set; }
public string ScopeUnderlyingTypes { get; set; }
public string ScopeTradeTypes { get; set; }
public bool ScopeIsGlobal { get; set; }
public int Version { get; set; }
public string OptName { get; set; }
public DateTime OptDate { get; set; }
public string UpdateOptName { get; set; }
public DateTime UpdateDate { get; set; }
}
}
@@ -0,0 +1,19 @@
using System;
namespace YLErp.Modules.RiskEngine.Dto
{
public class RiskAuditLogDetail
{
public long Id { get; set; }
public string OperationType { get; set; }
public string TargetType { get; set; }
public long TargetId { get; set; }
public string TargetName { get; set; }
public string OperationDetail { get; set; }
public string Result { get; set; }
public string SnapshotData { get; set; }
public long OptId { get; set; }
public string OptName { get; set; }
public DateTime OptDate { get; set; }
}
}
@@ -0,0 +1,17 @@
using System;
namespace YLErp.Modules.RiskEngine.Dto
{
public class RiskAuditLogListItem
{
public long Id { get; set; }
public string OperationType { get; set; }
public string TargetType { get; set; }
public long TargetId { get; set; }
public string TargetName { get; set; }
public string OperationDetail { get; set; }
public string Result { get; set; }
public string OptName { get; set; }
public DateTime OptDate { get; set; }
}
}
@@ -0,0 +1,12 @@
using YLErp.DBModels;
namespace YLErp.Modules.RiskEngine.Dto
{
public class RiskRuleApplicationSummary
{
public long Id { get; set; }
public RiskRuleStatus Status { get; set; }
public RiskControlStrategy ControlStrategy { get; set; }
public string TriggerPoints { get; set; }
}
}
@@ -0,0 +1,22 @@
using System;
using System.Collections.Generic;
using YLErp.DBModels;
namespace YLErp.Modules.RiskEngine.Dto
{
public class RiskRuleDetail
{
public long Id { get; set; }
public string RuleName { get; set; }
public string RuleText { get; set; }
public string ConditionJson { get; set; }
public string RuleExpr { get; set; }
public RiskRuleStatus Status { get; set; }
public int Version { get; set; }
public string OptName { get; set; }
public DateTime OptDate { get; set; }
public string UpdateOptName { get; set; }
public DateTime UpdateDate { get; set; }
public List<RiskRuleApplicationSummary> Applications { get; set; }
}
}
@@ -0,0 +1,19 @@
using System;
using YLErp.DBModels;
namespace YLErp.Modules.RiskEngine.Dto
{
public class RiskRuleListItem
{
public long Id { get; set; }
public string RuleName { get; set; }
public string RuleText { get; set; }
public RiskRuleStatus Status { get; set; }
public int Version { get; set; }
public string OptName { get; set; }
public DateTime OptDate { get; set; }
public string UpdateOptName { get; set; }
public DateTime UpdateDate { get; set; }
public int ApplicationCount { get; set; }
}
}
@@ -0,0 +1,13 @@
using System;
namespace YLErp.Modules.RiskEngine.Dto
{
public class RiskRuleVersionItem
{
public int Version { get; set; }
public string OperationType { get; set; }
public string OperationDetail { get; set; }
public string OptName { get; set; }
public DateTime OptDate { get; set; }
}
}
@@ -0,0 +1,24 @@
using System;
using YLErp.DBModels;
namespace YLErp.Modules.RiskEngine.Dto
{
public class RiskVariableDetail
{
public long Id { get; set; }
public string VariableName { get; set; }
public RiskVariableCategory Category { get; set; }
public RiskVariableDataType DataType { get; set; }
public string Unit { get; set; }
public string ValueDomain { get; set; }
public string Description { get; set; }
public string VariableExpr { get; set; }
public int Version { get; set; }
public int SortOrder { get; set; }
public string OptName { get; set; }
public DateTime OptDate { get; set; }
public string UpdateOptName { get; set; }
public DateTime UpdateDate { get; set; }
public int ReferenceCount { get; set; }
}
}
@@ -0,0 +1,18 @@
using YLErp.DBModels;
namespace YLErp.Modules.RiskEngine.Dto
{
public class RiskVariableListItem
{
public long Id { get; set; }
public string VariableName { get; set; }
public RiskVariableCategory Category { get; set; }
public RiskVariableDataType DataType { get; set; }
public string Unit { get; set; }
public string ValueDomain { get; set; }
public string Description { get; set; }
public string VariableExpr { get; set; }
public int Version { get; set; }
public int SortOrder { get; set; }
}
}
@@ -0,0 +1,14 @@
using YLErp.DBModels;
namespace YLErp.Modules.RiskEngine.Dto
{
public class RiskVariableSimpleItem
{
public long Id { get; set; }
public string VariableName { get; set; }
public RiskVariableCategory Category { get; set; }
public RiskVariableDataType DataType { get; set; }
public string Unit { get; set; }
public string VariableExpr { get; set; }
}
}
@@ -0,0 +1,17 @@
using YLErp.DBModels;
namespace YLErp.Modules.RiskEngine.Dto
{
public class UpdateRiskApplicationReq
{
public string RuleIds { get; set; }
public RiskControlStrategy ControlStrategy { get; set; }
public string TriggerPoints { get; set; }
public string ScopeAssetBookIds { get; set; }
public string ScopeClientIds { get; set; }
public string ScopeUnderlyingTypes { get; set; }
public string ScopeTradeTypes { get; set; }
public bool ScopeIsGlobal { get; set; }
public int ExpectedVersion { get; set; }
}
}
@@ -0,0 +1,11 @@
namespace YLErp.Modules.RiskEngine.Dto
{
public class UpdateRiskRuleReq
{
public string RuleName { get; set; }
public string RuleText { get; set; }
public string ConditionJson { get; set; }
public string RuleExpr { get; set; }
public int ExpectedVersion { get; set; }
}
}
@@ -0,0 +1,17 @@
using YLErp.DBModels;
namespace YLErp.Modules.RiskEngine.Dto
{
public class UpdateRiskVariableReq
{
public string VariableName { get; set; }
public RiskVariableCategory Category { get; set; }
public RiskVariableDataType DataType { get; set; }
public string Unit { get; set; }
public string ValueDomain { get; set; }
public string Description { get; set; }
public string VariableExpr { get; set; }
public int SortOrder { get; set; }
public int ExpectedVersion { get; set; }
}
}
@@ -117,6 +117,15 @@ namespace YLErp.Modules.RiskEngine
{
IYcLogger _logger = LogFactory.GetLogger("RiskEngineService");
private static readonly Lazy<RiskEngineService> _instance =
new Lazy<RiskEngineService>(() => new RiskEngineService());
public static RiskEngineService GetInstance() => _instance.Value;
private RiskEngineService() : base((OptUserInfo)null)
{
}
public RiskEngineService(OptUserInfo userInfo) : base(userInfo)
{
}
@@ -129,6 +138,11 @@ namespace YLErp.Modules.RiskEngine
{
}
public void RefreshCache()
{
_logger.Info("[风控引擎] RefreshCache 被调用(当前为桩实现,待缓存机制完成后替换)");
}
/// <summary>
/// 执行风控检查(最终设计版:预编译委托 + 规则筛选 + 策略判定)
/// </summary>
@@ -224,13 +238,13 @@ namespace YLErp.Modules.RiskEngine
try
{
triggered = compiledScript(context);
_logger.Info($"[风控引擎] 规则执行 - RuleCode: {rule.RuleCode}, Triggered: {triggered}");
_logger.Info($"[风控引擎] 规则执行 - RuleId: {rule.Id}, Triggered: {triggered}");
}
catch (Exception ex)
{
_logger.Info($"[风控引擎] 规则执行异常 - RuleCode: {rule.RuleCode}, Error: {ex.Message}");
_logger.Info($"[风控引擎] 规则执行异常 - RuleId: {rule.Id}, Error: {ex.Message}");
result.HasError = true;
result.ErrorMessage += $"规则[{rule.RuleCode}]执行异常:{ex.Message}";
result.ErrorMessage += $"规则[{rule.Id}]执行异常:{ex.Message}";
continue;
}
@@ -248,10 +262,9 @@ namespace YLErp.Modules.RiskEngine
result.Passed = false;
result.TriggeredRules.Add(new TriggeredRuleInfo
{
RuleCode = rule.RuleCode,
RuleName = rule.RuleName,
ControlStrategy = "禁止",
FormulaText = rule.FormulaText,
RuleText = rule.RuleText,
Message = $"规则[{rule.RuleName}]触发:禁止"
});
break;
@@ -261,16 +274,15 @@ namespace YLErp.Modules.RiskEngine
result.Passed = false;
result.TriggeredRules.Add(new TriggeredRuleInfo
{
RuleCode = rule.RuleCode,
RuleName = rule.RuleName,
ControlStrategy = "审批",
FormulaText = rule.FormulaText,
RuleText = rule.RuleText,
Message = $"规则[{rule.RuleName}]触发:需审批"
});
break;
case RiskControlStrategyEnum.Warning:
result.Warnings.Add($"规则[{rule.RuleName}]触发:提示 - {rule.FormulaText}");
result.Warnings.Add($"规则[{rule.RuleName}]触发:提示 - {rule.RuleText}");
break;
default:
@@ -303,7 +315,7 @@ namespace YLErp.Modules.RiskEngine
RuleCode = "ENGINE_ERROR",
RuleName = "风控引擎执行异常",
ControlStrategy = "审批",
FormulaText = ex.Message,
RuleText = ex.Message,
Message = $"风控引擎异常:{ex.Message},需审批通过"
});
_logger.Error($"[风控引擎] EvaluateRisk 异常 - TradeId: {context?.TradeId}, Error: {ex.Message}");
@@ -326,13 +338,12 @@ namespace YLErp.Modules.RiskEngine
var Rule1 = new RiskRule
{
Id = 103,
RuleCode = "RISK-20260622-0003",
RuleName = "测试规则:名义本金超过1亿",
FormulaText = "名义本金>1亿",
RuleText = "名义本金>1亿",
// FormulaJson = "{ \"conditions\": [" +
// "{\"variableCode\":\"StockEqvNotional\",\"expression\":\"trade.StockEqvNotional\",\"operator\":\">\",\"value\":100000000,\"variableType\":\"number\"}" +
// "] }",
FormulaExp = "Convert.ToDecimal(((YLErp.DBModels.trade)DataMap[\"trade\"]).StockEqvNotional) > 100000000m",
RuleExpr = "Convert.ToDecimal(((YLErp.DBModels.trade)DataMap[\"trade\"]).StockEqvNotional) > 100000000m",
Version = 1
};
@@ -342,9 +353,9 @@ namespace YLErp.Modules.RiskEngine
Id = 104,
RuleCode = "RISK-20260623-0004",
RuleName = "挂钩标的到期日小于合约到期日",
FormulaText = "挂钩标的到期日<合约到期日",
RuleText = "挂钩标的到期日<合约到期日",
//FormulaJson = "{ \"conditions\": [{\"variableCode\":\"MaturityDate\",\"expression\":\"trade.MaturityDate\",\"operator\":\"<\",\"value\":\"trade.ExerciseDate\",\"variableType\":\"date\"}] }",
FormulaExp = "((YLErp.DBModels.trade)DataMap[\"trade\"]).MaturityDate < ((YLErp.DBModels.trade)DataMap[\"trade\"]).ExerciseDate",
RuleExpr = "((YLErp.DBModels.trade)DataMap[\"trade\"]).MaturityDate < ((YLErp.DBModels.trade)DataMap[\"trade\"]).ExerciseDate",
Version = 1
};
+1 -1
View File
@@ -51,7 +51,7 @@ namespace YLErp.Modules.RiskEngine
public string RuleCode { get; set; }
public string RuleName { get; set; }
public string ControlStrategy { get; set; }
public string FormulaText { get; set; }
public string RuleText { get; set; }
public string Message { get; set; }
}
}
+9 -13
View File
@@ -11,26 +11,22 @@ namespace YLErp.Modules.RiskEngine
{
// === 基础信息 ===
public int Id { get; set; }
public string RuleCode { get; set; }
public string RuleName { get; set; }
public string Description { get; set; }
public string RuleText { get; set; }
public string RuleCode { get; set; }
/// <summary>
/// 【核心】用户输入的规则内容字符串,如"名义本金>1亿"
/// 在规则创建/加载时由 RuleCompiler 解析并编译为 CompiledScript
/// </summary>
public string FormulaText { get; set; }
/// <summary>
/// 【核心】公式 JSON(条件列表的结构化存储),如
/// {"conditions":[{"variableCode":"trade.StockEqvNotional","operator":">","value":100000000}]}
/// 【核心】条件JSON(结构化模式的条件列表存储),如
/// {"conditions":[{"variableId":1,"operator":">","value":100000000}]}
/// 由 RuleCompiler 解析并编译为 CompiledScript
/// </summary>
// public string FormulaJson { get; set; }
public string ConditionJson { get; set; }
/// <summary>
/// 【核心】具体的计算公式
/// 【核心】规则表达式(自由文本模式,类C#表达式)
/// 由 RuleCompiler 编译为 CompiledScript
/// </summary>
public string FormulaExp { get; set; }
public string RuleExpr { get; set; }
// === 生命周期 ===
public int Version { get; set; }
File diff suppressed because it is too large Load Diff
+124 -1
View File
@@ -1,2 +1,125 @@
var main = main || {};
main.formatOptions = { "trading": { "umprice": { "trimTailZeros": true, "precision": 9, "grouping": true, "rounded": true, "percent": false, "minDecimals": 2, "maxDecimals": 9 }, "umpriceP": { "trimTailZeros": true, "percent": true, "precision": 9, "grouping": false, "rounded": true, "minDecimals": 2, "maxDecimals": 9 }, "umpricePR": { "trimTailZeros": true, "precision": 9, "grouping": false, "rounded": true, "percent": false, "minDecimals": 2, "maxDecimals": 9 }, "tradeSinglePrice": { "trimTailZeros": true, "precision": 9, "grouping": true, "rounded": true, "percent": false, "minDecimals": 2, "maxDecimals": 9 }, "premiumRateP": { "trimTailZeros": true, "percent": true, "precision": 9, "grouping": false, "rounded": true, "minDecimals": 2, "maxDecimals": 9 }, "premiumRate": { "trimTailZeros": true, "precision": 9, "grouping": false, "rounded": true, "percent": false, "minDecimals": 2, "maxDecimals": 9 }, "tradePrice": { "trimTailZeros": true, "precision": 9, "grouping": false, "rounded": true, "percent": false, "minDecimals": 2, "maxDecimals": 9 }, "StockEqvNotional": { "trimTailZeros": true, "precision": 9, "grouping": true, "rounded": true, "percent": false, "minDecimals": 2, "maxDecimals": 9 }, "notional": { "trimTailZeros": true, "precision": 9, "grouping": true, "rounded": true, "percent": false, "minDecimals": 2, "maxDecimals": 9 }, "notionalP": { "trimTailZeros": true, "percent": true, "precision": 9, "grouping": false, "rounded": true, "minDecimals": 2, "maxDecimals": 9 }, "volatility": { "trimTailZeros": true, "precision": 9, "grouping": false, "rounded": true, "percent": false, "minDecimals": 2, "maxDecimals": 9 }, "volatilityP": { "trimTailZeros": true, "percent": true, "precision": 9, "grouping": false, "rounded": true, "minDecimals": 2, "maxDecimals": 9 }, "greek": { "trimTailZeros": true, "precision": 9, "grouping": false, "rounded": true, "percent": false, "minDecimals": 2, "maxDecimals": 9 }, "marginRateP": { "trimTailZeros": true, "percent": true, "precision": 9, "grouping": false, "rounded": true, "minDecimals": 2, "maxDecimals": 9 }, "marginRate": { "trimTailZeros": true, "precision": 9, "grouping": false, "rounded": true, "percent": false, "minDecimals": 2, "maxDecimals": 9 } } };
main.formatOptions={
"trading": {
"umprice": {
"precision": 9,
"grouping": true,
"rounded": true,
"percent": false,
"minDecimals": 9,
"maxDecimals": 0
},
"umpriceP": {
"percent": true,
"precision": 2,
"grouping": false,
"rounded": true,
"minDecimals": 2,
"maxDecimals": 0
},
"umpricePR": {
"precision": 4,
"grouping": false,
"rounded": true,
"percent": false,
"minDecimals": 4,
"maxDecimals": 2
},
"tradeSinglePrice": {
"precision": 2,
"grouping": true,
"rounded": true,
"percent": false,
"minDecimals": 2,
"maxDecimals": 0
},
"premiumRateP": {
"percent": true,
"precision": 2,
"grouping": false,
"rounded": true,
"minDecimals": 2,
"maxDecimals": 0
},
"premiumRate": {
"precision": 4,
"grouping": false,
"rounded": true,
"percent": false,
"minDecimals": 4,
"maxDecimals": 2
},
"tradePrice": {
"precision": 2,
"grouping": false,
"rounded": true,
"percent": false,
"minDecimals": 2,
"maxDecimals": 0
},
"StockEqvNotional": {
"precision": 2,
"grouping": true,
"rounded": true,
"percent": false,
"minDecimals": 2,
"maxDecimals": 0
},
"notional": {
"precision": 2,
"grouping": true,
"rounded": true,
"percent": false,
"minDecimals": 2,
"maxDecimals": 0
},
"notionalP": {
"percent": true,
"precision": 2,
"grouping": false,
"rounded": true,
"minDecimals": 2,
"maxDecimals": 0
},
"volatility": {
"precision": 4,
"grouping": false,
"rounded": true,
"percent": false,
"minDecimals": 4,
"maxDecimals": 2
},
"volatilityP": {
"percent": true,
"precision": 2,
"grouping": false,
"rounded": true,
"minDecimals": 2,
"maxDecimals": 0
},
"greek": {
"precision": 2,
"grouping": false,
"rounded": true,
"percent": false,
"minDecimals": 2,
"maxDecimals": 0
},
"marginRateP": {
"percent": true,
"precision": 2,
"grouping": false,
"rounded": true,
"minDecimals": 2,
"maxDecimals": 0
},
"marginRate": {
"precision": 4,
"grouping": false,
"rounded": true,
"percent": false,
"minDecimals": 4,
"maxDecimals": 2
}
}
};
+114 -96
View File
@@ -1,28 +1,29 @@
<?xml version="1.0" encoding="utf-8" ?>
<?xml version="1.0" encoding="utf-8"?>
<Functions>
<FunctionParent Name="报价管理" Title="报价管理">
<FunctionSub Name="结构化交易定价" Title="期权定价"></FunctionSub>
<FunctionSub Name="波动率曲面查看" Title="波动率查看"></FunctionSub>
<FunctionSub Name="波动率曲面修改" Type="Operate" Title="波动率修改"></FunctionSub>
<FunctionSub Name="波动率审核编辑" Type="Operate" Title="波动率审核"></FunctionSub>
<FunctionSub Name="利率曲线" Title="利率曲线"></FunctionSub>
<FunctionSub Name="基差曲线" Title="基差曲线"></FunctionSub>
</FunctionParent>
<FunctionParent Name="报价管理" Title="报价管理">
<FunctionSub Name="结构化交易定价" Title="期权定价"></FunctionSub>
<FunctionSub Name="波动率曲面查看" Title="波动率查看"></FunctionSub>
<FunctionSub Name="波动率曲面修改" Type="Operate" Title="波动率修改"></FunctionSub>
<FunctionSub Name="波动率审核编辑" Type="Operate" Title="波动率审核"></FunctionSub>
<FunctionSub Name="利率曲线" Title="利率曲线"></FunctionSub>
<FunctionSub Name="基差曲线" Title="基差曲线"></FunctionSub>
</FunctionParent>
<FunctionParent Name="交易管理" Title="交易管理">
<FunctionSub Name="交易搜索" Title="期权交易"></FunctionSub>
<FunctionSub Name="查看所有交易" Title="查看所有交易" Type="Operate" Note="是否可以查看所有交易,没有这个权限在交易列表中只能看到自己所在的簿记账户的交易" ></FunctionSub>
<FunctionSub Name="交易新增" Title="交易新增" Type="Operate" Note="是否有新增交易权限" ></FunctionSub>
<FunctionSub Name="交易编辑" Title="交易编辑" Type="Operate" Note="是否有交易编辑权限" ></FunctionSub>
<FunctionSub Name="交易删除" Title="交易删除" Type="Operate" Note="是否有交易删除权限" ></FunctionSub>
<FunctionSub Name="新增选择交易员" Title="新增交易选择交易员" Type="Operate" Note="新增交易时候是否可以选择自己以外的其他交易员" ></FunctionSub>
<FunctionSub Name="交易导入" Title="交易导入" Type="Operate" Note="是否显示交易导入按钮" ></FunctionSub>
<FunctionSub Name="交易导" Title="交易导" Type="Operate" Note="是否交易导出权限" ></FunctionSub>
<FunctionSub Name="交易平仓" Title="交易平仓" Type="Operate" Note="是否有交易平仓权限" ></FunctionSub>
<FunctionSub Name="收益结算与展期" Title="收益结算与展期" Type="Operate" Note="是否有收益结算和展期的权限" ></FunctionSub>
<FunctionSub Name="互换开平仓事件流水" Title="互换开平仓事件流水" ></FunctionSub>
<FunctionSub Name="交易审批" Title="交易审批" ></FunctionSub>
<FunctionSub Name="交易平仓审核" Title="交易平仓审核" Type="Operate" Note="是否有平仓审核权限" ></FunctionSub>
<FunctionSub Name="交易行权审核" Title="交易行权审核" Type="Operate" Note="是否有行权审核权限" ></FunctionSub>
<FunctionSub Name="查看所有交易" Title="查看所有交易" Type="Operate"
Note="是否可以查看所有交易,没有这个权限在交易列表中只能看到自己所在的簿记账户的交易"></FunctionSub>
<FunctionSub Name="交易新增" Title="交易新增" Type="Operate" Note="是否有新增交易权限"></FunctionSub>
<FunctionSub Name="交易编辑" Title="交易编辑" Type="Operate" Note="是否有交易编辑权限"></FunctionSub>
<FunctionSub Name="交易删除" Title="交易删除" Type="Operate" Note="是否有交易删除权限"></FunctionSub>
<FunctionSub Name="新增选择交易员" Title="新增交易选择交易员" Type="Operate" Note="新增交易时候是否可以选择自己以外的其他交易员"></FunctionSub>
<FunctionSub Name="交易导" Title="交易导" Type="Operate" Note="是否显示交易导入按钮"></FunctionSub>
<FunctionSub Name="交易导出" Title="交易导出" Type="Operate" Note="是否有交易导出权限"></FunctionSub>
<FunctionSub Name="交易平仓" Title="交易平仓" Type="Operate" Note="是否有交易平仓权限"></FunctionSub>
<FunctionSub Name="收益结算与展期" Title="收益结算与展期" Type="Operate" Note="是否有收益结算和展期的权限"></FunctionSub>
<FunctionSub Name="互换开平仓事件流水" Title="互换开平仓事件流水"></FunctionSub>
<FunctionSub Name="交易审批" Title="交易审批"></FunctionSub>
<FunctionSub Name="交易平仓审核" Title="交易平仓审核" Type="Operate" Note="是否有平仓审核权限"></FunctionSub>
<FunctionSub Name="交易行权审核" Title="交易行权审核" Type="Operate" Note="是否有行权审核权限"></FunctionSub>
<FunctionSub Name="交易回退" Title="交易回退" Type="Operate" Note="系统内任意状态的交易允许回退"></FunctionSub>
<FunctionSub Name="特批批量确认" Title="特批批量确认" Type="Operate" Note="批量确认,跳过交易时间和资金的卡控"></FunctionSub>
<FunctionSub Name="交易操作历史" Title="交易操作历史" Type="Operate" Note="交易操作历史"></FunctionSub>
@@ -30,13 +31,13 @@
<FunctionSub Name="标的交易" Title="标的交易" Note="股票期货"></FunctionSub>
<FunctionSub Name="交易流水查看" Type="Operate" Title="交易流水查看"></FunctionSub>
<FunctionSub Name="交易流水修改" Type="Operate" Title="交易流水修改"></FunctionSub>
<FunctionSub Name="交易标签调整权限" Title="交易标签调整权限" Type="Operate" Note="交易上打标签、移除标签、批量打标签" ></FunctionSub>
<FunctionSub Name="交易标签查看权限" Title="交易标签查看权限" Type="Operate" Note="是否可以查看交易上的标签" ></FunctionSub>
<FunctionSub Name="标的交易新增" Title="标的交易新增" Type="Operate" Note="是否有新增标的交易权限" ></FunctionSub>
<FunctionSub Name="标的交易编辑" Title="标的交易编辑" Type="Operate" Note="是否有标的交易编辑权限" ></FunctionSub>
<FunctionSub Name="标的交易删除" Title="标的交易删除" Type="Operate" Note="是否有标的交易删除权限" ></FunctionSub>
<FunctionSub Name="标的交易持仓重置" Title="标的交易持仓重置" Type="Operate" Note="是否有标的交易持仓重置权限" ></FunctionSub>
<FunctionSub Name="偏移设置" Title="偏移设置" Type="Operate" Note="X-Bond行情报价添加偏移设置" ></FunctionSub>
<FunctionSub Name="交易标签调整权限" Title="交易标签调整权限" Type="Operate" Note="交易上打标签、移除标签、批量打标签"></FunctionSub>
<FunctionSub Name="交易标签查看权限" Title="交易标签查看权限" Type="Operate" Note="是否可以查看交易上的标签"></FunctionSub>
<FunctionSub Name="标的交易新增" Title="标的交易新增" Type="Operate" Note="是否有新增标的交易权限"></FunctionSub>
<FunctionSub Name="标的交易编辑" Title="标的交易编辑" Type="Operate" Note="是否有标的交易编辑权限"></FunctionSub>
<FunctionSub Name="标的交易删除" Title="标的交易删除" Type="Operate" Note="是否有标的交易删除权限"></FunctionSub>
<FunctionSub Name="标的交易持仓重置" Title="标的交易持仓重置" Type="Operate" Note="是否有标的交易持仓重置权限"></FunctionSub>
<FunctionSub Name="偏移设置" Title="偏移设置" Type="Operate" Note="X-Bond行情报价添加偏移设置"></FunctionSub>
<FunctionSub Name="变更记录" Title="变更记录" Note="变更记录 "></FunctionSub>
<FunctionSub Name="收益凭证" Title="收益凭证"></FunctionSub>
<FunctionSub Name="凭证审批" Title="凭证审批"></FunctionSub>
@@ -52,14 +53,31 @@
<FunctionSub Name="白名单券池新增" Type="Operate" Title="白名单券池新增"></FunctionSub>
<FunctionSub Name="白名单券池编辑" Type="Operate" Title="白名单券池编辑"></FunctionSub>
<FunctionSub Name="白名单券池删除" Type="Operate" Title="白名单券池删除"></FunctionSub>
<FunctionSub Name="日终持仓风险" Title="日终持仓风险"></FunctionSub>
<FunctionSub Name="日终持仓风险" Title="日终持仓风险"></FunctionSub>
<FunctionSub Name="日终持仓风险_互换" Title="日终持仓风险_互换"></FunctionSub>
<FunctionSub Name="监控日志" Title="监控日志"></FunctionSub>
<FunctionSub Name="情景分析" Title="情景分析"></FunctionSub>
<FunctionSub Name="情景配置" Title="情景配置" Type="Operate" Note="交易页面是否有权限配置情景"></FunctionSub>
<FunctionSub Name="VaR计算" Title="VaR计算"></FunctionSub>
<FunctionSub Name="观察事件" Title="观察事件"></FunctionSub>
<FunctionSub Name="风险预警/禁止查询" Title="风险预警/禁止查询"></FunctionSub>
<FunctionSub Name="情景分析" Title="情景分析"></FunctionSub>
<FunctionSub Name="情景配置" Title="情景配置" Type="Operate" Note="交易页面是否有权限配置情景"></FunctionSub>
<FunctionSub Name="VaR计算" Title="VaR计算"></FunctionSub>
<FunctionSub Name="观察事件" Title="观察事件"></FunctionSub>
<FunctionSub Name="风险预警/禁止查询" Title="风险预警/禁止查询"></FunctionSub>
<FunctionSub Name="异常交易监控" Title="异常交易监控"></FunctionSub>
<FunctionSub Name="风控规则查看" Title="规则管理Tab" Note="控制规则管理Tab可见性"></FunctionSub>
<FunctionSub Name="风控规则新增" Type="Operate" Note="是否有权限新增风控规则"></FunctionSub>
<FunctionSub Name="风控规则编辑" Type="Operate" Note="是否有权限编辑风控规则"></FunctionSub>
<FunctionSub Name="风控规则删除" Type="Operate" Note="是否有权限删除/批量删除风控规则"></FunctionSub>
<FunctionSub Name="风控规则启停" Type="Operate" Note="是否有权限启用/停用风控规则"></FunctionSub>
<FunctionSub Name="风控应用查看" Title="规则应用Tab" Note="控制规则应用Tab可见性"></FunctionSub>
<FunctionSub Name="风控应用新增" Type="Operate" Note="是否有权限新增应用配置"></FunctionSub>
<FunctionSub Name="风控应用编辑" Type="Operate" Note="是否有权限编辑应用配置"></FunctionSub>
<FunctionSub Name="风控应用删除" Type="Operate" Note="是否有权限删除应用配置"></FunctionSub>
<FunctionSub Name="风控应用启停" Type="Operate" Note="是否有权限启用/停用/批量操作应用配置"></FunctionSub>
<FunctionSub Name="风控变量查看" Title="变量池Tab" Note="控制变量池Tab可见性"></FunctionSub>
<FunctionSub Name="风控变量新增" Type="Operate" Note="是否有权限新增变量"></FunctionSub>
<FunctionSub Name="风控变量编辑" Type="Operate" Note="是否有权限编辑变量"></FunctionSub>
<FunctionSub Name="风控变量删除" Type="Operate" Note="是否有权限删除变量"></FunctionSub>
<FunctionSub Name="风控日志查看" Title="操作日志Tab" Note="控制操作日志Tab可见性"></FunctionSub>
<FunctionSub Name="风控日志导出" Type="Operate" Note="是否有权限导出日志Excel"></FunctionSub>
</FunctionParent>
<FunctionParent Name="结算管理" Title="结算财务">
<FunctionSub Name="成交簿记" Title="成交簿记"></FunctionSub>
@@ -71,39 +89,39 @@
<FunctionSub Name="收盘操作" Title="收盘操作"></FunctionSub>
<FunctionSub Name="收盘" Type="Operate" Title="收盘"></FunctionSub>
<FunctionSub Name="每日估值报告" Title="每日估值报告"></FunctionSub>
<FunctionSub Name="每日估值报告邮件发送" Title="每日估值报告邮件发送" Type="Operate" Note="是否有每日估值报告权限" ></FunctionSub>
<FunctionSub Name="每日估值报告邮件发送" Title="每日估值报告邮件发送" Type="Operate" Note="是否有每日估值报告权限"></FunctionSub>
<FunctionSub Name="日终价格查看" Type="Operate" Title="日终价格查看"></FunctionSub>
<FunctionSub Name="日终价格修改" Type="Operate" Title="日终价格修改"></FunctionSub>
<FunctionSub Name="债券付息数据查看" Type="Operate" Title="债券付息数据查看"></FunctionSub>
<FunctionSub Name="债券付息数据修改" Type="Operate" Title="债券付息数据修改"></FunctionSub>
<FunctionSub Name="交易确认书" Title="交易确认书"></FunctionSub>
<FunctionSub Name="交易确认书生成" Title="交易确认书生成" Type="Operate" Note="是否有交易确认书生成权限" ></FunctionSub>
<FunctionSub Name="交易确认书邮件发送" Title="交易确认书邮件发送" Type="Operate" Note="是否有交易确认书邮件发送权限" ></FunctionSub>
<FunctionSub Name="交易确认书生成" Title="交易确认书生成" Type="Operate" Note="是否有交易确认书生成权限"></FunctionSub>
<FunctionSub Name="交易确认书邮件发送" Title="交易确认书邮件发送" Type="Operate" Note="是否有交易确认书邮件发送权限"></FunctionSub>
<FunctionSub Name="交易确认书-期权" Title="交易确认书-期权" Note="期权交易确认书页面访问权限"></FunctionSub>
<FunctionSub Name="结算确认书" Title="结算确认书"></FunctionSub>
<FunctionSub Name="结算确认书生成" Title="结算确认书生成" Type="Operate" Note="是否有结算确认书生成权限" ></FunctionSub>
<FunctionSub Name="结算确认书重置" Title="结算确认书重置" Type="Operate" Note="是否有结算确认书重置权限" ></FunctionSub>
<FunctionSub Name="结算确认书邮件发送" Title="结算确认书邮件发送" Type="Operate" Note="是否有结算确认书邮件发送权限" ></FunctionSub>
<FunctionSub Name="结算确认书生成" Title="结算确认书生成" Type="Operate" Note="是否有结算确认书生成权限"></FunctionSub>
<FunctionSub Name="结算确认书重置" Title="结算确认书重置" Type="Operate" Note="是否有结算确认书重置权限"></FunctionSub>
<FunctionSub Name="结算确认书邮件发送" Title="结算确认书邮件发送" Type="Operate" Note="是否有结算确认书邮件发送权限"></FunctionSub>
<FunctionSub Name="出入金维护" Title="资金记录"></FunctionSub>
<FunctionSub Name="资金审批页面" Title="资金审批"></FunctionSub>
<FunctionSub Name="出入金执行" Title="出入金执行" Type="Operate" Note="资金记录页面是否有出入金执行权限" ></FunctionSub>
<FunctionSub Name="出入金拒绝" Title="出入金拒绝" Type="Operate" Note="资金记录是否有出入金拒绝权限" ></FunctionSub>
<FunctionSub Name="出入金新增" Title="出入金新增" Type="Operate" Note="资金记录页面是否有出入金新增,导入权限,是否可以撤回" ></FunctionSub>
<FunctionSub Name="出入金执行" Title="出入金执行" Type="Operate" Note="资金记录页面是否有出入金执行权限"></FunctionSub>
<FunctionSub Name="出入金拒绝" Title="出入金拒绝" Type="Operate" Note="资金记录是否有出入金拒绝权限"></FunctionSub>
<FunctionSub Name="出入金新增" Title="出入金新增" Type="Operate" Note="资金记录页面是否有出入金新增,导入权限,是否可以撤回"></FunctionSub>
<FunctionSub Name="出入金删除" Title="出入金删除" Type="Operate" Note="资金记录页面是否有出入金删除权限"></FunctionSub>
<FunctionSub Name="生成出金单" Title="生成出金单" Type="Operate" Note="生成出金单权限" ></FunctionSub>
<FunctionSub Name="已拒绝资金重新发起" Title="已拒绝资金重新发起" Type="Operate" Note="已拒绝资金重新发起" ></FunctionSub>
<FunctionSub Name="生成出金单" Title="生成出金单" Type="Operate" Note="生成出金单权限"></FunctionSub>
<FunctionSub Name="已拒绝资金重新发起" Title="已拒绝资金重新发起" Type="Operate" Note="已拒绝资金重新发起"></FunctionSub>
<FunctionSub Name="修改资金记录" Title="资金记录维护" Type="Operate" Note="在资金记录页面,是否可以修改待确认和修改待确认的资金记录"></FunctionSub>
<FunctionSub Name="导入外部结算数据" Title="导入外部结算数据" Type="Operate" Note="导入外部结算数据"></FunctionSub>
<FunctionSub Name="其他报告" Title="其他报告" Note="用于存放用户个性化的非通用报表,仅针对此功能定制开发过的用户有效"></FunctionSub>
<FunctionSub Name="出入金是否进行资金账户类型用途的校验" Type="Operate" Title="出入金是否进行资金账户类型用途的校验"></FunctionSub>
<FunctionSub Name="资金通知书" Title="资金通知书"></FunctionSub>
</FunctionParent>
<FunctionParent Name="监管报告" Title="监管报告">
<FunctionSub Name="证券业报送" Title="证券业报送"></FunctionSub>
</FunctionParent>
<FunctionParent Name="监管报告" Title="监管报告">
<FunctionSub Name="证券业报送" Title="证券业报送"></FunctionSub>
</FunctionParent>
<FunctionParent Name="客户管理" Title="客户管理">
<FunctionSub Name="客户等级" Title="客户等级"></FunctionSub>
<FunctionSub Name="资信等级" Title="资信等级"></FunctionSub>
<FunctionSub Name="客户等级" Title="客户等级"></FunctionSub>
<FunctionSub Name="资信等级" Title="资信等级"></FunctionSub>
<FunctionSub Name="客户查看" Title="客户列表"></FunctionSub>
<FunctionSub Name="开户管理" Title="开户管理"></FunctionSub>
<FunctionSub Name="客户新增" Type="Operate" Note="是否有权限新增客户信息"></FunctionSub>
@@ -111,62 +129,62 @@
<FunctionSub Name="客户审批" Title="客户审批"></FunctionSub>
<FunctionSub Name="黑名单客户" Title="黑名单客户"></FunctionSub>
<FunctionSub Name="审批中客户信息编辑" Title="审批中客户信息编辑" Type="Operate" Note="是否可以修改审批中的客户信息"></FunctionSub>
<FunctionSub Name="黑名单客户管理" Type="Operate" Note="是否有权限进行客户黑名单操作" ></FunctionSub>
<FunctionSub Name="客户销户" Type="Operate" Note="是否有权限进行客户销户操作" ></FunctionSub>
<FunctionSub Name="客户休眠" Type="Operate" Note="是否有权限进行客户休眠操作" ></FunctionSub>
<FunctionSub Name="客户等级管理" Type="Operate" Note="是否有权限进行客户等级操作" ></FunctionSub>
<FunctionSub Name="黑名单客户管理" Type="Operate" Note="是否有权限进行客户黑名单操作"></FunctionSub>
<FunctionSub Name="客户销户" Type="Operate" Note="是否有权限进行客户销户操作"></FunctionSub>
<FunctionSub Name="客户休眠" Type="Operate" Note="是否有权限进行客户休眠操作"></FunctionSub>
<FunctionSub Name="客户等级管理" Type="Operate" Note="是否有权限进行客户等级操作"></FunctionSub>
<FunctionSub Name="担任适当性评估人" Type="Operate" Note="是否客户在客户信息的适当性管理页面中被选为适当性评估人"></FunctionSub>
<FunctionSub Name="导入客户银行卡" Type="Operate" Title="导入客户银行卡" Note="能否导入客户银行卡"></FunctionSub>
<FunctionSub Name="客户端密码设置" Type="Operate" Title="客户端密码设置" Note="能否设置客户端的密码"></FunctionSub>
<FunctionSub Name="正常状态客户修改" Type="Operate" Note="是否有对状态为正常的客户进行信息维护的权限"></FunctionSub>
<FunctionSub Name="销户休眠客户修改" Type="Operate" Note="是否有对已销户、已休眠的客户信息维护的权限"></FunctionSub>
<FunctionSub Name="批量修改客户信息" Type="Operate" Note="是否有权限批量修改客户信息"></FunctionSub>
<FunctionSub Name="客户标签调整权限" Title="客户标签调整权限" Type="Operate" Note="客户上打标签、移除标签、批量打标签" ></FunctionSub>
<FunctionSub Name="客户标签查看权限" Title="客户标签查看权限" Type="Operate" Note="是否可以查看客户上的标签" ></FunctionSub>
<FunctionSub Name="客户标签调整权限" Title="客户标签调整权限" Type="Operate" Note="客户上打标签、移除标签、批量打标签"></FunctionSub>
<FunctionSub Name="客户标签查看权限" Title="客户标签查看权限" Type="Operate" Note="是否可以查看客户上的标签"></FunctionSub>
<FunctionSub Name="机构账号设置" Title="机构账号设置"></FunctionSub>
<FunctionSub Name="机构账号设置新增" Title="机构账号设置新增" Type="Operate" Note="是否有机构账号设置新增权限" ></FunctionSub>
<FunctionSub Name="机构账号设置编辑" Title="机构账号设置编辑" Type="Operate" Note="是否有机构账号设置编辑权限" ></FunctionSub>
<FunctionSub Name="授信管理" Title="授信管理"></FunctionSub>
<FunctionSub Name="资信评级" Title="资信评级"></FunctionSub>
<FunctionSub Name="授信修改" Title="授信修改" Type="Operate" Note="是否可以修改授信(控制新增、修改、删除的 操作权限)"></FunctionSub>
<FunctionSub Name="资信等级有效期修改" Title="资信评级修改" Type="Operate" Note="是否可以修改用户资信评级(控制新增、修改权限)"></FunctionSub>
<FunctionSub Name="机构账号设置新增" Title="机构账号设置新增" Type="Operate" Note="是否有机构账号设置新增权限"></FunctionSub>
<FunctionSub Name="机构账号设置编辑" Title="机构账号设置编辑" Type="Operate" Note="是否有机构账号设置编辑权限"></FunctionSub>
<FunctionSub Name="授信管理" Title="授信管理"></FunctionSub>
<FunctionSub Name="资信评级" Title="资信评级"></FunctionSub>
<FunctionSub Name="授信修改" Title="授信修改" Type="Operate" Note="是否可以修改授信(控制新增、修改、删除的 操作权限)"></FunctionSub>
<FunctionSub Name="资信等级有效期修改" Title="资信评级修改" Type="Operate" Note="是否可以修改用户资信评级(控制新增、修改权限)"></FunctionSub>
</FunctionParent>
<FunctionParent Name="互换簿记预设" Title="互换簿记预设">
<FunctionSub Name="TRS用簿记账户设置" Title="TRS用簿记账户设置"></FunctionSub>
<FunctionSub Name="TRS用簿记账户设置新增" Title="TRS用簿记账户设置新增" Type="Operate" Note="是否有TRS用簿记账户设置新增权限" ></FunctionSub>
<FunctionSub Name="TRS用簿记账户设置编辑" Title="TRS用簿记账户设置编辑" Type="Operate" Note="是否有TRS用簿记账户设置编辑权限" ></FunctionSub>
<FunctionSub Name="TRS用簿记账户设置删除" Title="TRS用簿记账户设置删除" Type="Operate" Note="是否有TRS用簿记账户设置删除权限" ></FunctionSub>
<FunctionSub Name="TRS用簿记账户设置新增" Title="TRS用簿记账户设置新增" Type="Operate" Note="是否有TRS用簿记账户设置新增权限"></FunctionSub>
<FunctionSub Name="TRS用簿记账户设置编辑" Title="TRS用簿记账户设置编辑" Type="Operate" Note="是否有TRS用簿记账户设置编辑权限"></FunctionSub>
<FunctionSub Name="TRS用簿记账户设置删除" Title="TRS用簿记账户设置删除" Type="Operate" Note="是否有TRS用簿记账户设置删除权限"></FunctionSub>
<FunctionSub Name="簿记账户与衡泰关系" Title="簿记账户与衡泰关系"></FunctionSub>
<FunctionSub Name="簿记账户与衡泰关系新增" Title="簿记账户与衡泰关系新增" Type="Operate" Note="是否有簿记账户与衡泰关系权限" ></FunctionSub>
<FunctionSub Name="簿记账户与衡泰关系编辑" Title="簿记账户与衡泰关系编辑" Type="Operate" Note="是否有簿记账户与衡泰关系权限" ></FunctionSub>
<FunctionSub Name="簿记账户与衡泰关系删除" Title="簿记账户与衡泰关系删除" Type="Operate" Note="是否有簿记账户与衡泰关系权限" ></FunctionSub>
<FunctionSub Name="簿记账户与衡泰关系新增" Title="簿记账户与衡泰关系新增" Type="Operate" Note="是否有簿记账户与衡泰关系权限"></FunctionSub>
<FunctionSub Name="簿记账户与衡泰关系编辑" Title="簿记账户与衡泰关系编辑" Type="Operate" Note="是否有簿记账户与衡泰关系权限"></FunctionSub>
<FunctionSub Name="簿记账户与衡泰关系删除" Title="簿记账户与衡泰关系删除" Type="Operate" Note="是否有簿记账户与衡泰关系权限"></FunctionSub>
<FunctionSub Name="互换预付金率维护" Title="互换预付金率维护"></FunctionSub>
<FunctionSub Name="互换预付金率修改" Type="Operate" Title="互换预付金率修改"></FunctionSub>
<FunctionSub Name="阶梯费率" Title="阶梯费率" Note="互换阶梯费率"></FunctionSub>
<FunctionSub Name="阶梯费率新增" Title="阶梯费率新增" Type="Operate" Note="阶梯费率新增及导入" ></FunctionSub>
<FunctionSub Name="阶梯费率编辑" Title="阶梯费率编辑" Type="Operate" ></FunctionSub>
<FunctionSub Name="阶梯费率删除" Title="阶梯费率删除" Type="Operate" ></FunctionSub>
<FunctionSub Name="阶梯费率新增" Title="阶梯费率新增" Type="Operate" Note="阶梯费率新增及导入"></FunctionSub>
<FunctionSub Name="阶梯费率编辑" Title="阶梯费率编辑" Type="Operate"></FunctionSub>
<FunctionSub Name="阶梯费率删除" Title="阶梯费率删除" Type="Operate"></FunctionSub>
<FunctionSub Name="浮动利率" Title="浮动利率" Note="互换浮动利率"></FunctionSub>
<FunctionSub Name="浮动利率新增" Title="浮动利率新增" Type="Operate" Note="浮动利率新增及导入"></FunctionSub>
<FunctionSub Name="浮动利率编辑" Title="浮动利率编辑" Type="Operate" ></FunctionSub>
<FunctionSub Name="浮动利率删除" Title="浮动利率删除" Type="Operate" ></FunctionSub>
<FunctionSub Name="浮动利率新增" Title="浮动利率新增" Type="Operate" Note="浮动利率新增及导入"></FunctionSub>
<FunctionSub Name="浮动利率编辑" Title="浮动利率编辑" Type="Operate"></FunctionSub>
<FunctionSub Name="浮动利率删除" Title="浮动利率删除" Type="Operate"></FunctionSub>
</FunctionParent>
<FunctionParent Name="基础参数管理" Title="数据管理">
<FunctionSub Name="交易日历" Title="交易日历"></FunctionSub>
<FunctionSub Name="交易日历管理" Title="交易日历管理" Type="Operate" Note="是否有权限修改交易日历" ></FunctionSub>
<FunctionSub Name="交易日历管理" Title="交易日历管理" Type="Operate" Note="是否有权限修改交易日历"></FunctionSub>
<FunctionSub Name="交易市场" Title="交易市场"></FunctionSub>
<FunctionSub Name="交易市场修改" Type="Operate" Title="交易市场修改"></FunctionSub>
<FunctionSub Name="标的品种" Title="标的品种"></FunctionSub>
<FunctionSub Name="标的品种编辑" Title="标的品种编辑" Type="Operate" Note="是否有权限在标的品种页面编辑标的品种" ></FunctionSub>
<FunctionSub Name="标的品种编辑" Title="标的品种编辑" Type="Operate" Note="是否有权限在标的品种页面编辑标的品种"></FunctionSub>
<FunctionSub Name="标的管理" Title="标的资产"></FunctionSub>
<FunctionSub Name="标的资产编辑" Type="Operate" Title="标的资产编辑"></FunctionSub>
<FunctionSub Name="标的启用" Title="标的启用" Type="Operate" Note="标的资产页面是否可以启用标的资产" ></FunctionSub>
<FunctionSub Name="除权设置" Title="除权设置" Type="Operate" Note="是否可以在标的资产页面设置标的资产中的股票的除权除息信息" ></FunctionSub>
<FunctionSub Name="股票分红率查看" Title="股票分红率"></FunctionSub>
<FunctionSub Name="股票分红率设置" Title="股票分红率设置" Type="Operate" Note="股票分红率页面是否有新增修改权限" ></FunctionSub>
<FunctionSub Name="除权除息交易" Title="除权除息交易"></FunctionSub>
<FunctionSub Name="设置货币" Title="设置货币"></FunctionSub>
<FunctionSub Name="设置货币修改" Title="设置货币修改" Type="Operate" Note="修改设置货币"></FunctionSub>
<FunctionSub Name="标的启用" Title="标的启用" Type="Operate" Note="标的资产页面是否可以启用标的资产"></FunctionSub>
<FunctionSub Name="除权设置" Title="除权设置" Type="Operate" Note="是否可以在标的资产页面设置标的资产中的股票的除权除息信息"></FunctionSub>
<FunctionSub Name="股票分红率查看" Title="股票分红率"></FunctionSub>
<FunctionSub Name="股票分红率设置" Title="股票分红率设置" Type="Operate" Note="股票分红率页面是否有新增修改权限"></FunctionSub>
<FunctionSub Name="除权除息交易" Title="除权除息交易"></FunctionSub>
<FunctionSub Name="设置货币" Title="设置货币"></FunctionSub>
<FunctionSub Name="设置货币修改" Title="设置货币修改" Type="Operate" Note="修改设置货币"></FunctionSub>
</FunctionParent>
<FunctionParent Name="系统管理" Title="系统管理">
<FunctionSub Name="角色管理" Title="角色权限"></FunctionSub>
@@ -194,28 +212,28 @@
<FunctionSub Name="系统参数" Title="系统参数配置" Type="Operate"></FunctionSub>
<FunctionSub Name="交易权限" Title="交易权限"></FunctionSub>
<FunctionSub Name="交易权限修改" Type="Operate" Title="交易权限修改"></FunctionSub>
<FunctionSub Name="系统日期设置" Title="系统日期设置" Type="Operate" Note="是否有权限在交易参数页面设置系统日期" ></FunctionSub>
<FunctionSub Name="系统日期设置" Title="系统日期设置" Type="Operate" Note="是否有权限在交易参数页面设置系统日期"></FunctionSub>
<FunctionSub Name="交易特批" Title="交易特批" Type="Operate" Note="是否有权限在系统参数页面设置交易特批开关的权限"></FunctionSub>
<FunctionSub Name="出金特批" Title="出金特批" Type="Operate" Note="是否有权限在系统参数页面设置出金特批开关的权限"></FunctionSub>
<FunctionSub Name="交易相关" Title="交易相关" Type="Operate" Note="是否有权限在系统参数页面设置交易修改时是否需要说明开关的权限"></FunctionSub>
<FunctionSub Name="交易相关" Title="交易相关" Type="Operate" Note="是否有权限在系统参数页面设置交易修改时是否需要说明开关的权限"></FunctionSub>
<FunctionSub Name="平仓行权复核" Title="平仓行权复核" Type="Operate" Note="是否有权限在系统参数页面设置平仓行权复核开关的权限"></FunctionSub>
<FunctionSub Name="平仓行权审批" Title="平仓行权审批" Type="Operate" Note="是否有权限在系统参数页面设置平仓行权审批开关的权限"></FunctionSub>
<FunctionSub Name="凭证审批流程" Title="凭证审批流程"></FunctionSub>
</FunctionParent>
<FunctionParent Name="TRS交易端" Title="TRS交易端配置">
<FunctionSub Name="客户委托" Title="客户委托"></FunctionSub>
<FunctionSub Name="客户委托-确认对冲委托引擎开关" Title="客户委托-确认对冲委托引擎开关" Type="Operate" ></FunctionSub>
<FunctionSub Name="客户委托-合约成交" Title="客户委托-合约成交" Type="Operate" ></FunctionSub>
<FunctionSub Name="客户委托-确认对冲" Title="客户委托-确认对冲" Type="Operate" ></FunctionSub>
<FunctionSub Name="客户委托-批量合约成交" Title="客户委托-批量合约成交" Type="Operate" ></FunctionSub>
<FunctionSub Name="客户委托-批量拒绝" Title="客户委托-批量拒绝" Type="Operate" ></FunctionSub>
<FunctionSub Name="客户委托-新增客户交易" Title="客户委托-新增客户交易" Type="Operate" ></FunctionSub>
<FunctionSub Name="客户委托-拒绝" Title="客户委托-拒绝" Type="Operate" ></FunctionSub>
<FunctionSub Name="客户委托-确认对冲委托引擎开关" Title="客户委托-确认对冲委托引擎开关" Type="Operate"></FunctionSub>
<FunctionSub Name="客户委托-合约成交" Title="客户委托-合约成交" Type="Operate"></FunctionSub>
<FunctionSub Name="客户委托-确认对冲" Title="客户委托-确认对冲" Type="Operate"></FunctionSub>
<FunctionSub Name="客户委托-批量合约成交" Title="客户委托-批量合约成交" Type="Operate"></FunctionSub>
<FunctionSub Name="客户委托-批量拒绝" Title="客户委托-批量拒绝" Type="Operate"></FunctionSub>
<FunctionSub Name="客户委托-新增客户交易" Title="客户委托-新增客户交易" Type="Operate"></FunctionSub>
<FunctionSub Name="客户委托-拒绝" Title="客户委托-拒绝" Type="Operate"></FunctionSub>
<FunctionSub Name="对冲委托" Title="对冲委托"></FunctionSub>
<FunctionSub Name="对冲委托-确认对冲" Title="对冲委托-确认对冲" Type="Operate" ></FunctionSub>
<FunctionSub Name="对冲委托-对冲撤单" Title="对冲委托-对冲撤单" Type="Operate" ></FunctionSub>
<FunctionSub Name="对冲委托-确认对冲" Title="对冲委托-确认对冲" Type="Operate"></FunctionSub>
<FunctionSub Name="对冲委托-对冲撤单" Title="对冲委托-对冲撤单" Type="Operate"></FunctionSub>
<FunctionSub Name="成交补录" Title="成交补录"></FunctionSub>
<FunctionSub Name="成交补录-提交补录" Title="成交补录-提交补录" Type="Operate" ></FunctionSub>
<FunctionSub Name="成交补录-提交补录" Title="成交补录-提交补录" Type="Operate"></FunctionSub>
<FunctionSub Name="交易监控" Title="交易监控"></FunctionSub>
<FunctionSub Name="客户行为监控" Title="客户行为监控"></FunctionSub>
</FunctionParent>
+8
View File
@@ -180,6 +180,14 @@ namespace YLErp.Web
return;
}
var hasRight = false;
#if DEBUG
if (context.Controller is Controllers.RiskRuleController)
{
hasRight = true;
base.OnActionExecuting(context);
return;
}
#endif
var isAjaxRequest = Request.Headers["X-Requested-With"] == "XMLHttpRequest";
var typedHeaders = Request.GetTypedHeaders();
+2 -2
View File
@@ -1,4 +1,4 @@
using YLErp.DBModels.Consts;
using YLErp.DBModels.Consts;
using YLErp.Model.Enum;
using YLErp.Modules.ClientModule;
using YLErp.Modules.ClientModule.Models;
@@ -280,7 +280,7 @@ namespace YLErp.Web
if (user.Roles.Any(n => n.Name == "权限管理员"))
{
var rightStrs = new string[] { "部门管理", "系统管理", "角色管理", "角色新增", "角色修改", "用户管理", "用户新增", "用户修改", "用户禁用", "基础缓存" };
var rightStrs = new string[] { "部门管理", "系统管理", "角色管理", "角色新增", "角色修改", "用户管理", "用户新增", "用户修改", "用户禁用", "基础缓存", "风控规则查看", "风控规则新增", "风控规则编辑", "风控规则删除", "风控规则启停", "风控应用查看", "风控应用新增", "风控应用编辑", "风控应用删除", "风控应用启停", "风控变量查看", "风控变量新增", "风控变量编辑", "风控变量删除", "风控日志查看", "风控日志导出" };
var query1 = db.Functions.Where(o => rightStrs.Contains(o.Name)).Select(n => n.Id);
var query2 = from roleFunc in db.RoleFunctions
join roleUsr in db.RoleUsers on roleFunc.RoleId equals roleUsr.RoleId
+616
View File
@@ -0,0 +1,616 @@
using Qdp.Foundation.Utilities;
using YLErp.Modules.RiskEngine;
using YLErp.Modules.RiskEngine.Dto;
namespace YLErp.Web.Controllers
{
[Route("risk-engine")]
public class RiskRuleController : BaseController
{
private readonly IYcLogger _logger = LogFactory.GetLogger("RiskRuleController");
#region Rule Management
[HttpGet("risk-rules")]
[MyAuthorize("风控规则查看")]
public JsonResult QueryRiskRules(QueryRiskRuleReq req)
{
try
{
var service = new RiskRuleService(CurUser);
var result = service.QueryRuleList(req);
return Json(new { success = true, data = result });
}
catch (ServiceException ex)
{
return Json(new { success = false, message = ex.Message });
}
catch (Exception ex)
{
_logger.Error(ex, "查询风控规则列表");
return Json(new { success = false, message = "系统异常,请联系管理员" });
}
}
[HttpGet("risk-rules/{id}")]
[MyAuthorize("风控规则查看")]
public JsonResult GetRiskRule(long id)
{
try
{
var service = new RiskRuleService(CurUser);
var result = service.GetRuleDetail(id);
return Json(new { success = true, data = result });
}
catch (ServiceException ex)
{
return Json(new { success = false, message = ex.Message });
}
catch (Exception ex)
{
_logger.Error(ex, "查询风控规则详情");
return Json(new { success = false, message = "系统异常,请联系管理员" });
}
}
[HttpGet("risk-rules/{id}/versions")]
[MyAuthorize("风控规则查看")]
public JsonResult GetRiskRuleVersions(long id)
{
try
{
var service = new RiskRuleService(CurUser);
var result = service.GetRuleVersions(id);
return Json(new { success = true, data = result });
}
catch (ServiceException ex)
{
return Json(new { success = false, message = ex.Message });
}
catch (Exception ex)
{
_logger.Error(ex, "查询风控规则版本历史");
return Json(new { success = false, message = "系统异常,请联系管理员" });
}
}
[HttpPost("risk-rules")]
[MyAuthorize("风控规则新增")]
public JsonResult CreateRiskRule([FromBody] CreateRiskRuleReq req)
{
try
{
var service = new RiskRuleService(CurUser);
var result = service.CreateRule(req);
return Json(new { success = true, data = result });
}
catch (ServiceException ex)
{
return Json(new { success = false, message = ex.Message });
}
catch (Exception ex)
{
_logger.Error(ex, "创建风控规则");
return Json(new { success = false, message = "系统异常,请联系管理员" });
}
}
[HttpPut("risk-rules/{id}")]
[MyAuthorize("风控规则编辑")]
public JsonResult UpdateRiskRule(long id, [FromBody] UpdateRiskRuleReq req)
{
try
{
var service = new RiskRuleService(CurUser);
var result = service.UpdateRule(id, req);
return Json(new { success = true, data = result });
}
catch (ServiceException ex)
{
return Json(new { success = false, message = ex.Message });
}
catch (Exception ex)
{
_logger.Error(ex, "更新风控规则");
return Json(new { success = false, message = "系统异常,请联系管理员" });
}
}
[HttpDelete("risk-rules/{id}")]
[MyAuthorize("风控规则删除")]
public JsonResult DeleteRiskRule(long id)
{
try
{
var service = new RiskRuleService(CurUser);
service.DeleteRule(id);
return Json(new { success = true });
}
catch (ServiceException ex)
{
return Json(new { success = false, message = ex.Message });
}
catch (Exception ex)
{
_logger.Error(ex, "删除风控规则");
return Json(new { success = false, message = "系统异常,请联系管理员" });
}
}
[HttpDelete("risk-rules/batch")]
[MyAuthorize("风控规则删除")]
public JsonResult BatchDeleteRiskRules([FromBody] List<long> ids)
{
try
{
var service = new RiskRuleService(CurUser);
var result = service.BatchDeleteRules(ids);
return Json(new { success = true, data = result });
}
catch (ServiceException ex)
{
return Json(new { success = false, message = ex.Message });
}
catch (Exception ex)
{
_logger.Error(ex, "批量删除风控规则");
return Json(new { success = false, message = "系统异常,请联系管理员" });
}
}
[HttpPost("risk-rules/{id}/enable")]
[MyAuthorize("风控规则启停")]
public JsonResult EnableRiskRule(long id)
{
try
{
var service = new RiskRuleService(CurUser);
service.EnableRule(id);
return Json(new { success = true });
}
catch (ServiceException ex)
{
return Json(new { success = false, message = ex.Message });
}
catch (Exception ex)
{
_logger.Error(ex, "启用风控规则");
return Json(new { success = false, message = "系统异常,请联系管理员" });
}
}
[HttpPost("risk-rules/{id}/disable")]
[MyAuthorize("风控规则启停")]
public JsonResult DisableRiskRule(long id)
{
try
{
var service = new RiskRuleService(CurUser);
service.DisableRule(id);
return Json(new { success = true });
}
catch (ServiceException ex)
{
return Json(new { success = false, message = ex.Message });
}
catch (Exception ex)
{
_logger.Error(ex, "停用风控规则");
return Json(new { success = false, message = "系统异常,请联系管理员" });
}
}
[HttpGet("risk-rules/{id}/applications")]
[MyAuthorize("风控规则查看")]
public JsonResult GetRuleApplications(long id)
{
try
{
var service = new RiskRuleService(CurUser);
var result = service.GetRuleApplications(id);
return Json(new { success = true, data = result });
}
catch (ServiceException ex)
{
return Json(new { success = false, message = ex.Message });
}
catch (Exception ex)
{
_logger.Error(ex, "查询规则关联应用列表");
return Json(new { success = false, message = "系统异常,请联系管理员" });
}
}
#endregion
#region Application Management
[HttpGet("risk-applications")]
[MyAuthorize("风控应用查看")]
public JsonResult QueryRiskApplications(QueryRiskApplicationReq req)
{
try
{
var service = new RiskRuleService(CurUser);
var result = service.QueryApplicationList(req);
return Json(new { success = true, data = result });
}
catch (ServiceException ex)
{
return Json(new { success = false, message = ex.Message });
}
catch (Exception ex)
{
_logger.Error(ex, "查询应用配置列表");
return Json(new { success = false, message = "系统异常,请联系管理员" });
}
}
[HttpGet("risk-applications/{id}")]
[MyAuthorize("风控应用查看")]
public JsonResult GetRiskApplication(long id)
{
try
{
var service = new RiskRuleService(CurUser);
var result = service.GetApplicationDetail(id);
return Json(new { success = true, data = result });
}
catch (ServiceException ex)
{
return Json(new { success = false, message = ex.Message });
}
catch (Exception ex)
{
_logger.Error(ex, "查询应用配置详情");
return Json(new { success = false, message = "系统异常,请联系管理员" });
}
}
[HttpPost("risk-applications")]
[MyAuthorize("风控应用新增")]
public JsonResult CreateRiskApplication([FromBody] CreateRiskApplicationReq req)
{
try
{
var service = new RiskRuleService(CurUser);
var result = service.CreateApplication(req);
return Json(new { success = true, data = result });
}
catch (ServiceException ex)
{
return Json(new { success = false, message = ex.Message });
}
catch (Exception ex)
{
_logger.Error(ex, "创建应用配置");
return Json(new { success = false, message = "系统异常,请联系管理员" });
}
}
[HttpPut("risk-applications/{id}")]
[MyAuthorize("风控应用编辑")]
public JsonResult UpdateRiskApplication(long id, [FromBody] UpdateRiskApplicationReq req)
{
try
{
var service = new RiskRuleService(CurUser);
var result = service.UpdateApplication(id, req);
return Json(new { success = true, data = result });
}
catch (ServiceException ex)
{
return Json(new { success = false, message = ex.Message });
}
catch (Exception ex)
{
_logger.Error(ex, "更新应用配置");
return Json(new { success = false, message = "系统异常,请联系管理员" });
}
}
[HttpDelete("risk-applications/{id}")]
[MyAuthorize("风控应用删除")]
public JsonResult DeleteRiskApplication(long id)
{
try
{
var service = new RiskRuleService(CurUser);
service.DeleteApplication(id);
return Json(new { success = true });
}
catch (ServiceException ex)
{
return Json(new { success = false, message = ex.Message });
}
catch (Exception ex)
{
_logger.Error(ex, "删除应用配置");
return Json(new { success = false, message = "系统异常,请联系管理员" });
}
}
[HttpPost("risk-applications/{id}/enable")]
[MyAuthorize("风控应用启停")]
public JsonResult EnableRiskApplication(long id)
{
try
{
var service = new RiskRuleService(CurUser);
service.EnableApplication(id);
return Json(new { success = true });
}
catch (ServiceException ex)
{
return Json(new { success = false, message = ex.Message });
}
catch (Exception ex)
{
_logger.Error(ex, "启用应用配置");
return Json(new { success = false, message = "系统异常,请联系管理员" });
}
}
[HttpPost("risk-applications/{id}/disable")]
[MyAuthorize("风控应用启停")]
public JsonResult DisableRiskApplication(long id)
{
try
{
var service = new RiskRuleService(CurUser);
service.DisableApplication(id);
return Json(new { success = true });
}
catch (ServiceException ex)
{
return Json(new { success = false, message = ex.Message });
}
catch (Exception ex)
{
_logger.Error(ex, "停用应用配置");
return Json(new { success = false, message = "系统异常,请联系管理员" });
}
}
[HttpPost("risk-applications/batch-enable")]
[MyAuthorize("风控应用启停")]
public JsonResult BatchEnableRiskApplications([FromBody] List<long> ids)
{
try
{
var service = new RiskRuleService(CurUser);
var result = service.BatchEnableApplications(ids);
return Json(new { success = true, data = result });
}
catch (ServiceException ex)
{
return Json(new { success = false, message = ex.Message });
}
catch (Exception ex)
{
_logger.Error(ex, "批量启用应用配置");
return Json(new { success = false, message = "系统异常,请联系管理员" });
}
}
[HttpPost("risk-applications/batch-disable")]
[MyAuthorize("风控应用启停")]
public JsonResult BatchDisableRiskApplications([FromBody] List<long> ids)
{
try
{
var service = new RiskRuleService(CurUser);
var result = service.BatchDisableApplications(ids);
return Json(new { success = true, data = result });
}
catch (ServiceException ex)
{
return Json(new { success = false, message = ex.Message });
}
catch (Exception ex)
{
_logger.Error(ex, "批量停用应用配置");
return Json(new { success = false, message = "系统异常,请联系管理员" });
}
}
#endregion
#region Variable Management
[HttpGet("risk-variables")]
[MyAuthorize("风控变量查看")]
public JsonResult QueryRiskVariables(QueryRiskVariableReq req)
{
try
{
var service = new RiskRuleService(CurUser);
var result = service.QueryVariableList(req);
return Json(new { success = true, data = result });
}
catch (ServiceException ex)
{
return Json(new { success = false, message = ex.Message });
}
catch (Exception ex)
{
_logger.Error(ex, "查询变量列表");
return Json(new { success = false, message = "系统异常,请联系管理员" });
}
}
[HttpGet("risk-variables/{id}")]
[MyAuthorize("风控变量查看")]
public JsonResult GetRiskVariable(long id)
{
try
{
var service = new RiskRuleService(CurUser);
var result = service.GetVariableDetail(id);
return Json(new { success = true, data = result });
}
catch (ServiceException ex)
{
return Json(new { success = false, message = ex.Message });
}
catch (Exception ex)
{
_logger.Error(ex, "查询变量详情");
return Json(new { success = false, message = "系统异常,请联系管理员" });
}
}
[HttpGet("risk-variables/list")]
[MyAuthorize("风控变量查看")]
public JsonResult GetAllRiskVariables()
{
try
{
var service = new RiskRuleService(CurUser);
var result = service.GetAllVariableList();
return Json(new { success = true, data = result });
}
catch (ServiceException ex)
{
return Json(new { success = false, message = ex.Message });
}
catch (Exception ex)
{
_logger.Error(ex, "查询全部变量列表");
return Json(new { success = false, message = "系统异常,请联系管理员" });
}
}
[HttpPost("risk-variables")]
[MyAuthorize("风控变量新增")]
public JsonResult CreateRiskVariable([FromBody] CreateRiskVariableReq req)
{
try
{
var service = new RiskRuleService(CurUser);
var result = service.CreateVariable(req);
return Json(new { success = true, data = result });
}
catch (ServiceException ex)
{
return Json(new { success = false, message = ex.Message });
}
catch (Exception ex)
{
_logger.Error(ex, "创建变量");
return Json(new { success = false, message = "系统异常,请联系管理员" });
}
}
[HttpPut("risk-variables/{id}")]
[MyAuthorize("风控变量编辑")]
public JsonResult UpdateRiskVariable(long id, [FromBody] UpdateRiskVariableReq req)
{
try
{
var service = new RiskRuleService(CurUser);
var result = service.UpdateVariable(id, req);
return Json(new { success = true, data = result });
}
catch (ServiceException ex)
{
return Json(new { success = false, message = ex.Message });
}
catch (Exception ex)
{
_logger.Error(ex, "更新变量");
return Json(new { success = false, message = "系统异常,请联系管理员" });
}
}
[HttpDelete("risk-variables/{id}")]
[MyAuthorize("风控变量删除")]
public JsonResult DeleteRiskVariable(long id)
{
try
{
var service = new RiskRuleService(CurUser);
service.DeleteVariable(id);
return Json(new { success = true });
}
catch (ServiceException ex)
{
return Json(new { success = false, message = ex.Message });
}
catch (Exception ex)
{
_logger.Error(ex, "删除变量");
return Json(new { success = false, message = "系统异常,请联系管理员" });
}
}
#endregion
#region Audit Log
[HttpGet("risk-audit-logs")]
[MyAuthorize("风控日志查看")]
public JsonResult QueryRiskAuditLogs(QueryRiskAuditLogReq req)
{
try
{
var service = new RiskRuleService(CurUser);
var result = service.QueryAuditLogs(req);
return Json(new { success = true, data = result });
}
catch (ServiceException ex)
{
return Json(new { success = false, message = ex.Message });
}
catch (Exception ex)
{
_logger.Error(ex, "查询风控操作日志列表");
return Json(new { success = false, message = "系统异常,请联系管理员" });
}
}
[HttpGet("risk-audit-logs/{id}")]
[MyAuthorize("风控日志查看")]
public JsonResult GetRiskAuditLogDetail(long id)
{
try
{
var service = new RiskRuleService(CurUser);
var result = service.GetAuditLogDetail(id);
return Json(new { success = true, data = result });
}
catch (ServiceException ex)
{
return Json(new { success = false, message = ex.Message });
}
catch (Exception ex)
{
_logger.Error(ex, "查询风控操作日志详情");
return Json(new { success = false, message = "系统异常,请联系管理员" });
}
}
[HttpGet("risk-audit-logs/export")]
[MyAuthorize("风控日志导出")]
public IActionResult ExportRiskAuditLogs(QueryRiskAuditLogReq req)
{
try
{
var service = new RiskRuleService(CurUser);
var bytes = service.ExportAuditLogs(req);
return File(bytes, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "风控操作日志.xlsx");
}
catch (ServiceException ex)
{
return Json(new { success = false, message = ex.Message });
}
catch (Exception ex)
{
_logger.Error(ex, "导出风控操作日志");
return Json(new { success = false, message = "系统异常,请联系管理员" });
}
}
#endregion
}
}
+14 -11
View File
@@ -7,15 +7,15 @@
},
"AllowedHosts": "*",
"ConnectionStrings": {
"ylcms": "server=192.168.2.96;uid=DBAdmin;pooling=true;port=3306;pwd=YieldChain$$2025;database=glms_yltrs_ylcms;charset=utf8;Allow User Variables=True;SslMode=none;Connection Timeout=30;IgnoreCommandTransaction=true;",
"yladmin": "server=192.168.2.96;uid=DBAdmin;pooling=true;port=3306;pwd=YieldChain$$2025;database=glms_yltrs_admin;charset=utf8;Allow User Variables=True;SslMode=none;Connection Timeout=30;IgnoreCommandTransaction=true;",
"ylclient": "server=192.168.2.96;uid=DBAdmin;pooling=true;port=3306;pwd=YieldChain$$2025;database=glms_yltrs_client;charset=utf8;Allow User Variables=True;SslMode=none;Connection Timeout=30;IgnoreCommandTransaction=true;",
"bondoms": "server=192.168.2.96;uid=DBAdmin;pooling=true;port=3306;pwd=YieldChain$$2025;database=glms_bond_oms;charset=utf8;Allow User Variables=True;SslMode=none;Connection Timeout=30;IgnoreCommandTransaction=true;"
"ylcms": "server=10.250.202.35;uid=onederiv@OneDeriv#wx_dtpp_test;pooling=true;port=2883;pwd=Onederiv@2026;database=yltrs_ylcms;charset=utf8;Allow User Variables=True;SslMode=none;Connection Timeout=30;IgnoreCommandTransaction=true;",
"yladmin": "server=10.250.202.35;uid=onederiv@OneDeriv#wx_dtpp_test;pooling=true;port=2883;pwd=Onederiv@2026;database=yltrs_admin;charset=utf8;Allow User Variables=True;SslMode=none;Connection Timeout=30;IgnoreCommandTransaction=true;",
"ylclient": "server=10.250.202.35;uid=onederiv@OneDeriv#wx_dtpp_test;pooling=true;port=2883;pwd=Onederiv@2026;database=yltrs_client;charset=utf8;Allow User Variables=True;SslMode=none;Connection Timeout=30;IgnoreCommandTransaction=true;",
"bondoms": "server=10.250.202.35;uid=onederiv@OneDeriv#wx_dtpp_test;pooling=true;port=2883;pwd=Onederiv@2026;database=bond_oms;charset=utf8;Allow User Variables=True;SslMode=none;Connection Timeout=30;IgnoreCommandTransaction=true;"
},
"AppSettings": {
"VirtualPathRoot": "",
"UseRightAligned": "",
"PluginFolder": "D:\\workspace\\glms\\zszq-trs\\Plugins\\YLErp.Plugins.GuoLian\\obj\\Debug\\net6.0"
"PluginFolder": "D:\\workspace\\onederiv\\trs\\Plugins\\YLErp.Plugins.GuoLian\\obj\\Debug\\net6.0" // 改为本地目录地址
},
"LibreOffice": {
"ExePath": "",
@@ -75,12 +75,15 @@
"SendKafakaCron": "10 0 * * *",
"MaxThreadPercent": 0.6, //占系统资源最多60%的线程数量
"oa_confg": {
"BaseUrl": "http://ip:port",
"SubUrl": "",
"UploadUrl": "/api/oa/upload", // OA附件上传接口路径
"SystemToken": "your-system-token", // OA系统鉴权Token
"SystemName": "OTC_TRADE", // 调用方系统标识
"IsNextFlow": 0
"BaseUrl": "http://10.250.202.40:13590",
"SubUrl": "/gateway/oaflow/createOaFlow",
"QueryUrl": "/gateway/oaflow/getRequestData",
"DownloadFileUrl": "/gateway/oaflow/downloadSingleFile",
"SystemToken": "QIkox8sv3rVLtiT1wmI4Dp8wSjX9D84Glkp121vRino9fLobWnDiy8ppmqJcv1676TYuxZsGrYelx0whRCMaPyums2VnzIYrpqCFf5tyc3/x22Elf25xgRmd5pH8tLcnPuVOjMrUf0GsoytQCGFkhnrPajhsKq/mSwYQ4OA=", //OA系统key
"SystemName": "onederiv",
"IsNextFlow": 1, //是否自动提交 默认0
"FlowId": 779115,
"UploadUrl": "http://10.250.202.40:13590/gateway/oaflow/uploadDoc"
},
"GeneralSSO": {
"enable": true, //是否启用通用SSO登录