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-07-14 17:18:47 +08:00
2 changed files with 138 additions and 116 deletions
+46 -27
View File
@@ -1,6 +1,7 @@
using BaseOUDAL;
using Newtonsoft.Json;
using System.Linq.Expressions;
using System.Text.RegularExpressions;
using YLErp.BLL;
using YLErp.DBModels;
using YLErp.Modules.RiskEngine.Dto;
@@ -113,7 +114,7 @@ using YLErp.Modules.RiskEngine.Dto;
ValidateTriggerPoints(triggerPoints) 触发时点校验(5 个合法时点)
ValidateScopeFields(req) Scope 字段校验(全局互斥 + ID 格式校验)
ValidateIdList(idList, fieldName) ID 列表格式校验
TryRefreshCache() 安全调用 RefreshCache(失败仅记日志
RefreshOneRuleCache(ruleId) 单条规则缓存刷新(规则变更后调用
GetRuleOrThrow / GetApplicationOrThrow / GetVariableOrThrow 实体获取快捷方法
【关键设计决策】
@@ -124,7 +125,7 @@ using YLErp.Modules.RiskEngine.Dto;
5. ConditionJson 校验:变量存在性(按 VariableId+ 操作符合法性(按 DataType 映射)+ 类型匹配 + 阈值变量引用
6. RuleExpr:自由文本模式下前端直接编辑,后端做基础语法校验(括号匹配 + 变量引用校验)
7. Scope 字段:逗号分隔字符串存储,全局适用时不允许指定其他维度
8. 缓存刷新:写操作后调用 TryRefreshCache(),失败仅记日志不影响操作结果
8. 缓存刷新:规则变更后调用 RefreshOneRuleCache(ruleId),应用变更后调用 RefreshApplication()
9. 批量操作:单事务批量,全部成功或全部失败
10. 变量缓存:5 分钟本地 HashSet<string> 缓存,CRUD 后 InvalidateVariableCache()
11. 审计日志:16 种操作类型,CRUD + 审计日志同一事务,SnapshotData 存储版本快照
@@ -172,7 +173,7 @@ using YLErp.Modules.RiskEngine.Dto;
【注意事项】
1. RiskEngineService 由另一个团队开发实现,本服务通过 GetInstance() 获取单例引用
2. 所有写操作后必须调用 TryRefreshCache(),确保引擎缓存与数据库一致
2. 规则变更后调用 RefreshOneRuleCache(ruleId),应用变更后调用 RefreshApplication(),变量变更不触发引擎缓存刷新
3. 变量删除为硬删除(物理删除),规则/应用删除为软删除(Status=Deleted
4. ExportAuditLogs 当前为占位实现,Excel 导出功能待后续迭代
5. VariableExpr 当前仅做基础长度校验(≤10000),完整编译校验待引入 Roslyn 库
@@ -850,7 +851,7 @@ namespace YLErp.Modules.RiskEngine
WriteAuditLog("RULE_DELETE", "RULE", ruleId, rule.RuleName, "删除规则");
DbContext.SaveChanges();
TryRefreshCache();
RiskEngineService.GetInstance().RefreshOneRuleCache(ruleId);
}
/// <summary>
@@ -862,6 +863,10 @@ namespace YLErp.Modules.RiskEngine
if (rule == null)
throw new ServiceException("仅已停用的规则可以启用");
var compileResult = RuleCompiler.ValidateAndCompileFormula(ruleId, rule.RuleExpr);
if (!compileResult.Success)
throw new ServiceException($"规则表达式编译失败:{compileResult.ErrorMessage}");
rule.Status = RiskRuleStatus.Active;
rule.UpdateOptId = UserId;
rule.UpdateOptName = UserName;
@@ -870,7 +875,7 @@ namespace YLErp.Modules.RiskEngine
WriteAuditLog("RULE_ENABLE", "RULE", ruleId, rule.RuleName, "启用规则");
DbContext.SaveChanges();
TryRefreshCache();
RiskEngineService.GetInstance().RefreshOneRuleCache(ruleId);
}
/// <summary>
@@ -890,7 +895,7 @@ namespace YLErp.Modules.RiskEngine
WriteAuditLog("RULE_DISABLE", "RULE", ruleId, rule.RuleName, "停用规则");
DbContext.SaveChanges();
TryRefreshCache();
RiskEngineService.GetInstance().RefreshOneRuleCache(ruleId);
}
/// <summary>
@@ -966,7 +971,10 @@ namespace YLErp.Modules.RiskEngine
}
DbContext.SaveChanges();
TryRefreshCache();
foreach (var ruleId in ruleIds)
{
RiskEngineService.GetInstance().RefreshOneRuleCache(ruleId);
}
return new BatchOperationResult
{
@@ -1372,6 +1380,27 @@ namespace YLErp.Modules.RiskEngine
#endregion
/// <summary>
/// 查询 ConditionJson 中引用了指定变量 ID 的规则(仅结构化模式)
/// 精确匹配 "VariableId":{id} 或 "ThresholdVariableId":{id}\b 防止 id=1 误匹配 id=10
/// </summary>
private List<glms_risk_rule> GetRulesByVariableId(long variableId)
{
var allRules = DbContext.glms_risk_rule
.Where(r => r.Status != RiskRuleStatus.Deleted && r.ConditionJson != null)
.ToList();
if (allRules.Count == 0) return allRules;
var idPattern = $@"""VariableId""\s*:\s*{variableId}\b";
var thresholdPattern = $@"""ThresholdVariableId""\s*:\s*{variableId}\b";
return allRules.Where(r =>
Regex.IsMatch(r.ConditionJson, idPattern) ||
Regex.IsMatch(r.ConditionJson, thresholdPattern)
).ToList();
}
#region Variable Management
/// <summary>
@@ -1498,7 +1527,6 @@ namespace YLErp.Modules.RiskEngine
}
InvalidateVariableCache();
TryRefreshCache();
return GetVariableDetail(entity.id);
}
@@ -1520,11 +1548,8 @@ namespace YLErp.Modules.RiskEngine
if (req.DataType != variable.DataType)
{
var varExpr = variable.VariableExpr;
var activeRefCount = DbContext.glms_risk_rule
.Count(r => r.Status == RiskRuleStatus.Active &&
((r.ConditionJson != null && r.ConditionJson.Contains(variable.id.ToString())) ||
(r.RuleExpr != null && varExpr != null && r.RuleExpr.Contains(varExpr))));
var activeRefCount = GetRulesByVariableId(variableId)
.Count(r => r.Status == RiskRuleStatus.Active);
if (activeRefCount > 0)
throw new ServiceException($"该变量被 {activeRefCount} 个生效中的规则引用,无法修改数据类型");
}
@@ -1548,9 +1573,9 @@ namespace YLErp.Modules.RiskEngine
if (variableExprChanged)
{
// 编译校验:变量表达式变更后,需验证所有级联更新的规则表达式可编译
var affectedRules = DbContext.glms_risk_rule
.Where(r => r.RuleExpr != null && r.RuleExpr.Contains(oldVariableExpr))
// 结构化模式:通过 ConditionJson 中的 VariableId 找到受影响的规则
var affectedRules = GetRulesByVariableId(variableId)
.Where(r => r.RuleExpr != null)
.ToList();
var compileTasks = affectedRules.Select(r =>
@@ -1579,11 +1604,9 @@ namespace YLErp.Modules.RiskEngine
WriteAuditLog("VAR_UPDATE", "VARIABLE", variableId, req.VariableName, $"修改变量:{variable.VariableName}");
foreach (var rule in affectedRules)
{
WriteAuditLog("VAR_UPDATE_CASCADE", "RULE", rule.id, rule.RuleName,
$"变量 [{variable.VariableName}] VariableExpr 变更,级联更新规则 RuleExpr");
}
var cascadedRuleIds = affectedRules.Select(r => r.id.ToString()).ToList();
WriteAuditLog("VAR_UPDATE_CASCADE", "VARIABLE", variableId, req.VariableName,
$"变量 [{variable.VariableName}] VariableExpr 变更,级联更新规则 {string.Join("", cascadedRuleIds)}");
DbContext.SaveChanges();
transaction.Commit();
@@ -1618,11 +1641,8 @@ namespace YLErp.Modules.RiskEngine
{
var variable = GetVariableOrThrow(variableId);
var varExpr = variable.VariableExpr;
var activeRefCount = DbContext.glms_risk_rule
.Count(r => r.Status == RiskRuleStatus.Active &&
((r.ConditionJson != null && r.ConditionJson.Contains(variable.id.ToString())) ||
(r.RuleExpr != null && varExpr != null && r.RuleExpr.Contains(varExpr))));
var activeRefCount = GetRulesByVariableId(variableId)
.Count(r => r.Status == RiskRuleStatus.Active);
if (activeRefCount > 0)
throw new ServiceException($"该变量被 {activeRefCount} 个生效中的规则引用,无法删除");
@@ -1632,7 +1652,6 @@ namespace YLErp.Modules.RiskEngine
DbContext.SaveChanges();
InvalidateVariableCache();
TryRefreshCache();
}
/// <summary>
+92 -89
View File
@@ -1,4 +1,5 @@
using Qdp.Foundation.Utilities;
using System.Threading.Tasks;
using YLErp.DBModels;
using YLErp.Modules.RiskEngine;
using YLErp.Modules.RiskEngine.Dto;
@@ -11,17 +12,19 @@ namespace YLErp.Web.Controllers
{
private readonly IYcLogger _logger = LogFactory.GetLogger("RiskRuleController");
private RiskRuleService GetRiskRuleService() => new RiskRuleService(CurUser);
#region Rule Management
[HttpGet("risk-rules")]
[MyAuthorize("风险控制-风控规则查看")]
/// <summary>查询风控规则列表(分页)</summary>
public JsonResult QueryRiskRules(QueryRiskRuleReq req)
public async Task<JsonResult> QueryRiskRules(QueryRiskRuleReq req)
{
try
{
var service = new RiskRuleService(CurUser);
var result = service.QueryRuleList(req);
var service = GetRiskRuleService();
var result = await Task.Run(() => service.QueryRuleList(req));
return Json(new { success = true, data = result });
}
catch (ServiceException ex)
@@ -38,12 +41,12 @@ namespace YLErp.Web.Controllers
[HttpGet("risk-rules/{id}")]
[MyAuthorize("风险控制-风控规则查看")]
/// <summary>获取风控规则详情</summary>
public JsonResult GetRiskRule(long id)
public async Task<JsonResult> GetRiskRule(long id)
{
try
{
var service = new RiskRuleService(CurUser);
var result = service.GetRuleDetail(id);
var service = GetRiskRuleService();
var result = await Task.Run(() => service.GetRuleDetail(id));
return Json(new { success = true, data = result });
}
catch (ServiceException ex)
@@ -60,12 +63,12 @@ namespace YLErp.Web.Controllers
[HttpGet("risk-rules/{id}/versions")]
[MyAuthorize("风险控制-风控规则查看")]
/// <summary>获取风控规则版本历史</summary>
public JsonResult GetRiskRuleVersions(long id)
public async Task<JsonResult> GetRiskRuleVersions(long id)
{
try
{
var service = new RiskRuleService(CurUser);
var result = service.GetRuleVersions(id);
var service = GetRiskRuleService();
var result = await Task.Run(() => service.GetRuleVersions(id));
return Json(new { success = true, data = result });
}
catch (ServiceException ex)
@@ -82,12 +85,12 @@ namespace YLErp.Web.Controllers
[HttpPost("risk-rules")]
[MyAuthorize("风险控制-风控规则新增")]
/// <summary>创建风控规则</summary>
public JsonResult CreateRiskRule([FromBody] CreateRiskRuleReq req)
public async Task<JsonResult> CreateRiskRule([FromBody] CreateRiskRuleReq req)
{
try
{
var service = new RiskRuleService(CurUser);
var result = service.CreateRule(req);
var service = GetRiskRuleService();
var result = await Task.Run(() => service.CreateRule(req));
return Json(new { success = true, data = result });
}
catch (ServiceException ex)
@@ -104,12 +107,12 @@ namespace YLErp.Web.Controllers
[HttpPut("risk-rules/{id}")]
[MyAuthorize("风险控制-风控规则编辑")]
/// <summary>更新风控规则</summary>
public JsonResult UpdateRiskRule(long id, [FromBody] UpdateRiskRuleReq req)
public async Task<JsonResult> UpdateRiskRule(long id, [FromBody] UpdateRiskRuleReq req)
{
try
{
var service = new RiskRuleService(CurUser);
var result = service.UpdateRule(id, req);
var service = GetRiskRuleService();
var result = await Task.Run(() => service.UpdateRule(id, req));
return Json(new { success = true, data = result });
}
catch (ServiceException ex)
@@ -126,12 +129,12 @@ namespace YLErp.Web.Controllers
[HttpDelete("risk-rules/{id}")]
[MyAuthorize("风险控制-风控规则删除")]
/// <summary>删除风控规则(软删除)</summary>
public JsonResult DeleteRiskRule(long id)
public async Task<JsonResult> DeleteRiskRule(long id)
{
try
{
var service = new RiskRuleService(CurUser);
service.DeleteRule(id);
var service = GetRiskRuleService();
await Task.Run(() => service.DeleteRule(id));
return Json(new { success = true });
}
catch (ServiceException ex)
@@ -148,12 +151,12 @@ namespace YLErp.Web.Controllers
[HttpDelete("risk-rules/batch")]
[MyAuthorize("风险控制-风控规则删除")]
/// <summary>批量删除风控规则</summary>
public JsonResult BatchDeleteRiskRules([FromBody] List<long> ids)
public async Task<JsonResult> BatchDeleteRiskRules([FromBody] List<long> ids)
{
try
{
var service = new RiskRuleService(CurUser);
var result = service.BatchDeleteRules(ids);
var service = GetRiskRuleService();
var result = await Task.Run(() => service.BatchDeleteRules(ids));
return Json(new { success = true, data = result });
}
catch (ServiceException ex)
@@ -170,12 +173,12 @@ namespace YLErp.Web.Controllers
[HttpPost("risk-rules/{id}/enable")]
[MyAuthorize("风险控制-风控规则启停")]
/// <summary>启用风控规则</summary>
public JsonResult EnableRiskRule(long id)
public async Task<JsonResult> EnableRiskRule(long id)
{
try
{
var service = new RiskRuleService(CurUser);
service.EnableRule(id);
var service = GetRiskRuleService();
await Task.Run(() => service.EnableRule(id));
return Json(new { success = true });
}
catch (ServiceException ex)
@@ -192,12 +195,12 @@ namespace YLErp.Web.Controllers
[HttpPost("risk-rules/{id}/disable")]
[MyAuthorize("风险控制-风控规则启停")]
/// <summary>停用风控规则</summary>
public JsonResult DisableRiskRule(long id)
public async Task<JsonResult> DisableRiskRule(long id)
{
try
{
var service = new RiskRuleService(CurUser);
service.DisableRule(id);
var service = GetRiskRuleService();
await Task.Run(() => service.DisableRule(id));
return Json(new { success = true });
}
catch (ServiceException ex)
@@ -214,12 +217,12 @@ namespace YLErp.Web.Controllers
[HttpGet("risk-rules/{id}/applications")]
[MyAuthorize("风险控制-风控规则查看")]
/// <summary>获取规则关联的应用配置列表</summary>
public JsonResult GetRuleApplications(long id)
public async Task<JsonResult> GetRuleApplications(long id)
{
try
{
var service = new RiskRuleService(CurUser);
var result = service.GetRuleApplications(id);
var service = GetRiskRuleService();
var result = await Task.Run(() => service.GetRuleApplications(id));
return Json(new { success = true, data = new { rows = result, total = result.Count, records = result.Count, page = 1 } });
}
catch (ServiceException ex)
@@ -236,12 +239,12 @@ namespace YLErp.Web.Controllers
[HttpGet("risk-rules/list")]
[MyAuthorize("风险控制-风控规则查看")]
/// <summary>获取所有启用规则列表(供下拉选择)</summary>
public JsonResult GetAllRiskRules()
public async Task<JsonResult> GetAllRiskRules()
{
try
{
var service = new RiskRuleService(CurUser);
var result = service.GetAllRuleList();
var service = GetRiskRuleService();
var result = await Task.Run(() => service.GetAllRuleList());
return Json(new { success = true, data = new { rows = result, total = result.Count, records = result.Count, page = 1 } });
}
catch (ServiceException ex)
@@ -262,12 +265,12 @@ namespace YLErp.Web.Controllers
[HttpGet("risk-applications")]
[MyAuthorize("风险控制-风控应用查看")]
/// <summary>查询应用配置列表(分页)</summary>
public JsonResult QueryRiskApplications(QueryRiskApplicationReq req)
public async Task<JsonResult> QueryRiskApplications(QueryRiskApplicationReq req)
{
try
{
var service = new RiskRuleService(CurUser);
var result = service.QueryApplicationList(req);
var service = GetRiskRuleService();
var result = await Task.Run(() => service.QueryApplicationList(req));
return Json(new { success = true, data = result });
}
catch (ServiceException ex)
@@ -284,12 +287,12 @@ namespace YLErp.Web.Controllers
[HttpGet("risk-applications/{id}")]
[MyAuthorize("风险控制-风控应用查看")]
/// <summary>获取应用配置详情</summary>
public JsonResult GetRiskApplication(long id)
public async Task<JsonResult> GetRiskApplication(long id)
{
try
{
var service = new RiskRuleService(CurUser);
var result = service.GetApplicationDetail(id);
var service = GetRiskRuleService();
var result = await Task.Run(() => service.GetApplicationDetail(id));
return Json(new { success = true, data = result });
}
catch (ServiceException ex)
@@ -306,12 +309,12 @@ namespace YLErp.Web.Controllers
[HttpPost("risk-applications")]
[MyAuthorize("风险控制-风控应用新增")]
/// <summary>创建应用配置</summary>
public JsonResult CreateRiskApplication([FromBody] CreateRiskApplicationReq req)
public async Task<JsonResult> CreateRiskApplication([FromBody] CreateRiskApplicationReq req)
{
try
{
var service = new RiskRuleService(CurUser);
var result = service.CreateApplication(req);
var service = GetRiskRuleService();
var result = await Task.Run(() => service.CreateApplication(req));
return Json(new { success = true, data = result });
}
catch (ServiceException ex)
@@ -328,12 +331,12 @@ namespace YLErp.Web.Controllers
[HttpPut("risk-applications/{id}")]
[MyAuthorize("风险控制-风控应用编辑")]
/// <summary>更新应用配置</summary>
public JsonResult UpdateRiskApplication(long id, [FromBody] UpdateRiskApplicationReq req)
public async Task<JsonResult> UpdateRiskApplication(long id, [FromBody] UpdateRiskApplicationReq req)
{
try
{
var service = new RiskRuleService(CurUser);
var result = service.UpdateApplication(id, req);
var service = GetRiskRuleService();
var result = await Task.Run(() => service.UpdateApplication(id, req));
return Json(new { success = true, data = result });
}
catch (ServiceException ex)
@@ -350,12 +353,12 @@ namespace YLErp.Web.Controllers
[HttpDelete("risk-applications/{id}")]
[MyAuthorize("风险控制-风控应用删除")]
/// <summary>删除应用配置(软删除)</summary>
public JsonResult DeleteRiskApplication(long id)
public async Task<JsonResult> DeleteRiskApplication(long id)
{
try
{
var service = new RiskRuleService(CurUser);
service.DeleteApplication(id);
var service = GetRiskRuleService();
await Task.Run(() => service.DeleteApplication(id));
return Json(new { success = true });
}
catch (ServiceException ex)
@@ -372,12 +375,12 @@ namespace YLErp.Web.Controllers
[HttpPost("risk-applications/{id}/enable")]
[MyAuthorize("风险控制-风控应用启停")]
/// <summary>启用应用配置</summary>
public JsonResult EnableRiskApplication(long id)
public async Task<JsonResult> EnableRiskApplication(long id)
{
try
{
var service = new RiskRuleService(CurUser);
service.EnableApplication(id);
var service = GetRiskRuleService();
await Task.Run(() => service.EnableApplication(id));
return Json(new { success = true });
}
catch (ServiceException ex)
@@ -394,12 +397,12 @@ namespace YLErp.Web.Controllers
[HttpPost("risk-applications/{id}/disable")]
[MyAuthorize("风险控制-风控应用启停")]
/// <summary>停用应用配置</summary>
public JsonResult DisableRiskApplication(long id)
public async Task<JsonResult> DisableRiskApplication(long id)
{
try
{
var service = new RiskRuleService(CurUser);
service.DisableApplication(id);
var service = GetRiskRuleService();
await Task.Run(() => service.DisableApplication(id));
return Json(new { success = true });
}
catch (ServiceException ex)
@@ -416,12 +419,12 @@ namespace YLErp.Web.Controllers
[HttpPost("risk-applications/batch-enable")]
[MyAuthorize("风险控制-风控应用启停")]
/// <summary>批量启用应用配置</summary>
public JsonResult BatchEnableRiskApplications([FromBody] List<long> ids)
public async Task<JsonResult> BatchEnableRiskApplications([FromBody] List<long> ids)
{
try
{
var service = new RiskRuleService(CurUser);
var result = service.BatchEnableApplications(ids);
var service = GetRiskRuleService();
var result = await Task.Run(() => service.BatchEnableApplications(ids));
return Json(new { success = true, data = result });
}
catch (ServiceException ex)
@@ -438,12 +441,12 @@ namespace YLErp.Web.Controllers
[HttpPost("risk-applications/batch-disable")]
[MyAuthorize("风险控制-风控应用启停")]
/// <summary>批量停用应用配置</summary>
public JsonResult BatchDisableRiskApplications([FromBody] List<long> ids)
public async Task<JsonResult> BatchDisableRiskApplications([FromBody] List<long> ids)
{
try
{
var service = new RiskRuleService(CurUser);
var result = service.BatchDisableApplications(ids);
var service = GetRiskRuleService();
var result = await Task.Run(() => service.BatchDisableApplications(ids));
return Json(new { success = true, data = result });
}
catch (ServiceException ex)
@@ -464,12 +467,12 @@ namespace YLErp.Web.Controllers
[HttpGet("risk-variables")]
[MyAuthorize("风险控制-风控变量查看")]
/// <summary>查询变量列表</summary>
public JsonResult QueryRiskVariables(QueryRiskVariableReq req)
public async Task<JsonResult> QueryRiskVariables(QueryRiskVariableReq req)
{
try
{
var service = new RiskRuleService(CurUser);
var result = service.QueryVariableList(req);
var service = GetRiskRuleService();
var result = await Task.Run(() => service.QueryVariableList(req));
return Json(new { success = true, data = result });
}
catch (ServiceException ex)
@@ -486,12 +489,12 @@ namespace YLErp.Web.Controllers
[HttpGet("risk-variables/{id}")]
[MyAuthorize("风险控制-风控变量查看")]
/// <summary>获取变量详情</summary>
public JsonResult GetRiskVariable(long id)
public async Task<JsonResult> GetRiskVariable(long id)
{
try
{
var service = new RiskRuleService(CurUser);
var result = service.GetVariableDetail(id);
var service = GetRiskRuleService();
var result = await Task.Run(() => service.GetVariableDetail(id));
return Json(new { success = true, data = result });
}
catch (ServiceException ex)
@@ -508,12 +511,12 @@ namespace YLErp.Web.Controllers
[HttpGet("risk-variables/list")]
[MyAuthorize("风险控制-风控变量查看")]
/// <summary>获取所有变量列表(供下拉选择)</summary>
public JsonResult GetAllRiskVariables()
public async Task<JsonResult> GetAllRiskVariables()
{
try
{
var service = new RiskRuleService(CurUser);
var result = service.GetAllVariableList();
var service = GetRiskRuleService();
var result = await Task.Run(() => service.GetAllVariableList());
return Json(new { success = true, data = new { rows = result, total = result.Count, records = result.Count, page = 1 } });
}
catch (ServiceException ex)
@@ -530,12 +533,12 @@ namespace YLErp.Web.Controllers
[HttpPost("risk-variables")]
[MyAuthorize("风险控制-风控变量新增")]
/// <summary>创建变量</summary>
public JsonResult CreateRiskVariable([FromBody] CreateRiskVariableReq req)
public async Task<JsonResult> CreateRiskVariable([FromBody] CreateRiskVariableReq req)
{
try
{
var service = new RiskRuleService(CurUser);
var result = service.CreateVariable(req);
var service = GetRiskRuleService();
var result = await Task.Run(() => service.CreateVariable(req));
return Json(new { success = true, data = result });
}
catch (ServiceException ex)
@@ -552,12 +555,12 @@ namespace YLErp.Web.Controllers
[HttpPut("risk-variables/{id}")]
[MyAuthorize("风险控制-风控变量编辑")]
/// <summary>更新变量(含级联更新引用规则的 RuleExpr</summary>
public JsonResult UpdateRiskVariable(long id, [FromBody] UpdateRiskVariableReq req)
public async Task<JsonResult> UpdateRiskVariable(long id, [FromBody] UpdateRiskVariableReq req)
{
try
{
var service = new RiskRuleService(CurUser);
var result = service.UpdateVariable(id, req);
var service = GetRiskRuleService();
var result = await Task.Run(() => service.UpdateVariable(id, req));
return Json(new { success = true, data = result });
}
catch (ServiceException ex)
@@ -574,12 +577,12 @@ namespace YLErp.Web.Controllers
[HttpDelete("risk-variables/{id}")]
[MyAuthorize("风险控制-风控变量删除")]
/// <summary>删除变量</summary>
public JsonResult DeleteRiskVariable(long id)
public async Task<JsonResult> DeleteRiskVariable(long id)
{
try
{
var service = new RiskRuleService(CurUser);
service.DeleteVariable(id);
var service = GetRiskRuleService();
await Task.Run(() => service.DeleteVariable(id));
return Json(new { success = true });
}
catch (ServiceException ex)
@@ -599,7 +602,7 @@ namespace YLErp.Web.Controllers
[HttpGet("trade-types")]
[MyAuthorize("风险控制-风控应用查看")]
/// <summary>获取合约类型列表</summary>
/// <summary>获取合约类型列表(纯内存操作,无需异步)</summary>
public JsonResult GetTradeTypes()
{
try
@@ -630,12 +633,12 @@ namespace YLErp.Web.Controllers
[HttpGet("risk-audit-logs")]
[MyAuthorize("风险控制-风控日志查看")]
/// <summary>查询风控操作日志列表(分页)</summary>
public JsonResult QueryRiskAuditLogs(QueryRiskAuditLogReq req)
public async Task<JsonResult> QueryRiskAuditLogs(QueryRiskAuditLogReq req)
{
try
{
var service = new RiskRuleService(CurUser);
var result = service.QueryAuditLogs(req);
var service = GetRiskRuleService();
var result = await Task.Run(() => service.QueryAuditLogs(req));
return Json(new { success = true, data = result });
}
catch (ServiceException ex)
@@ -652,12 +655,12 @@ namespace YLErp.Web.Controllers
[HttpGet("risk-audit-logs/{id}")]
[MyAuthorize("风险控制-风控日志查看")]
/// <summary>获取风控操作日志详情</summary>
public JsonResult GetRiskAuditLogDetail(long id)
public async Task<JsonResult> GetRiskAuditLogDetail(long id)
{
try
{
var service = new RiskRuleService(CurUser);
var result = service.GetAuditLogDetail(id);
var service = GetRiskRuleService();
var result = await Task.Run(() => service.GetAuditLogDetail(id));
return Json(new { success = true, data = result });
}
catch (ServiceException ex)
@@ -674,12 +677,12 @@ namespace YLErp.Web.Controllers
[HttpGet("risk-audit-logs/export")]
[MyAuthorize("风险控制-风控日志导出")]
/// <summary>导出风控操作日志为 Excel</summary>
public IActionResult ExportRiskAuditLogs(QueryRiskAuditLogReq req)
public async Task<IActionResult> ExportRiskAuditLogs(QueryRiskAuditLogReq req)
{
try
{
var service = new RiskRuleService(CurUser);
var bytes = service.ExportAuditLogs(req);
var service = GetRiskRuleService();
var bytes = await Task.Run(() => service.ExportAuditLogs(req));
return File(bytes, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "风控操作日志.xlsx");
}
catch (ServiceException ex)
@@ -695,4 +698,4 @@ namespace YLErp.Web.Controllers
#endregion
}
}
}