using BaseOUDAL; namespace YLErp.Modules.ClientModule { public class ClientCreditRiskService : YLBaseService { public ClientCreditRiskService(OptUserInfo userInfo) : base(userInfo) { } public SearchListResult clientCreditRisksQuery(ClientCreditRiskReq req) { //客户 vm im -- clientsapn //预付金授信额度 预付金占用 追保额度pfe pfe授信额度 后付交易费用 var clientQuery = DbContextFactory.GetClientDbContext(OptUser).client.AsQueryable().Where(a=> req.CurUserClientIds.Contains(a.id)); if (req.ClientIds != null && req.ClientIds.Count > 0) { clientQuery = clientQuery.Where(o => req.ClientIds.Contains(o.id)); } if (!string.IsNullOrWhiteSpace(req.BoundSide)) { clientQuery = clientQuery.Where(o => o.BoundSide == (req.BoundSide == "0" ? DBModels.BoundSideEnum.北向 : DBModels.BoundSideEnum.南向)); } var clients = clientQuery.ToList(); if (clients == null || clients.Count() < 1) { return null; } var ids = clients.Select(o => o.id); var query = from span in DbContext.client_span where span.ValueDate == req.ValueDate && ids.Contains(span.ClientId) join clientbalances in DbContext.ClientBalanceDaily.Where(o => o.BalanceDate == req.ValueDate) on span.ClientId equals clientbalances.ClientId into clientbalances from clientbalance in clientbalances.DefaultIfEmpty() join credits in DbContext.credit.Where(o => o.CreditStartDate <= req.ValueDate && o.CreditDeadLine >= req.ValueDate && o.ProcessOrderId == -2) on span.ClientId equals credits.ClientId into credits from credit in credits.DefaultIfEmpty() select new ClientCreditRiskInfo { clientId = span.ClientId, clientName = clientbalance.ClientName, clientNumber = clientbalance.ClientNumber, VM = span.VM, IM = span.IM, PFE = span.PFE, MarginLimit = credit.MarginLimit, Credit = credit.Credit, PFECredit = credit.PFECredit, PFEMargin = span.IM, Commission = -span.Commission, Margin = -clientbalance.Margin, MarginUsed = -clientbalance.PayableMargin, CashRemain = clientbalance.ToDayRemainFund, AvailableFund = (clientbalance.MarginBalance ?? 0.0) + (clientbalance.PayableMargin ?? 0.0) - (clientbalance.FrozenMarginMoney ?? 0.0) - (clientbalance.TodayRemianFundProduct ?? 0.0) }; var querylist = query.ToList(); foreach (var item in querylist) { var client = clients.FirstOrDefault(o => o.id == item.clientId); if (item.MarginLimit == null) { if (client.BoundSide == BoundSideEnum.南向) { item.MarginLimit = 50000; } if (client.BoundSide == BoundSideEnum.北向) { item.MarginLimit = 10000; } } item.boundSide = client.BoundSide; item.CurrencyCode = client.SettlementCurrency; item.MarginUsed = Math.Max(item.MarginUsed ?? 0, 0); } if (req.NeedMarginCall ?? false) { querylist = querylist.Where(o => o.Margin >= o.MarginLimit).ToList(); } //是否需要追保 var searchList = querylist.AsQueryable().ToSearchList(req); return searchList; } public bool ClientNeedMarginCall(int clientId, DateTime endDate, out string ClientName) { var info = (from cb in DbContext.ClientBalanceDaily join credits in DbContext.credit on cb.ClientId equals credits.ClientId into credits from credit in credits.Where(o => o.CreditStartDate <= endDate && o.CreditDeadLine >= endDate && o.ProcessOrderId == -2).DefaultIfEmpty() where cb.ClientId == clientId && cb.BalanceDate == endDate select new MarginInfo { ClientName = cb.ClientName, Margin = cb.Margin, Credit = credit == null ? null : credit.Credit, MarginLimit = credit == null ? null : credit.MarginLimit, }).FirstOrDefault(); if (info.MarginLimit == null) { var client = DataCacheProvider.GetClientDataSource().GetData(clientId); if (client.BoundSide == BoundSideEnum.南向) { info.MarginLimit = 50000; } if (client.BoundSide == BoundSideEnum.北向) { info.MarginLimit = 10000; } } ClientName = info.ClientName; return -info.Margin > info.MarginLimit; } public string GetTemplateName(int clientId) { var client = DataCacheProvider.GetClientDataSource().GetData(clientId); var templateName = new ClientConfirmTemplateService(OptUser).GetTemplateName(clientId, "邮件模板"); if (string.IsNullOrWhiteSpace(templateName)) { templateName = client.BoundSide == BoundSideEnum.南向 ? "南向" : "北向"; } return templateName; } } public class ClientCreditRiskReq : BaseSearchReq { public List ClientIds { get; set; } public string BoundSide { get; set; } public bool? NeedMarginCall { get; set; } public DateTime? ValueDate { get; set; } public List CurUserClientIds { get; set; } } public class ClientCreditRiskInfo { public int clientId { get; set; } public string clientNumber { get; set; } public string clientName { get; set; } public BoundSideEnum boundSide { get; set; } public string CurrencyCode { get; set; } //VM public double? VM { get; set; } //IM public double? IM { get; set; } //预付金额度? public double? Credit { get; set; } //后付手续费 public double? Commission { get; set; } //预付金占用 public double? MarginUsed { get; set; } //追保金额 public double? Margin { get; set; } //合格履约品价值 public double? CashRemain { get; set; } //可用履约品价值 public double? AvailableFund { get; set; } //最小转账金额 public double? MarginLimit { get; set; } public double? PFE { get; set; } //追保金额pfe public double? PFEMargin { get; set; } //pfe授信额度 public double? PFECredit { get; set; } } public class MarginInfo { public string ClientName { get; set; } public double? Margin { get; set; } public double? Credit { get; set; } public double? MarginLimit { get; set; } } }