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