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, IMsgToolTask { public IWw_huser _iww_hhuser_service = new Ww_huser_BL(); private CACHE_BL _cache = new CACHE_BL(); public List 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 header = new Dictionary(); 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>(res); if (reqInfo.Code == 0) { pager.count = reqInfo.Data.total; return reqInfo.Data.data; } else { throw new Exception(reqInfo.Message); } } public List GetExecuteList(ref Laypage pager, decimal taskid) { List result = new List(); var url = _cache.GetValue_Parameter("MsgTool_WEBAPI"); url = $"{url}Api/MsgTool/ExecuteTaskPage"; var para = "PageIndex=" + pager.page + "&PageSize=" + pager.limit; para += "&TaskId=" + taskid; Dictionary header = new Dictionary(); 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>(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>(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>(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 qiWeiPostJsons = new List(); 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 qiWeiPostJsons = new List(); 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 header = new Dictionary(); 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>(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 header = new Dictionary(); 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>(res); if (reqInfo.Code == 0) { return true; } else { throw new Exception(reqInfo.Message); } } } public List GetTaskCmdDetail(ref Laypage pager, CmdDetailQueryDto dto) { List result = new List(); 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 header = new Dictionary(); 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>(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 header = new Dictionary(); 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>(res); if (reqInfo.Code == 0) { return true; } else { throw new Exception(reqInfo.Message); } } } }