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