using CRM.Core.DTO.Res; using Ninject; using System; using System.Collections.Generic; using System.Linq; using WX.CRM.BLL.Base; using WX.CRM.BLL.Res; using WX.CRM.Common; using WX.CRM.IBLL.Csvr; using WX.CRM.IBLL.Res; using WX.CRM.IBLL.Util; using WX.CRM.IBLL.Ww; using WX.CRM.IBLL.Wx; using WX.CRM.Model.Entity; using WX.CRM.WebHelper.Infrastructure; namespace RiaService.Services { public class ResServices { private ICACHE_Q cacheQ = NinjectControllerFactory.ninjectKernel.Get(); private ICSVR_FAVORITECUSTOMER_Q _favCustomerQ = NinjectControllerFactory.ninjectKernel.Get(); private IRES_SCENE _resScene = NinjectControllerFactory.ninjectKernel.Get(); private IRES_MYALLOCATERES _myallocate = NinjectControllerFactory.ninjectKernel.Get(); private IWX_SZZYORDER _order = NinjectControllerFactory.ninjectKernel.Get(); private IRES_SHAREDPOOL_HIS _sharedPoolHis = NinjectControllerFactory.ninjectKernel.Get(); private IRES_SHAREDPOOL_ONE _sharedPoolOne = NinjectControllerFactory.ninjectKernel.Get(); private IRES_ACTIVITY _activity = NinjectControllerFactory.ninjectKernel.Get(); private ICACHE_Q _cache = NinjectControllerFactory.ninjectKernel.Get(); private IWw_huser _wwHHUser = NinjectControllerFactory.ninjectKernel.Get(); private ICSVR_TODOITEM _todoItem = NinjectControllerFactory.ninjectKernel.Get(); private IRES_APPLY res_apply = NinjectControllerFactory.ninjectKernel.Get(); private ValidationErrors errors = new ValidationErrors(); public BAS_INNERUSER FindUser(string resid, string unionid, string appid, string appuserid, int? deptid = 0) { var users = cacheQ.GetUserList(); if (!string.IsNullOrEmpty(resid)) { var favCustomer = _favCustomerQ.GetModel_FavoriteCustomer(resid, null); if (favCustomer != null) { return users.Find(p => p.PKID == favCustomer.SALESID && p.ISDISMISS == 0); } else { var resMyAllocate = _myallocate.GetLastSale(resid, deptid); if (resMyAllocate != null) { return users.Find(p => p.PKID == resMyAllocate.INNERUSERID && p.ISDISMISS == 0); } else { var order = _order.Get(P => P.RESID == resid && P.ISOPEN == 1); if (order != null) { return users.Find(p => p.PKID == order.INNERUSERID && p.ISDISMISS == 0); } var sharedPoolHisList = _sharedPoolHis.GetList(p => p.RESID == resid); if (sharedPoolHisList.Any()) { var sharedPoolHis = sharedPoolHisList.OrderByDescending(p => p.CTIME).FirstOrDefault(); var user = users.Find(p => p.PKID == sharedPoolHis.SALESID.Value); if (user.ISDISMISS == 0) { return user; } else { var sharedPoolOneList = _sharedPoolOne.GetList(p => p.RESID == resid); if (sharedPoolOneList.Any()) { var sharedPoolOne = sharedPoolOneList.OrderByDescending(p => p.CTIME).FirstOrDefault(); return users.Find(p => p.PKID == sharedPoolOne.SALESID); } } } } } } else { if (!string.IsNullOrEmpty(unionid)) { var extUser = _wwHHUser.GetExtUserByUnionId(unionid); if (extUser != null) { var userExtUserList = _wwHHUser.GetUserExtUserByUserId(extUser.userid); //LogHelper.Info("userExtUserList:" + userExtUserList.ToJson()); if (userExtUserList.Any()) { var hhUserList = _wwHHUser.GetUserListByQWUserId(userExtUserList.Select(p => p.userid).ToArray()); //LogHelper.Info("hhUserList:" + hhUserList.ToJson()); if (hhUserList.Any()) { if (hhUserList.Count() > 1) { var aid = appid.Replace("_1", ""); var hhUserList2 = hhUserList.Where(p => p.CORPID == aid); foreach (var item in hhUserList2) { return users.Find(p => p.EID == item.EID); } } else { var eid = hhUserList.First().EID; return users.Find(p => p.EID == eid); } } else { LogHelper.Info("未找到分配企微客服信息 hhUserList:" + userExtUserList.Select(p => p.userid).ToJson()); } } else { LogHelper.Info("根据appuserid未能找到信息 userExtUserList:" + extUser.userid); } } else { LogHelper.Info("根据unionid未能找到信息 extUser:" + unionid); } } } return null; } public void SaveToDoItem(UserCenterEventDto dto, string tag) { int deptid = 0; if (dto.Channel > 0) { var defaultDept = cacheQ.ConvertChannelName(new List { dto.Channel }); if (defaultDept.Count > 0) { deptid = Convert.ToInt32(defaultDept.FirstOrDefault().id); } } if (!string.IsNullOrEmpty(dto.Mobile)) { var apply = new RES_APPLY { CTIME = DateTime.Now, JSONDATA = null, JSONTYPE = 0, MOBILE = dto.Mobile, RESID = dto.ResId, RESOURCETAG = tag, RTIME = DateTime.Now, STATUS = 0, USERNAME = string.Empty, DATATYPE = null, EXTXML = null, KWORD = null, SOURCETYPE = null, DEPTID = deptid }; res_apply.Create(ref errors, apply); } var user = FindUser(dto.ResId, dto.UnionId, dto.AppId, dto.AppUserId, deptid); if (user == null) { //LogHelper.Error($"待办事项找不到分配收藏关系{dto.ToJson()}"); return; } var users = cacheQ.GetUserList(); var user10000 = cacheQ.GetUserList().Find(p => p.EID == 10000).PKID; var todoItem = new CSVR_TODOITEM() { PKID = new SEQUENCES_BL().Seq_base_get(), SENDEDUSERID = user10000, RECEIVEDUSERID = user.PKID, ISPRIVATE = 1, //RESID = dto.resid, MEMO = dto.EventMemo, STARTTIME = DateTime.Now, //URL = "/Csvr/CustomerInfo/CustomerDetail?resid=" + dto.resid, URLTITLE = "客户详细", DOSTATUS = 0, RESOURCETAG = tag, DEPTID = deptid, EXTXML = null }; if (string.IsNullOrEmpty(dto.ResId)) { //todoItem.RESID = dto.AppUserId; todoItem.URL = string.Empty; } else { todoItem.RESID = dto.ResId; todoItem.URL = "/Csvr/CustomerInfo/CustomerDetail?resid=" + dto.ResId; } _todoItem.Create(ref errors, todoItem); } public BAS_INNERUSER SceneFindUser(RES_SCENE model) { var users = cacheQ.GetUserList(); //var users = cacheQ.GetUserList(); if (!string.IsNullOrEmpty(model.RESID)) { var deptid = 0; //根据渠道取deptid if (model.CH > 0) { var ch = Convert.ToInt32(model.CH); var defaultDept = cacheQ.ConvertChannelName(new List { ch }); if (defaultDept.Count > 0) { deptid = Convert.ToInt32(defaultDept.FirstOrDefault().id); } } var favCustomer = _favCustomerQ.GetModel_FavoriteCustomer(model.RESID, null); if (favCustomer != null) { return users.Find(p => p.PKID == favCustomer.SALESID && p.ISDISMISS == 0); } else { var resMyAllocate = _myallocate.GetLastSale(model.RESID, deptid); if (resMyAllocate != null) { return users.Find(p => p.PKID == resMyAllocate.INNERUSERID && p.ISDISMISS == 0); } else { var order = _order.Get(P => P.RESID == model.RESID && P.ISOPEN == 1); if (order != null) { return users.Find(p => p.PKID == order.INNERUSERID && p.ISDISMISS == 0); } var sharedPoolHisList = _sharedPoolHis.GetList(p => p.RESID == model.RESID); if (sharedPoolHisList.Any()) { var sharedPoolHis = sharedPoolHisList.OrderByDescending(p => p.CTIME).FirstOrDefault(); var user = users.Find(p => p.PKID == sharedPoolHis.SALESID.Value); if (user.ISDISMISS == 0) { return user; } else { var sharedPoolOneList = _sharedPoolOne.GetList(p => p.RESID == model.RESID); if (sharedPoolOneList.Any()) { var sharedPoolOne = sharedPoolOneList.OrderByDescending(p => p.CTIME).FirstOrDefault(); return users.Find(p => p.PKID == sharedPoolOne.SALESID); } } } } } } return null; } public void SaveScene(RES_SCENE model) { var user = SceneFindUser(model); if (user != null) { model.EID = user.EID; model.INNERUSERID = user.PKID; } else { LogHelper.Info("本地未找到归属信息:" + model.ToJson()); //如果本地没有获取到工号并且资源ID不是空的,那么获取线上分配关系,如果线上分配关系不为空,使用线上分配关系分配 if (!string.IsNullOrEmpty(model.RESID)) { _myallocate.ExecDistribute(null, model.RESID, Convert.ToInt32(model.CH.Value), null, "直播分配"); } } _resScene.Add(model); } public bool SaveActivityType(ActivityDto dto, string typename = "活动报名") { var errors = new ValidationErrors(); var resourceType = _cache.GetResourceType(); var resourceTypeModel = resourceType.FirstOrDefault(p => p.TYPENAME == typename); if (resourceTypeModel != null) { var activityList = _cache.GetList_ResActivity(); var activityexists = activityList.FirstOrDefault(p => p.RESOURCETAG == dto.tag); //如果标签已经存在就不需要处理 if (activityexists == null) { var actLists = activityList.OrderByDescending(p => p.ACTIVITYID).Where(p => p.RESTYPEID == resourceTypeModel.RESTYPEID && p.ACTIVITYCODE.Contains(resourceTypeModel.RESTYPECODE)).ToList(); var code = ""; foreach (var item in actLists) { var lastCode = item.ACTIVITYCODE; var prefix = lastCode.Substring(0, resourceTypeModel.RESTYPECODE.Length); var suffix = lastCode.Substring(resourceTypeModel.RESTYPECODE.Length, lastCode.Length - resourceTypeModel.RESTYPECODE.Length); var addNum = 0; Int32.TryParse(suffix, out addNum); if (addNum > 0) { code = prefix + (addNum + 1).ToString(); break; } } if (string.IsNullOrWhiteSpace(code)) { code = resourceTypeModel.RESTYPECODE + "01"; } var model = new RES_ACTIVITY() { ACTIVITYCODE = code, RESOURCETAG = dto.tag, RESTYPEID = resourceTypeModel.RESTYPEID, CREATEUSER = 600000207, ACTIVITYNAME = dto.tagname }; SetActivityDeptId(model, dto); _activity.Create(ref errors, model); CacheHelper.Remove("cache_resourcetype_getlist"); CacheHelper.Remove("cache_resactivity_getList"); } else if (!activityexists.DEPTID.HasValue || activityexists.DEPTID <= 0) { SetActivityDeptId(activityexists, dto); _activity.Update(ref errors, activityexists); CacheHelper.Remove("cache_resourcetype_getlist"); CacheHelper.Remove("cache_resactivity_getList"); } return true; } return false; } public void SetActivityDeptId(RES_ACTIVITY act, ActivityDto dto) { if (dto.deptid.HasValue && dto.deptid > 0) { act.DEPTID = dto.deptid; } else { var curChannel = 0; if (dto.ch.HasValue && dto.ch > 0) { curChannel = dto.ch.Value; } else { 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) { act.DEPTID = Convert.ToInt32(firstModel.id); } } } } }