diff --git a/YLErpDAL/Modules/RiskModule/QuotaMonitorService.cs b/YLErpDAL/Modules/RiskModule/QuotaMonitorService.cs index 9ce485ad..0b05ceee 100644 --- a/YLErpDAL/Modules/RiskModule/QuotaMonitorService.cs +++ b/YLErpDAL/Modules/RiskModule/QuotaMonitorService.cs @@ -4468,7 +4468,7 @@ namespace YLErp.Modules.RiskModule return QuotaCheck(ref res, false); } - public bool QuotaCheck(ref TradeOpenResult res, bool ignoreRiskWarning) + public bool QuotaCheck(ref TradeOpenResult res, bool ignoreRiskWarning, IEnumerable ignoreRiskRuleIds = null) { if (res == null || res.Trade == null) { @@ -4515,14 +4515,27 @@ namespace YLErp.Modules.RiskModule detailParts.Add($"限额预警:{quotaObj.QuotaWarningDetails}"); res.ErrorMsg = string.Join("\n", detailParts); //确认本次为需审批后,二次特批。因为只靠点击“交易特批”的ignoreRiskWarning,不能保证本次校验通过。 - var isRiskApprovalWarning = quotaObj.TrialStatus == QuotaTrialStatusEnum.Warning - && !string.IsNullOrWhiteSpace(quotaObj.RiskWarningDetails); - //需清除ErrorMsg,不然外部调用会认为失败 - //触发需审批,交易特批逻辑 - if (ignoreRiskWarning && isRiskApprovalWarning) + var isRiskApprovalWarning = quotaObj.TrialStatus == QuotaTrialStatusEnum.RiskWarning + && !string.IsNullOrWhiteSpace(quotaObj.RiskWarningDetails) + && (quotaObj.ApprovalRuleIds?.Any() ?? false); + //当前为老风控特批,不是新风控需审批 + res.OldRiskNeedSpecialApproval = quotaObj.TrialStatus == QuotaTrialStatusEnum.Warning; + if (isRiskApprovalWarning) { - res.ErrorMsg = string.Empty; - return true; + var currentApprovalRuleIds = quotaObj.ApprovalRuleIds ?? new List(); + res.IgnoredRiskRuleIds = currentApprovalRuleIds; + //需清除ErrorMsg,不然外部调用会认为失败 + //触发需审批,交易特批逻辑 + if (ignoreRiskWarning) + { + var ignoredRuleIdSet = new HashSet((ignoreRiskRuleIds ?? Enumerable.Empty()).Where(o => !string.IsNullOrWhiteSpace(o))); + var newApprovalRuleIds = currentApprovalRuleIds.Where(o => !ignoredRuleIdSet.Contains(o)).ToList(); + if (!newApprovalRuleIds.Any()) + { + res.ErrorMsg = string.Empty; + return true; + } + } } res.RetCode = isRiskApprovalWarning ? TradeOpenRetCode.RiskWarning : TradeOpenRetCode.QuotaTrialError; return false; @@ -5193,12 +5206,25 @@ namespace YLErp.Modules.RiskModule } if (riskResult.NeedApproval) { - if (result.TrialStatus != QuotaTrialStatusEnum.Error) + if (result.TrialStatus != QuotaTrialStatusEnum.Error && result.TrialStatus != QuotaTrialStatusEnum.Warning) { - result.TrialStatus = QuotaTrialStatusEnum.Warning; + result.TrialStatus = QuotaTrialStatusEnum.RiskWarning; } result.RiskWarningDetails += "[风控引擎] 规则触发:需审批\n"; - foreach (var triggeredRule in riskResult.TriggeredRules.Where(r => r.ControlStrategy == RiskControlStrategy.Approval)) + var approvalTriggeredRules = riskResult.TriggeredRules.Where(r => r.ControlStrategy == RiskControlStrategy.Approval).ToList(); + var approvalTriggeredRuleIds = approvalTriggeredRules.Select(r => r.RuleId) + .Where(r => !string.IsNullOrWhiteSpace(r)) + .ToList(); + var showTipTriggeredRules = riskResult.TriggeredRules.Where(r => r.ControlStrategy == RiskControlStrategy.ShowTip).ToList(); + var showTipTriggeredRuleIds = showTipTriggeredRules.Select(r => r.RuleId) + .Where(r => !string.IsNullOrWhiteSpace(r)) + .ToList(); + // 二次确认时,需审批规则允许按首次命中结果忽略;同时已展示过的提示规则也不再重复展示 + var processedRiskRuleIds = approvalTriggeredRuleIds.Concat(showTipTriggeredRuleIds) + .Distinct() + .ToList(); + result.ApprovalRuleIds = processedRiskRuleIds; + foreach (var triggeredRule in approvalTriggeredRules) { result.RiskWarningDetails += $"规则ID:{triggeredRule.RuleId};规则名称:{triggeredRule.RuleName};规则说明:{triggeredRule.RuleText}\n"; }