using BaseOUDAL; using MoreLinq; using OfficeOpenXml; using Snowflake.Core; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using YLErp.DBModels; using YLErp.Enums; using YLErp.Model; using YLErp.Modules.EodFileModule.Dto; using YLErp.Modules.RiskModule.Dto; using YLErp.Office; namespace YLErp.Modules.RiskModule { public class TradeRiskCheckLogService : YLBaseService { public TradeRiskCheckLogService(OptUserInfo userInfo) : base(userInfo) { } private const int RiskCheckLogTextMaxLength = 500; private static string TruncateRiskCheckLogText(string text) { if (string.IsNullOrEmpty(text) || text.Length <= RiskCheckLogTextMaxLength) return text; const string suffix = "……(日志内容过长已截断)"; return text.Substring(0, RiskCheckLogTextMaxLength - suffix.Length) + suffix; } public SearchListResult Search(SearchTradeRiskCheckLogRequest req) { var predicate = PredicateBuilder.Create(x=> !string.IsNullOrEmpty(x.trade_number)); if (req.DateFromCreateTime != null) { predicate = predicate.And(d => d.create_time >= req.DateFromCreateTime); } if (req.DateToCreateTime != null) { req.DateToCreateTime = ((DateTime)req.DateToCreateTime).AddDays(1); predicate = predicate.And(d => d.create_time < req.DateToCreateTime); } if (req.TrialResults!=null&& req.TrialResults.Count>0&& !req.TrialResults.Any(x=>x==-1)) { predicate = predicate.And(d => req.TrialResults.Contains(d.trial_result)); } if (!string.IsNullOrEmpty(req.TradeNumber)) { predicate = predicate.And(d => !string.IsNullOrEmpty(d.trade_number) && d.trade_number.Contains(req.TradeNumber)); } if (!string.IsNullOrEmpty(req.ClientNumber)) { predicate = predicate.And(d => !string.IsNullOrEmpty(d.client_number) && d.client_number.Contains(req.ClientNumber)); } if (!string.IsNullOrEmpty(req.ClientName)) { predicate = predicate.And(d => !string.IsNullOrEmpty(d.client_name) && d.client_name.Contains(req.ClientName)); } if (!string.IsNullOrEmpty(req.Trader)) { predicate = predicate.And(d => !string.IsNullOrEmpty(d.trader) && d.trader.Contains(req.Trader)); } if (string.IsNullOrEmpty(req.sidx)) { req.sidx = "id"; req.sord = "desc"; } return DbContext.trade_risk_check_log.AsNoTracking().Where(predicate).ToSearchList(req); } /// /// 风控记录导出 /// /// /// /// public byte[] ExprotExcel(SearchTradeRiskCheckLogRequest req) { //获取数据 var ret = Search(req); List list = new List(); foreach (var item in ret.rows) { TradeRiskCheckLogExportModel exportModel = new TradeRiskCheckLogExportModel(); exportModel.trader = item.trader; exportModel.client_number = item.client_number; exportModel.client_name = item.client_name; exportModel.remark = item.remark; exportModel.create_time = item.create_time.ToString("yyyy-MM-dd HH:mm:ss"); exportModel.limit_warning = item.limit_warning; exportModel.trade_number = item.trade_number; exportModel.risk_warning = item.risk_warning; switch ((QuotaTrialStatusEnum)item.trial_result) { case QuotaTrialStatusEnum.Warning: exportModel.trial_result = "老风控触发特批"; break; case QuotaTrialStatusEnum.RiskWarning: exportModel.trial_result = "新风控需审批"; break; case QuotaTrialStatusEnum.Error: exportModel.trial_result = "禁止"; break; default: exportModel.trial_result = "通过"; break; } list.Add(exportModel); } var tplFilePath = OtcAppContext.MapPath("/App_Docs"); var sourceFileName = Path.Combine(tplFilePath, "导出模板", "限额监控记录导出模板.xlsx"); var modelDict = new Dictionary(); var model = new { list = list }; modelDict.Add("Sheet1", model); ExcelPackage.LicenseContext = LicenseContext.NonCommercial; return new ExcelTemplateGenerator().SetTemplateFile(sourceFileName).SetTemplateData(modelDict).Output(); } /// /// 新增风控记录 /// public void AddLog(QuotaTrial quotaTrial) { var td = DbContext.trade.FirstOrDefault(x=>x.id==quotaTrial.TradeId); quotaTrial = DbContext.quotaTrial.FirstOrDefault(x=>x.id== quotaTrial.id); if (quotaTrial == null) { return; } trade_risk_check_log log = new trade_risk_check_log(); if (td!=null) { var client = DataCacheProvider.GetClientDataSource().GetData(td.ClientId); log.client_number = client?.Number; } var worker = new IdWorker(1, 1); log.id = worker.NextId(); log.trial_result = (int)quotaTrial.TrialStatus; log.client_name = quotaTrial.ClientName; log.trader = td?.TraderName; log.trade_number = quotaTrial.TradeNumber; var riskWarning = string.Empty; if (!string.IsNullOrWhiteSpace(quotaTrial.QuotaWarningDetails)) { riskWarning = "限额预警: " + quotaTrial.QuotaWarningDetails; } if (!string.IsNullOrWhiteSpace(quotaTrial.RiskWarningDetails)) { if (!string.IsNullOrWhiteSpace(riskWarning)) { riskWarning += Environment.NewLine; } riskWarning += "风控预警: " + quotaTrial.RiskWarningDetails; } log.risk_warning = TruncateRiskCheckLogText(riskWarning); log.limit_warning = quotaTrial.QuotaCheckDetails; log.remark = quotaTrial.Remark; log.create_user = UserId; log.create_time = DateTime.Now; DbContext.trade_risk_check_log.Add(log); DbContext.SaveChanges(); } /// /// 查询指定交易最近一次新风控“确认通过”的处理时间,用于控制二次审批放行仅在短时间内有效。 /// public DateTime? QueryLatestRiskWarningDecisionTime(int tradeId) { var tradeNumber = DbContext.trade.Where(x => x.id == tradeId).Select(x => x.TradeNumber).FirstOrDefault(); if (string.IsNullOrWhiteSpace(tradeNumber)) { return null; } return DbContext.trade_risk_check_log .Where(x => x.trade_number == tradeNumber && x.trial_result == (int)QuotaTrialStatusEnum.RiskWarning && x.remark.Contains("风控预警处理结果:确认通过")) .OrderByDescending(x => x.create_time) .Select(x => (DateTime?)x.create_time) .FirstOrDefault(); } public void AddWarningDecisionLog(int quotaTrialId, string decision) { var quotaTrial = DbContext.quotaTrial.FirstOrDefault(x => x.id == quotaTrialId); if (quotaTrial == null) { return; } var td = DbContext.trade.FirstOrDefault(x => x.id == quotaTrial.TradeId); trade_risk_check_log log = new trade_risk_check_log(); if (td != null) { var client = DataCacheProvider.GetClientDataSource().GetData(td.ClientId); log.client_number = client?.Number; } var worker = new IdWorker(1, 1); log.id = worker.NextId(); log.trial_result = (int)quotaTrial.TrialStatus; log.client_name = quotaTrial.ClientName; log.trader = td?.TraderName; log.trade_number = quotaTrial.TradeNumber; var riskWarning = string.IsNullOrWhiteSpace(quotaTrial.RiskWarningDetails) ? $"[风控预警处理]{decision}" : quotaTrial.RiskWarningDetails + Environment.NewLine + $"[风控预警处理]{decision}"; log.risk_warning = TruncateRiskCheckLogText(riskWarning); log.limit_warning = quotaTrial.QuotaCheckDetails; log.remark = string.IsNullOrWhiteSpace(quotaTrial.Remark) ? $"风控预警处理结果:{decision}" : quotaTrial.Remark + ";风控预警处理结果:" + decision; log.create_user = UserId; log.create_time = DateTime.Now; DbContext.trade_risk_check_log.Add(log); DbContext.SaveChanges(); } /// /// 回退重置 /// /// /// public void DeleteLog(string tradeNumber,DateTime valueDate) { var logs= DbContext.trade_risk_check_log.Where(x=>x.trade_number==tradeNumber&&x.create_time.Date>= valueDate).ToList(); if (logs.Count()==0) { return; } logs.ForEach(x => { x.trade_number = null; }); DbContext.SaveChanges(); } /// /// 批量回退重置 /// /// public void DeleteLogs(List trsDealIds) { var logs = DbContext.trade_risk_check_log.Where(x => trsDealIds.Contains(x.flow_id??0)).ToList(); if (logs.Count() == 0) { return; } logs.ForEach(x => { x.trade_number = null; }); DbContext.SaveChanges(); } public void UpdateLogTradeNumber(List trsDealIds,string tradeNumber) { var logs = DbContext.trade_risk_check_log.Where(x=> trsDealIds.Contains(x.flow_id??0)); if (logs.Count() == 0) { return; } logs.ForEach(x => { x.trade_number = tradeNumber; }); DbContext.SaveChanges(); } } }