From b51d39e0ff0947cdde843440a2c35bbcee8a6b3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=B9=E5=B3=B0?= Date: Fri, 17 Jul 2026 14:27:27 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=8F=98=E9=87=8F=E6=89=B9?= =?UTF-8?q?=E9=87=8F=E5=88=A0=E9=99=A4=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RiskEngine/Dto/BatchOperationResult.cs | 15 ++++++ .../Modules/RiskEngine/RiskRuleService.cs | 52 +++++++++++++++++++ YLErpWeb/Controllers/RiskRuleController.cs | 22 ++++++++ 3 files changed, 89 insertions(+) diff --git a/YLErpDAL/Modules/RiskEngine/Dto/BatchOperationResult.cs b/YLErpDAL/Modules/RiskEngine/Dto/BatchOperationResult.cs index 7d9dccb1..c6c7aafd 100644 --- a/YLErpDAL/Modules/RiskEngine/Dto/BatchOperationResult.cs +++ b/YLErpDAL/Modules/RiskEngine/Dto/BatchOperationResult.cs @@ -14,4 +14,19 @@ namespace YLErp.Modules.RiskEngine.Dto /// 错误信息 public string ErrorMessage { get; set; } } + + /// + /// 批量删除变量结果 + /// + public class BatchDeleteVariablesResult : BatchOperationResult + { + /// 成功删除的变量 ID + public List DeletedIds { get; set; } + /// 不存在的变量 ID + public List MissingIds { get; set; } + /// 因被生效规则引用而跳过的变量 ID + public List BlockedIds { get; set; } + /// 被跳过变量的原因,Key 为变量 ID + public Dictionary BlockedReasons { get; set; } + } } diff --git a/YLErpDAL/Modules/RiskEngine/RiskRuleService.cs b/YLErpDAL/Modules/RiskEngine/RiskRuleService.cs index c9fa2dc8..737aa940 100644 --- a/YLErpDAL/Modules/RiskEngine/RiskRuleService.cs +++ b/YLErpDAL/Modules/RiskEngine/RiskRuleService.cs @@ -2383,6 +2383,58 @@ namespace YLErp.Modules.RiskEngine InvalidateVariableCache(); } + /// + /// 批量删除变量(不存在或被生效规则引用的变量将被跳过) + /// + public BatchDeleteVariablesResult BatchDeleteVariables(List variableIds) + { + if (variableIds == null || variableIds.Count == 0) + throw new ServiceException("变量ID列表不能为空"); + + var distinctIds = variableIds.Distinct().ToList(); + var variables = DbContext.glms_risk_variable + .Where(v => distinctIds.Contains(v.id)) + .ToList(); + var foundIds = variables.Select(v => (long)v.id).ToList(); + var missingIds = distinctIds.Except(foundIds).ToList(); + var blockedIds = new List(); + var blockedReasons = new Dictionary(); + var deletedIds = new List(); + + foreach (var variable in variables) + { + var activeRefCount = GetRulesByVariableId(variable.id) + .Count(r => r.Status == RiskRuleStatus.Active); + if (activeRefCount > 0) + { + blockedIds.Add(variable.id); + blockedReasons[variable.id] = $"该变量被 {activeRefCount} 个生效中的规则引用,无法删除"; + continue; + } + + DbContext.glms_risk_variable.Remove(variable); + WriteAuditLog("VAR_BATCH_DELETE", "VARIABLE", variable.id, variable.VariableName, $"批量删除变量:{variable.VariableName}"); + deletedIds.Add(variable.id); + } + + if (deletedIds.Count > 0) + { + DbContext.SaveChanges(); + InvalidateVariableCache(); + } + + return new BatchDeleteVariablesResult + { + Success = true, + TotalCount = distinctIds.Count, + SuccessCount = deletedIds.Count, + DeletedIds = deletedIds, + MissingIds = missingIds, + BlockedIds = blockedIds, + BlockedReasons = blockedReasons + }; + } + /// /// 获取所有变量列表(供下拉选择) /// diff --git a/YLErpWeb/Controllers/RiskRuleController.cs b/YLErpWeb/Controllers/RiskRuleController.cs index 7dbda6ed..e47aa4f7 100644 --- a/YLErpWeb/Controllers/RiskRuleController.cs +++ b/YLErpWeb/Controllers/RiskRuleController.cs @@ -685,6 +685,28 @@ namespace YLErp.Web.Controllers } } + [HttpDelete("risk-variables/batch")] + [MyAuthorize("风险控制-风控变量删除")] + /// 批量删除变量 + public async Task BatchDeleteRiskVariables([FromBody] BatchIdsReq req) + { + try + { + var service = GetRiskRuleService(); + var result = await Task.Run(() => service.BatchDeleteVariables(req?.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 Trade Types