using DG.Core; using Hg.Core.Domain.Dto.InComplaint; using Hg.Core.Domain.Dto.OrderRefund; using Hg.Core.Domain.Dto.OutComplaint; using Org.BouncyCastle.Ocsp; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Hg.Core.Domain { internal class OutComplaintDomain : IOutComplaintDomain { private readonly IBaseRepository _zxdRepository; private readonly IRedisManager _redisManager; private readonly IConfiguration _configuration; private readonly IHttpClient _httpClient; private readonly IMapper _mapper; private readonly SystemConfig _systemConfig; private readonly IInneruserDomain _inneruserDomain; private readonly ICacheDomain _cacheDomain; public OutComplaintDomain(IBaseRepository zxdRepository, IRedisManager redisManager, IConfiguration configuration, IMapper mapper, IHttpClient httpClient, IInneruserDomain inneruserDomain, ICacheDomain cacheDomain) { _zxdRepository = zxdRepository; _redisManager = redisManager; _mapper = mapper; _httpClient = httpClient; _configuration = configuration; _inneruserDomain = inneruserDomain; _cacheDomain = cacheDomain; _systemConfig = _configuration.GetSection("SystemConfig").Get(); } public async Task GetOutComplaint(int id) { var query = from a in _zxdRepository.GetRepository().Query() select new OutComplaintDto { Id = a.Id, Deptid = a.Deptid, DueStatus = a.DueStatus, BusinessDeadline = a.BusinessDeadline, ComplaintDeadline = a.ComplaintDeadline, OutComplaintDate = a.OutComplaintDate, BusinessStatus = a.BusinessStatus, Cname = a.Cname, ComplaintId = a.ComplaintId, Content = a.Content, CreateTime = a.CreateTime, Creator = a.Creator, Eid = a.Eid, Follow = a.Follow, OutComplaintChannel = a.OutComplaintChannel, OutComplaintStatus = a.OutComplaintStatus, Reason = a.Reason, Remark = a.Remark, Resid = a.Resid, Updater = a.Updater, UpdateTime = a.UpdateTime, RiskSituation = a.RiskSituation, }; var result = await query.FirstOrDefaultAsync(x => x.Id == id); if (result == null) throw new ApiException("外诉数据不存在或已删除!"); return result; } public async Task> GetOutComplaintPage(SearchOutComplaintDto dto) { var eids = new List(); if (!string.IsNullOrWhiteSpace(dto.Eids)) eids = dto.Eids.Split(",").Select(x => int.Parse(x)).ToList(); var deptList = await _cacheDomain.GetDeptments(); var departIds = new List(); #region UMID转RESID if (!string.IsNullOrEmpty(dto.UMID) && string.IsNullOrEmpty(dto.Resid)) { var UMIDMain = _zxdRepository.GetRepository().Query().FirstOrDefault(m => dto.UMID == m.UMID); if (UMIDMain != null) { dto.Resid = UMIDMain.RESID; } else { dto.Resid = "NULL_RESID"; } } #endregion if (!string.IsNullOrWhiteSpace(dto.Channel)) { var arr0 = dto.Channel.Split('|'); foreach (var item0 in arr0) { var arr1 = item0.Split(','); foreach (var item in arr1) { //var dept = deptList.Where(y => y.DeptmentCampains.Any(a => "2500-2900" == $"{a.StartCampainId}-{a.EndCampainId}" || "3000-3900" == $"{a.StartCampainId}-{a.EndCampainId}")); var a = item.Split(';'); var min = Convert.ToInt32(a[0]); var max = Convert.ToInt32(a[1]); var ids = deptList.Where(x => x.DeptmentCampains.Any(y => y.StartCampainId >= min && y.EndCampainId <= max)).Select(x => x.Id).ToList(); departIds.AddRange(ids); } } } var showDeptIds = new List(); if (!string.IsNullOrWhiteSpace(dto.ShowDeptIds)) showDeptIds = dto.ShowDeptIds.Split(',').Select(x => int.Parse(x)).ToList(); var query = from a in _zxdRepository.GetRepository().Query() // join b in _zxdRepository.GetRepository().Query() on a.Resid equals b.RESID into ab // from b in ab.DefaultIfEmpty() select new OutComplaintDto { Id = a.Id, Deptid = a.Deptid, DueStatus = dto.Type.HasValue ? a.ComplaintDueStatus : a.DueStatus, BusinessDeadline = a.BusinessDeadline, ComplaintDeadline = a.ComplaintDeadline, OutComplaintDate = a.OutComplaintDate, BusinessStatus = a.BusinessStatus, Cname = a.Cname, ComplaintId = a.ComplaintId, Content = a.Content, CreateTime = a.CreateTime, Creator = a.Creator, Eid = a.Eid, Follow = a.Follow, OutComplaintChannel = a.OutComplaintChannel, OutComplaintStatus = a.OutComplaintStatus, Reason = a.Reason, Remark = a.Remark, Resid = a.Resid, //UMID= b.UMID, Updater = a.Updater, UpdateTime = a.UpdateTime, //Restorer = b.FirstCreator, //RestoreTime = b.FirstCreateTime, //RefundStatus = _zxdRepository.GetRepository().Query().OrderByDescending(x=>x.CreateTime).FirstOrDefault(x=>x.ComplaintId == a.ComplaintId).RefundStatus, Restorer = _zxdRepository.GetRepository().Query().OrderByDescending(x => x.CreateTime).FirstOrDefault(x => x.ComplaintId == a.ComplaintId && x.RestoreType == RestoreType.业务).Creator, RestoreTime = _zxdRepository.GetRepository().Query().OrderByDescending(x => x.CreateTime).FirstOrDefault(x => x.ComplaintId == a.ComplaintId && x.RestoreType == RestoreType.业务).CreateTime, HGRestorer = _zxdRepository.GetRepository().Query().OrderByDescending(x => x.CreateTime).FirstOrDefault(x => x.ComplaintId == a.ComplaintId && x.RestoreType == RestoreType.合规).Creator, HGRestoreTime = _zxdRepository.GetRepository().Query().OrderByDescending(x => x.CreateTime).FirstOrDefault(x => x.ComplaintId == a.ComplaintId && x.RestoreType == RestoreType.合规).CreateTime, //OrderList = _zxdRepository.GetRepository().Query().Where(x => x.ComplaintId == a.ComplaintId).Select(x => x.Orderid).ToList(), //PriceList = _zxdRepository.GetRepository().Query().Where(x => x.ComplaintId == a.ComplaintId).Select(x => x.Price).ToList(), RestoreCount = _zxdRepository.GetRepository().Query().Count(x => x.ComplaintId == a.ComplaintId), FollowUpCount = _zxdRepository.GetRepository().Query().Count(x => x.ComplaintId == a.ComplaintId), NeedRestoreCount = _zxdRepository.GetRepository().Query().Count(x => x.ComplaintId == a.ComplaintId), TimeSort = a.UpdateTime.HasValue && a.CreateTime < a.UpdateTime ? a.UpdateTime.Value : a.CreateTime, IsInComplaint = _zxdRepository.GetRepository().Query().Count(x=>x.Resid == a.Resid) > 0 ? "是":"否", Verifyier = a.Verifyier, VerifyTime = a.VerifyTime, RiskSituation = a.RiskSituation }; if (!string.IsNullOrWhiteSpace(dto.Eid)) { query = from a in query join b in _zxdRepository.GetRepository().Query() on a.Eid equals b.EID where (a.Eid.ToString() == dto.Eid || b.UNAME == dto.Eid) select a; } if (dto.Orderid.HasValue) { query = from a in query join b in _zxdRepository.GetRepository().Query() on a.Resid equals b.RESID join c in _zxdRepository.GetRepository().Query() on b.ORDERID equals c.orderid where c.orderid == dto.Orderid && c.isdelete == 0 && c.auditstatus == 1 select a; } if (dto.RefundStatus.HasValue) { if (dto.RefundStatus == OrderRefundStatus.未退款) { query = from a in query join b in _zxdRepository.GetRepository().Query() on a.Resid equals b.RESID join c in _zxdRepository.GetRepository().Query() on b.ORDERID equals c.orderid where c.orderid == 0 && c.isdelete == 0 && c.auditstatus == 1 select a; } else if (dto.RefundStatus == OrderRefundStatus.已退款) { query = from a in query join b in _zxdRepository.GetRepository().Query() on a.Resid equals b.RESID join c in _zxdRepository.GetRepository().Query() on b.ORDERID equals c.orderid where c.orderid > 0 && c.isdelete == 0 && c.auditstatus == 1 select a; } } query = query.If(dto.Deptid != null, x => x.Where(x => x.Deptid == dto.Deptid)) .If(departIds.Any(), x => x.Where(x => x.Deptid.HasValue && departIds.Contains(x.Deptid.Value))) .If(showDeptIds.Any(), x => x.Where(x => x.Deptid.HasValue && showDeptIds.Contains(x.Deptid.Value))) .If(dto.DueStatus != null, x => x.Where(x => x.DueStatus == dto.DueStatus)) .If(dto.BusinessStatus != null, x => x.Where(x => x.BusinessStatus == dto.BusinessStatus)) .If(dto.OutComplaintChannel != null, x => x.Where(x => x.OutComplaintChannel == dto.OutComplaintChannel)) .If(dto.OutComplaintStatus != null, x => x.Where(x => x.OutComplaintStatus == dto.OutComplaintStatus)) //.If(dto.RefundStatus != null, x => x.Where(x => x.RefundStatus == dto.RefundStatus)) .If(dto.Reason != null, x => x.Where(x => ((int)dto.Reason & x.Reason.Value) > 0)) .If(eids.Any(), x => x.Where(x => eids.Contains(x.Eid.Value))) .If(!string.IsNullOrEmpty(dto.Resid), x => x.Where(x => x.Resid == dto.Resid)) .If(!string.IsNullOrEmpty(dto.Cname), x => x.Where(x => x.Cname == dto.Cname)) .If(!string.IsNullOrEmpty(dto.ComplaintId), x => x.Where(x => x.ComplaintId == dto.ComplaintId)) .If(!string.IsNullOrEmpty(dto.CreaetOrUpdateUser) && dto.PersonType == PersonTypeEnum.创建人, x => x.Where(x => x.Creator == dto.CreaetOrUpdateUser)) .If(!string.IsNullOrEmpty(dto.CreaetOrUpdateUser) && dto.PersonType == PersonTypeEnum.更新人, x => x.Where(x => x.Updater == dto.CreaetOrUpdateUser)) .If(!string.IsNullOrEmpty(dto.CreaetOrUpdateUser) && dto.PersonType == PersonTypeEnum.核查人, x => x.Where(x => x.Verifyier == dto.CreaetOrUpdateUser)) .If(!string.IsNullOrEmpty(dto.CreaetOrUpdateUser) && dto.PersonType == PersonTypeEnum.业务回复人, x => x.Where(x => x.Restorer == dto.CreaetOrUpdateUser)) .If(!string.IsNullOrEmpty(dto.CreaetOrUpdateUser) && dto.PersonType == PersonTypeEnum.合规回复人, x => x.Where(x => x.HGRestorer == dto.CreaetOrUpdateUser)) //.If(dto.Orderid != null, x => x.Where(x => x.OrderList.Contains(dto.Orderid))) .If(dto.DateType == OutComplaintDateType.客户外诉日期 && dto.DateFrom != null, x => x.Where(x => x.OutComplaintDate >= dto.DateFrom.Value)) .If(dto.DateType == OutComplaintDateType.业务回复日期 && dto.DateFrom != null, x => x.Where(x => x.RestoreTime >= dto.DateFrom.Value)) .If(dto.DateType == OutComplaintDateType.合规回复日期 && dto.DateFrom != null, x => x.Where(x => x.HGRestoreTime >= dto.DateFrom.Value)) .If(dto.DateType == OutComplaintDateType.创建日期 && dto.DateFrom != null, x => x.Where(x => x.CreateTime >= dto.DateFrom.Value)) .If(dto.DateType == OutComplaintDateType.更新日期 && dto.DateFrom != null, x => x.Where(x => x.UpdateTime >= dto.DateFrom.Value)) .If(dto.DateType == OutComplaintDateType.核查日期 && dto.DateFrom != null, x => x.Where(x => x.VerifyTime >= dto.DateFrom.Value)) .If(dto.DateType == OutComplaintDateType.客户外诉日期 && dto.DateTo != null, x => x.Where(x => x.OutComplaintDate <= dto.DateTo.Value.AddDays(1).AddSeconds(-1))) .If(dto.DateType == OutComplaintDateType.业务回复日期 && dto.DateTo != null, x => x.Where(x => x.RestoreTime <= dto.DateTo.Value.AddDays(1).AddSeconds(-1))) .If(dto.DateType == OutComplaintDateType.合规回复日期 && dto.DateTo != null, x => x.Where(x => x.HGRestoreTime <= dto.DateTo.Value.AddDays(1).AddSeconds(-1))) .If(dto.DateType == OutComplaintDateType.创建日期 && dto.DateTo != null, x => x.Where(x => x.CreateTime <= dto.DateTo.Value.AddDays(1).AddSeconds(-1))) .If(dto.DateType == OutComplaintDateType.更新日期 && dto.DateTo != null, x => x.Where(x => x.UpdateTime <= dto.DateTo.Value.AddDays(1).AddSeconds(-1))) .If(dto.DateType == OutComplaintDateType.核查日期 && dto.DateTo != null, x => x.Where(x => x.VerifyTime <= dto.DateTo.Value.AddDays(1).AddSeconds(-1))) .OrderByDescending(x => x.TimeSort); var total = await query.CountAsync(); var data = await query .Skip((dto.PageIndex - 1) * dto.PageSize) .Take(dto.PageSize) .ToListAsync(); var now = DateTime.Now; if (data.Any()) { var eidStr = string.Join(",", data.Where(x => x.Eid != null).Select(x => x.Eid).ToList()); var innerUsers = await _inneruserDomain.GetInnerusers(eidStr); var orderStatus = new List { "220", "205", "80", "90" }; var orders = await _zxdRepository.GetRepository().Query().Where(x => data.Select(x => x.Resid).Contains(x.RESID) && orderStatus.Contains(x.ORDERSTATUS)).OrderByDescending(x => x.OTIME).ToListAsync(); var resIds = data.Select(x => x.Resid); var refundOrders = await (from a in _zxdRepository.GetRepository().Query() join b in _zxdRepository.GetRepository().Query() on a.orderid equals b.ORDERID where resIds.Contains(b.RESID) && a.isdelete == 0 && a.auditstatus == 1 select new { a.refundprice, a.orderid, b.RESID }).ToListAsync(); var rcu = _zxdRepository.GetRepository().Query().Where(m => resIds.Contains(m.RESID)).ToList(); foreach (var item in data) { var company = deptList.FirstOrDefault(y => y.Id == item.Deptid); var itemOrders = orders.Where(x => x.RESID == item.Resid); if (item.Resid == "224284360094995449")//该客户测试单号过多 itemOrders = itemOrders.Take(4); var idCard = itemOrders.FirstOrDefault(x => !string.IsNullOrWhiteSpace(x.idcard))?.idcard; var minOTime = itemOrders.Min(x => x.OTIME); item.Age = _cacheDomain.GetAge(idCard); //item.OrderInfo = itemOrders.Select(x => $"产品:{x.SUBPRODUCTNAME} 订单号:{x.ORDERID} 开通时间:{x.OTIME} 到账金额:{x.ARRIVALPAY} 权限到期状态:{(now > x.ARRIVALTIME ? "到期" : "未到期")}").ToList(); item.Products = itemOrders.Select(x => x.SUBPRODUCTNAME).ToList(); item.OrderIds = itemOrders.Select(x => x.ORDERID).ToList(); item.OTimes = itemOrders.Select(x => x.OTIME).ToList(); item.ArrivalPays = itemOrders.Select(x => x.ARRIVALPAY).ToList(); item.ArrivalStatus = itemOrders.Select(x => (x.OTIME.HasValue && x.OPENDAYS.HasValue && now < x.OTIME.Value.AddDays(x.OPENDAYS.Value) ? "未到期" : "到期")).ToList(); item.ComplaintCycle = minOTime.HasValue ? item.OutComplaintDate.Value.Subtract(minOTime.Value).Days : null; item.Deptname = company?.Title; item.BusinessDeadlineSpan = $"{await _cacheDomain.GetWorkDays(now, item.BusinessDeadline)}个工作日"; item.ComplaintDeadlineSpan = $"{await _cacheDomain.GetWorkDays(now, item.ComplaintDeadline)}个工作日"; var innerUser = innerUsers.FirstOrDefault(x => x.EId == item.Eid); item.Euser = item.Eid.HasValue && innerUser != null ? $"{item.Eid}-{innerUser?.Name}-{(innerUser?.Status == 2 ? "离职" : "在职")}" : item.Eid.ToString(); item.OrderList = refundOrders.Where(x => x.RESID == item.Resid).Select(x => x.orderid).ToList(); item.PriceList = refundOrders.Where(x => x.RESID == item.Resid).Select(x => x.refundprice).ToList(); item.RefundStatus = refundOrders.Where(x => x.RESID == item.Resid).Any() ? OrderRefundStatus.已退款 : OrderRefundStatus.未退款; item.UMID = rcu.FirstOrDefault(m => m.RESID == item.Resid)?.UMID; } } else { data = new List(); } return new PageResult(dto.PageIndex, dto.PageSize, total, data); } public async Task CreateOutComplaint(CreateOutComplaintDto dto) { var date = DateTime.Now.Date.AddDays(1).AddSeconds(-1); var complaintId = CreateOutComplaintid(); //Log.Information("卧槽"); var customer = await _zxdRepository.GetRepository().Query().FirstOrDefaultAsync(x => x.UMID == dto.Resid.Trim()); if (customer == null) throw new Exception("客户ID不存在"); var order = await _zxdRepository.GetRepository().Query().OrderByDescending(x => x.CTIME) .FirstOrDefaultAsync(x => x.RESID == customer.RESID && x.deptid == dto.Deptid); var data = new OutComplaint { Deptid = dto.Deptid, DueStatus = OutComplaintDueStatus.未到期, ComplaintDueStatus = OutComplaintDueStatus.未到期, OutComplaintDate = dto.OutComplaintDate.Value, Cname = dto.Cname, ComplaintId = complaintId, BusinessDeadline = await _cacheDomain.AddWorkDays(date, 7), ComplaintDeadline = await _cacheDomain.AddWorkDays(date, 20), BusinessStatus = OutComplaintBusinessStatus.待处理, Content = dto.Content, CreateTime = DateTime.Now, Creator = dto.Operator, Follow = dto.Follow, OutComplaintChannel = dto.OutComplaintChannel, Reason = dto.Reason, OutComplaintStatus = OutComplaintStatus.跟进中, Remark = dto.Remark, //Resid = dto.Resid, Resid = customer.RESID, Eid = order?.eid, CreateEid = dto.OperatorEid, VerifyEid = !string.IsNullOrWhiteSpace(dto.Remark) ? dto.OperatorEid : null, Verifyier = !string.IsNullOrWhiteSpace(dto.Remark) ? dto.Operator : null, VerifyTime = !string.IsNullOrWhiteSpace(dto.Remark) ? DateTime.Now : null, RiskSituation = dto.RiskSituation }; var outComplaintFollowUp = new OutComplaintFollowUp { ComplaintId = complaintId, Content = dto.Content, CreateTime = DateTime.Now, Creator = dto.Operator, Follow = dto.Follow, CreateEid = dto.OperatorEid }; //var orders = await _zxdRepository.GetRepository().Query() // .Where(x => x.RESID == dto.Resid) // .Where(x => x.ORDERSTATUS == "90") // .Select(x => new OutComplaintOrder // { // Orderid = x.ORDERID, // ComplaintId = complaintId, // Price = x.NEEDPAY // }) // .ToListAsync(); var transaction = await _zxdRepository.BeginTransactionAsync(); try { await _zxdRepository.GetRepository().InsertAsync(data); await _zxdRepository.GetRepository().InsertAsync(outComplaintFollowUp); //发送消息 var sendMessage = new { Message = $"{dto.Operator}({dto.Resid})提交了外诉,投诉原因是:{dto.ReasonList},请在7个工作日内及时处理好。", Eid = order?.eid, Deptid = dto.Deptid, Method = "ComplaintMessage", IsDepartment = true, }; //Log.Information("卧槽44"); //await _cacheDomain.SendCrmMessage(sendMessage); //创建客户标签 await _cacheDomain.ComplaintLabel(dto.Resid, dto.Cname, order?.companycode, "外诉"); await transaction.CommitAsync(); return true; } catch { await transaction.RollbackAsync(); await transaction.DisposeAsync(); throw; } } /// /// 更新外诉记录 /// /// /// /// public async Task UpdateOutComplaint(UpdateOutComplaintDto dto) { var data = await _zxdRepository.GetRepository().Query().FirstOrDefaultAsync(x => x.Id == dto.Id); if (data == null) throw new ApiException("外诉数据不存在或已删除!"); data.Content = dto.Content; data.Follow = dto.Follow; data.Updater = dto.Operator; data.UpdateTime = DateTime.Now; data.UpdateEid = dto.OperatorEid; data.RiskSituation = dto.RiskSituation; if (data.Remark != dto.Remark) { data.Remark = dto.Remark; data.VerifyTime = DateTime.Now; data.VerifyEid = dto.OperatorEid; data.Verifyier = dto.Operator; } await _zxdRepository.GetRepository().UpdateAsync(data, x => new { x.RiskSituation ,x.Content, x.Follow, x.Remark, x.UpdateTime, x.Updater, x.Verifyier, x.VerifyTime, x.VerifyEid }); return true; } private static string CreateOutComplaintid() { //return $"WS{DateTimeOffset.Now.ToUnixTimeMilliseconds()}"; return $"WS{DateTime.Now.ToString("yyyyMMddHHmmssffff")}"; } /// /// 添加跟进记录 /// /// /// public async Task CreateOutComlpaintFollowUp(CreateOutComplaintFollowUpDto dto) { var data = await _zxdRepository.GetRepository().Query().FirstOrDefaultAsync(x => x.Id == dto.Id); if (data == null) throw new ApiException("外诉数据不存在或已删除!"); var outComplaintFollowUp = new OutComplaintFollowUp { ComplaintId = data.ComplaintId, Content = dto.Content, CreateTime = DateTime.Now, Creator = dto.Operator, Follow = dto.Follow, CreateEid = dto.OperatorEid }; data.Updater = dto.Operator; data.UpdateEid = dto.OperatorEid; data.UpdateTime = DateTime.Now; var transaction = await _zxdRepository.BeginTransactionAsync(); try { await _zxdRepository.GetRepository().UpdateAsync(data, x => new { x.Updater, x.UpdateEid, x.UpdateTime }); await _zxdRepository.GetRepository().InsertAsync(outComplaintFollowUp); await transaction.CommitAsync(); return true; } catch (Exception ex) { await transaction.RollbackAsync(); await transaction.DisposeAsync(); throw; } } public async Task UpdateOutComlpaintFollowUp(CreateOutComplaintFollowUpDto dto) { var complaintFollowUp = await _zxdRepository.GetRepository().Query().FirstOrDefaultAsync(x => x.Id == dto.Id); if(complaintFollowUp == null) throw new ApiException("跟进数据不存在或已删除!"); complaintFollowUp.Content = dto.Content; complaintFollowUp.Follow = dto.Follow; complaintFollowUp.UpdateEid = dto.OperatorEid; complaintFollowUp.Updater = dto.Operator; complaintFollowUp.UpdateTime = DateTime.Now; await _zxdRepository.GetRepository().UpdateAsync(complaintFollowUp); return true; } /// /// 获取用户信息 /// /// /// public async Task GetComplaintCustomerInfo(string? resid) { //var customerInfo = await _zxdRepository.GetRepository().Query() // .Where(x => x.RESID == resid) // .Where(x => x.ORDERSTATUS == "220") // .GroupBy(x => new // { // x.RESID, // x.CNAME, // x.eid, // }) // .Select(x => new ComplaintCustomerInfoDto // { // Resid = x.Key.RESID, // Cname = x.Key.CNAME, // Eid = x.Key.eid, // DeptInfos = x.GroupBy(y=>new { y.CHANNEL,y.companycode}).Select(y => new ComplaintCustomerDeptInfo // { // Channel = y.Key.CHANNEL, // CompanyCode = y.Key.companycode // }).ToList() // }) // .FirstOrDefaultAsync(); var orderList = await _zxdRepository.GetRepository().Query() .Where(x => x.RESID == resid) .Where(x => x.ORDERSTATUS == "220").ToListAsync(); var customerInfo = orderList.GroupBy(x => new { x.RESID, x.CNAME, x.eid }) .Select(x => new ComplaintCustomerInfoDto { Resid = x.Key.RESID, Cname = x.Key.CNAME, Eid = x.Key.eid, DeptInfos = orderList.GroupBy(y => new { y.CHANNEL, y.companycode }).Select(y => new ComplaintCustomerDeptInfo { Channel = y.Key.CHANNEL, CompanyCode = y.Key.companycode }).ToList() }).FirstOrDefault(); var deptList = await _cacheDomain.GetDeptments(); if (customerInfo != null && customerInfo.DeptInfos != null && customerInfo.DeptInfos.Any()) { customerInfo.DeptInfos.ForEach(x => { var dept = deptList.FirstOrDefault(y => y.DeptmentCampains.Any(a => x.Channel >= a.StartCampainId && x.Channel <= a.EndCampainId)); x.Deptname = dept?.Title; x.Deptid = dept?.Id; }); } return customerInfo; } public async Task GetOutComplaintFollowUp(int? id) { var query = from a in _zxdRepository.GetRepository().Query() where a.Id == id select new OutComplaintFollowUpDto { Id = a.Id, Cname = a.Cname, OutComplaintStatus = a.OutComplaintStatus, ComplaintId = a.ComplaintId, Resid = a.Resid }; var data = await query.FirstOrDefaultAsync(); if (data == null) throw new ApiException("外诉数据不存在或已删除!"); data.Details = await _zxdRepository.GetRepository().Query() .Where(x => x.ComplaintId == data.ComplaintId) .Select(x => new OutComplaintFollowUpDetailDto { Id = x.Id, Content = x.Content, CreateTime = x.CreateTime, Creator = x.Creator, Follow = x.Follow, Updater = x.Updater, UpdateTime = x.UpdateTime, }).ToListAsync(); var index = 1; data.Details?.ForEach(x => { x.Index = $"第{index}次投诉"; index++; }); return data; } public async Task GetOutComplaintRestoreInfo(int id) { var data = await _zxdRepository.GetRepository().Query().FirstOrDefaultAsync(x => x.Id == id); if (data == null) throw new ApiException("外诉数据不存在或已删除!"); var restore = await _zxdRepository.GetRepository().Query().Where(x => x.ComplaintId == data.ComplaintId).OrderBy(x=>x.CreateTime).ToListAsync(); var result = new OutComplaintRestoreDto { Deptid = data.Deptid, Cname = data.Cname, ComplaintId = data.ComplaintId, Resid = data.Resid, OutComplaintStatus = data.OutComplaintStatus, Id = data.Id, OutComplaintBusinessStatus = data.BusinessStatus, Restores = restore.Select(x => new RestoreDto { Id = x.Id, Content = x.Content, Creator = x.Creator, Attachment = x.Attachment, ComplaintId = x.ComplaintId, CreateTime = x.CreateTime, CreatorEid = x.CreatorEid, RestoreType = x.RestoreType }).ToList() }; var deptList = await _cacheDomain.GetDeptments(); var dept = deptList.FirstOrDefault(y => y.Id == data.Deptid); result.Deptname = dept?.Title; return result; } public async Task CreateOutComplaintRestore(CreateOutComplaintRestoreDto dto) { var data = await _zxdRepository.GetRepository().Query().FirstOrDefaultAsync(x => x.Id == dto.Id); if (data == null) throw new ApiException("外诉数据不存在或已删除!"); if (dto.RestoreType == RestoreType.业务) { data.BusinessStatus = dto.BusinessStatus; } else if (dto.RestoreType == RestoreType.合规) { data.Updater = dto.Creator; data.UpdateEid = dto.CreatorEid; data.UpdateTime = DateTime.Now; } var restore = new OutComplaintRestore { ComplaintId = data.ComplaintId, Content = dto.Content, CreateTime = DateTime.Now, Creator = dto.Creator, CreatorEid = dto.CreatorEid, Attachment = dto.Attachment, RestoreType = dto.RestoreType }; await _zxdRepository.GetRepository().InsertAsync(restore); await _zxdRepository.GetRepository().UpdateAsync(data, x => new { x.BusinessStatus, x.UpdateEid, x.Updater, x.UpdateTime }); return true; } public async Task UpdateOutComplaintStatus(UpdateOutComplaintStatusDto dto) { var data = await _zxdRepository.GetRepository().Query().FirstOrDefaultAsync(x => x.Id == dto.Id); if (data == null) throw new ApiException("外诉数据不存在或已删除!"); data.UpdateEid = dto.OperatorEid; data.Updater = dto.Operator; data.UpdateTime = DateTime.Now; data.OutComplaintStatus = dto.OutComplaintStatus; //if (dto.OutComplaintStatus == OutComplaintStatus.已办结) //{ // data.BusinessStatus = OutComplaintBusinessStatus.已办结; //} await _zxdRepository.GetRepository().UpdateAsync(data, x => new { x.UpdateEid, x.Updater, x.OutComplaintStatus, x.UpdateTime, x.BusinessStatus }); return true; } public async Task SyncOutComplaintStatus() { var now = DateTime.Now; var data = await _zxdRepository.GetRepository().Query() .Where(x => (x.DueStatus == OutComplaintDueStatus.未到期 || x.ComplaintDueStatus == OutComplaintDueStatus.未到期) && (x.BusinessDeadline <= now || x.ComplaintDeadline <= now)) //&& x.ComplaintDeadline <= now) .ToListAsync(); foreach (var item in data) { if(item.BusinessDeadline <= now) item.DueStatus = OutComplaintDueStatus.已到期; if(item.ComplaintDeadline <= now) item.ComplaintDueStatus = OutComplaintDueStatus.已到期; if (item.BusinessStatus == OutComplaintBusinessStatus.待处理 && item.BusinessDeadline <= now) { item.BusinessStatus = OutComplaintBusinessStatus.到期未处理; } } if (data.Any()) { await _zxdRepository.GetRepository().BatchUpdateAsync(data, x => new { x.DueStatus, x.BusinessStatus, x.ComplaintDueStatus }); } } public async Task ComplaintLabel(string resId) { if (string.IsNullOrWhiteSpace(resId)) throw new Exception("请输入客户ID"); var inComplaint = await _zxdRepository.GetRepository().FirstOrDefaultAsync(x => x.Resid == resId); var outComplaint = await _zxdRepository.GetRepository().FirstOrDefaultAsync(x => x.Resid == resId); var result = new ComplaintLabelDto { InComplaint = inComplaint != null, OutComplaint = outComplaint != null }; return result; } public async Task Import(List dtos) { dtos = dtos.Where(x => !string.IsNullOrWhiteSpace(x.Resid)).ToList(); dtos.ForEach(x => x.Resid = x.Resid.Replace("(", "(")); dtos.ForEach(x => x.Resid = x.Resid.Contains("(") ? x.Resid.Substring(0, x.Resid.IndexOf("(")) : x.Resid); var complaints = new List(); var follows = new List(); var orderStatus = new List { "220", "80", "90" }; var resIds = dtos.Select(x => x.Resid).ToList(); var orders = await _zxdRepository.GetRepository().Query().Where(x => resIds.Contains(x.RESID) && orderStatus.Contains(x.ORDERSTATUS)).OrderByDescending(x => x.CTIME).ToListAsync(); var deptList = await _cacheDomain.GetDeptments(); foreach (var dto in dtos) { var order = orders.FirstOrDefault(x => x.RESID == dto.Resid && x.ORDERSTATUS == "90"); if (order == null) order = orders.FirstOrDefault(x => x.RESID == dto.Resid && x.ORDERSTATUS == "220"); if (order == null) order = orders.FirstOrDefault(x => x.RESID == dto.Resid && x.ORDERSTATUS == "80"); //if (order == null) // throw new Exception($"客户{dto.Resid}订单不存在"); var dept = deptList.FirstOrDefault(x => x.Title == dto.DeptName); //if (dept == null) // throw new Exception($"部门{dto.DeptName}不存在"); if (!System.Enum.TryParse(dto.OutComplaintChannel, out OutComplaintChannel complaintChannel)) { if (dto.OutComplaintChannel.Contains("110")) complaintChannel = OutComplaintChannel.公安110; if (dto.OutComplaintChannel.Contains("123")) complaintChannel = OutComplaintChannel.热线12386; if (dto.OutComplaintChannel.Contains("工商局")) complaintChannel = OutComplaintChannel.广东局; //else //throw new Exception($"不存在:{dto.ComplaintChannel}内诉来源"); } if (!System.Enum.TryParse(dto.Reasons, out OutComplaintReason outComplaintReason)) { if (dto.Reasons.Contains("拖延")) outComplaintReason = OutComplaintReason.拖延退款; if (dto.Reasons.Contains("好股来外部引流")) outComplaintReason = OutComplaintReason.好股来外部引流; if (dto.Reasons.Contains("拒绝退款")) outComplaintReason = OutComplaintReason.拖延退款; //else //throw new Exception($"不存在:{dto.Reasons}投诉原因"); } if (!System.Enum.TryParse(dto.ComplaintStatus, out OutComplaintStatus complaintStatus)) { //throw new Exception($"不存在:{dto.ComplaintStatus}内诉状态"); } var complaintId = CreateOutComplaintid(); var data = new OutComplaint { Deptid = dept?.Id, DueStatus = await _cacheDomain.AddWorkDays(dto.OutComplaintDate.Value, 7) > DateTime.Now ? OutComplaintDueStatus.未到期 : OutComplaintDueStatus.已到期, ComplaintDueStatus = await _cacheDomain.AddWorkDays(dto.OutComplaintDate.Value, 20) > DateTime.Now ? OutComplaintDueStatus.未到期 : OutComplaintDueStatus.已到期, OutComplaintDate = dto.OutComplaintDate.Value, Cname = dto.Cname, ComplaintId = complaintId, BusinessDeadline = await _cacheDomain.AddWorkDays(dto.OutComplaintDate.Value, 7), ComplaintDeadline = await _cacheDomain.AddWorkDays(dto.OutComplaintDate.Value, 20), BusinessStatus = complaintStatus == OutComplaintStatus.已办结 ? OutComplaintBusinessStatus.已办结 : OutComplaintBusinessStatus.待处理, Content = dto.Content, CreateTime = dto.OutComplaintDate.Value, Creator = "李冰华", Follow = dto.Follow, OutComplaintChannel = (int)complaintChannel == 0 ? null : complaintChannel, Reason = (int)outComplaintReason == 0 ? null : (int)outComplaintReason, OutComplaintStatus = complaintStatus == 0 ? null : complaintStatus, Remark = dto.Remark, Resid = dto.Resid, Eid = order?.eid, CreateEid = 6022, VerifyEid = !string.IsNullOrWhiteSpace(dto.Remark) ? 6022 : null, Verifyier = !string.IsNullOrWhiteSpace(dto.Remark) ? "李冰华" : null, VerifyTime = !string.IsNullOrWhiteSpace(dto.Remark) ? DateTime.Now : null, RiskSituation = "" }; var outComplaintFollowUp = new OutComplaintFollowUp { ComplaintId = complaintId, Content = dto.Content, CreateTime = dto.OutComplaintDate.Value, Creator = "李冰华", Follow = dto.Follow, CreateEid = 6022 }; complaints.Add(data); follows.Add(outComplaintFollowUp); //创建客户标签 if(dept!= null) await _cacheDomain.ComplaintLabel(dto.Resid, dto.Cname, dept.CompanyCode, "外诉"); } await _zxdRepository.GetRepository().BatchInsertAsync(complaints); await _zxdRepository.GetRepository().BatchInsertAsync(follows); return true; } public async Task UpdateEid() { //var inComplaints = await _zxdRepository.GetRepository().Query().Where(x => x.Eid == null).ToListAsync(); //var outComplaints = await _zxdRepository.GetRepository().Query().Where(x => x.Eid == null).ToListAsync(); var inComplaints = await _zxdRepository.GetRepository().Query().Where(x => x.Deptid == null).ToListAsync(); var outComplaints = await _zxdRepository.GetRepository().Query().Where(x => x.Deptid == null).ToListAsync(); var updateInComplaints = new List(); var updateOutComplaints = new List(); var orderStatus = new List { "220", "80", "90", "200", "205" }; foreach (var item in inComplaints) { //var order = await _zxdRepository.GetRepository().Query().OrderByDescending(x=>x.CTIME).FirstOrDefaultAsync(x => x.RESID == item.Resid && x.eid.HasValue); var order = await _zxdRepository.GetRepository().Query().OrderByDescending(x=>x.CTIME).FirstOrDefaultAsync(x => x.RESID == item.Resid && x.deptid.HasValue); if (order == null) continue; //item.Eid = order.eid; item.Deptid = order.deptid; updateInComplaints.Add(item); } foreach (var item in outComplaints) { //var order = await _zxdRepository.GetRepository().Query().OrderByDescending(x => x.CTIME).FirstOrDefaultAsync(x => x.RESID == item.Resid && x.eid.HasValue); var order = await _zxdRepository.GetRepository().Query().OrderByDescending(x => x.CTIME).FirstOrDefaultAsync(x => x.RESID == item.Resid && x.deptid.HasValue); if (order == null) continue; //item.Eid = order.eid; item.Deptid = order.deptid; updateOutComplaints.Add(item); } if (updateInComplaints.Any()) await _zxdRepository.GetRepository().BatchUpdateAsync(updateInComplaints, x => new { x.Deptid}); if (updateOutComplaints.Any()) await _zxdRepository.GetRepository().BatchUpdateAsync(updateOutComplaints, x => new { x.Deptid }); return true; } } }