using DG.Core; using Hg.Core.Domain.Dto.InComplaint; using Hg.Core.Domain.Dto.OrderRefund; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Hg.Core.Domain { internal class InComplaintDomain : IInComplaintDomain { 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 InComplaintDomain(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 GetInComplaint(int id) { var query = from a in _zxdRepository.GetRepository().Query() select new InComplaintDto { Id = a.Id, Deptid = a.Deptid, DueStatus = a.DueStatus, BusinessDeadline = a.BusinessDeadline, InComplaintDate = a.InComplaintDate, BusinessStatus = a.BusinessStatus, Cname = a.Cname, ComplaintId = a.ComplaintId, Content = a.Content, CreateTime = a.CreateTime, Creator = a.Creator, Eid = a.Eid, Follow = a.Follow, InComplaintChannel = a.InComplaintChannel, InComplaintStatus = a.InComplaintStatus, 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> GetInComplaintPage(SearchInComplaintDto 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.ComplaintId equals b.ComplaintId into ab //from b in ab.DefaultIfEmpty() select new InComplaintDto { Id = a.Id, Deptid = a.Deptid, DueStatus = a.DueStatus, BusinessDeadline = a.BusinessDeadline, InComplaintDate = a.InComplaintDate, BusinessStatus = a.BusinessStatus, Cname = a.Cname, ComplaintId = a.ComplaintId, Content = a.Content, CreateTime = a.CreateTime, Creator = a.Creator, Eid = a.Eid, Follow = a.Follow, InComplaintChannel = a.InComplaintChannel, InComplaintStatus = a.InComplaintStatus, Reason = a.Reason, Remark = a.Remark, Resid = a.Resid, 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, DueCount = a.DueCount, IsAdjustDeadline = a.IsAdjustDeadline, //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, IsOutComplaint = _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 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 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.InComplaintChannel != null, x => x.Where(x => ((int)dto.InComplaintChannel & x.InComplaintChannel) > 0)) .If(dto.InComplaintStatus != null, x => x.Where(x => x.InComplaintStatus == dto.InComplaintStatus)) //.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 == InComplaintDateType.客户内诉日期 && dto.DateFrom != null, x => x.Where(x => x.InComplaintDate >= dto.DateFrom.Value)) .If(dto.DateType == InComplaintDateType.业务回复日期 && dto.DateFrom != null, x => x.Where(x => x.RestoreTime >= dto.DateFrom.Value)) .If(dto.DateType == InComplaintDateType.合规回复日期 && dto.DateFrom != null, x => x.Where(x => x.HGRestoreTime >= dto.DateFrom.Value)) .If(dto.DateType == InComplaintDateType.创建日期 && dto.DateFrom != null, x => x.Where(x => x.CreateTime >= dto.DateFrom.Value)) .If(dto.DateType == InComplaintDateType.更新日期 && dto.DateFrom != null, x => x.Where(x => x.UpdateTime >= dto.DateFrom.Value)) .If(dto.DateType == InComplaintDateType.核查日期 && dto.DateFrom != null, x => x.Where(x => x.VerifyTime >= dto.DateFrom.Value)) .If(dto.DateType == InComplaintDateType.客户内诉日期 && dto.DateTo != null, x => x.Where(x => x.InComplaintDate <= dto.DateTo.Value.AddDays(1).AddSeconds(-1))) .If(dto.DateType == InComplaintDateType.业务回复日期 && dto.DateTo != null, x => x.Where(x => x.RestoreTime <= dto.DateTo.Value.AddDays(1).AddSeconds(-1))) .If(dto.DateType == InComplaintDateType.合规回复日期 && dto.DateTo != null, x => x.Where(x => x.HGRestoreTime <= dto.DateTo.Value.AddDays(1).AddSeconds(-1))) .If(dto.DateType == InComplaintDateType.创建日期 && dto.DateTo != null, x => x.Where(x => x.CreateTime <= dto.DateTo.Value.AddDays(1).AddSeconds(-1))) .If(dto.DateType == InComplaintDateType.更新日期 && dto.DateTo != null, x => x.Where(x => x.UpdateTime <= dto.DateTo.Value.AddDays(1).AddSeconds(-1))) .If(dto.DateType == InComplaintDateType.核查日期 && 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.InComplaintDate.Value.Subtract(minOTime.Value).Days : null; item.Deptname = company?.Title; item.BusinessDeadlineSpan = $"{await _cacheDomain.GetWorkHours(now, item.BusinessDeadline)}小时"; 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; }; } return new PageResult(dto.PageIndex, dto.PageSize, total, data); } public async Task CreateInComplaint(CreateInComplaintDto dto) { var date = DateTime.Now; var complaintId = CreateInComplaintid(); 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 InComplaint { Deptid = dto.Deptid, DueStatus = InComplaintDueStatus.未到期, InComplaintDate = dto.InComplaintDate, Cname = dto.Cname, ComplaintId = complaintId, BusinessDeadline = await _cacheDomain.AddWorkDays(date, 3), BusinessStatus = InComplaintBusinessStatus.待处理, Content = dto.Content, CreateTime = DateTime.Now, Creator = dto.Operator, Follow = dto.Follow, InComplaintChannel = dto.InComplaintChannel, Reason = dto.Reason, InComplaintStatus = InComplaintStatus.跟进中, Remark = dto.Remark, //Resid = dto.Resid, Resid = customer.RESID, Eid = order?.eid, CreateEid = dto.OperatorEid, DueCount = 4, IsAdjustDeadline = false, 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 InComplaintFollowUp = new InComplaintFollowUp { 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 InComplaintOrder // { // Orderid = x.ORDERID, // ComplaintId = complaintId, // Price = x.NEEDPAY // }) // .ToListAsync(); var transaction = await _zxdRepository.BeginTransactionAsync(); try { await _zxdRepository.GetRepository().InsertAsync(data); await _zxdRepository.GetRepository().InsertAsync(InComplaintFollowUp); //发送消息 var sendMessage = new { Message = $"{dto.Operator}({dto.Resid})提交了内诉,投诉原因是:{dto.ReasonList},请在72小时内及时处理好。", Eid = order?.eid, Deptid = dto.Deptid, Method = "ComplaintMessage", IsDepartment = true, }; //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 UpdateInComplaint(UpdateInComplaintDto 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.Content, x.Follow, x.Remark, x.UpdateTime, x.Updater, x.UpdateEid,x.RiskSituation,x.VerifyTime,x.Verifyier,x.VerifyEid }); return true; } private static string CreateInComplaintid() { //return $"NS{DateTimeOffset.Now.ToUnixTimeMilliseconds()}"; return $"NS{DateTime.Now.ToString("yyyyMMddHHmmssffff")}"; } /// /// 添加跟进记录 /// /// /// public async Task CreateInComlpaintFollowUp(CreateInComplaintFollowUpDto dto) { var data = await _zxdRepository.GetRepository().Query().FirstOrDefaultAsync(x => x.Id == dto.Id); if (data == null) throw new ApiException("内诉数据不存在或已删除!"); var InComplaintFollowUp = new InComplaintFollowUp { ComplaintId = data.ComplaintId, Content = dto.Content, CreateTime = DateTime.Now, Creator = dto.Operator, Follow = dto.Follow }; 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(InComplaintFollowUp); await transaction.CommitAsync(); return true; } catch (Exception ex) { await transaction.RollbackAsync(); await transaction.DisposeAsync(); throw; } } public async Task UpdateInComlpaintFollowUp(CreateInComplaintFollowUpDto 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 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 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.Select(x => new ComplaintCustomerDeptInfo // { // Channel = x.CHANNEL, // CompanyCode = x.companycode // }).ToList() // }) // .FirstOrDefaultAsync(); //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; // }); //} var customerInfo = new ComplaintCustomerInfoDto(); var orderStatus = new List { "200", "220", "205", "80", "90" }; var customer = await _zxdRepository.GetRepository().Query().FirstOrDefaultAsync(x => x.UMID == resid); if (customer == null) return customerInfo; var order = await _zxdRepository.GetRepository().Query().OrderByDescending(x => x.CTIME) .FirstOrDefaultAsync(x => x.RESID == customer.RESID && orderStatus.Contains(x.ORDERSTATUS) && !string.IsNullOrWhiteSpace(x.CNAME)); if(order == null) return customerInfo; customerInfo.Resid = resid; customerInfo.Eid = order.eid; customerInfo.Cname = order.CNAME; return customerInfo; } public async Task GetInComplaintFollowUp(int? id) { var query = from a in _zxdRepository.GetRepository().Query() where a.Id == id select new InComplaintFollowUpDto { Id = a.Id, Cname = a.Cname, InComplaintStatus = a.InComplaintStatus, 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 InComplaintFollowUpDetailDto { 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 CreateInComplaintRestore(CreateInComplaintRestoreDto 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 InComplaintRestore { 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 UpdateInComplaintStatus(UpdateInComplaintStatusDto 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.InComplaintStatus = dto.InComplaintStatus; await _zxdRepository.GetRepository().UpdateAsync(data, x => new { x.UpdateEid, x.Updater, x.InComplaintStatus, x.UpdateTime, x.BusinessStatus }); return true; } public async Task SyncInComplaintStatus() { var now = DateTime.Now; var data = await _zxdRepository.GetRepository().Query() .Where(x => x.DueStatus == InComplaintDueStatus.未到期 //&& (x.BusinessDeadline <= now || x.ComplaintDeadline <= now)) && x.BusinessDeadline <= now) .ToListAsync(); foreach (var item in data) { item.DueStatus = InComplaintDueStatus.已到期; if (item.BusinessStatus == InComplaintBusinessStatus.待处理) { item.BusinessStatus = InComplaintBusinessStatus.到期未处理; } } if (data.Any()) { await _zxdRepository.GetRepository().BatchUpdateAsync(data, x => new { x.DueStatus, x.BusinessStatus }); } } public async Task GetRestore(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 InComplaintRestoreDto { Deptid = data.Deptid, Cname = data.Cname, ComplaintId = data.ComplaintId, Resid = data.Resid, InComplaintStatus = data.InComplaintStatus, Id = data.Id, InComplaintBusinessStatus = 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 ProLong(InComplaintProLongDto dto) { var data = await _zxdRepository.GetRepository().Query().FirstOrDefaultAsync(x => x.Id == dto.Id); if (data == null) throw new ApiException("内诉数据不存在或已删除!"); var restore = await _zxdRepository.GetRepository().Query().FirstOrDefaultAsync(x => x.ComplaintId == data.ComplaintId); if (restore != null) throw new ApiException("已经处理回复,无需再延长期限!"); if (data.DueCount - 1 < 0) throw new ApiException("延长期限次数已用完,无法再延长!"); if (data.IsAdjustDeadline) throw new ApiException("已经调整过期限,无法再延长!"); data.BusinessDeadline = await _cacheDomain.AddWorkDays(data.BusinessDeadline, 3); data.DueCount--; data.UpdateEid = (int)dto.Eid; data.Updater = dto.Name; data.UpdateTime = DateTime.Now; await _zxdRepository.GetRepository().UpdateAsync(data, x => new { x.UpdateEid, x.Updater, x.UpdateTime, x.BusinessDeadline, x.DueCount, }); return true; } public async Task Adjust(InComplaintAdjustDto dto) { var data = await _zxdRepository.GetRepository().Query().FirstOrDefaultAsync(x => x.Id == dto.Id); if (data == null) throw new ApiException("内诉数据不存在或已删除!"); if (data.IsAdjustDeadline) throw new ApiException("已经调整过期限,无法再延长!"); data.UpdateEid = dto.Eid; data.Updater = dto.UserName; data.UpdateTime = DateTime.Now; data.IsAdjustDeadline = true; data.BusinessDeadline = await _cacheDomain.AddWorkDays(DateTime.Now, dto.Adjust); await _zxdRepository.GetRepository().UpdateAsync(data, x => new { x.UpdateEid, x.Updater, x.UpdateTime, x.IsAdjustDeadline, x.BusinessDeadline }); return true; } 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); 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.ComplaintChannel, out InComplaintChannel complaintChannel)) { if (dto.ComplaintChannel.Contains("400申诉热线")) complaintChannel = InComplaintChannel.申诉热线400; //else //throw new Exception($"不存在:{dto.ComplaintChannel}内诉来源"); } if (!System.Enum.TryParse(dto.Reasons, out InComplaintReason inComplaintReason)) { if (dto.Reasons.Contains("5个工作日")) inComplaintReason = InComplaintReason._5个工作日无理由; //else //throw new Exception($"不存在:{dto.Reasons}投诉原因"); } if (!System.Enum.TryParse(dto.ComplaintStatus, out InComplaintStatus complaintStatus)) { //throw new Exception($"不存在:{dto.ComplaintStatus}内诉状态"); } var complaintId = CreateInComplaintid(); var data = new InComplaint { Deptid = dept?.Id, DueStatus = await _cacheDomain.AddWorkDays(dto.ComplaintDate.Value, 3) > DateTime.Now ? InComplaintDueStatus.已到期 : InComplaintDueStatus.未到期, InComplaintDate = dto.ComplaintDate, Cname = dto.Cname, ComplaintId = complaintId, BusinessDeadline = await _cacheDomain.AddWorkDays(dto.ComplaintDate.Value, 3), BusinessStatus = InComplaintBusinessStatus.已办结, Content = dto.Content, CreateTime = dto.ComplaintDate.Value, Creator = "李冰华", Follow = "", InComplaintChannel = (int)complaintChannel == 0 ? null : (int)complaintChannel, Reason = (int)inComplaintReason == 0 ? null : (int)inComplaintReason, InComplaintStatus = complaintStatus == 0 ? null : complaintStatus, Remark = dto.Remark, Resid = dto.Resid, Eid = order?.eid, CreateEid = 6022, DueCount = 4, IsAdjustDeadline = false, VerifyEid = !string.IsNullOrWhiteSpace(dto.Remark) ? 6022 : null, Verifyier = !string.IsNullOrWhiteSpace(dto.Remark) ? "李冰华" : null, VerifyTime = !string.IsNullOrWhiteSpace(dto.Remark) ? dto.ComplaintDate : null, RiskSituation = "" }; var InComplaintFollowUp = new InComplaintFollowUp { ComplaintId = complaintId, Content = dto.Content, CreateTime = dto.ComplaintDate, Creator = "李冰华", Follow = "", CreateEid = 6022 }; complaints.Add(data); follows.Add(InComplaintFollowUp); //创建客户标签 if (dept != null) await _cacheDomain.ComplaintLabel(dto.Resid, dto.Cname, dept.CompanyCode, "内诉"); } await _zxdRepository.GetRepository().BatchInsertAsync(complaints); await _zxdRepository.GetRepository().BatchInsertAsync(follows); return true; } } }