279 lines
11 KiB
C#
279 lines
11 KiB
C#
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<trade_risk_check_log> Search(SearchTradeRiskCheckLogRequest req)
|
|
{
|
|
var predicate = PredicateBuilder.Create<trade_risk_check_log>(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<trade_risk_check_log>(req);
|
|
|
|
}
|
|
|
|
/// <summary>
|
|
/// 风控记录导出
|
|
/// </summary>
|
|
/// <param name="req"></param>
|
|
/// <returns></returns>
|
|
/// <exception cref="ServiceException"></exception>
|
|
public byte[] ExprotExcel(SearchTradeRiskCheckLogRequest req)
|
|
{
|
|
//获取数据
|
|
var ret = Search(req);
|
|
List<TradeRiskCheckLogExportModel> list = new List<TradeRiskCheckLogExportModel>();
|
|
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<string, object>();
|
|
var model = new { list = list };
|
|
modelDict.Add("Sheet1", model);
|
|
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
|
|
return new ExcelTemplateGenerator().SetTemplateFile(sourceFileName).SetTemplateData(modelDict).Output();
|
|
}
|
|
/// <summary>
|
|
/// 新增风控记录
|
|
/// </summary>
|
|
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();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 查询指定交易最近一次新风控“确认通过”的处理时间,用于控制二次审批放行仅在短时间内有效。
|
|
/// </summary>
|
|
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();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 回退重置
|
|
/// </summary>
|
|
/// <param name="tradeNumber"></param>
|
|
/// <param name="valueDate"></param>
|
|
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();
|
|
}
|
|
/// <summary>
|
|
/// 批量回退重置
|
|
/// </summary>
|
|
/// <param name="trsDealIds"></param>
|
|
public void DeleteLogs(List<long> 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<long> 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();
|
|
}
|
|
}
|
|
}
|