TG.WXCRM.V4/BLL/Res/RES_MYALLOCATERES_BL.cs

550 lines
23 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<RES_MYALLOCATERES>, 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<SeniorDistributionDto> 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<MySeniorDistributionDto> 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<SeniorKFBDistributionDto> GetKFBSeniorDistribution(ref Pager pg, SeniorDistributionQuery query, QueryUserComboDto usercomboDto)
{
List<decimal> ALLdeptIDS = new List<decimal>();
List<decimal> ALLgidS = new List<decimal>();
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<decimal> deptIDS = new List<decimal>();
List<decimal> gidS = new List<decimal>();
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<MySeniorKFBDistributionDto> GetKFBMySeniorDistribution(ref Pager pg, MySeniorDistributionQuery query, QueryUserComboDto usercomboDto)
{
List<decimal> ALLdeptIDS = new List<decimal>();
List<decimal> ALLgidS = new List<decimal>();
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<decimal> deptIDS = new List<decimal>();
List<decimal> gidS = new List<decimal>();
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);
}
/// <summary>
/// 调用分配
/// 手机号跟资源ID必须存在一个渠道跟资源类型必须存在一个
/// </summary>
/// <param name="mobile">手机号</param>
/// <param name="resid">资源ID</param>
/// <param name="ch">渠道</param>
/// <param name="restypeid">资源类型</param>
/// <param name="remark">备注</param>
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<WeworkUserAssignMessage>(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<ToDayAllocateRes> 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<AllocateRes3View> GetAllocateRes3List(AllocateRes3Para dto, ref int total)
{
var url = _cache.GetValue_Parameter("AllocateRes3Url");
var conditions = new List<Even>();
var dates = new List<string>();
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<string>() { "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<AllocateRes3Rsp>(rsp);
total = data.total;
var residArr = new List<string>();
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<AllocateRes3View>();
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();
/// <summary>
/// 获取高级资源查询
/// </summary>
/// <returns></returns>
public List<SeniorNoticeDto> GetSeniorNotice()
{
List<SeniorNoticeDto> res = new List<SeniorNoticeDto>();
string cacheKey = "cache_GetSeniorNoticeList";
if (CacheHelper.Exists(cacheKey))
// return CacheHelper.Get<List<SeniorNoticeDto>>(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<int> { 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; }
}
}
}