TG.WXCRM.V4/BLL/MsgTool/MsgToolPlan_BL.cs

477 lines
22 KiB
C#

using Common;
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.Common.Layui;
using WX.CRM.Common.StockHelper;
using WX.CRM.IBLL.MsgTool;
using WX.CRM.Model.Entity;
using WX.CRM.Model.Enum;
namespace WX.CRM.BLL.MsgTool
{
public class MsgToolPlan_BL : DbContextRepository<MsgToolPlan>, IMsgToolPlan
{
CACHE_BL _cache = new CACHE_BL();
BAS_BUSSINESSLINE_BL businessBL = new BAS_BUSSINESSLINE_BL();
public List<MsgToolPlanRepeatViewModel> GetPlanList(ref Laypage pager, MsgToolPlanQueryDto dto)
{
List<MsgToolPlanRepeatViewModel> res = new List<MsgToolPlanRepeatViewModel>();
using (var db = new crmContext())
{
var queryData = db.MsgToolPlan.AsQueryable();
if (dto.txt_userId.HasValue)
{
queryData = (from a in queryData
join c in db.BAS_INNERUSER on a.CREATOR equals c.EID
where c.PKID == dto.txt_userId
select a);
}
if (!string.IsNullOrEmpty(dto.txt_groupIds))
{
var _groupids = OperationUtil.ConvertToDecimal(dto.txt_groupIds.Split(','));
queryData = (from a in queryData
join c in db.BAS_INNERUSER on a.CREATOR equals c.EID
join b in db.BAS_INNERUSERGROUP on c.PKID equals b.INNERUSERID
where _groupids.Contains(b.GID.Value)
select a);
}
if (!string.IsNullOrEmpty(dto.txt_deptId))
{
List<decimal> ALLdeptIDS = new List<decimal>();
List<decimal> ALLgidS = new List<decimal>();
if (!string.IsNullOrEmpty(dto.txt_deptId))
{
var depts = OperationUtil.ConvertToDecimal(dto.txt_deptId.Split(','));
UserServices userservices = new UserServices(_cache);
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);
}
}
queryData = (from a in queryData
join c in db.BAS_INNERUSER on a.CREATOR equals c.EID
join b in db.BAS_INNERUSERGROUP on c.PKID equals b.INNERUSERID
//join g in db.BAS_INNERGROUP on b.GID equals g.GID
where ALLdeptIDS.Contains(b.DEPTID.Value) || ALLgidS.Contains(b.GID.Value)
select a);
}
if (!string.IsNullOrWhiteSpace(dto.PLANNAME))
{
queryData = queryData.Where(n => n.PLANNAME.Contains(dto.PLANNAME));
}
if (!string.IsNullOrWhiteSpace(dto.CREATOR))
{
var userFilter = db.BAS_INNERUSER.Where(n => n.EID.ToString().Contains(dto.CREATOR) || n.UNAME.Contains(dto.CREATOR)).Select(n => n.EID).Distinct().ToList();
queryData = queryData.Where(n => userFilter.Contains(n.CREATOR));
}
List<string> nowTypeList = new List<string> { "now", "tim" };
if(dto.IndexType == 1)
{
queryData = queryData.Where(n => nowTypeList.Contains(n.SENDTYPE));
}
else
{
queryData = queryData.Where(n => !nowTypeList.Contains(n.SENDTYPE));
}
if (!string.IsNullOrWhiteSpace(dto.SENDTYPE))
{
queryData = queryData.Where(n => n.SENDTYPE == dto.SENDTYPE);
}
if (dto.STATUS.HasValue)
{
queryData = queryData.Where(n => n.STATUS == dto.STATUS);
}
if (dto.xstime.HasValue)
{
queryData = queryData.Where(n => n.CTIME >= dto.xstime);
}
if (dto.xetime.HasValue)
{
queryData = queryData.Where(n => n.CTIME < dto.xetime.Value.AddDays(1));
}
queryData = queryData.OrderByDescending(n => n.CTIME);
PagerUtil.SetPager<MsgToolPlan>(ref queryData, ref pager);
var list = queryData.ToList();
res = BuildPlanCountData(list);
return res;
}
}
public List<MsgToolPlanRepeatViewModel> BuildPlanCountData(List<MsgToolPlan> list)
{
List<MsgToolPlanRepeatViewModel> res = new List<MsgToolPlanRepeatViewModel>();
var userList = _cache.GetUserList();
var groupList = _cache.GetGroupList();
var deptList = _cache.GetList_SalesDepartMent();
UserServices userservices = new UserServices(_cache);
foreach (var item in list)
{
var usercount = item.MsgToolPlanReceives.Where(n => n.TYPE == 3).Count();
var deptIds = item.MsgToolPlanReceives.Where(n => n.TYPE == 1).Select(n=>n.RECEIVERID).ToList();
var groupIds = item.MsgToolPlanReceives.Where(n => n.TYPE == 2).Select(n => n.RECEIVERID).ToList();
var itemUser = userservices.GetAllUserByDeptOrGroup(deptIds, groupIds);
var creator = userList.FirstOrDefault(n => n.EID == item.CREATOR);
usercount = usercount + itemUser.Count();
MsgToolPlanRepeatViewModel newModel = new MsgToolPlanRepeatViewModel
{
PKID = item.PKID,
PLANNAME = item.PLANNAME,
CREATOR = creator != null ? $"{item.CREATOR}-{creator.UNAME}" : "",
ReceiveInfo = usercount > 0? $"{usercount}个人员":"",
SendObject = item.GROUPNAME,
JSONDATA = item.JSONDATA,
SENDTYPE = item.SENDTYPE,
STATUS = item.STATUS,
StatusName = EnumHelper.GetEnumDesc((MsgPlanStatus)item.STATUS),
Cycle = item.PLANEXECYCLE,
Remark = item.REMARK,
Unexec = item.MsgToolTasks.Where(n=>n.STATUS == (int)MsgTaskStatus. || n.STATUS == (int)MsgTaskStatus.).Count(),
Exec = item.MsgToolTasks.Where(n => n.STATUS == (int)MsgTaskStatus.).Count(),
Cancel = item.MsgToolTasks.Where(n => n.STATUS == (int)MsgPlanStatus.).Count(),
SendTypeName = ConvertSendType(item.SENDTYPE),
PLANEXETIME = item.PLANEXETIME,
DUEDATE = item.DUEDATE,
SendTime = item.SENDTIME
};
res.Add(newModel);
}
return res;
}
public string ConvertSendType(string sendtype)
{
switch (sendtype)
{
case "now":
return "立即发布";
case "tim":
return "定时发布";
case "daily":
return "每天循环";
case "week":
return "每周循环";
case "month":
return "每月循环";
}
return "未知";
}
public bool AddMsgPlan(MsgToolPlanCreateDto model)
{
var result = false;
using (var db = new crmContext())
{
CheckDateTime(model);
var plan = db.MsgToolPlan.FirstOrDefault(n => n.PKID == model.PKID);
if (plan==null)
{
//新增
plan = new MsgToolPlan
{
PKID = new SEQUENCES_BL().Seq_master_get(),
PLANNAME = model.PLANNAME,
GROUPID = model.GROUPID,
GROUPNAME = model.GROUPNAME,
GROUPMEMO = model.GROUPMEMO,
CORPIDS = model.CORPIDS,
JSONDATA = model.JSONDATA,
SENDTYPE = model.SENDTYPE,
PLANEXETIME = model.PLANEXETIME,
PLANEXECYCLE = model.PLANEXECYCLE,
PLANEXEHOUR = model.PLANEXEHOUR,
DUEDATE = model.DUEDATE,
CTIME = DateTime.Now,
CREATOR = model.Eid,
REMARK = model.REMARK,
STATUS = model.Type == 2 ?(int)MsgPlanStatus.: (int)MsgPlanStatus.稿
};
db.MsgToolPlan.Add(plan);
if (!string.IsNullOrWhiteSpace(model.ReceiveData))
{
var receiveList = JsonConvert.DeserializeObject<List<ReceiveModel>>(model.ReceiveData);
foreach (var item in receiveList)
{
MsgToolPlanReceive receive = new MsgToolPlanReceive
{
PLANID = plan.PKID,
PKID = new SEQUENCES_BL().Seq_master_get(),
TYPE = item.Type,
RECEIVERID = item.Receiverid
};
db.MsgToolPlanReceive.Add(receive);
}
}
}
else
{
if(plan.STATUS == (int)MsgPlanStatus.)
{
throw new Exception("该计划已分发!");
}
plan.PLANNAME = model.PLANNAME;
//GROUPID = model.GROUPID,
plan.CORPIDS = model.CORPIDS;
plan.JSONDATA = model.JSONDATA.ToString();
plan.SENDTYPE = model.SENDTYPE;
plan.PLANEXETIME = model.SENDTYPE == "now" ? DateTime.Now : model.PLANEXETIME;
plan.PLANEXECYCLE = model.PLANEXECYCLE;
plan.PLANEXEHOUR = model.PLANEXEHOUR;
plan.GROUPID = model.GROUPID;
plan.GROUPNAME = model.GROUPNAME;
plan.GROUPMEMO = model.GROUPMEMO;
plan.DUEDATE = model.DUEDATE;
//plan. = DateTime.Now;
plan.CREATOR = model.Eid;
plan.REMARK = model.REMARK;
plan.STATUS = model.Type == 2 ? (int)MsgPlanStatus.:(int)MsgPlanStatus.稿 ;
if (!string.IsNullOrWhiteSpace(model.ReceiveData))
{
var existReceive = plan.MsgToolPlanReceives;
var receiveList = JsonConvert.DeserializeObject<List<ReceiveModel>>(model.ReceiveData);
var removeList = existReceive.Where(n => !receiveList.Select(x => x.Receiverid).Contains(n.RECEIVERID)).ToList();
db.MsgToolPlanReceive.RemoveRange(removeList);
foreach (var item in receiveList)
{
if (existReceive.FirstOrDefault(n => n.RECEIVERID == item.Receiverid) != null)
{
continue;
}
MsgToolPlanReceive receive = new MsgToolPlanReceive
{
PLANID = plan.PKID,
PKID = new SEQUENCES_BL().Seq_master_get(),
TYPE = item.Type,
RECEIVERID = item.Receiverid
};
db.MsgToolPlanReceive.Add(receive);
}
}
}
db.SaveChanges();
if(model.Type == 2 &&(plan.STATUS == (int)MsgPlanStatus. || plan.STATUS == (int)MsgPlanStatus.稿))
{
result = SendTask(plan);
}
return true;
}
}
public void CheckDateTime(MsgToolPlanCreateDto model)
{
model.PLANEXETIME = model.SENDTYPE == "now" ? DateTime.Now : model.PLANEXETIME;
if (model.Type == 2 && model.SENDTYPE == "tim" && !model.PLANEXETIME.HasValue)
{
throw new Exception("预计开始时间必填");
}
switch (model.SENDTYPE)
{
case "now":
model.DUEDATE = null;
break;
case "tim":
case "daily":
model.PLANEXECYCLE = null;
break;
}
if(model.SENDTYPE != "now" && model.SENDTYPE != "tim")
{
if(model.Type == 2 && (!model.PLANEXEDATE.HasValue || string.IsNullOrWhiteSpace(model.PLANEXEHOUR)))
{
throw new Exception("预计开始日期和开始时间必填");
}
if(model.PLANEXEDATE.HasValue && !string.IsNullOrWhiteSpace(model.PLANEXEHOUR))
{
model.PLANEXETIME = Convert.ToDateTime(model.PLANEXEDATE.Value.ToString("yyyy-MM-dd ") + model.PLANEXEHOUR);
}
else
{
model.PLANEXETIME = null;
}
}
if (model.PLANEXETIME.HasValue && string.IsNullOrWhiteSpace(model.PLANEXEHOUR))
{
model.PLANEXEHOUR = model.PLANEXETIME.Value.ToString("HH:mm:ss");
}
if (model.PLANEXETIME.HasValue && model.DUEDATE.HasValue && model.PLANEXETIME.Value > model.DUEDATE.Value)
{
throw new Exception("截止时间不能小于预计开始时间");
}
if (model.SENDTYPE != "month" && model.SENDTYPE != "week")
{
model.PLANEXECYCLE = "";
}
}
public bool CreateTask(decimal planId)
{
using (var db = new crmContext())
{
var plan = db.MsgToolPlan.FirstOrDefault(n => n.PKID == planId);
if (string.IsNullOrWhiteSpace(plan.JSONDATA))
{
throw new Exception("发送内容不能为空");
}
if (plan.STATUS == (int)MsgPlanStatus. && (plan.SENDTYPE == "now" || plan.SENDTYPE == "tim"))
{
throw new Exception("该计划已分发!");
}
return SendTask(plan);
}
}
public bool CancelTask(decimal planId)
{
using (var db = new crmContext())
{
var plan = db.MsgToolPlan.FirstOrDefault(n => n.PKID == planId);
var url = _cache.GetValue_Parameter("MsgTool_WEBAPI");
url = $"{url}Api/MsgTool/CancelTasksByPlan";
var postData = new { planId = plan.PKID };
Dictionary<string, string> header = new Dictionary<string, string>();
var appid = System.Configuration.ConfigurationManager.AppSettings["appid"];
header.Add("appid", appid);
header.Add("eid", plan.CREATOR.ToString());
var res = Utility.PostAjaxData(url, postData.ToJson(), header, Encoding.UTF8);
var reqInfo = JsonConvert.DeserializeObject<ApiResult<bool>>(res);
if (reqInfo.Code == 0)
{
return true;
}
else
{
throw new Exception(reqInfo.Message);
}
}
}
public bool SendTask(MsgToolPlan plan)
{
if (string.IsNullOrWhiteSpace(plan.JSONDATA) || plan.JSONDATA == "[]")
{
throw new Exception("发送内容不能为空");
}
if(plan.GROUPID == 0)
{
throw new Exception("人群包不能为空");
}
if((plan.SENDTYPE == "month" || plan.SENDTYPE == "week") && (string.IsNullOrWhiteSpace(plan.PLANEXECYCLE) || plan.PLANEXECYCLE == "[]"))
{
throw new Exception("发送周期不能为空");
}
var url = _cache.GetValue_Parameter("MsgTool_WEBAPI");
url = $"{url}Api/MsgTool/TasksByPlan";
var postData = new { planId = plan.PKID };
Dictionary<string, string> header = new Dictionary<string, string>();
var appid = System.Configuration.ConfigurationManager.AppSettings["appid"];
header.Add("appid", appid);
header.Add("eid", plan.CREATOR.ToString());
var res = Utility.PostAjaxData(url, postData.ToJson(), header, Encoding.UTF8);
var reqInfo = JsonConvert.DeserializeObject<ApiResult<bool>>(res);
if (reqInfo.Code == 0)
{
return true;
}
else
{
throw new Exception(reqInfo.Message);
}
}
public MsgEditModel GetMsgPlanEditModel(decimal planId)
{
MsgEditModel model = new MsgEditModel();
using (var db = new crmContext())
{
var userList = _cache.GetUserList();
var groupList = _cache.GetGroupList();
var deptList = _cache.GetList_SalesDepartMent();
var plan = db.MsgToolPlan.FirstOrDefault(n => n.PKID == planId);
var faceListSetting = _cache.GetValue_Parameter("FaceSetting");
List<string> faceList = new List<string>();
if (!string.IsNullOrWhiteSpace(faceListSetting))
{
faceList = JsonConvert.DeserializeObject<List<string>>(faceListSetting);
}
if (plan != null)
{
var receiveData = db.MsgToolPlanReceive.Where(n => n.PLANID == planId).Select(x=>new ReceiveModel { Type =x.TYPE,Receiverid=x.RECEIVERID }).ToList();
List<string> receiveShowText = new List<string>();
foreach(var reItem in receiveData)
{
var uname = "";
switch (reItem.Type)
{
case 1:
uname = deptList.FirstOrDefault(n => n.SALEDEPTID == reItem.Receiverid)?.DEPTNAME;
break;
case 2:
uname = groupList.FirstOrDefault(n => n.GID == reItem.Receiverid)?.GNAME;
break;
case 3:
uname = userList.FirstOrDefault(n => n.EID == reItem.Receiverid)?.UNAME;
break;
}
receiveShowText.Add(uname);
}
model.PKID = plan.PKID;
model.PLANNAME = plan.PLANNAME;
model.CORPIDS = plan.CORPIDS;
model.GROUPID = plan.GROUPID;
model.GROUPNAME = plan.GROUPNAME;
model.GROUPMEMO = plan.GROUPMEMO;
model.ReceiveData = receiveData.ToJson();
model.ShowPeopleText = string.Join(",", receiveShowText);
model.JSONDATA = plan.JSONDATA;
model.SENDTYPE = plan.SENDTYPE;
model.REMARK = plan.REMARK;
model.PLANEXECYCLE = plan.PLANEXECYCLE;
model.PLANEXETIME = plan.PLANEXETIME.HasValue ? plan.PLANEXETIME.Value.ToString("yyyy-MM-dd HH:mm:ss"):"";
model.PLANEXEDATE = plan.PLANEXETIME.HasValue ? plan.PLANEXETIME.Value.ToString("yyyy-MM-dd") : "";
model.PLANEXEHOUR = plan.PLANEXEHOUR;
model.DUEDATE = plan.DUEDATE.HasValue ? plan.DUEDATE.Value.ToString("yyyy-MM-dd HH:mm:ss") : "";
}
return model;
}
}
public List<UserGroupModel> GetGroupList(decimal eid)
{
List<UserGroupModel> result = new List<UserGroupModel>();
var url = _cache.GetValue_Parameter("MsgTool_WEBAPI");
url = $"{url}Api/MsgTool/UserGroupList";
var para = $"eid={eid}";
Dictionary<string, string> header = new Dictionary<string, string>();
var appid = System.Configuration.ConfigurationManager.AppSettings["appid"];
header.Add("appid", appid);
var res = Utility.GetData(url, para,header, Encoding.UTF8);
var reqInfo = JsonConvert.DeserializeObject<ApiResult<List<UserGroupDto>>>(res);
if (reqInfo.Code == 0)
{
foreach(var item in reqInfo.Data)
{
result.Add(new UserGroupModel
{
id=item.Id.ToString(),
text = item.Name,
description = item.Description,
UserCount = item.UserCount,
CustomerCount = item.CustomerCount,
//ShareWay = item.ShareWay
});
}
return result;
}
else
{
throw new Exception(reqInfo.Message);
}
}
}
}