diff --git a/YLErpDAL/Modules/RiskEngine/RiskRuleService.cs b/YLErpDAL/Modules/RiskEngine/RiskRuleService.cs
index 26e5d5d7..f3ecab99 100644
--- a/YLErpDAL/Modules/RiskEngine/RiskRuleService.cs
+++ b/YLErpDAL/Modules/RiskEngine/RiskRuleService.cs
@@ -863,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;
@@ -1600,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();
diff --git a/YLErpWeb/Controllers/RiskRuleController.cs b/YLErpWeb/Controllers/RiskRuleController.cs
index 28fbfeec..b30a905d 100644
--- a/YLErpWeb/Controllers/RiskRuleController.cs
+++ b/YLErpWeb/Controllers/RiskRuleController.cs
@@ -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("风险控制-风控规则查看")]
/// 查询风控规则列表(分页)
- public JsonResult QueryRiskRules(QueryRiskRuleReq req)
+ public async Task 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("风险控制-风控规则查看")]
/// 获取风控规则详情
- public JsonResult GetRiskRule(long id)
+ public async Task 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("风险控制-风控规则查看")]
/// 获取风控规则版本历史
- public JsonResult GetRiskRuleVersions(long id)
+ public async Task 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("风险控制-风控规则新增")]
/// 创建风控规则
- public JsonResult CreateRiskRule([FromBody] CreateRiskRuleReq req)
+ public async Task 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("风险控制-风控规则编辑")]
/// 更新风控规则
- public JsonResult UpdateRiskRule(long id, [FromBody] UpdateRiskRuleReq req)
+ public async Task 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("风险控制-风控规则删除")]
/// 删除风控规则(软删除)
- public JsonResult DeleteRiskRule(long id)
+ public async Task 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("风险控制-风控规则删除")]
/// 批量删除风控规则
- public JsonResult BatchDeleteRiskRules([FromBody] List ids)
+ public async Task BatchDeleteRiskRules([FromBody] List 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("风险控制-风控规则启停")]
/// 启用风控规则
- public JsonResult EnableRiskRule(long id)
+ public async Task 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("风险控制-风控规则启停")]
/// 停用风控规则
- public JsonResult DisableRiskRule(long id)
+ public async Task 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("风险控制-风控规则查看")]
/// 获取规则关联的应用配置列表
- public JsonResult GetRuleApplications(long id)
+ public async Task 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("风险控制-风控规则查看")]
/// 获取所有启用规则列表(供下拉选择)
- public JsonResult GetAllRiskRules()
+ public async Task 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("风险控制-风控应用查看")]
/// 查询应用配置列表(分页)
- public JsonResult QueryRiskApplications(QueryRiskApplicationReq req)
+ public async Task 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("风险控制-风控应用查看")]
/// 获取应用配置详情
- public JsonResult GetRiskApplication(long id)
+ public async Task 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("风险控制-风控应用新增")]
/// 创建应用配置
- public JsonResult CreateRiskApplication([FromBody] CreateRiskApplicationReq req)
+ public async Task 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("风险控制-风控应用编辑")]
/// 更新应用配置
- public JsonResult UpdateRiskApplication(long id, [FromBody] UpdateRiskApplicationReq req)
+ public async Task 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("风险控制-风控应用删除")]
/// 删除应用配置(软删除)
- public JsonResult DeleteRiskApplication(long id)
+ public async Task 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("风险控制-风控应用启停")]
/// 启用应用配置
- public JsonResult EnableRiskApplication(long id)
+ public async Task 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("风险控制-风控应用启停")]
/// 停用应用配置
- public JsonResult DisableRiskApplication(long id)
+ public async Task 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("风险控制-风控应用启停")]
/// 批量启用应用配置
- public JsonResult BatchEnableRiskApplications([FromBody] List ids)
+ public async Task BatchEnableRiskApplications([FromBody] List 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("风险控制-风控应用启停")]
/// 批量停用应用配置
- public JsonResult BatchDisableRiskApplications([FromBody] List ids)
+ public async Task BatchDisableRiskApplications([FromBody] List 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("风险控制-风控变量查看")]
/// 查询变量列表
- public JsonResult QueryRiskVariables(QueryRiskVariableReq req)
+ public async Task 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("风险控制-风控变量查看")]
/// 获取变量详情
- public JsonResult GetRiskVariable(long id)
+ public async Task 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("风险控制-风控变量查看")]
/// 获取所有变量列表(供下拉选择)
- public JsonResult GetAllRiskVariables()
+ public async Task 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("风险控制-风控变量新增")]
/// 创建变量
- public JsonResult CreateRiskVariable([FromBody] CreateRiskVariableReq req)
+ public async Task 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("风险控制-风控变量编辑")]
/// 更新变量(含级联更新引用规则的 RuleExpr)
- public JsonResult UpdateRiskVariable(long id, [FromBody] UpdateRiskVariableReq req)
+ public async Task 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("风险控制-风控变量删除")]
/// 删除变量
- public JsonResult DeleteRiskVariable(long id)
+ public async Task 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("风险控制-风控应用查看")]
- /// 获取合约类型列表
+ /// 获取合约类型列表(纯内存操作,无需异步)
public JsonResult GetTradeTypes()
{
try
@@ -630,12 +633,12 @@ namespace YLErp.Web.Controllers
[HttpGet("risk-audit-logs")]
[MyAuthorize("风险控制-风控日志查看")]
/// 查询风控操作日志列表(分页)
- public JsonResult QueryRiskAuditLogs(QueryRiskAuditLogReq req)
+ public async Task 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("风险控制-风控日志查看")]
/// 获取风控操作日志详情
- public JsonResult GetRiskAuditLogDetail(long id)
+ public async Task 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("风险控制-风控日志导出")]
/// 导出风控操作日志为 Excel
- public IActionResult ExportRiskAuditLogs(QueryRiskAuditLogReq req)
+ public async Task 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
}
-}
+}
\ No newline at end of file