381 lines
16 KiB
C#
381 lines
16 KiB
C#
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<ICACHE_Q>();
|
||
private ICSVR_FAVORITECUSTOMER_Q _favCustomerQ = NinjectControllerFactory.ninjectKernel.Get<ICSVR_FAVORITECUSTOMER_Q>();
|
||
private IRES_SCENE _resScene = NinjectControllerFactory.ninjectKernel.Get<IRES_SCENE>();
|
||
private IRES_MYALLOCATERES _myallocate = NinjectControllerFactory.ninjectKernel.Get<IRES_MYALLOCATERES>();
|
||
private IWX_SZZYORDER _order = NinjectControllerFactory.ninjectKernel.Get<IWX_SZZYORDER>();
|
||
private IRES_SHAREDPOOL_HIS _sharedPoolHis = NinjectControllerFactory.ninjectKernel.Get<IRES_SHAREDPOOL_HIS>();
|
||
private IRES_SHAREDPOOL_ONE _sharedPoolOne = NinjectControllerFactory.ninjectKernel.Get<IRES_SHAREDPOOL_ONE>();
|
||
private IRES_ACTIVITY _activity = NinjectControllerFactory.ninjectKernel.Get<IRES_ACTIVITY>();
|
||
private ICACHE_Q _cache = NinjectControllerFactory.ninjectKernel.Get<ICACHE_Q>();
|
||
private IWw_huser _wwHHUser = NinjectControllerFactory.ninjectKernel.Get<IWw_huser>();
|
||
private ICSVR_TODOITEM _todoItem = NinjectControllerFactory.ninjectKernel.Get<ICSVR_TODOITEM>();
|
||
private IRES_APPLY res_apply = NinjectControllerFactory.ninjectKernel.Get<IRES_APPLY>();
|
||
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<int> { 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<int> { 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<int> { curChannel });
|
||
var firstModel = defaultDept.FirstOrDefault();
|
||
if (firstModel != null)
|
||
{
|
||
act.DEPTID = Convert.ToInt32(firstModel.id);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
} |