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

522 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.BLL.Ww;
using WX.CRM.Common;
using WX.CRM.Common.Layui;
using WX.CRM.Common.StockHelper;
using WX.CRM.IBLL.MsgTool;
using WX.CRM.IBLL.Ww;
using WX.CRM.Model;
using WX.CRM.Model.Entity;
using WX.CRM.Model.Enum;
using WX.CRM.Model.Ww;
namespace WX.CRM.BLL.MsgTool
{
public class MsgToolTask_BL : DbContextRepository<MsgToolTask>, IMsgToolTask
{
public IWw_huser _iww_hhuser_service = new Ww_huser_BL();
private CACHE_BL _cache = new CACHE_BL();
public List<MsgToolTaskViewModel> GetTaskList(ref Laypage pager, MsgToolPlanQueryDto dto)
{
var url = _cache.GetValue_Parameter("MsgTool_WEBAPI");
url = $"{url}Api/MsgTool/MsgToolTaskPage";
var para = "PageIndex=" + pager.page + "&PageSize=" + pager.limit;
if (dto.txt_userId.HasValue)
{
para += "&UserId=" + dto.txt_userId;
}
if (!string.IsNullOrEmpty(dto.txt_deptId))
{
para += "&DeptId=" + dto.txt_deptId;
}
if (!string.IsNullOrEmpty(dto.txt_groupIds))
{
para += "&GroupIds=" + dto.txt_groupIds;
}
if (!string.IsNullOrWhiteSpace(dto.PLANNAME))
{
para += "&PlanName=" + dto.PLANNAME;
}
if (!string.IsNullOrWhiteSpace(dto.CREATOR))
{
para += "&Creator=" + dto.CREATOR;
}
para += "&IndexType=" + dto.IndexType;
if (!string.IsNullOrWhiteSpace(dto.SENDTYPE))
{
para += "&SendType=" + dto.SENDTYPE;
}
if (dto.STATUS.HasValue)
{
para += "&Status=" + dto.STATUS;
}
if (dto.xstime.HasValue)
{
para += "&Stime=" + dto.xstime;
}
if (dto.xetime.HasValue)
{
para += "&Etime=" + dto.xetime;
}
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, 20000);
var reqInfo = JsonConvert.DeserializeObject<ApiResult<TaskReturnModel>>(res);
if (reqInfo.Code == 0)
{
pager.count = reqInfo.Data.total;
return reqInfo.Data.data;
}
else
{
throw new Exception(reqInfo.Message);
}
}
public List<MsgToolExecuteViewModel> GetExecuteList(ref Laypage pager, decimal taskid)
{
List<MsgToolExecuteViewModel> result = new List<MsgToolExecuteViewModel>();
var url = _cache.GetValue_Parameter("MsgTool_WEBAPI");
url = $"{url}Api/MsgTool/ExecuteTaskPage";
var para = "PageIndex=" + pager.page + "&PageSize=" + pager.limit;
para += "&TaskId=" + taskid;
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, 20000);
var reqInfo = JsonConvert.DeserializeObject<ApiResult<ExecListModel>>(res);
if (reqInfo.Code == 0)
{
pager.count = reqInfo.Data.total;
result = reqInfo.Data.data;
}
else
{
throw new Exception(reqInfo.Message);
}
return result;
}
public string ConvertSendType(string sendtype)
{
switch (sendtype)
{
case "now":
return "立即发布";
case "tim":
return "定时发布";
case "daily":
return "每天循环";
case "week":
return "每周循环";
case "month":
return "每月循环";
}
return "未知";
}
public void CheckDateTime(MsgToolTaskCreateDto model)
{
model.PLANEXETIME = model.SENDTYPE == "now" ? DateTime.Now : model.PLANEXETIME;
if (model.Type == 2 && model.SENDTYPE == "tim" && model.SENDTYPE != "daily" && !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)
{
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 AddMsgTask(MsgToolTaskCreateDto model)
{
var result = false;
using (var db = new crmContext())
{
CheckDateTime(model);
var task = db.MsgToolTask.FirstOrDefault(n => n.PKID == model.PKID);
if (task == null)
{
//新增
task = new MsgToolTask
{
PKID = new SEQUENCES_BL().Seq_master_get(),
PLANNAME = model.PLANNAME,
//GROUPID = model.GROUPID,
RECEIVERID = model.Eid,
CORPIDS = model.CORPIDS,
GROUPID = model.GROUPID,
GROUPMEMO = model.GROUPMEMO,
GROUPNAME = model.GROUPNAME,
JSONDATA = model.JSONDATA,
SENDTYPE = model.SENDTYPE,
PLANEXETIME = model.SENDTYPE == "now" ? DateTime.Now : model.PLANEXETIME,
PLANEXECYCLE = model.PLANEXECYCLE,
DUEDATE = model.DUEDATE,
CTIME = DateTime.Now,
CREATOR = model.Eid,
REMARK = model.REMARK,
TASKTYPE = model.TaskType,
STATUS = model.Type == 2 ? (int)MsgPlanStatus. : (int)MsgPlanStatus.稿
};
model.PKID = task.PKID;
db.MsgToolTask.Add(task);
}
else
{
if (task.RECEIVERID != model.Eid)
{
throw new Exception("不能操作非本人任务!");
}
if (task.STATUS == (int)MsgPlanStatus. && (task.SENDTYPE == "now" || task.SENDTYPE == "tim"))
{
throw new Exception("不能编辑已经分发的任务");
}
task.PLANNAME = model.PLANNAME;
//GROUPID = model.GROUPID,
task.CORPIDS = model.CORPIDS;
task.JSONDATA = model.JSONDATA;
task.SENDTYPE = model.SENDTYPE;
task.PLANEXETIME = model.SENDTYPE == "now" ? DateTime.Now : model.PLANEXETIME;
task.PLANEXECYCLE = model.PLANEXECYCLE;
task.PLANEXEHOUR = model.PLANEXEHOUR;
task.DUEDATE = model.DUEDATE;
task.GROUPNAME = model.GROUPNAME;
task.GROUPID = model.GROUPID;
task.GROUPMEMO = model.GROUPMEMO;
task.TASKTYPE = model.TaskType;
//plan. = DateTime.Now;
task.CREATOR = model.Eid;
task.REMARK = model.REMARK;
task.STATUS = model.Type == 2 ? (int)MsgPlanStatus. : (int)MsgPlanStatus.稿;
}
var hasKfDetail = false;
//当任务类型为企微类型时候 要处理
if (task.TASKTYPE == 2 && !string.IsNullOrWhiteSpace(model.QiWeiPostJson))
{
//先删除所有的任务关系
var oldLabDetail = db.MsgToolTaskLabDetail.Where(n => n.TASKID == task.PKID).ToList();
db.MsgToolTaskLabDetail.RemoveRange(oldLabDetail);
var qwJson = JsonConvert.DeserializeObject<List<QiWeiPostJson>>(model.QiWeiPostJson);
foreach (var item in qwJson)
{
foreach (var outuser in item.outuserList)
{
MsgToolTaskLabDetail labDetail = new MsgToolTaskLabDetail
{
CORPID = item.corpid,
KFUSERID = item.userid,
EXTUSERID = outuser.userid,
NICKNAME = outuser.name,
KFNICKNAME = item.kfnickname,
CORPNAME = item.corpname,
PAGETYPE = item.pagetype,
CTIME = DateTime.Now,
TASKID = task.PKID,
PKID = new SEQUENCES_BL().Seq_master_get(),
};
db.MsgToolTaskLabDetail.Add(labDetail);
}
hasKfDetail = true;
}
}
if (task.TASKTYPE == 1 && !string.IsNullOrWhiteSpace(model.QiWeiPostJson))
{
var oldLabDetail = db.MsgToolTaskKFDetail.Where(n => n.TASKID == task.PKID).ToList();
db.MsgToolTaskKFDetail.RemoveRange(oldLabDetail);
var qwJson = JsonConvert.DeserializeObject<List<QiWeiPostJson>>(model.QiWeiPostJson);
foreach (var item in qwJson)
{
MsgToolTaskKFDetail labDetail = new MsgToolTaskKFDetail
{
CORPID = item.corpid,
KFUSERID = item.userid,
KFNICKNAME = item.kfnickname,
CORPNAME = item.corpname,
CTIME = DateTime.Now,
TASKID = task.PKID,
PKID = new SEQUENCES_BL().Seq_master_get(),
};
db.MsgToolTaskKFDetail.Add(labDetail);
hasKfDetail = true;
}
}
db.SaveChanges();
if (model.Type == 2 && (task.STATUS == (int)MsgPlanStatus. || task.STATUS == (int)MsgPlanStatus.稿))
{
if (task.TASKTYPE == 2 && !hasKfDetail)
{
throw new Exception("请先勾选企微账户");
}
if (task.TASKTYPE == 1 && string.IsNullOrWhiteSpace(task.CORPIDS) && !hasKfDetail)
{
throw new Exception("请先选择企微账户或企业微信");
}
result = SendTask(task);
}
return true;
}
}
public string BuildQiweiJson(MsgToolTask task)
{
using (var db = new crmContext())
{
if (task.TASKTYPE == 2)
{
var labDetail = db.MsgToolTaskLabDetail.Where(n => n.TASKID == task.PKID).ToList();
List<QiWeiPostJson> qiWeiPostJsons = new List<QiWeiPostJson>();
if (labDetail.Count > 0)
{
var groupLab = labDetail.GroupBy(n => new { n.CORPID, n.KFUSERID, n.CORPNAME, n.KFNICKNAME, n.PAGETYPE }).ToList();
foreach (var lab in groupLab)
{
QiWeiPostJson newJson = new QiWeiPostJson
{
corpid = lab.Key.CORPID,
userid = lab.Key.KFUSERID,
kfnickname = lab.Key.KFNICKNAME,
pagetype = lab.Key.PAGETYPE,
corpname = lab.Key.CORPNAME
};
var outUser = labDetail.Where(n => n.KFUSERID == lab.Key.KFUSERID && n.CORPID == lab.Key.CORPID).ToList();
newJson.outuserList = outUser.Select(n => new OutUserList { userid = n.EXTUSERID, name = n.NICKNAME }).ToList();
qiWeiPostJsons.Add(newJson);
}
return qiWeiPostJsons.ToJson();
}
}
else
{
var kfDetail = db.MsgToolTaskKFDetail.Where(n => n.TASKID == task.PKID).ToList();
List<QiWeiPostJson> qiWeiPostJsons = new List<QiWeiPostJson>();
if (kfDetail.Count > 0)
{
foreach (var kv in kfDetail)
{
QiWeiPostJson newJson = new QiWeiPostJson
{
corpid = kv.CORPID,
userid = kv.KFUSERID,
kfnickname = kv.KFNICKNAME,
corpname = kv.CORPNAME
};
qiWeiPostJsons.Add(newJson);
}
return qiWeiPostJsons.ToJson();
}
}
return "";
}
}
public MsgEditTaskModel GetMsgTaskEditModel(decimal id)
{
MsgEditTaskModel model = new MsgEditTaskModel();
using (var db = new crmContext())
{
var task = db.MsgToolTask.FirstOrDefault(n => n.PKID == id);
if (task != null)
{
model.QiWeiPostJson = BuildQiweiJson(task);
model.PKID = task.PKID;
model.PLANNAME = task.PLANNAME;
model.CORPIDS = task.CORPIDS;
model.RECEIVERID = task.RECEIVERID;
model.GROUPID = task.GROUPID;
model.GROUPNAME = task.GROUPNAME;
model.GROUPMEMO = task.GROUPMEMO;
model.JSONDATA = task.JSONDATA;
model.SENDTYPE = task.SENDTYPE;
model.REMARK = task.REMARK;
model.PLANEXECYCLE = task.PLANEXECYCLE;
model.PLANEXETIME = task.PLANEXETIME.HasValue ? task.PLANEXETIME.Value.ToString("yyyy-MM-dd HH:mm:ss") : "";
model.PLANEXEDATE = task.PLANEXETIME.HasValue ? task.PLANEXETIME.Value.ToString("yyyy-MM-dd") : "";
model.PLANEXEHOUR = task.PLANEXEHOUR;
model.DUEDATE = task.DUEDATE.HasValue ? task.DUEDATE.Value.ToString("yyyy-MM-dd HH:mm:ss") : "";
model.TaskType = task.TASKTYPE;
}
return model;
}
}
public bool CreateTask(decimal taskid)
{
using (var db = new crmContext())
{
var task = db.MsgToolTask.FirstOrDefault(n => n.PKID == taskid);
if (task.STATUS == (int)MsgPlanStatus. || task.STATUS == (int)MsgPlanStatus.稿)
{
if (task.TASKTYPE == 2)
{
var oldLabDetail = db.MsgToolTaskLabDetail.Where(n => n.TASKID == task.PKID).ToList();
if (oldLabDetail.Count() == 0)
{
throw new Exception("请先勾选企微账户");
}
}
if (task.TASKTYPE == 1 && string.IsNullOrWhiteSpace(task.CORPIDS))
{
var kfDetail = db.MsgToolTaskKFDetail.Where(n => n.TASKID == task.PKID).ToList();
if (kfDetail.Count == 0)
{
throw new Exception("请先选择企微账户或企业微信");
}
}
return SendTask(task);
}
}
return false;
}
public bool SendTask(MsgToolTask task)
{
if (string.IsNullOrWhiteSpace(task.JSONDATA) || task.JSONDATA == "[]")
{
throw new Exception("发送内容不能为空");
}
if (task.GROUPID == 0 && task.TASKTYPE != 2)
{
throw new Exception("人群包不能为空");
}
if ((task.SENDTYPE == "month" || task.SENDTYPE == "week") && (string.IsNullOrWhiteSpace(task.PLANEXECYCLE) || task.PLANEXECYCLE == "[]"))
{
throw new Exception("发送周期不能为空");
}
var url = _cache.GetValue_Parameter("MsgTool_WEBAPI");
url = $"{url}Api/MsgTool/TaskCmdByTaskId";
var postData = new { TaskId = task.PKID };
Dictionary<string, string> header = new Dictionary<string, string>();
var appid = System.Configuration.ConfigurationManager.AppSettings["appid"];
header.Add("appid", appid);
header.Add("eid", task.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 CancelTask(decimal taskId)
{
using (var db = new crmContext())
{
var task = db.MsgToolTask.FirstOrDefault(n => n.PKID == taskId);
var url = _cache.GetValue_Parameter("MsgTool_WEBAPI");
url = $"{url}Api/MsgTool/CancelTaskCmd";
var postData = new { TaskId = task.PKID };
Dictionary<string, string> header = new Dictionary<string, string>();
var appid = System.Configuration.ConfigurationManager.AppSettings["appid"];
header.Add("appid", appid);
header.Add("eid", task.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 List<CmdDetailDto> GetTaskCmdDetail(ref Laypage pager, CmdDetailQueryDto dto)
{
List<CmdDetailDto> result = new List<CmdDetailDto>();
var url = _cache.GetValue_Parameter("MsgTool_WEBAPI");
var para = "PageIndex=" + pager.page + "&PageSize=" + pager.limit;
para += $"&cmdId={dto.cmdId}";
if (!string.IsNullOrWhiteSpace(dto.name))
{
para += $"&name={dto.name}";
}
url = $"{url}Api/MsgTool/TaskCmdDetail";
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, 10000);
var reqInfo = JsonConvert.DeserializeObject<ApiResult<CmdDetailListModel>>(res);
if (reqInfo.Code == 0)
{
pager.count = reqInfo.Data.total;
result = reqInfo.Data.data;
}
return result;
}
public bool SetCmdDetailEnable(SetCmdEnableDto data)
{
var url = _cache.GetValue_Parameter("MsgTool_WEBAPI");
url = $"{url}Api/MsgTool/SetCmdDetailEnable";
Dictionary<string, string> header = new Dictionary<string, string>();
var appid = System.Configuration.ConfigurationManager.AppSettings["appid"];
header.Add("appid", appid);
var res = Utility.PostAjaxData(url, data.ToJson(), header, Encoding.UTF8);
var reqInfo = JsonConvert.DeserializeObject<ApiResult<bool>>(res);
if (reqInfo.Code == 0)
{
return true;
}
else
{
throw new Exception(reqInfo.Message);
}
}
}
}