using Hg.Core.Domain.Config; using Hg.Core.Domain.Dto.Order; using Hg.Core.Entity; using OfficeOpenXml.Style; using Oracle.ManagedDataAccess.Client; using StackExchange.Redis; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations.Schema; using System.Data; using System.Diagnostics; using System.Drawing; using System.Linq; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; using System.Web; namespace Hg.Core.Domain { public class OrderDomain : IOrderDomain { private readonly IBaseRepository _repository; private readonly IHttpClient _httpClient; private readonly IMapper _mapper; private readonly ICacheDomain _cacheDomain; private readonly IConfiguration _configuration; private readonly SystemConfig _systemConfig; private readonly IProductDomain _productDomain; private readonly IInneruserDomain _inneruserDomain; private readonly IEmployeeDomain _employeeDomain; private readonly IRedisManager _redisManager; public OrderDomain(IConfiguration configuration, IBaseRepository repository, IHttpClient httpClient, IMapper mapper, ICacheDomain cacheDomain, IProductDomain productDomain, IInneruserDomain inneruserDomain, IEmployeeDomain employeeDomain, IRedisManager redisManager ) { _systemConfig = configuration.GetSection("SystemConfig").Get(); _configuration = configuration; _repository = repository; _httpClient = httpClient; _mapper = mapper; _cacheDomain = cacheDomain; _productDomain = productDomain; _inneruserDomain = inneruserDomain; _employeeDomain = employeeDomain; _redisManager = redisManager; } public async Task> GetOrderListByResid(string resid) { List res = new List(); if (string.IsNullOrWhiteSpace(resid)) { return res; } var companyList = await _cacheDomain.GetCompanyVirtualList(); var resIdList = resid.Split(",").ToList(); var list = await _repository.GetRepository().Query().Where(x => resIdList.Contains(x.RESID)).ToListAsync();//在坐席中对应的关系 foreach (var item in resIdList) { var rOList = list.Where(n => n.RESID == item).ToList(); var orderList = _mapper.Map(rOList); foreach (var order in orderList) { order.ChannelName = ConvertChannelName(companyList, order.CHANNEL); } res.AddRange(orderList); } return res; } /// /// 转换事业部 /// /// /// /// private string ConvertChannelName(List channelList, int? channel) { foreach (var item in channelList) { var channelStr = item.Channel.Split('|').ToList(); foreach (var str in channelStr) { var a = str.Split(','); var min = Convert.ToInt32(a[0]); var max = Convert.ToInt32(a[1]); if (channel >= min && channel <= max) { return item.CompanyName; } } } return ""; } public async Task> GetHHUserByResId(string resids) { List res = new List(); if (string.IsNullOrWhiteSpace(resids)) { return res; } Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); var resIdList = resids.Split(",").ToList(); var customerQuery = _repository.GetRepository().Query(); var allCustomer = customerQuery.Where(n => resIdList.Contains(n.RESID)).ToList(); //var custFilter = allCustomer.Select(p => n.CUSTOMERID). var otherCust = customerQuery.Where(n => allCustomer.Select(p => p.CUSTOMERID).Contains(n.CUSTOMERID)).ToList(); allCustomer.AddRange(otherCust); var extQuery = _repository.GetRepository().Query().Where(n => allCustomer.Select(p => p.RESID).Contains(n.resid)).ToList(); List extlist = new List(); stopwatch.Stop(); Log.Information($"花费时间【{stopwatch.ElapsedMilliseconds}】ms"); stopwatch.Restart(); foreach (var resId in resIdList) { var resfilter = allCustomer.Where(n => n.RESID == resId || n.CUSTOMERID == resId).ToList(); var extUser = extQuery.Where(n => resfilter.Select(n => n.RESID).Contains(n.resid) || resfilter.Select(p => p.CUSTOMERID).Contains(n.resid)).ToList(); foreach (var ax in extUser) { var ext = _mapper.Map(ax); ext.ResId = resId; extlist.Add(ext); } } stopwatch.Stop(); Log.Information($"花费时间【{stopwatch.ElapsedMilliseconds}】ms"); stopwatch.Restart(); // var wxuserlist = await _repository.GetRepository().Query().Where(x => resIdList.Contains(x.resid)).ToListAsync();//在坐席中对应的关系 foreach (var item in resIdList) { var ext = extlist.Where(m => m.ResId == item).ToList(); var orderList = ext; res.AddRange(orderList); } stopwatch.Stop(); Log.Information($"花费时间【{stopwatch.ElapsedMilliseconds}】ms"); return res; } /// /// 合同审核 /// /// public async Task ContractAudit(ContractAuditDto dto) { var order = await _repository.GetRepository().Query() .FirstOrDefaultAsync(x => x.ORDERID == dto.OrderId); var systemConfig = _configuration.GetSection("SystemConfig").Get(); var accessKey = systemConfig.GetAccessKey("UPWEBSITE"); if (order == null) { throw new ApiException("订单不存在或已删除!"); } order.ContractStatus = dto.Status; order.ContractRemark = dto.Remark; var data = new { orderId = order.SZZYORDERID, status = dto.Status == 1 ? 0 : -1, contractStatus = dto.Status }; var content = SecurityHelper.EncyptData(data.ToJson(), accessKey); var sign = SecurityHelper.SignData(content, accessKey); var updateContractStatusUrl = systemConfig.PostContractStatus(HttpUtility.UrlEncode(content), HttpUtility.UrlEncode(sign), "UPWEBSITE"); var res = await _httpClient.PostAsync(updateContractStatusUrl); if (res.Code == 0) { await _repository.GetRepository().UpdateAsync(order); } else { throw new ApiException(res.Message); } } /// /// 更新合同状态 /// /// /// /// /// public async Task UpdateContractStatus(string content, string sign, string clientId) { try { var accessKey = _systemConfig.GetAccessKey(clientId); if (sign != SecurityHelper.SignData(content, accessKey)) { throw new ApiException("签名不正确"); } var json = SecurityHelper.DecyptData(content, accessKey); var data = JsonSerializer.Deserialize(json); if (data == null || string.IsNullOrEmpty(data.SzzyOrderId)) { throw new ApiException("请输入orderid"); } if (!long.TryParse(data.SzzyOrderId, out long szzyOrderId)) { throw new ApiException("请输入正确的orderid"); } Console.WriteLine("更新这个订单的合同审核状态为未审核:" + szzyOrderId); var order = await _repository.GetRepository().Query() .FirstOrDefaultAsync(x => x.SZZYORDERID == szzyOrderId); if (order != null && (!order.ContractStatus.HasValue || order.ContractStatus == 0)) { order.ContractStatus = null; await _repository.GetRepository().UpdateAsync(order, x => new { x.ContractStatus }); } return true; } catch (Exception ex) { Log.Error(ex, "更改合同状态失败!"); throw; } } /// /// 更新实名信息 /// /// /// /// /// public async Task UpdateRealName(string content, string sign, string clientId) { try { var deptments = await _cacheDomain.GetDeptments(); var accessKey = _systemConfig.GetAccessKey(clientId); if (sign != SecurityHelper.SignData(content, accessKey)) { throw new ApiException("签名不正确"); } var json = SecurityHelper.DecyptData(content, accessKey); Log.Information($"更新的实名信息,{json}"); var data = JsonSerializer.Deserialize(json); if (data == null || string.IsNullOrEmpty(data.Resid)) { throw new ApiException("请输入resid"); } var customerid = await _repository.GetRepository().Query() .Where(x => x.RESID == data.Resid).Select(x => x.CUSTOMERID).FirstOrDefaultAsync(); var resids = await _repository.GetRepository().Query() .Where(x => x.CUSTOMERID == customerid).Select(x => x.RESID).ToListAsync(); var orders = await _repository.GetRepository().Query() .Where(x => resids.Contains(x.RESID) && (x.ORDERSTATUS == "200" || x.ORDERSTATUS == "180" || x.ORDERSTATUS == "190")).ToListAsync(); var userProtocols = await _repository.GetRepository().Query() .Where(x => resids.Contains(x.Resid) && x.Protocoltype == 6 && new int[] { 0, 1 }.Contains(x.Status)).ToListAsync(); var transaction = await _repository.BeginTransactionAsync(); try { if (orders.Count > 10) return false; if (orders != null && orders.Any()) { orders.ForEach(order => { order.CNAME = data.Cname; order.idcard = data.Idcard; }); await _repository.GetRepository().BatchUpdateAsync(orders, x => new { x.CNAME, x.idcard }); if (userProtocols != null && userProtocols.Any()) { userProtocols.ForEach(protocol => { protocol.Username = data.Cname; }); await _repository.GetRepository().BatchUpdateAsync(userProtocols, x => new { x.Username }); } var deptid = orders.Select(x => x.deptid).Distinct().First(); var appid = deptments.Where(x => deptid == x.Id).Select(x => x.Appid).First(); var request = new { Orderids = orders.Select(x => x.ORDERID).ToList(), RealName = data.Cname }; var result = await _httpClient.PostAsync(_systemConfig.UpdateOrderRealName(), request, appid); if (result.Code == 0) { await transaction.CommitAsync(); } else { throw new ApiException(result.Message); } } } catch (Exception ex) { Log.Error(ex, "更新的实名信息失败!"); await transaction.RollbackAsync(); await transaction.DisposeAsync(); throw; } return true; } catch (Exception ex) { Log.Error(ex, "更新的实名信息失败!"); throw; } } public async Task> GetPage(OrderSearchDto dto) { var products = await _productDomain.GetProductList(); var subproducts = await _productDomain.GetSubProductListByProductId(0, 0, null); var config = await _cacheDomain.GetValueParameter("AI_CallTaskConfig"); var recall = config.ReCallMins.Count > 0 ? true : false; //替换resid if (!string.IsNullOrEmpty(dto.UMID) && string.IsNullOrEmpty(dto.ResId)) { dto.ResId = await QueryResidByUMID(dto.UMID); } #region 过滤条件 if (!string.IsNullOrEmpty(dto.Mobile)) { dto.ResId = ResUtil.CreateResId(dto.Mobile); } var query = _repository.GetRepository().Query().Where(m => m.Contractstatus == 1) .If(dto.OrderId.HasValue, x => x.Where(m => m.ORDERID == dto.OrderId.Value)) .If(dto.OrderType.HasValue, x => x.Where(m => m.ORDERTYPE == dto.OrderType)) .If(dto.Stime.HasValue, x => x.Where(m => m.ARRIVALTIME >= dto.Stime.Value)) .If(dto.Etime.HasValue, x => x.Where(m => m.ARRIVALTIME < dto.Etime.Value.AddDays(1).AddMilliseconds(-1))) .If(!string.IsNullOrEmpty(dto.SubProduct), x => x.Where(m => m.SUBPRODUCTNAME.Contains(dto.SubProduct))) .If(!string.IsNullOrEmpty(dto.ResId), x => x.Where(m => m.RESID == dto.ResId)) .If(!string.IsNullOrWhiteSpace(dto.CompanyCode), x => x.Where(m => m.companycode == dto.CompanyCode)) .If(dto.SzzyOrderId.HasValue, x => x.Where(m => m.SZZYORDERID == dto.SzzyOrderId)) .If(dto.ProductId.HasValue && dto.ProductId > 0, x => x.Where(m => m.PRODUCTID == dto.ProductId)) .If(dto.SubProductId.HasValue, x => x.Where(m => m.SUBPRODUCTID == dto.SubProductId)) .If(!string.IsNullOrEmpty(dto.OutOrderNo), x => x.Where(m => m.outorderno == dto.OutOrderNo)) .If(!string.IsNullOrEmpty(dto.Cname), x => x.Where(m => m.CNAME == dto.Cname)) .If(dto.Needpay.HasValue, x => x.If(dto.NeedpayType == "1", x => x.Where(p => p.NEEDPAY > dto.Needpay)) .If(dto.NeedpayType == "2", x => x.Where(p => p.NEEDPAY < dto.Needpay)) .If(dto.NeedpayType != "1" && dto.NeedpayType != "2", x => x.Where(p => p.NEEDPAY == dto.Needpay))) .If(!string.IsNullOrEmpty(dto.Softusername), x => x.Where(p => p.SOFTUSERNAME == dto.Softusername)) .If(!string.IsNullOrEmpty(dto.WXShopOrderNo), x => x.Where(p => p.wXShopOrderNo == dto.WXShopOrderNo)) .If(dto.Xstime.HasValue, x => x.Where(m => m.CTIME >= dto.Xstime)) .If(dto.Xetime.HasValue, x => x.Where(m => m.CTIME < dto.Xetime.Value.AddDays(1).AddMilliseconds(-1))) .If(dto.Kstime.HasValue, x => x.Where(m => m.OTIME >= dto.Kstime)) .If(dto.Ketime.HasValue, x => x.Where(m => m.OTIME < dto.Ketime.Value.AddDays(1).AddMilliseconds(-1))) .If(dto.Hastime.HasValue && dto.Hastime.Value == 1, x => x.Where(m => m.OTIME == null)); if (dto.ProductId1.HasValue && dto.ProductId.HasValue && !dto.ProductId2.HasValue && !dto.SubProductId.HasValue) { var arr1 = products.Where(p => p.Parentid == dto.ProductId1.Value).Select(p => p.Productid).ToList(); var arr = subproducts.Where(p => arr1.Contains(p.MidProductId.Value)).Select(p => p.SUBPRODUCTID).ToList(); query = query.Where(m => arr.Contains(m.SUBPRODUCTID)); //where = where.And(m => arr.Contains(m.SUBPRODUCTID)); } if (dto.ProductId2.HasValue && dto.ProductId.HasValue && dto.ProductId1.HasValue && !dto.SubProductId.HasValue) { var arr = subproducts.Where(p => p.MidProductId == dto.ProductId2.Value).Select(p => p.SUBPRODUCTID).ToList(); query = query.Where(m => arr.Contains(m.SUBPRODUCTID)); //where = where.And(m => arr.Contains(m.SUBPRODUCTID)); } if (!string.IsNullOrWhiteSpace(dto.OrderStatus)) { if (dto.OrderStatus == "1") { string[] arr = { "180", "190", "195", "200", "220", "205", "90", "80" }; query = query.Where(m => arr.Contains(m.ORDERSTATUS)); //where = where.And(m => arr.Contains(m.ORDERSTATUS)); } else { if (dto.OrderStatus == "201") { dto.OrderStatus = "200"; dto.RiskctrlStatus = 2; } var arr = dto.OrderStatus.Split(','); if (arr.Length > 1) { query = query.Where(m => arr.Contains(m.ORDERSTATUS)); } else { query = query.Where(m => m.ORDERSTATUS == dto.OrderStatus); } } } if (!string.IsNullOrEmpty(dto.Channel)) { if (dto.Channel.Split(',').Length != 1) { var predicates = new List>>(); foreach (var channel in dto.Channel.Split(',')) { var arr0 = channel.Split('|'); foreach (var item in arr0) { var a = item.Split(';'); var min = Convert.ToInt32(a[0]); var max = Convert.ToInt32(a[1]); predicates.Add(m => m.CHANNEL >= min && m.CHANNEL <= max); } } query = query.WhereOR(predicates.ToArray()); } else { foreach (var channel in dto.Channel.Split(',')) { var arr0 = channel.Split('|'); if (arr0.Length > 1) { var predicates = new List>>(); foreach (var item in arr0) { var a = item.Split(';'); var min = Convert.ToInt32(a[0]); var max = Convert.ToInt32(a[1]); predicates.Add(m => m.CHANNEL >= min && m.CHANNEL <= max); } query = query.WhereOR(predicates.ToArray()); } else { var arr = channel.Split(';'); var min = Convert.ToInt32(arr[0]); var max = Convert.ToInt32(arr[1]); query = query.Where(m => m.CHANNEL >= min && m.CHANNEL <= max); } } } } if (dto.RiskctrlStatus.HasValue) { if (dto.RiskctrlStatus.Value == -2) { query = query.Where(m => m.Contractstatus == 0); } else { if (dto.RiskctrlStatus.Value == 2) query = query.Where(m => m.RISKCTRLSTATUS == dto.RiskctrlStatus.Value && m.Contractstatus == 1); else if (dto.RiskctrlStatus.Value == -1) query = query.Where(m => m.RISKCTRLSTATUS == dto.RiskctrlStatus.Value && m.Contractstatus == 1); else query = query.Where(m => m.RISKCTRLSTATUS != 2 && m.RISKCTRLSTATUS != -1 && m.Contractstatus == 1); } } var queryList = from q in query join c in _repository.GetRepository().Query().Select(x => x.SzzyOrderId) on q.SZZYORDERID equals c into tmpQC from qc in tmpQC.DefaultIfEmpty() join d in _repository.GetRepository().Query() on q.ORDERID equals d.ORDERID into tmpd from qd in tmpd.DefaultIfEmpty() //join u in _repository.GetRepository().Query() on q.RESID equals u.RESID into ruc //from uc in ruc.DefaultIfEmpty() select new OrderDto() { ORDERID = q.ORDERID, PRODUCTNAME = q.PRODUCTNAME, SUBPRODUCTNAME = q.SUBPRODUCTNAME, ORDERTYPE = q.ORDERTYPE, UPGRADEORDERIDS = q.UPGRADEORDERIDS, NEEDPAY = q.NEEDPAY, SZZYORDERID = q.SZZYORDERID, ORDERSTATUS = q.ORDERSTATUS, CTIME = q.CTIME, CONTRACTCODE = q.CONTRACTCODE, contractctime = q.contractctime, OTIME = q.OTIME, ENDTIME = q.ENDTIME, RESID = q.RESID, //UMID= uc.UMID, FINALPAY = q.FINALPAY, BALANCEPAY = q.BALANCEPAY, ORIGINPAY = q.ORIGINPAY, ORDERSTATUSNAME = q.ORDERSTATUSNAME, UPDATEORDERTIME = q.UPDATEORDERTIME, ISOPEN = q.ISOPEN, ARRIVALPAY = q.ARRIVALPAY, ARRIVALTIME = q.ARRIVALTIME, CNAME = q.CNAME, OPENDAYS = q.OPENDAYS, SOFTUSERNAME = q.SOFTUSERNAME, CHANNEL = q.CHANNEL, RISKCTRLSTATUS = q.RISKCTRLSTATUS, companycode = q.companycode, contractstatus = q.Contractstatus, hashgrecord = q.hashgrecord, outorderno = q.outorderno, giftdays = q.giftdays, giftdays2 = q.giftdays2, external_userid = q.external_userid, wework_remoteid = q.wework_remoteid, CUSTOMERUSERNAME = q.CUSTOMERUSERNAME, INNERUSERID = q.INNERUSERID, SUBPRODUCTID = q.SUBPRODUCTID, SOURCE = q.SOURCE, rejectremark = q.rejectremark, CpConfirmOrderId = qc, fujian = q.fujian, ret = q.RET, estimateotime = q.estimateotime, productcode = q.PRODUCTCODE, ai_hgrecord_status = q.ai_hgrecord_status, ai_hgrecord_statusname = q.ai_hgrecord_statusname, hasaiaudio = q.hasaiaudio, ai_hgrecord_stime = q.ai_hgrecord_stime, ai_hgrecord_etime = q.ai_hgrecord_etime, eid = q.eid, contract_status = q.ContractStatus, MarkStatus = !(q.external_userid == null && q.wework_remoteid == null && q.CUSTOMERUSERNAME == null && q.fujian == null && !_repository.GetRepository().Query().Any(x => x.resid == q.RESID)), checkStatus = qd.CHECKSTATUS, CheckRank = qd.CHECKRANK, CheckRankTxt = qd.CHECKRANKTXT, }; if (dto.checkStatus.HasValue) { if (dto.checkStatus != HGCheckStatus.未质检) { queryList = from q in query join c in _repository.GetRepository().Query().Select(x => x.SzzyOrderId) on q.SZZYORDERID equals c into tmpQC from qc in tmpQC.DefaultIfEmpty() join d in _repository.GetRepository().Query() on q.ORDERID equals d.ORDERID select new OrderDto() { ORDERID = q.ORDERID, PRODUCTNAME = q.PRODUCTNAME, SUBPRODUCTNAME = q.SUBPRODUCTNAME, ORDERTYPE = q.ORDERTYPE, UPGRADEORDERIDS = q.UPGRADEORDERIDS, NEEDPAY = q.NEEDPAY, contractctime = q.contractctime, SZZYORDERID = q.SZZYORDERID, ORDERSTATUS = q.ORDERSTATUS, CTIME = q.CTIME, CONTRACTCODE = q.CONTRACTCODE, OTIME = q.OTIME, ENDTIME = q.ENDTIME, RESID = q.RESID, FINALPAY = q.FINALPAY, BALANCEPAY = q.BALANCEPAY, ORIGINPAY = q.ORIGINPAY, ORDERSTATUSNAME = q.ORDERSTATUSNAME, UPDATEORDERTIME = q.UPDATEORDERTIME, ISOPEN = q.ISOPEN, ARRIVALPAY = q.ARRIVALPAY, ARRIVALTIME = q.ARRIVALTIME, CNAME = q.CNAME, OPENDAYS = q.OPENDAYS, SOFTUSERNAME = q.SOFTUSERNAME, CHANNEL = q.CHANNEL, RISKCTRLSTATUS = q.RISKCTRLSTATUS, companycode = q.companycode, contractstatus = q.Contractstatus, hashgrecord = q.hashgrecord, outorderno = q.outorderno, giftdays = q.giftdays, giftdays2 = q.giftdays2, external_userid = q.external_userid, wework_remoteid = q.wework_remoteid, CUSTOMERUSERNAME = q.CUSTOMERUSERNAME, INNERUSERID = q.INNERUSERID, SUBPRODUCTID = q.SUBPRODUCTID, SOURCE = q.SOURCE, rejectremark = q.rejectremark, CpConfirmOrderId = qc, fujian = q.fujian, ret = q.RET, estimateotime = q.estimateotime, productcode = q.PRODUCTCODE, ai_hgrecord_status = q.ai_hgrecord_status, ai_hgrecord_statusname = q.ai_hgrecord_statusname, hasaiaudio = q.hasaiaudio, ai_hgrecord_stime = q.ai_hgrecord_stime, ai_hgrecord_etime = q.ai_hgrecord_etime, eid = q.eid, contract_status = q.ContractStatus, MarkStatus = !(q.external_userid == null && q.wework_remoteid == null && q.CUSTOMERUSERNAME == null && q.fujian == null && !_repository.GetRepository().Query().Any(x => x.resid == q.RESID)), checkStatus = d.CHECKSTATUS, CheckRank = d.CHECKRANK, CheckRankTxt = d.CHECKRANKTXT }; queryList = queryList.Where(n => n.checkStatus == dto.checkStatus); if (dto.checkrank.HasValue) { queryList = queryList.Where(n => n.CheckRank == dto.checkrank); } } else { queryList = queryList.Where(n => n.checkStatus != HGCheckStatus.违规 && n.checkStatus != HGCheckStatus.合规); } } if (dto.MarkStatus.HasValue) { if (dto.MarkStatus.Value) { queryList = queryList.Where(q => q.MarkStatus.Value); } else { queryList = queryList.Where(q => !q.MarkStatus.Value); } } List lev2Status = new List { (int)EnumAiCallState.AI外呼失败未答完, (int)EnumAiCallState.Ai外呼取消, (int)EnumAiCallState.AI重拨失败, }; List waitStatus = new List { (int)EnumAiCallState.等待AI外呼, (int)EnumAiCallState.等待AI重拨, (int)EnumAiCallState.已提交AI外呼, }; //如果有设置重拨 则 归类到 待ai外呼 否则归类到 需人工介入 if (recall && config.ReCallStatus.Count > 0) { waitStatus.AddRange(config.ReCallStatus); } else { lev2Status.Add((int)EnumAiCallState.AI外呼失败挂断); lev2Status.Add((int)EnumAiCallState.AI外呼未接通); } if (!string.IsNullOrEmpty(dto.AiCallStatusList)) { Expression> expression = x => false; foreach (var item in dto.AiCallStatusList.Split(',').Select(x => int.Parse(x))) { switch (item) { case -1: case 9: case 5: expression = expression.Or(n => n.ai_hgrecord_status == item && n.CpConfirmOrderId == null); break; case 0: expression = expression.Or(n => n.ai_hgrecord_status == item && n.CpConfirmOrderId == null); break; case 3: expression = expression.Or(n => n.ai_hgrecord_status == item); break; case 2: //var time = DateTime.Now.AddDays(-5); expression = expression.Or(n => n.ai_hgrecord_status != null && lev2Status.Contains(n.ai_hgrecord_status.Value) && !new string[] { "90", "60" }.Contains(n.ORDERSTATUS) ); break; case 1: expression = expression.Or(n => n.ai_hgrecord_status != null && waitStatus.Contains(n.ai_hgrecord_status.Value)); break; case 4: expression = expression.Or(n => n.CpConfirmOrderId != null); break; } } queryList = queryList.Where(expression); } if (dto.Aistime.HasValue || dto.Aietime.HasValue) { var aiQuery = _repository.GetRepository().Query(); if (dto.Aistime.HasValue) { aiQuery = aiQuery.Where(n => n.Ctime >= dto.Aistime); } if (dto.Aietime.HasValue) { dto.Aietime = dto.Aietime.Value.AddDays(1); aiQuery = aiQuery.Where(n => n.Ctime <= dto.Aietime); } var orderList = from n in aiQuery join b in _repository.GetRepository().Query() on n.Id equals b.Taskid select b.Orderid.Value; var orderids = orderList.ToList(); queryList = queryList.Where(n => orderids.Contains(n.ORDERID)); } #endregion 过滤条件 queryList = queryList.OrderByDescending(m => m.ORDERID); var total = await queryList.CountAsync(); var data = await queryList .Skip((dto.PageIndex - 1) * dto.PageSize) .Take(dto.PageSize) .ToListAsync(); var orderIds = data.Select(x => x.ORDERID).ToList(); if (orderIds != null && orderIds.Any()) { //查询客户录屏数据 var userNames = data.Select(x => x.SOFTUSERNAME).Distinct().ToList(); var screenRecords = await _repository.GetRepository().Query().Where(x => userNames.Contains(x.MasterId) || userNames.Contains(x.SlaveId)).ToListAsync(); var orderAudits = await _repository.GetRepository().Query().Where(x => orderIds.Contains(x.Orderid)).ToListAsync(); foreach (var item in data) { var orderAuditList = orderAudits.Where(x => x.Orderid == item.ORDERID).ToList(); if (orderAuditList != null && orderAuditList.Any()) { var orderAudit = orderAuditList.OrderByDescending(x => x.CreateTime).FirstOrDefault(); item.auditor = orderAudit?.Auditor; item.auditTime = orderAudit?.CreateTime; } var screenRecord = screenRecords.Where(x => x.MasterId == item.SOFTUSERNAME || x.SlaveId == item.SOFTUSERNAME); item.ScreenRecordCount = screenRecord.Count(); } } var companyList = await _cacheDomain.GetCompanyVirtualList(); var eids = string.Join(",", data.Where(x => x.eid != null).Select(x => x.eid).ToList()); var innerusers = await _inneruserDomain.GetInnerusers(eids); var resids = data.Select(x => x.RESID).ToList(); var myUMID = _repository.GetRepository().Query().Where(m => resids.Contains(m.RESID)).ToList(); var usernames = data.Select(x => x.SOFTUSERNAME).ToList(); var canopenorder = await _repository.GetRepository().Query().Where(x => usernames.Contains(x.Username)) .ToListAsync(); foreach (var item in data) { #region 获取UMID item.UMID = myUMID.FirstOrDefault(m => m.RESID == item.RESID)?.UMID; #endregion 获取UMID item.checkStatus = item.checkStatus == null ? HGCheckStatus.未质检 : item.checkStatus; item.Canopenorder = canopenorder.FirstOrDefault(x => x.Username == item.SOFTUSERNAME)?.Status == 1; if (innerusers != null && innerusers.Any()) { var inneruser = innerusers.FirstOrDefault(x => x.EId == item.eid); if (inneruser != null) { item.innerUserName = inneruser.Name; } } if (string.IsNullOrWhiteSpace(item.ai_hgrecord_statusname) && item.ai_hgrecord_status == 0) { item.ai_hgrecord_statusname = EnumAiCallState.尚未进行AI外呼.ToString(); } item.CHANNELNAME = ConvertChannelName(companyList, item.CHANNEL); if (item.ai_hgrecord_status.HasValue && item.ai_hgrecord_status.Value == (int)EnumAiCallState.AI外呼成功) { item.ai_hgrecord_statusname = EnumAiCallState.AI外呼成功.ToString(); } else if (item.CpConfirmOrderId != null) { item.ai_hgrecord_statusname = EnumAiCallState.电子回访成功.ToString(); } else if (lev2Status.Contains(item.ai_hgrecord_status.Value)) { item.ai_hgrecord_statusname = "AI外呼需人工介入"; } else if (waitStatus.Contains(item.ai_hgrecord_status.Value)) { //等待ai外呼 再拆分 if (item.ai_hgrecord_status.Value == (int)EnumAiCallState.等待AI外呼) { item.ai_hgrecord_statusname = "等待AI外呼(首次拨打)"; } else if (item.ai_hgrecord_status.Value == (int)EnumAiCallState.已提交AI外呼) { item.ai_hgrecord_statusname = "等待AI外呼(已提交任务)"; } else { item.ai_hgrecord_statusname = "等待AI外呼(重复拨打)"; } item.hasBtn = 1; } var sp = subproducts.FirstOrDefault(p => p.SUBPRODUCTID == item.SUBPRODUCTID); if (sp != null) { var pp = products.FirstOrDefault(p => p.Productid == sp.MidProductId); if (pp != null) { item.MidProductName = pp.Productname; } } if (!string.IsNullOrWhiteSpace(item.ai_hgrecord_stime) || !string.IsNullOrWhiteSpace(item.ai_hgrecord_etime)) { item.ai_hgrecord_time = $"{item.ai_hgrecord_stime}-{item.ai_hgrecord_etime}"; } else { item.ai_hgrecord_time = "不限制"; } } var curOrderSum = new OrderDto() { //RESID = "合计", ORDERID = 1, NEEDPAY = data.Sum(p => p.NEEDPAY), FINALPAY = data.Sum(p => p.FINALPAY), ARRIVALPAY = data.Sum(p => p.ARRIVALPAY), ORDERTYPE = 0, ORDERSTATUS = string.Empty }; data.Add(curOrderSum); return new PageResult(dto.PageIndex, dto.PageSize, total, data); } public async Task> GetCheckLog(QueryCheckDto dto) { List res = new List(); var log = await _repository.GetRepository().Query().Where(n => n.ResId == dto.resid) .Include(x => x.HG_CheckQualityLogRelation) .Include(x => x.HG_CheckQualityLogDetail) .ThenInclude(x => x.HG_CheckQualityLogSource) .OrderByDescending(n => n.Id) .ToListAsync(); foreach (var item in log) { CheckOrderListModel model = new CheckOrderListModel { Id = item.Id, OrderIds = String.Join(",", item.HG_CheckQualityLogRelation.Select(n => n.orderid)), CheckTime = item.CHECKTIME, Ename = item.ENAME, Row = item.HG_CheckQualityLogDetail.Count, Result = item.CHECKSTATUS.GetDescription() }; List checkDetailList = new List(); foreach (var detail in item.HG_CheckQualityLogDetail) { CheckDetail checkdetail = new CheckDetail { Id = detail.Id, CheckType = detail.checktype, CheckTypeName = ((HGCheckType)detail.checktype).GetDescription(), condition = detail.condition.Split(',').Select(n => Convert.ToInt32(n)).ToList(), content = detail.content, suggest = detail.suggest, //Source = detail.HG_CheckQualityLogSource.ToList(), conditionText = detail.conditiontext }; if (detail.checktype == (int)HGCheckType.企微) { checkdetail.ShowSource = String.Join(",", detail.HG_CheckQualityLogSource.Select(n => $"{n.appuserid}({n.externaluserid})[{n.appname}]")); } else { checkdetail.ShowSource = String.Join(",", detail.HG_CheckQualityLogSource.Select(n => $"{n.recordid}")); } checkDetailList.Add(checkdetail); model.CheckDetails = checkDetailList; } res.Add(model); } return res; } public async Task> GetNewCheckLog(QueryCheckDto dto) { List res = new List(); var resId = _repository.GetRepository().Query().FirstOrDefault(x => x.UMID == dto.resid)?.RESID; var log = await _repository.GetRepository().Query().Where(n => n.ResId == resId) .Include(x => x.HG_CheckQualityLogRelation) .Include(x => x.HG_CheckQualityLogDetail) .ThenInclude(x => x.HG_CheckQualityLogSource) .OrderByDescending(n => n.UTIME) .ToListAsync(); foreach (var item in log) { List checkDetailList = new List(); if (item.HG_CheckQualityLogDetail.Count == 0) { CheckNewOrderListModel checkdetail = new CheckNewOrderListModel { Id = item.Id, OrderIds = String.Join(",", item.HG_CheckQualityLogRelation.Select(n => n.orderid)), CheckTime = item.CHECKTIME, Ename = item.ENAME, Row = item.HG_CheckQualityLogDetail.Count, Result = item.CHECKSTATUS.GetDescription() }; res.Add(checkdetail); } foreach (var detail in item.HG_CheckQualityLogDetail) { CheckNewOrderListModel checkdetail = new CheckNewOrderListModel { DetailId = detail.Id, CheckType = detail.checktype, CheckTypeName = ((HGCheckType)detail.checktype).GetDescription(), condition = detail.condition.Split(',').Select(n => Convert.ToInt32(n)).ToList(), content = detail.content, suggest = detail.suggest, conditionText = detail.conditiontext, Id = item.Id, OrderIds = String.Join(",", item.HG_CheckQualityLogRelation.Select(n => n.orderid)), CheckTime = item.CHECKTIME, Ename = item.ENAME, Row = item.HG_CheckQualityLogDetail.Count, Result = item.CHECKSTATUS.GetDescription() }; if (detail.checktype == (int)HGCheckType.企微) { List showSource = new List(); foreach (var soul in detail.HG_CheckQualityLogSource) { if (soul.eid > 0) { showSource.Add($"{soul.appuserid}({soul.eid}{soul.ename})"); } else { showSource.Add($"{soul.appuserid}"); } } checkdetail.ShowSource = String.Join(",", showSource); } else { checkdetail.ShowSource = String.Join(",", detail.HG_CheckQualityLogSource.Select(n => $"{n.recordid}")); } res.Add(checkdetail); } } return res; } /// /// 获取近7天的订单合规情况和最新的操作 /// /// /// public async Task GetCheckEditLog(CheckEditDto dto) { CheckEditModel res = new CheckEditModel(); var resId = _repository.GetRepository().Query().FirstOrDefault(x => x.UMID == dto.ResId)?.RESID; var query = _repository.GetRepository().Query().Where(n => n.RESID == resId); var orderList = query.ToList(); var checkOrders = from n in query join b in _repository.GetRepository().Query() on n.ORDERID equals b.ORDERID into tmp from qd in tmp.DefaultIfEmpty() select new CheckOrderModel { CTIME = n.CTIME, value = n.ORDERID, name = qd != null ? $"{n.ORDERID}({n.ORDERSTATUSNAME})({qd.CHECKSTATUS.GetDescription()})" : $"{n.ORDERID}({n.ORDERSTATUSNAME})({HGCheckStatus.未质检.GetDescription()})", Exuserid = n.external_userid }; List exteruserName = new List(); var exteruserList = await _repository.GetRepository().Query().Where(n => n.resid == resId).ToListAsync(); exteruserName.AddRange(exteruserList.Select(n => n.userid).ToList()); exteruserName.Add(checkOrders.FirstOrDefault(n => n.value == dto.OrderId)?.Exuserid); exteruserName = exteruserName.Where(n => !string.IsNullOrEmpty(n)).Distinct().ToList(); res.CheckOrders = checkOrders.OrderByDescending(n => n.CTIME).Take(500).ToList(); /* if (!res.CheckOrders.Select(n => n.value).Contains(dto.OrderId)) { throw new Exception($"当前订单未开通,无法质检"); } if (res.CheckOrders.Count == 0) { throw new Exception($"当前客户不存在已开通的订单"); }*/ var setting = await _repository.GetRepository().Query().FirstOrDefaultAsync(n => n.PARAKEY == "HgCheckSetting"); if (setting != null) { res.HgCheckSetting = setting.PARAVALUE; } var qiweiHost = await _repository.GetRepository().Query().FirstOrDefaultAsync(n => n.PARAKEY == "QiWeiHost"); res.OrderInfo = new OrderInfo { OrderId = new List { dto.OrderId.Value }, QiWeiUrl = $"{qiweiHost.PARAVALUE.Split('$').FirstOrDefault().Trim('/')}/Admin/OutHHuser/User_extuserList?exuserid={string.Join(";", exteruserName)}&isHg=true&resid={resId}&isChoose=true", Exuserid = exteruserName }; return res; } /// /// 保存 /// /// /// public async Task CheckSave(CheckSaveDto dto) { try { var setting = await _repository.GetRepository().Query().FirstOrDefaultAsync(n => n.PARAKEY == "HgCheckSetting"); var hgSetting = JsonHelper.FromJson>(setting.PARAVALUE); var orderList = await _repository.GetRepository().Query().Where(n => dto.orderids.Contains(n.ORDERID)).ToListAsync(); var resid = orderList.FirstOrDefault(n => n.ORDERID == dto.orderids.FirstOrDefault())?.RESID; HG_CheckQualityLog log = new HG_CheckQualityLog(); List delRelation = new List(); List delLogdetail = new List(); List delLogsource = new List(); if (dto.Id.HasValue && dto.Id > 0) { log = await _repository.GetRepository().Query().Where(n => n.Id == dto.Id) .Include(x => x.HG_CheckQualityLogRelation) .Include(x => x.HG_CheckQualityLogDetail) .ThenInclude(x => x.HG_CheckQualityLogSource) .OrderByDescending(n => n.Id) .FirstOrDefaultAsync(); log.CHECKSTATUS = dto.checkstatus; log.CHECKTIME = DateTime.Now; log.UTIME = DateTime.Now; log.EID = dto.eid; log.ResId = resid; log.ENAME = dto.ename; await _repository.GetRepository().UpdateAsync(log); foreach (var item in log.HG_CheckQualityLogRelation) { delRelation.Add(item); } foreach (var detail in log.HG_CheckQualityLogDetail) { delLogdetail.Add(detail); foreach (var source in detail.HG_CheckQualityLogSource) { delLogsource.Add(source); } } } //插入日志 using var transaction = await _repository.BeginTransactionAsync(); if (!dto.Id.HasValue || dto.Id == 0) { log = new HG_CheckQualityLog { CHECKSTATUS = dto.checkstatus, CHECKTIME = DateTime.Now, CTIME = DateTime.Now, EID = dto.eid, ResId = resid, ENAME = dto.ename, UTIME = DateTime.Now }; await _repository.GetRepository().InsertAsync(log); } //插入扩展表 var orderextendList = await _repository.GetRepository().Query().Where(n => dto.orderids.Contains(n.ORDERID)).ToListAsync(); List insertExtendList = new List(); List updateExtendList = new List(); List inRelationList = new List(); List insource = new List(); int? checkrank = null; var checkranktxt = string.Empty; foreach (var detail in dto.children) { if (detail.condition.Count == 0) { throw new Exception("合规情况必填"); } List conditionText = new List(); foreach (var set in hgSetting) { if (set.children == null || set.children.Count == 0) { if (detail.condition.Contains(set.value)) { conditionText.Add(set.name); } continue; } var hafirstStr = false; var conditStr = ""; foreach (var con in detail.condition) { var cren = set.children.FirstOrDefault(n => n.value == con); if (cren != null) { if (hafirstStr) { conditStr += $",{cren.name}"; } else { if (!checkrank.HasValue) { checkrank = set.value; checkranktxt = set.name; } conditStr += $"{set.name}({cren.name}"; hafirstStr = true; } } } if (!string.IsNullOrWhiteSpace(conditStr)) { conditStr += ")"; conditionText.Add(conditStr); } } HG_CheckQualityLogDetail newDetail = new HG_CheckQualityLogDetail { logid = log.Id, checktype = detail.checktype, condition = String.Join(",", detail.condition), conditiontext = String.Join(",", conditionText), suggest = detail.suggest, content = detail.content, ctime = DateTime.Now }; await _repository.GetRepository().InsertAsync(newDetail); if (detail.checktype == (int)HGCheckType.企微) { if (detail.qiMsg.Count == 0) { throw new Exception("企微微信聊天记录不能为空"); } foreach (var item in detail.qiMsg) { HG_CheckQualityLogSource source = new HG_CheckQualityLogSource { logdetailid = newDetail.Id, logid = log.Id, checktype = detail.checktype, appid = item.corpid, appname = item.corpname, appuserid = item.userid, externaluserid = item.extuserid, ctime = DateTime.Now, eid = item.eid, ename = item.ename }; insource.Add(source); } } else { if (detail.audio.Count == 0) { throw new Exception("违规录音不能为空"); } foreach (var item in detail.audio) { HG_CheckQualityLogSource source = new HG_CheckQualityLogSource { logdetailid = newDetail.Id, logid = log.Id, checktype = detail.checktype, recordid = item.recordid, ctime = DateTime.Now }; insource.Add(source); } } } foreach (var orderid in dto.orderids) { var existExtend = orderextendList.FirstOrDefault(n => n.ORDERID == orderid); if (existExtend == null) { WX_SZZYORDER_EXTEND order = new WX_SZZYORDER_EXTEND { ORDERID = orderid, RESID = resid, CHECKSTATUS = dto.checkstatus, CHECKTIME = log.CHECKTIME, EID = dto.eid, ENAME = dto.ename, CTIME = DateTime.Now, CHECKRANK = checkrank, CHECKRANKTXT = checkranktxt }; insertExtendList.Add(order); } else { existExtend.CHECKSTATUS = log.CHECKSTATUS; existExtend.CHECKTIME = log.CHECKTIME; existExtend.EID = log.EID; existExtend.ENAME = log.ENAME; existExtend.UTIME = log.UTIME; existExtend.CHECKRANK = checkrank; existExtend.CHECKRANKTXT = checkranktxt; updateExtendList.Add(existExtend); } inRelationList.Add(new HG_CheckQualityLogRelation { logid = log.Id, orderid = orderid, resid = resid, CTIME = DateTime.Now }); } if (insertExtendList.Count() > 0) { await _repository.GetRepository().BatchInsertAsync(insertExtendList); } if (updateExtendList.Count > 0) { await _repository.GetRepository().BatchUpdateAsync(updateExtendList); } if (inRelationList.Count > 0) { await _repository.GetRepository().BatchInsertAsync(inRelationList); } if (insource.Count > 0) { await _repository.GetRepository().BatchInsertAsync(insource); } if (delRelation.Count > 0) { await _repository.GetRepository().BatchDeleteAsync(delRelation); } if (delLogdetail.Count > 0) { await _repository.GetRepository().BatchDeleteAsync(delLogdetail); } if (delLogsource.Count > 0) { await _repository.GetRepository().BatchDeleteAsync(delLogsource); } await transaction.CommitAsync(); } catch (Exception ex) { Log.Error($"质检保存失败{ex.Message}"); throw ex; } return true; } public async Task initEditModel(QueryCheckDto dto) { InitEditModel res = new InitEditModel(); CheckSaveDto editModel = new CheckSaveDto(); if (!dto.id.HasValue) { //取最早那一条记录 var logList = await _repository.GetRepository().Query().Where(n => n.orderid == dto.orderid).OrderByDescending(n => n.logid).FirstOrDefaultAsync(); dto.id = logList.logid; } List orderfilter = new List(); if (dto.id.HasValue) { var log = await _repository.GetRepository().Query().Where(n => n.Id == dto.id) .Include(x => x.HG_CheckQualityLogRelation) .Include(x => x.HG_CheckQualityLogDetail) .ThenInclude(x => x.HG_CheckQualityLogSource) .OrderByDescending(n => n.Id) .FirstOrDefaultAsync(); if (log != null) { editModel.Id = log.Id; editModel.ename = log.ENAME; editModel.checkstatus = log.CHECKSTATUS; editModel.checktime = log.CHECKTIME.Value.ToString("yyyy-MM-dd HH:mm:ss"); editModel.orderids = log.HG_CheckQualityLogRelation.Select(n => Convert.ToInt32(n.orderid)).ToList(); editModel.eid = log.EID; List detailList = new List(); foreach (var item in log.HG_CheckQualityLogDetail) { CheckLogDetail checkLogDetail = new CheckLogDetail { id = item.Id, checktype = item.checktype, condition = item.condition.Split(",").Select(n => Convert.ToInt32(n)).ToList(), content = item.content, suggest = item.suggest }; if (item.checktype == (int)HGCheckType.录音) { List auditDetailList = new List(); foreach (var audio in item.HG_CheckQualityLogSource) { AuditDetail auditDetail = new AuditDetail { recordid = audio.recordid, }; auditDetailList.Add(auditDetail); } checkLogDetail.audio = auditDetailList; } else { List qiwei = new List(); foreach (var audio in item.HG_CheckQualityLogSource) { QiWeMsg msg = new QiWeMsg { corpid = audio.appid, corpname = audio.appname, userid = audio.appuserid, extuserid = audio.externaluserid, eid = audio.eid, ename = audio.ename, }; qiwei.Add(msg); } checkLogDetail.qiMsg = qiwei; } detailList.Add(checkLogDetail); } editModel.children = detailList; dto.resid = log.ResId; orderfilter = log.HG_CheckQualityLogRelation.Select(n => n.orderid).Distinct().ToList(); } } //列表 QueryCheckDto queryCheckDto = new QueryCheckDto() { resid = dto.resid }; CheckEditModel setting = new CheckEditModel(); var query = _repository.GetRepository().Query().Where(n => n.RESID == dto.resid); var checkOrders = from n in query join b in _repository.GetRepository().Query() on n.ORDERID equals b.ORDERID into tmp from qd in tmp.DefaultIfEmpty() select new CheckOrderModel { CTIME = n.CTIME, value = n.ORDERID, name = qd != null ? $"{n.ORDERID}({n.ORDERSTATUSNAME})({qd.CHECKSTATUS.GetDescription()})" : $"{n.ORDERID}({n.ORDERSTATUSNAME})({HGCheckStatus.未质检.GetDescription()})", Exuserid = n.external_userid }; List exteruserName = new List(); var exteruserList = await _repository.GetRepository().Query().Where(n => n.resid == dto.resid).ToListAsync(); exteruserName.AddRange(exteruserList.Select(n => n.userid).ToList()); exteruserName.Add(checkOrders.FirstOrDefault(n => n.value == dto.orderid)?.Exuserid); exteruserName = exteruserName.Where(n => !string.IsNullOrEmpty(n)).Distinct().ToList(); setting.CheckOrders = checkOrders.OrderByDescending(n => n.CTIME).ToList(); var checkSetting = await _repository.GetRepository().Query().FirstOrDefaultAsync(n => n.PARAKEY == "HgCheckSetting"); if (setting != null) { setting.HgCheckSetting = checkSetting.PARAVALUE; } var qiweiHost = await _repository.GetRepository().Query().FirstOrDefaultAsync(n => n.PARAKEY == "QiWeiHost"); setting.OrderInfo = new OrderInfo { //OrderId = new List { dto.orderid }, QiWeiUrl = $"{qiweiHost.PARAVALUE.Split('$').FirstOrDefault().Trim('/')}/Admin/OutHHuser/User_extuserList?exuserid={string.Join(";", exteruserName)}&isHg=true&resid={dto.resid}&isChoose=true", Exuserid = exteruserName }; res.Setting = setting; res.CheckNewOrderListModel = await GetNewCheckLog(queryCheckDto); res.CheckSaveDto = editModel; return res; } public async Task> GetCheckOrderList(CheckOrderQueryDto dto) { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); var isorderFilter = false; //替换resid if (!string.IsNullOrEmpty(dto.UMID) && string.IsNullOrEmpty(dto.resId)) { dto.resId = await QueryResidByUMID(dto.UMID); } var resCustomer = _repository.GetRepository().Query(); var _orderquery = _repository.GetRepository().Query() .If(dto.orderId.HasValue, x => x.Where(m => m.ORDERID == dto.orderId.Value)) .If(!string.IsNullOrEmpty(dto.cname), x => x.Where(m => m.CNAME == dto.cname)) .If(dto.cstart.HasValue, x => x.Where(m => m.CTIME >= dto.cstart)) .If(dto.cend.HasValue, x => x.Where(m => m.CTIME < dto.cend.Value.AddDays(1).AddMilliseconds(-1))) .If(dto.kstime.HasValue, x => x.Where(m => m.OTIME >= dto.kstime)) .If(dto.ketime.HasValue, x => x.Where(m => m.OTIME < dto.ketime.Value.AddDays(1).AddMilliseconds(-1))); if (dto.orderId.HasValue || !string.IsNullOrEmpty(dto.cname) || dto.cstart.HasValue || dto.cend.HasValue || dto.kstime.HasValue || dto.ketime.HasValue) { isorderFilter = true; } if (!string.IsNullOrWhiteSpace(dto.auditname)) { isorderFilter = true; var orderfilter = _repository.GetRepository().Query().Where(n => n.Auditor == dto.auditname).Select(n => n.Orderid); _orderquery = _orderquery.Where(n => orderfilter.Contains(n.ORDERID)); } if (!string.IsNullOrEmpty(dto.channel)) { isorderFilter = true; if (dto.channel.Split(',').Length != 1) { var predicates = new List>>(); foreach (var channel in dto.channel.Split(',')) { var arr0 = channel.Split('|'); foreach (var item in arr0) { var a = item.Split(';'); var min = Convert.ToInt32(a[0]); var max = Convert.ToInt32(a[1]); predicates.Add(m => m.CHANNEL >= min && m.CHANNEL <= max); } } _orderquery = _orderquery.WhereOR(predicates.ToArray()); } else { foreach (var channel in dto.channel.Split(',')) { var arr0 = channel.Split('|'); if (arr0.Length > 1) { var predicates = new List>>(); foreach (var item in arr0) { var a = item.Split(';'); var min = Convert.ToInt32(a[0]); var max = Convert.ToInt32(a[1]); predicates.Add(m => m.CHANNEL >= min && m.CHANNEL <= max); } _orderquery = _orderquery.WhereOR(predicates.ToArray()); } else { var arr = channel.Split(';'); var min = Convert.ToInt32(arr[0]); var max = Convert.ToInt32(arr[1]); _orderquery = _orderquery.Where(m => m.CHANNEL >= min && m.CHANNEL <= max); } } } } var query = _repository.GetRepository().Query() .If(!string.IsNullOrEmpty(dto.resId), x => x.Where(m => m.ResId == dto.resId)) .If(dto.checktype.HasValue, n => n.Where(n => n.HG_CheckQualityLogDetail.Any(s => s.checktype == dto.checktype))) .If(dto.ckstime.HasValue, x => x.Where(m => m.CHECKTIME >= dto.ckstime)) .If(dto.cketime.HasValue, x => x.Where(m => m.CHECKTIME < dto.cketime.Value.AddDays(1).AddMilliseconds(-1))) .If(dto.checkStatus.HasValue, x => x.Where(m => (int)m.CHECKSTATUS == dto.checkStatus)) .If(isorderFilter, x => x.Where(n => n.HG_CheckQualityLogRelation.Any(s => _orderquery.Select(n => n.ORDERID).Contains(s.orderid)))) .If(!string.IsNullOrWhiteSpace(dto.checkname), x => x.Where(m => m.ENAME == dto.checkname)); if (!string.IsNullOrEmpty(dto.condition)) { var logdetail = _repository.GetRepository().Query(); var predicates = new List>>(); foreach (var cond in dto.condition.Split(',')) { predicates.Add(m => m.condition.Contains(cond)); } logdetail = logdetail.WhereOR(predicates.ToArray()); query = query.If(!string.IsNullOrEmpty(dto.condition), n => n.Where(s => s.HG_CheckQualityLogDetail.Any(sq => logdetail.Contains(sq)))); } var total = await query.CountAsync(); var logQuery = await query.OrderByDescending(n => n.UTIME) .Skip((dto.PageIndex - 1) * dto.PageSize) .Take(dto.PageSize) .Include(x => x.HG_CheckQualityLogRelation) .Include(x => x.HG_CheckQualityLogDetail) .ThenInclude(x => x.HG_CheckQualityLogSource) .ToListAsync(); stopwatch.Stop(); Log.Information($"查询质检明细耗时{stopwatch.ElapsedMilliseconds}ms"); stopwatch.Restart(); var orderids = logQuery.SelectMany(n => n.HG_CheckQualityLogRelation.Select(s => s.orderid)).ToList(); var orderAudits = _repository.GetRepository().Query(); var orderQuery = _repository.GetRepository().Query(); var orderAuditQyery = from n in orderQuery join b in orderAudits on n.ORDERID equals b.Orderid into tmpd from qd in tmpd.DefaultIfEmpty() where orderids.Contains(n.ORDERID) select new { order = n, auditlog = qd }; var orderList = orderAuditQyery.ToList(); var orderresCustomer = resCustomer.Where(m => logQuery.Select(l => l.ResId).Contains(m.RESID)).ToList(); var ocDic = orderresCustomer.GroupBy(m => m.RESID).ToDictionary(m => m.Key, n => n.First().UMID);//匹配UMID var eids = string.Join(",", orderList.Where(x => x.order.eid != null).Select(x => x.order.eid).ToList()); var innerusers = await _inneruserDomain.GetInnerusers(eids); List res = new List(); foreach (var item in logQuery) { var orderaudit = orderList.Where(s => item.HG_CheckQualityLogRelation.Select(n => n.orderid).Contains(s.order.ORDERID)).ToList(); var orderitem = orderaudit.Select(n => n.order).Distinct().ToList(); var oids = orderitem.Select(n => n.ORDERID).ToList(); var orderAuditList = orderaudit.Where(n => n.auditlog != null).Select(n => n.auditlog).ToList(); var UMID = ocDic.ContainsKey(item.ResId) ? ocDic[item.ResId] : ""; CheckOrderList newModel = new CheckOrderList { Id = item.Id, ResId = item.ResId, UMID = UMID, CNAME = orderitem.FirstOrDefault()?.CNAME, CHANNELNAME = String.Join(",", orderitem.Select(n => n.deptname).Distinct()), checkStatus = item.CHECKSTATUS, OrderIds = string.Join(",", oids), CTime = string.Join(",", orderitem.Select(n => n.CTIME.Value.ToString("yyyy-MM-dd HH:mm:ss"))), CheckTime = item.CHECKTIME, Ename = item.ENAME, AuditTime = String.Join(",", orderitem.Where(n => n.OTIME.HasValue).Select(n => n.OTIME.Value.ToString("yyyy-MM-dd HH:mm:ss"))) }; List innerUserName = new List(); if (innerusers != null && innerusers.Any()) { var inneruser = innerusers.Where(x => orderitem.Select(n => n.eid).Contains(x.EId)); innerUserName = inneruser.Select(n => n.Name).Distinct().ToList(); if (inneruser != null) { newModel.innerUserName = String.Join(",", innerUserName); } } if (orderAuditList != null && orderAuditList.Any()) { List inneraudit = new List(); foreach (var ad in oids) { var firstAd = orderAuditList.OrderByDescending(n => n.CreateTime).FirstOrDefault(n => n.Orderid == ad); if (firstAd != null && !string.IsNullOrWhiteSpace(firstAd.Auditor)) { inneraudit.Add(firstAd.Auditor); } } newModel.AuditName = string.Join(",", inneraudit); } if (item.HG_CheckQualityLogDetail.Count == 0) { res.Add(newModel); continue; } foreach (var detail in item.HG_CheckQualityLogDetail) { newModel.CheckType = detail.checktype; newModel.CheckTypeName = ((HGCheckType)detail.checktype).GetDescription(); newModel.condition = detail.condition.Split(',').Select(n => Convert.ToInt32(n)).ToList(); newModel.content = detail.content; newModel.suggest = detail.suggest; newModel.conditionText = detail.conditiontext; if (detail.checktype == (int)HGCheckType.企微) { List showSource = new List(); foreach (var soul in detail.HG_CheckQualityLogSource) { if (soul.eid > 0) { showSource.Add($"{soul.appuserid}({soul.eid}{soul.ename})"); } else { showSource.Add($"{soul.appuserid}"); } } newModel.ShowSource = String.Join(",", showSource); } else { newModel.ShowSource = String.Join(",", detail.HG_CheckQualityLogSource.Select(n => $"{n.recordid}")); } res.Add(newModel); } } var result = new PageResult(dto.PageIndex, dto.PageSize, total, res); stopwatch.Stop(); Log.Information($"构建质检明细耗时{stopwatch.ElapsedMilliseconds}ms"); return result; } private async Task QueryResidByUMID(string UMID) { var UMIDMain = await _repository.GetRepository().Query().FirstOrDefaultAsync(m => m.UMID == UMID); if (UMIDMain != null) { return UMIDMain.RESID; } else { return "NULL_RESID"; } } private async Task GetNoticeNo() { var noticeId = $@"ZJ{DateTime.Now.Year}{DateTime.Now.Month}{DateTime.Now.Day}"; string keyName = CacheKeys.CheckNoticeNo + DateTime.Now.ToString("yyyyMMdd"); if (!await _redisManager.ExistsAsync(keyName)) { await _redisManager.SetAsync(keyName, 1, TimeSpan.FromHours(24)); return noticeId + GetNumberStr(1); } else { var no = _redisManager.Get(keyName) + 1; await _redisManager.SetAsync(keyName, no, TimeSpan.FromHours(24));//加1 return noticeId + GetNumberStr(no); } } private string GetNumberStr(int no) { if (no < 10) return "00" + no; if (no >= 10 && no < 100) return "0" + no; else return no.ToString(); } public async Task AddCheckNotice(HgCheckQualityNoticeDto dto) { try { // 创建新的通知 Log.Information("创建违规单 :"); Log.Information("HgCheckQualityNoticeDto :" + dto.ToJson()); DepartmentInfo info = _employeeDomain.GetAllDeptInfos(dto.NoticeCreator); CenterInfo signInfo = await _employeeDomain.GetCenterNameAsync(dto.ToEid); Log.Information("signInfo :" + signInfo.ToJson()); var notice = new Hg_CheckQuality_Notice { NoticeNo = await GetNoticeNo(),//获取合同号 NoticeDate = DateTime.Now, FromDept = info.deptmentIds,//合规部门 FromDeptName = info.deptmentNames,//合规部门 ToEid = dto.ToEid, ToDept = signInfo.deptId.ToString(),//业务部门 ToDeptName = signInfo.centerName,//业务部门 Content = dto.Content, NoticeCreator = dto.NoticeCreator, NoticeCreatorName = dto.NoticeCreatorName, NoticeCtime = DateTime.Now, isDelete = 0 }; // 插入通知到数据库 await _repository.GetRepository().InsertAsync(notice); // 为每个通知人员创建签名记录 foreach (var signer in dto.PersonList) { var noticeSign = new Hg_CheckQuality_NoticeSign { NoticeId = notice.id, NoticeNo = notice.NoticeNo, NoticeLevel = signer.NoticeLevel, // 假设签名者有一个等级属性 eid = signer.Eid, Name = _employeeDomain.GetEmpoyeeName(signer.Eid), Sign = 0 // 默认未签名 }; // 插入签名记录到数据库 await _repository.GetRepository().InsertAsync(noticeSign); } return true; } catch (Exception ex) { Log.Error($"添加检查通知失败: {ex.Message}"); throw; } } public async Task EditCheckNotice(EditHgCheckQualityNoticeDto dto) { try { // 创建新的通知 Log.Information("更新违规单 :"); Log.Information("HgCheckQualityNoticeDto id:" + dto.Id.ToString()); var notice = await GetHgCheckQualityNoticeModel(dto.Id); notice.Content = dto.Content; // 插入通知到数据库 await _repository.GetRepository().UpdateAsync(notice); return true; } catch (Exception ex) { Log.Error($"添加检查通知失败: {ex.Message}"); throw; } } public async Task DelCheckNotice(int id) { try { var info = await this.GetHgCheckQualityNoticeModel(id); info.isDelete = 1; // 插入通知到数据库 await _repository.GetRepository().UpdateAsync(info, m => new { m.isDelete });//修改删除状态 return true; } catch (Exception ex) { Log.Error($"添加检查通知失败: {ex.Message}"); throw; } } private async Task GetHgCheckQualityNoticeModel(int id) { return await _repository.GetRepository().FirstOrDefaultAsync(m => m.id == id); } private async Task GetHgCheckQualityNoticeOptionModel(int id, string NoticeLevel) { return await _repository.GetRepository().FirstOrDefaultAsync(m => m.NoticeId == id && m.NoticeLevel == NoticeLevel); } public async Task AddQualityNoticeOption(QualityNoticeOption dto) { var info = await this.GetHgCheckQualityNoticeModel(dto.id); if (info == null) { throw new Exception("参数错误"); } var option = await this.GetHgCheckQualityNoticeOptionModel(dto.id, dto.NoticeLevel); var noticeSign = new Hg_CheckQuality_NoticeSign { NoticeId = dto.id, NoticeNo = info.NoticeNo, NoticeLevel = dto.NoticeLevel, // 假设签名者有一个等级属性 eid = dto.eid, Name = _employeeDomain.GetEmpoyeeName(dto.eid), Sign = 1, Opinion = dto.opinion, SignTime = DateTime.Now, }; if (option == null) // 插入签名记录到数据库 await _repository.GetRepository().InsertAsync(noticeSign); else { //noticeSign.id = option.id; option.Sign = 1; option.Opinion = noticeSign.Opinion; option.SignTime = noticeSign.SignTime; option.eid = noticeSign.eid; option.Name = noticeSign.Name; await _repository.GetRepository().UpdateAsync(option, x => new { x.eid, x.Name, x.Sign, x.Opinion, x.SignTime }); } return true; } public async Task> GetCheckQualityNotice(HgCheckQualitySearchDto dto) { var query = _repository.GetRepository().Query().Where(m => m.isDelete == 0); if (dto.stime.HasValue) { query = query.Where(m => m.NoticeCtime >= dto.stime.Value); } if (dto.etime.HasValue) { query = query.Where(m => m.NoticeCtime < dto.etime.Value); } if (!string.IsNullOrEmpty(dto.toDept)) { query = query.Where(m => m.ToDept == dto.toDept); } if (!string.IsNullOrEmpty(dto.noticeNo)) { query = query.Where(m => m.NoticeNo == dto.noticeNo); } if (dto.eid.HasValue)//如果传了工号,那么就要工号过滤 { var query1 = _repository.GetRepository().Query().Where(m => m.NoticeLevel == "manage"); var einfo = from a in query join b in query1 on a.id equals b.NoticeId into jiontemp from sign in jiontemp.DefaultIfEmpty()//左关联(用户组/部门 关系表) where a.ToEid == dto.eid.Value || sign.eid == dto.eid.Value select a; var list = await einfo.OrderByDescending(x => x.NoticeCtime) .Skip((dto.PageIndex - 1) * dto.PageSize) .Take(dto.PageSize).Include(m => m.Hg_CheckQuality_NoticeSigns) .ToListAsync(); var total = await einfo.CountAsync(); PageResult dataList = new PageResult(dto.PageIndex, dto.PageSize, total, list); return dataList; } else { var list = await query.OrderByDescending(x => x.NoticeCtime) .Skip((dto.PageIndex - 1) * dto.PageSize) .Take(dto.PageSize).Include(m => m.Hg_CheckQuality_NoticeSigns) .ToListAsync(); var total = await query.CountAsync(); PageResult dataList = new PageResult(dto.PageIndex, dto.PageSize, total, list); return dataList; } } /// /// 查找违规通知单明细 /// /// /// public async Task GetCheckQualityInfo(int id) { var info = await _repository.GetRepository().Query().Where(m => m.id == id).Include(m => m.Hg_CheckQuality_NoticeSigns).FirstOrDefaultAsync(); return info; } /// /// 添加处罚单 /// /// /// /// public async Task AddQualityPunish(QualityPunish dto) { var info = await this.GetHgCheckQualityNoticeModel(dto.id); if (info == null) { throw new Exception("参数错误"); } info.PunishContent = dto.content; info.PunishCreator = dto.eid; info.PunishCreatorName = _employeeDomain.GetEmpoyeeName(dto.eid); info.PunishCtime = DateTime.Now; info.PunishNo = "F-" + await GetNoticeNo();//处罚单,前面加一个f await _repository.GetRepository().UpdateAsync(info, x => new { x.PunishContent, x.PunishCreator, x.PunishCreatorName, x.PunishCtime, x.PunishNo }); return true; } } }