using BaseOUDAL; using YLErp.BLL; namespace YLErp.Modules.ClientModule { /// /// 客户资信评级服务 /// public class ClientRatingService : ClientBaseService { public ClientRatingService(OptUserInfo userInfo) : base(userInfo) { } public ClientRatingService(ClientBaseService baseService) : base(baseService) { } /// /// 检查授信总额度是否是否超过了资信等级对应的额度 /// public bool IsCreditOverTheCreditLine(CreditTable newCredit) { var curDate = valuedateBLL.ValueDate; //var clientrating = db.Client_Rating.Where(x => !x.IsDeleted && x.ProcessStatus == "已审批" && x.ClientId == newCredit.ClientId && newCredit.CreditStartDate >= x.RatingStartDate) // .OrderByDescending(x => x.RatingDeadLine).ThenByDescending(x => x.ProcessOptDate).FirstOrDefault(); Tuple clientrating = GetCurrentCreditRating(curDate, newCredit.ClientId ?? 0); if (clientrating == null) { return false; } var creditRating = DbContext.credit_rating.FirstOrDefault(r => r.id == clientrating.Item1 && r.ValidState != ConsGlobal.InValid); //如果为空或者额度不限,表示没有限额 if (creditRating == null || creditRating.IsUnLimited == 1) { return false; } return (newCredit?.Credit ?? 0) > creditRating.CreditLine; } /// /// 获取当前日期有效的客户评级 /// public Tuple GetCurrentCreditRating(DateTime valuedate, int clientId) { var perfectCreditRating = DbContext.Client_Rating.Where(x => !x.IsDeleted && x.ProcessStatus == "已审批" && x.ClientId == clientId && x.RatingStartDate <= valuedate && x.RatingDeadLine >= valuedate).OrderByDescending(x => x.RatingDeadLine).ThenByDescending(x => x.ProcessOptDate).FirstOrDefault();//优先取deadline最大的 if (perfectCreditRating != null) { return new Tuple(perfectCreditRating.CreditRatingId, perfectCreditRating.CreditRatingStr); } return null; } /// /// 获取列表数据 /// public SearchListResult SearchList(ClientRatingReq req) { var creditProcessList = yldb.approvalprocess.Where(x => x.processType == "CreditProcess").ToArray(); var valuedate = valuedateBLL.ValueDate; var Client_RatingOpenProcessOrder = yldb.approvalprocess.Where(x => x.processType == "CreditProcess").Count(); var query = from source in DbContext.Client_Rating.AsQueryable().Where(s => !s.IsDeleted) //join process in yldb.approvalprocess.Where(a => a.processType == "CreditProcess") on source.ProcessOrderId equals process.order into pro //from proce in pro.DefaultIfEmpty() join client in DbContext.client.Where(a => req.DbClientIds.Contains(a.id)) on source.ClientId equals client.id select new ClientRatingDto { id = source.id, ClientId = source.ClientId, ClientName = source.ClientName, RatingStartDate = source.RatingStartDate, RatingDeadLine = source.RatingDeadLine, ClientNumber = source.ClientNumber, ProcessStatusOriginal = source.ProcessStatus, ProcessStatus = source.ProcessStatus == "审批中" ? source.ProcessStatus + " 流程" + (source.ProcessOrderId - 1) + "/" + Client_RatingOpenProcessOrder : source.ProcessStatus, //ProcessRoleId = proce.roleId, ProcessRoleName = "", ProcessOptDate = source.ProcessOptDate, OptId = source.OptId, OptName = source.OptName, ProcessOrderId = source.ProcessOrderId, OptDate = source.OptDate, RoleId = source.RoleId, RoleName = source.RoleName, CreditRatingId = source.CreditRatingId, CreditRatingStr = source.CreditRatingStr, RatingAccording = source.RatingAccording, RatingPersonnel = source.RatingPersonnel, CheckPersonnel = source.CheckPersonnel, Comments = source.Comments, BusinessType = client.BusinessType }; if (req.ShowExpiredRecords) { var notExpiredCids = DbContext.Client_Rating.Where(x => !x.IsDeleted && x.ProcessStatus == "已审批" && x.RatingStartDate <= valuedate && x.RatingDeadLine >= valuedate && x.ClientId > 0).Select(x => x.ClientId).Distinct().ToArray();//具有有效评级的客户 query = query.Where(d => !notExpiredCids.Contains(d.ClientId)); } if (req.ClientId > 0) { 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.RatingDeadLineStart != DateTime.MinValue) { query = query.Where(d => d.RatingDeadLine >= req.RatingDeadLineStart); } if (req.RatingDeadLineEnd != DateTime.MinValue) { query = query.Where(d => d.RatingDeadLine <= req.RatingDeadLineEnd); } if (!string.IsNullOrEmpty(req.ClientNumber)) { query = query.Where(d => d.ClientNumber.Contains(req.ClientNumber)); } if (req.OptId != null) { query = query.Where(d => d.OptId == req.OptId); } if (!string.IsNullOrEmpty(req.OptName)) { query = query.Where(d => d.OptName.Contains(req.OptName)); } if (req.OptDateStart != DateTime.MinValue) { query = query.Where(d => d.OptDate >= req.OptDateStart); } if (req.OptDateEnd != DateTime.MinValue) { DateTime OptDateTemp = req.OptDateEnd.AddDays(1); query = query.Where(d => d.OptDate < OptDateTemp); } if (string.IsNullOrEmpty(req.sidx)) { req.sidx = "id"; req.sord = "desc"; } var DbErpBaseContext = new ErpBaseContext(); query = query.OrderByDescending(x => x.OptDate); var retListResult = query.ToSearchList(req); var listRoles = DbErpBaseContext.Roles.Select(n => new { n.Id, n.Name }).ToDictionary(n => n.Id, m => m.Name); foreach (var item in retListResult.rows) { if (item.ProcessOrderId > 0) { item.ProcessRoleId = creditProcessList.FirstOrDefault(n => n.order == item.ProcessOrderId)?.roleId; } if (item.ProcessRoleId != null && listRoles.TryGetValue(item.ProcessRoleId.Value, out var name)) { item.ProcessRoleName = name; } } return retListResult; } } /// /// 客户资信评级查询请求 /// public class ClientRatingReq : BaseSearchReq { public int? id { get; set; } /// /// 评级Id /// public int CreditRatingId { get; set; } /// /// 评级 /// public string CreditRatingStr { get; set; } /// /// 客户信息 /// public int ClientId { get; set; } public List ClientIds { get; set; } public List DbClientIds { get; set; } /// /// 客户名称 /// public string ClientName { get; set; } /// /// 评级起始日 /// public DateTime? RatingStartDate { get; set; } /// /// 评级到期日 /// public DateTime? RatingDeadLine { get; set; } public DateTime RatingDeadLineStart { get; set; } public DateTime RatingDeadLineEnd { get; set; } public string RatingAccording { get; set; } public string RatingPersonnel { get; set; } public string CheckPersonnel { get; set; } /// /// 用户编号 /// public string ClientNumber { get; set; } /// /// 操作人_optid /// public int? OptId { get; set; } /// /// 操作人_optid /// public string OptName { get; set; } /// /// 操作时间_createdate /// public DateTime? OptDate { get; set; } public DateTime OptDateStart { get; set; } public DateTime OptDateEnd { get; set; } /// /// 评级状态 /// public string ProcessStatuses { get; set; } public List ProcessStatusList { get { if (string.IsNullOrWhiteSpace(ProcessStatuses)) { return new List(); } return ProcessStatuses.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToList(); } } /// /// 客户代码列表 /// public List ClientNumberList { get; set; } /// /// 客户名称列表 /// public List ClientNameList { get; set; } /// /// 评级列表 /// public List RateList { get; set; } /// /// 评级有效期开始时间 /// public DateTime? Client_RatingStartDateStart { get; set; } /// /// 评级有效期截至时间 /// public DateTime? Client_RatingStartDateEnd { get; set; } /// /// 评级状态列表 /// public List ProcessStatusList_New { get; set; } /// /// 说明 /// public string Comments { get; set; } = ""; /// /// 只显示全部无效评级客户的记录 /// public bool ShowExpiredRecords { get; set; } } }