Files
zszq-trs/YLErpDAL/Modules/ClientModule/ClientCreditRiskService.cs
T
2024-05-09 14:06:26 +08:00

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; }
}
}