using CRM.Core.DTO.Res; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WX.CRM.BLL.Application.UserComBox; using WX.CRM.BLL.Base; using WX.CRM.BLL.Util; using WX.CRM.Common; using WX.CRM.DAL.Res; using WX.CRM.IBLL.Res; using WX.CRM.Model.DTO; using WX.CRM.Model.Entity; using WX.CRM.Model.MAP; namespace WX.CRM.BLL.Res { public class RES_MYALLOCATERES_BL : DbContextRepository, IRES_MYALLOCATERES { private readonly RES_ALLOCATE_DAL _dal = new RES_ALLOCATE_DAL(); private readonly RES_DISTRIBUTE_BL _resDistribute = new RES_DISTRIBUTE_BL(); private readonly RES_CUSTOMER_BL _customer = new RES_CUSTOMER_BL(); private BAS_PARAMETER_BL _para = new BAS_PARAMETER_BL(); private BAS_INNERUSER_BL _user = new BAS_INNERUSER_BL(); private readonly CACHE_BL _cache = new CACHE_BL(); public RES_MYALLOCATERES GetLastSale(string resId, int? deptid) { using (var db = new crmContext()) { //var roleArr = new string[] { "GJSKF", "GJSGJKF", "GJSSJKF" }; ////先找出不是客服,客服主管,高级客服的员工,这些员工需要提醒 //var users = (from u in db.BAS_INNERUSER // join ur in db.BAS_INNERUSERROLE on u.PKID equals ur.INNERUSERID // join r in db.BAS_ROLE on ur.ROLEID equals r.ROLEID // where !roleArr.Contains(r.CODE) // select u.PKID) // .Distinct() // .ToList(); //var data = db.RES_MYALLOCATERES.Where(p => !users.Contains(p.INNERUSERID) && p.RESID == resId); var res = db.RES_MYALLOCATERES.Where(p => p.RESID == resId).ToList(); var data = res.FirstOrDefault(n => n.DEPTID == deptid); if (data == null) { data = res.FirstOrDefault(); } return data; } } public IList GetSeniorDistribution(ref Pager pg, SeniorDistributionQuery query) { var list = _dal.GetSeniorDistribution(ref pg, query); var row = list.FirstOrDefault(p => string.IsNullOrEmpty(p.ResId)); pg.totalRows = Convert.ToInt32(row.rn); list.Remove(row); return list; } public IList GetMySeniorDistribution(ref Pager pg, MySeniorDistributionQuery query) { var list = _dal.GetMySeniorDistribution(ref pg, query); var row = list.FirstOrDefault(p => string.IsNullOrEmpty(p.ResId)); pg.totalRows = Convert.ToInt32(row.rn); list.Remove(row); return list; } public IList GetKFBSeniorDistribution(ref Pager pg, SeniorDistributionQuery query, QueryUserComboDto usercomboDto) { List ALLdeptIDS = new List(); List ALLgidS = new List(); if (string.IsNullOrEmpty(usercomboDto.groupIds) && !string.IsNullOrEmpty(usercomboDto.deptId)) { var depts = OperationUtil.ConvertToDecimal(usercomboDto.deptId.Split(',')); UserServices userservices = new UserServices(); foreach (var item in depts) { List deptIDS = new List(); List gidS = new List(); userservices.GetAllDeptIDOrGidByDeptId(item, ref deptIDS, ref gidS);//获取所有的组别和gid ALLdeptIDS.AddRange(deptIDS); ALLgidS.AddRange(gidS); } ALLdeptIDS.AddRange(ALLgidS); usercomboDto.groupIds = string.Join(",", ALLdeptIDS);//所有的部门ID和销售组ID } query.groupId = usercomboDto.groupIds; if (!query.eid.HasValue) query.eid = usercomboDto.userId; var list = _dal.GetKFBSeniorDistribution(ref pg, query); var row = list.FirstOrDefault(p => string.IsNullOrEmpty(p.ResId)); pg.totalRows = Convert.ToInt32(row.rn); list.Remove(row); return list; } public IList GetKFBMySeniorDistribution(ref Pager pg, MySeniorDistributionQuery query, QueryUserComboDto usercomboDto) { List ALLdeptIDS = new List(); List ALLgidS = new List(); if (string.IsNullOrEmpty(usercomboDto.groupIds) && !string.IsNullOrEmpty(usercomboDto.deptId)) { var depts = OperationUtil.ConvertToDecimal(usercomboDto.deptId.Split(',')); UserServices userservices = new UserServices(); foreach (var item in depts) { List deptIDS = new List(); List gidS = new List(); userservices.GetAllDeptIDOrGidByDeptId(item, ref deptIDS, ref gidS);//获取所有的组别和gid ALLdeptIDS.AddRange(deptIDS); ALLgidS.AddRange(gidS); } ALLdeptIDS.AddRange(ALLgidS); usercomboDto.groupIds = string.Join(",", ALLdeptIDS);//所有的部门ID和销售组ID } query.groupId = usercomboDto.groupIds; var list = _dal.GetKFBMySeniorDistribution(ref pg, query); var row = list.FirstOrDefault(p => string.IsNullOrEmpty(p.ResId)); pg.totalRows = Convert.ToInt32(row.rn); list.Remove(row); return list; } public void ExeSeniorDistribute(SeniorDistributionQuery query) { _dal.ExeSeniorDistribute(query); } public void ExeSeniorDistributeByResId(decimal fenpeiUser, decimal pici, string remark, decimal isNew = 1) { _dal.ExeSeniorDistributeByResId(fenpeiUser, pici, remark, isNew); } /// /// 调用分配 /// 手机号跟资源ID必须存在一个,渠道跟资源类型必须存在一个 /// /// 手机号 /// 资源ID /// 渠道 /// 资源类型 /// 备注 public void ExecDistribute(string mobile, string resid, int? ch, decimal? restypeid, string remark) { if (string.IsNullOrEmpty(mobile) && string.IsNullOrEmpty(resid)) { LogHelper.Info("参数错误!分配时手机号跟资源ID不能同时为空"); return; } //var resid = Common.ResUtil.CreateResId(mobile); if (string.IsNullOrEmpty(resid)) { resid = Common.ResUtil.CreateResId(mobile); } var assignUrl = _cache.GetValue_Parameter("assignUrl"); if (!string.IsNullOrEmpty(assignUrl)) { if (!ch.HasValue && restypeid.HasValue) { var resourceType = _cache.GetResourceType(); var rtype = resourceType.FirstOrDefault(p => p.RESTYPEID == restypeid); if (rtype != null) { var companys = _cache.GetList_innerCompany(); var company = companys.Find(p => p.COMPANYID == rtype.COMPANYID); if (company != null) { var deptments = _cache.GetList_SalesDepartMent(); var dept = deptments.Find(p => p.CHANNELDEF != null && p.COMPANYID == company.COMPANYID); if (dept != null) { ch = Convert.ToInt32(dept.CHANNELDEF); } } } } if (ch.HasValue) { var umid = ""; using (var db = new crmContext()) { var customer = db.RES_CUSTOMER.FirstOrDefault(n => n.RESID == resid); umid = customer?.UMID; } var assign = new AssignQuery("com.web", resid, ch.Value, ch.Value, "soft_reg"); assign.umid = umid; LogHelper.Info("【ExecDistribute】获取分配" + assign.ToJson()); var time = (long)Utility.ConvertDateTimeInt(DateTime.Now); var message = JsonConvert.SerializeObject(new { account = "dn.crm", time }); var postpara = new SecurityHelper().createSignEncodingStr(message); var rsp = Utility.PostAjaxData(assignUrl + "?" + postpara, assign.ToJson(), Encoding.UTF8); var ret = JsonConvert.DeserializeObject(rsp); LogHelper.Info("【ExecDistribute】获取分配" + ret.ToJson()); if (ret.errcode == 0) { //如果有工号,直接分配 if (!string.IsNullOrEmpty(ret.data.eid) && !string.IsNullOrEmpty(resid)) { var isExe = false; var userList = _cache.GetUserList(); var pici = new SEQUENCES_BL().Seq_base_get(); var deptid = 0; var eid32 = Convert.ToDecimal(ret.data.eid); var user = _user.getInnerUserByEid(eid32); if (user != null && user.DEPTID.HasValue) { deptid = user.DEPTID.Value; } using (var db = new crmContext()) { var myRes = db.RES_MYALLOCATERES.FirstOrDefault(p => p.RESID == resid && p.DEPTID == deptid); var para = _para.GetModel_Patameter("IgnoreManager"); if (para != null && myRes != null) { var manager = _user.GetModel(myRes.INNERUSERID); if (!string.IsNullOrEmpty(para.PARAVALUE)) { var manageList = para.PARAVALUE.Split(','); foreach (var item in manageList) { if (item == manager.EID.ToString()) { isExe = true; } } } } //如果不存在分配关系,才需要分配 if (myRes == null || isExe) { LogHelper.Info("【ExecDistribute】开始写入分配资源:" + resid); if (user != null) { var allcoteUse = new RES_ALLCOTE_USER() { ID = new SEQUENCES_BL().Seq_base_get(), INNERUSERID = user.PKID, EID = user.EID, NUM = 1, CTIME = DateTime.Now, PICI = pici, RESID = resid, TYPE = 1, DEPTID = deptid }; //if (activeModel.groupid.HasValue) //{ // info.SGID = activeModel.groupid.Value; //} db.RES_ALLCOTE_USER.Add(allcoteUse); } db.SaveChanges(); } } //资源分配关系 var eid1000 = userList.FirstOrDefault(p => p.EID == 10000).PKID; ExeSeniorDistributeByResId(eid1000, pici, remark); } } } } } public IEnumerable GetToDayAllocateRes() { using (var db = new crmContext()) { var today = DateTime.Parse(DateTime.Now.ToShortDateString()); var query = from m in db.RES_MYALLOCATERES join c in db.RES_CUSTOMER on m.RESID equals c.RESID join u in db.BAS_INNERUSER on m.INNERUSERID equals u.PKID where m.DISTIME >= today && m.MEMO == "扫码直接分配" select new ToDayAllocateRes() { ResId = m.RESID, Eid = u.EID, DisTime = m.DISTIME, CTime = c.CTIME, IsNew = 1 } ; return query.ToList(); } } public List GetAllocateRes3List(AllocateRes3Para dto, ref int total) { var url = _cache.GetValue_Parameter("AllocateRes3Url"); var conditions = new List(); var dates = new List(); if (dto.QwStatus.HasValue) { conditions.Add(new Even() { eventid = 12, isNo = dto.QwStatus == 1 ? true : false }); } if (dto.RjStatus.HasValue) { conditions.Add(new Even() { eventid = 6, isNo = dto.RjStatus == 1 ? true : false }); } if (!string.IsNullOrEmpty(dto.TkStatus)) { conditions.Add(new Even() { eventid = 17, isNo = dto.TkStatus == "on" ? true : false }); } if (!string.IsNullOrEmpty(dto.stime)) { dates.Add(dto.stime); } if (!string.IsNullOrEmpty(dto.etime)) { var time = DateTime.Parse(dto.etime).AddDays(1); dates.Add(time.ToString("yyyy-MM-dd")); } var ch = new List() { "3000", "3099" }; var para = new AllocateRes3RequestDto() { conditions = conditions.ToJson(), dates = dates, ch = ch.ToJson(), isAnd = "true", iPageIndex = dto.page }; LogHelper.Info("para:" + para.ToJson()); var rsp = Utility.PostAjaxData(url, para.ToJson(), Encoding.UTF8); //var rsp = Utility.HttpPostData(url, para.ToJson(), Encoding.UTF8); LogHelper.Info("rsp:" + rsp); var data = Utility.JSONToObject(rsp); total = data.total; var residArr = new List(); foreach (var item in data.list) { if (!string.IsNullOrEmpty(item.mobile)) { item.resid = ResUtil.CreateResId(item.mobile); residArr.Add(item.resid); } } var view = new List(); if (!residArr.Any()) { return view; } var list = GetList(p => residArr.Contains(p.RESID)); var resounceCount = _resDistribute.GetCacheResourceCount(residArr); var customers = _customer.getResByResIds(residArr.ToArray()); var users = _cache.GetUserList(); foreach (var item in data.list.Where(p => p.resid != null)) { int? eid = null; var uname = string.Empty; DateTime? distime = null; DateTime? lastactivetime = null; DateTime? lastcalltime = null; DateTime? ctime = null; var umid = ""; var myRes = list.FirstOrDefault(p => p.RESID == item.resid); if (myRes != null) { var user = users.FirstOrDefault(p => p.PKID == myRes.INNERUSERID); if (user != null) { eid = Convert.ToInt32(user.EID); uname = user.UNAME; } distime = myRes.DISTIME; } var cacheresourcecount = resounceCount.FirstOrDefault(p => p.RESID == item.resid); if (cacheresourcecount != null) { lastactivetime = cacheresourcecount.LASTACTIVETIME; lastcalltime = cacheresourcecount.LASTCALLTIME; } var customer = customers.FirstOrDefault(p => p.RESID == item.resid); if (customer != null) { ctime = customer.CTIME; umid = customer.UMID; } var model = new AllocateRes3View() { ResId = umid, QwStatus = dto.QwStatus, RjStauts = dto.RjStatus, Eid = eid, UName = uname, LastActiveTime = lastactivetime, LastCallTime = lastcalltime, DisTime = distime, CTime = ctime }; view.Add(model); } return view; } private static bool islock = false; private static object noticeLock = new object(); /// /// 获取高级资源查询 /// /// public List GetSeniorNotice() { List res = new List(); string cacheKey = "cache_GetSeniorNoticeList"; if (CacheHelper.Exists(cacheKey)) // return CacheHelper.Get>(cacheKey); if (islock) { //被锁了返回 return res; } lock (noticeLock) { if (islock) { LogHelper.Info($"event was innerlocked "); return res; } islock = true; using (var db = new crmContext()) { var nowDate = DateTime.Now.Date; var data = db.WX_AFTERSALES3.Where(p => p.CTIME >= nowDate && p.ISEXE == 0); foreach (var item in data) { SeniorNoticeDto newObj = new SeniorNoticeDto { InnerUserId = item.INNERUSERID, ResId = item.RESID, Ctime = item.CTIME }; res.Add(newObj); } CacheHelper.Set(cacheKey, res, DateTime.Now.AddSeconds(120), true); //LogHelper.Info("load:30"); } islock = false; return res; } } public void UpdateNoticeExe(int? userId) { using (var db = new crmContext()) { var nowDate = DateTime.Now.Date; var data = db.WX_AFTERSALES3.Where(p => p.CTIME >= nowDate && p.ISEXE == 0); foreach (var item in data) { item.ISEXE = 1; } db.SaveChanges(); } } public bool InsertResCutomerRelation(int channel, string resid) { if (string.IsNullOrWhiteSpace(resid)) { return true; } try { var curChannel = channel; if (channel <= 0) { var channelSetting = Utility.GetSettingOrNullByKey("Channel"); int ch = 0; Int32.TryParse(channelSetting, out ch); curChannel = ch; } var defaultDept = _cache.ConvertChannelName(new List { curChannel }); var firstModel = defaultDept.FirstOrDefault(); if (firstModel != null) { var deptId = Convert.ToInt32(firstModel.id); var deptName = firstModel.title; var groupId = Convert.ToInt32(firstModel.groupId); return _dal.CreateRelation(resid, deptId, deptName, groupId); } } catch (Exception ex) { LogHelper.Error($"插入事业部归属失败【{resid}】,【{channel}】{ex.Message}"); } return true; } public bool CreateRelation(RelationDto relation) { return _dal.CreateRelation(relation.ResId, relation.DeptId, relation.DeptName, relation.GROUPID); } public class AssignQuery { public AssignQuery(string appid, string appuserid, int channel, int curchannel, string remark) : this(appid, appuserid, string.Empty, channel, curchannel, 0, string.Empty, remark, string.Empty, string.Empty, string.Empty) { } public AssignQuery(string appid, string appuserid, string unionid, int channel, int curchannel, int type, string livecode, string remark, string remarkext, string memo, string eid) { this.appid = appid; this.appuserid = appuserid; this.unionid = unionid; this.channel = channel; this.curchannel = curchannel; this.type = type; this.livecode = livecode; this.remark = remark; this.remarkext = remarkext; this.memo = memo; this.eid = eid; } public string appid { get; set; } public string appuserid { get; set; } public string unionid { get; set; } public int channel { get; set; } public int curchannel { get; set; } public int type { get; set; }//1、返回二维码链接、0、不需要返回二码码链接 public string livecode { get; set; } //活码标识,30字符以内 public string remark { get; set; }//标记,30字符以内 public string remarkext { get; set; }//标记补充,30字符以内 public string memo { get; set; } public string eid { get; set; }//工号 public string umid { get; set; } } public class WeworkUserAssignMessage { public int errcode { get; set; } public string errmsg { get; set; } public WeworkUserAssignResult data { get; set; } } public class WeworkUserAssignResult { public string eid { get; set; } public int? groupid { get; set; } public string qr { get; set; } } } }