200 lines
7.8 KiB
C#
200 lines
7.8 KiB
C#
using BaseOUDAL;
|
|
|
|
namespace YLErp.Modules.ClientModule
|
|
{
|
|
public class ClientCreditRiskService : YLBaseService
|
|
{
|
|
public ClientCreditRiskService(OptUserInfo userInfo) : base(userInfo)
|
|
{
|
|
|
|
}
|
|
|
|
public SearchListResult<ClientCreditRiskInfo> 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<int> ClientIds { get; set; }
|
|
|
|
public string BoundSide { get; set; }
|
|
|
|
public bool? NeedMarginCall { get; set; }
|
|
|
|
public DateTime? ValueDate { get; set; }
|
|
|
|
public List<int> 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; }
|
|
|
|
}
|
|
}
|