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, IMsgToolPlan { CACHE_BL _cache = new CACHE_BL(); BAS_BUSSINESSLINE_BL businessBL = new BAS_BUSSINESSLINE_BL(); public List GetPlanList(ref Laypage pager, MsgToolPlanQueryDto dto) { List res = new List(); 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 ALLdeptIDS = new List(); List ALLgidS = new List(); 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 deptIDS = new List(); List gidS = new List(); 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 nowTypeList = new List { "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(ref queryData, ref pager); var list = queryData.ToList(); res = BuildPlanCountData(list); return res; } } public List BuildPlanCountData(List list) { List res = new List(); 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>(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>(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 header = new Dictionary(); 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>(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 header = new Dictionary(); 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>(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 faceList = new List(); if (!string.IsNullOrWhiteSpace(faceListSetting)) { faceList = JsonConvert.DeserializeObject>(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 receiveShowText = new List(); 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 GetGroupList(decimal eid) { List result = new List(); var url = _cache.GetValue_Parameter("MsgTool_WEBAPI"); url = $"{url}Api/MsgTool/UserGroupList"; var para = $"eid={eid}"; Dictionary header = new Dictionary(); var appid = System.Configuration.ConfigurationManager.AppSettings["appid"]; header.Add("appid", appid); var res = Utility.GetData(url, para,header, Encoding.UTF8); var reqInfo = JsonConvert.DeserializeObject>>(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); } } } }