477 lines
22 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|
|
}
|