using BaseOUDAL;
using YLErp.BLL;
namespace YLErp.Modules.ClientModule
{
///
/// creditBLL
///
public class ClientCreditService : YLBaseService
{
public ClientCreditService(OptUserInfo userInfo) : base(userInfo)
{
}
///
/// 查询credit
///
public SearchListResult SearchList(ClientCreditReq req)
{
var db = new YLContext();
var creditOpenProcessOrder = db.approvalprocess.Where(x => x.processType == "CreditProcess").Count();
var query = from source in DbContext.credit.Where(a => req.CurUserClientIds.Contains(a.ClientId ?? 0))
join process in DbContext.approvalprocess.Where(a => a.processType == "CreditProcess") on source.ProcessOrderId equals process.order into pro
from proce in pro.DefaultIfEmpty()
select new CreditDto
{
id = source.id,
Credit = source.Credit,
OriginalCredit = source.OriginalCredit,
MaxCreditUseRatio = source.MaxCreditUseRatio,
PFECredit = source.PFECredit,
IMCredit = source.IMCredit,
AuditCredit = source.AuditCredit,
StockEqvNotional = source.StockEqvNotional,
AuditStockEqvNotional = source.AuditStockEqvNotional,
DeductStockEqvNotional = source.DeductStockEqvNotional,
ClientId = source.ClientId,
ClientName = source.ClientName,
CreditStartDate = source.CreditStartDate,
CreditDeadLine = source.CreditDeadLine,
ClientNumber = source.ClientNumber,
ProcessStatusOriginal = source.ProcessStatus,
ProcessStatus = source.ProcessStatus == "审批中" ? source.ProcessStatus + " 流程" + (source.ProcessOrderId - 1) + "/" + creditOpenProcessOrder : source.ProcessStatus,
ProcessRoleId = proce.roleId,
ProcessRoleName = "",
ProcessOptDate = source.ProcessOptDate,
CreatorId = source.CreatorId,
CreatorName = source.CreatorName,
CreateDate = source.CreateDate,
OptId = source.OptId,
OptName = source.OptName,
OptDate = source.OptDate,
VarietyId = source.VarietyId,
VarietyName = source.VarietyName,
Type = source.Type,
RoleId = source.RoleId,
RoleName = source.RoleName,
BuySellRight = source.BuySellRight,
IsAll = source.IsAll,
IsVariety = source.IsVariety,
QualificationRating = source.QualificationRating,
IsWhitelist = source.IsWhitelist,
Comments = source.Comments,
MarginLimit = source.MarginLimit
};
if (!string.IsNullOrEmpty(req.VarietyId))
{
List vars = req.VarietyId.Split(',').ToList();
vars.ForEach(v =>
{
query = query.Where(d => !(d.Type == CreditTable.RoleType || (d.Type == CreditTable.ClientType && d.IsVariety == true))
|| ((d.Type == CreditTable.RoleType || d.IsWhitelist == 1) && ("," + d.VarietyId + ",").Contains("," + v + ","))
|| (d.IsWhitelist == 0 && !("," + d.VarietyId + ",").Contains("," + v + ",")));
});
}
if (req.ClientIds.Any())
{
query = query.Where(d => req.ClientIds.Contains(d.ClientId ?? 0));
}
if (req.RoleId != null)
{
query = query.Where(d => d.RoleId == req.RoleId);
}
if (!string.IsNullOrEmpty(req.RoleName))
{
query = query.Where(d => d.RoleName.Contains(req.RoleName));
}
if (!string.IsNullOrEmpty(req.Type))
{
query = query.Where(d => d.Type == req.Type);
}
if (req.Credit != null)
{
query = query.Where(d => d.Credit == req.Credit);
}
if (req.ClientId != null)
{
query = query.Where(d => d.ClientId == req.ClientId);
}
if (!string.IsNullOrEmpty(req.ClientName))
{
query = query.Where(d => d.ClientName.Contains(req.ClientName));
}
if (!string.IsNullOrWhiteSpace(req.ProcessStatuses))
{
query = query.Where(d => req.ProcessStatusList.Contains(d.ProcessStatusOriginal));
}
if (req.CreditDeadLineStart != DateTime.MinValue)
{
query = query.Where(d => d.CreditDeadLine >= req.CreditDeadLineStart);
}
if (req.CreditDeadLineEnd != DateTime.MinValue)
{
DateTime CreditDeadLineTemp = req.CreditDeadLineEnd.AddDays(1);
query = query.Where(d => d.CreditDeadLine < CreditDeadLineTemp);
}
if (!string.IsNullOrEmpty(req.ClientNumber))
{
query = query.Where(d => d.ClientNumber.Contains(req.ClientNumber));
}
if (!string.IsNullOrEmpty(req.VarietyName))
{
query = query.Where(d => !(d.Type == CreditTable.RoleType || (d.Type == CreditTable.ClientType && d.IsVariety == true))
|| ((d.Type == CreditTable.RoleType || d.IsWhitelist == 1) && d.VarietyName.Contains(req.VarietyName)) || (d.IsWhitelist == 0 && !d.VarietyName.Contains(req.VarietyName)));
}
if (string.IsNullOrEmpty(req.sidx))
{
req.sidx = "id";
req.sord = "desc";
}
var DbErpBaseContext = new ErpBaseContext();
var retListResult = query.ToSearchList(req);
var listRoles = DbErpBaseContext.Roles.ToList();
foreach (var creditLinq in retListResult.rows)
{
if (creditLinq.ProcessRoleId != null)
{
creditLinq.ProcessRoleName =
listRoles.FirstOrDefault(s => s.Id == creditLinq.ProcessRoleId).Name;
}
}
return retListResult;
}
///
/// 查询credit processlog
///
public SearchListResult SearchCreditList(ProcesslogReq req)
{
var predicate = ProcesslogReqUtil.CreatePredicate("CreditProcess", req);
var query = from processlog in DbContext.CreditProcessLog.Where(predicate)
join credit in DbContext.credit on processlog.TypeId equals credit.id into t_credit
from credit in t_credit.DefaultIfEmpty()
select new ProcesslogViewModel
{
id = processlog.id,
TypeId = processlog.TypeId,
ClientName = credit.ClientName,
ProcessType = processlog.ProcessType,
ProcessStatus = processlog.ProcessStatus,
Log = processlog.Log,
OptId = processlog.OptId,
//OptName = systemUsersD.LoginName,
CreateTime = processlog.CreateTime
};
if (string.IsNullOrEmpty(req.sidx))
{
req.sidx = "id";
req.sord = "desc";
}
var retListResult = query.ToSearchList(req);
foreach (var row in retListResult.rows)
{
row.OptName = UserBLL.GetById(row.OptId ?? 0)?.Name;//OTC-8651
}
return retListResult;
}
///
/// creditController.SubmitProcess
///
public string SubmitProcess(int creditId)
{
try
{
var credit = DbContext.credit.FirstOrDefault(s => s.id == creditId);
if (credit == null)
{
throw new ServiceException("请先保存授信基本信息");
}
if (PS.Config.ClientElement.IsCreditLimit &&
!DbContextFactory.GetClientDbContext(OptUser).client.Any(n => n.id == credit.ClientId && n.IsCreditOn == 1))
{
throw new ServiceException("请确认客户的授信是打开的");
}
////授信审批通过时校验授权交易类型
//if (!new CreditTableService(OptUser).derivativesInvestmentVarietiesCheck(credit))
//{
// throw new ServiceException("客户必须为同业交易商或AAA级以上银行,才可以对互换进行授信!");
//}
var processList = DbContext.approvalprocess.Where(s => s.processType == "CreditProcess").ToList();//判断有没有设置授信审批流程
//未设置流程 直接设置成授信状态
if (processList.Count == 0)
{
credit.ProcessStatus = "已审批";
credit.ProcessOrderId = -2;
credit.ProcessOptDate = DateTime.Now;
CreditLog(credit.id, "通过审批", "未设置审批流程,直接通过");
DbContext.SaveChanges();
return "已审批";
}
if (credit.ProcessStatus == "已审批")
{
return "已审批,无需再次提交";
}
if (credit.ProcessStatus == "审批中")
{
return "正在审批中";
}
if (credit.ProcessStatus == "已拒绝")
{
credit.ProcessStatus = "审批中";
credit.ProcessOrderId = 1;
credit.ProcessOptDate = DateTime.Now;
CreditLog(credit.id, "重新提交审批");
DbContext.SaveChanges();
return "已重新提交授信审批";
}
int orderId = credit.ProcessOrderId;
credit.ProcessStatus = "审批中";
credit.ProcessOrderId = 1;
credit.ProcessOptDate = DateTime.Now;
CreditLog(credit.id, "提交审批");
DbContext.SaveChanges();
return "已提交,正在审批中";
}
catch (Exception ex)
{
LogFactory.GetLogger("提交授信审批").Error(ex);
throw new ServiceException(ex.Message, ex);
}
}
#region----UpdateProcessCreditLog-----
///
/// 客户授信审批
///
public string UpdateProcessCreditLog(int creditId, string status, string text)
{
if (string.IsNullOrEmpty(status))
{
throw new ServiceException("status参数传入有误");
}
if (creditId < 1)
{
throw new ServiceException("审批失败,参数传入有误");
}
var credit = DbContext.credit.Find(creditId);
if (credit == null)
{
throw new ServiceException("审批失败,系统中没有该授信记录");
}
try
{
if (status == "pass")
{
////授信审批通过时校验授权交易类型
//if (!new CreditTableService(OptUser).derivativesInvestmentVarietiesCheck(credit)) {
// throw new ServiceException("客户必须为同业交易商或AAA级以上银行,才可以对互换进行授信!");
//}
// //检查是否存在对应的资信评级
// var clientrating = db.Client_Rating.Where(x => !x.IsDeleted && x.ProcessStatus == "已审批" && x.ClientId == credit.ClientId
//&& credit.CreditStartDate >= x.RatingStartDate).OrderByDescending(x => x.RatingDeadLine).ThenByDescending(x=>x.ProcessOptDate).FirstOrDefault();
// if (clientrating == null)
// {
// throw new ServcieException($"审批失败,请为客户设置从日期:{credit.CreditStartDate.Value.ToString("yyyy-MM-dd")}开始的资信评级");
// }
// else
// {
// if (credit.CreditDeadLine > clientrating.RatingDeadLine)
// {
// throw new ServcieException($"审批失败,客户的本次授信截止日期({credit.CreditDeadLine.Value.ToString("yyyy-MM-dd")})不能超过该客户的对应资信评级记录的截止日({clientrating.RatingDeadLine.Value.ToString("yyyy-MM-dd")})");
// }
// }
if (new ClientRatingService(OptUser).IsCreditOverTheCreditLine(credit))
{
throw new ServiceException("审批失败,客户授信申请额度不能超过资信等级额度");
}
var count = DbContext.approvalprocess.Where(s => s.processType == "CreditProcess").Count();
if (count == 0)
{
return SetCreditOpen(credit, text);
}
var processOrderId = credit.ProcessOrderId + 1;
if (processOrderId > count)
{
return SetCreditOpen(credit, text);
}
//继续审批流转
credit.ProcessOrderId = processOrderId;
//client.ProcessStatus = "审批中";
credit.ProcessOptDate = OptDate;
credit.OptId = UserId;
credit.OptName = UserName;
credit.OptDate = OptDate;
DbContext.CreditProcessLog.Add(new Processlog
{
TypeId = creditId,
ProcessType = "CreditProcess",
ProcessStatus = "通过审批",
Log = text,
OptId = UserId,
CreateTime = OptDate
});
CreditLog(creditId, "通过审批", text);
DbContext.SaveChanges();
return "提交成功";
}
else if (status == "reject")
{
credit.ProcessOrderId = -1;
credit.ProcessStatus = "已拒绝";
credit.ProcessOptDate = OptDate;
credit.OptId = UserId;
credit.OptName = UserName;
credit.OptDate = OptDate;
DbContext.CreditProcessLog.Add(new Processlog
{
TypeId = creditId,
ProcessType = "CreditProcess",
ProcessStatus = "审批拒绝",
Log = text,
OptId = UserId,
CreateTime = OptDate
});
CreditLog(creditId, "审批拒绝", text);
DbContext.SaveChanges();
return "提交成功";
}
throw new ServiceException("status参数不支持:" + status);
}
catch (ServiceException)
{
throw;
}
catch (Exception ex)
{
LogFactory.GetLogger().Error("提交授信审批", ex);
throw new ServiceException(ex.Message, ex);
}
}
private string SetCreditOpen(CreditTable credit, string text)
{
//设置成授信审批状态
credit.ProcessOrderId = -2;
credit.ProcessStatus = "已审批";
credit.ProcessOptDate = OptDate;
credit.OptId = UserId;
credit.OptName = UserName;
credit.OptDate = OptDate;
DbContext.CreditProcessLog.Add(new Processlog
{
TypeId = credit.id,
ProcessType = "CreditProcess",
ProcessStatus = "已审批",
Log = text,
OptId = UserId,
CreateTime = OptDate
});
CreditLog(credit.id, "通过审批", text);
DbContext.SaveChanges();
return "提交成功";
}
///
/// 授信日志
///
public void CreditLog(int CreditId, string OptType, string Changes = null)
{
DbContext.credit_log.Add(new CreditLog
{
CreditId = CreditId,
OptType = OptType,
OptId = UserId,
Changes = Changes,
OptName = UserName,
OptDate = DateTime.Now
}); ;
DbContext.SaveChanges();
}
#endregion
///
/// 授信是否可用于收益互换
///
///
///
public static bool creditCanApplySwap(Client client)
{
//授信是否可用于授信
if (client.BusinessType != null && ((client.BusinessType.Contains("银行") && "AAA".Equals(client.BankCreditRating)) || (client.BusinessType.Contains("证券") && client.SamePeer == 0)))
{
return true;
}
return false;
}
}
}