using System; using System.Collections.Generic; using System.Linq; using WX.CRM.BLL.Util; using WX.CRM.Common; using WX.CRM.DAL.Sms; using WX.CRM.IBLL.Sms; using WX.CRM.Model.Entity; using WX.CRM.Model.MAP; namespace WX.CRM.BLL.Sms { public class SMS_BATCHMSG_BL : ISMS_BATCHMSG, ISMS_BATCHMSG_Q { string clientid = Utility.GetSettingByKey("CRMClientKey"); WX.CRM.IBLL.Util.ISecurityHelper sHelper = new SecurityHelper(); DAL.Sms.BATCHMSG_DAL dal = new BATCHMSG_DAL(); private WX.CRM.Model.Entity.crmContext db = new WX.CRM.Model.Entity.crmContext(); public void ImpotDt(WX.CRM.Model.Entity.SMS_BATCHMSG info, List mobils, int timeOut = 300) { var genKey = new BLL.Base.SEQUENCES_BL(); decimal batchId = genKey.Seq_base_get(WX.CRM.Model.Enum.PKIDType.LargeTable); System.Data.DataSet ds = new System.Data.DataSet(); var msgSubTypeModel = db.SMS_MSGSUBTYPE.FirstOrDefault(p => p.SUBTYPEID == info.SUBTYPEID); if (msgSubTypeModel == null) { return; } //主表SMS_BATCHMSG System.Data.DataTable dt1 = new System.Data.DataTable("SMS_BATCHMSG"); dt1.Columns.Add("BATCHID", typeof(decimal)); dt1.Columns.Add("MESSAGE", typeof(string)); dt1.Columns.Add("TYPECODE", typeof(string)); dt1.Columns.Add("SUBTYPEID", typeof(decimal)); dt1.Columns.Add("CLIENTCODE", typeof(string)); dt1.Columns.Add("CTIME", typeof(DateTime)); dt1.Columns.Add("CREATEUSER", typeof(decimal)); System.Data.DataRow r1_1 = dt1.NewRow(); r1_1["BATCHID"] = batchId; r1_1["MESSAGE"] = (new { typeCode = info.TYPECODE, SubTypeCode = msgSubTypeModel.SUBTYPECODE, para = info.MESSAGE }).ToJson(); r1_1["TYPECODE"] = info.TYPECODE ?? ""; r1_1["SUBTYPEID"] = info.SUBTYPEID ?? 0; r1_1["CLIENTCODE"] = info.CLIENTCODE ?? ""; r1_1["CTIME"] = info.CTIME; r1_1["CREATEUSER"] = info.CREATEUSER; dt1.Rows.Add(r1_1); //明细表:SMS_BATCHMSGDETAIL System.Data.DataTable dt2 = new System.Data.DataTable("RES_IMPORTRES_DETAIL"); dt2.Columns.Add("IMPORTID", typeof(decimal)); dt2.Columns.Add("RESID", typeof(string)); dt2.Columns.Add("MOBILE", typeof(string)); dt2.Columns.Add("ENMOBILE", typeof(string)); foreach (string m in mobils) { System.Data.DataRow r2_1 = dt2.NewRow(); r2_1["IMPORTID"] = batchId; r2_1["RESID"] = m; r2_1["MOBILE"] = "0"; r2_1["ENMOBILE"] = "0"; dt2.Rows.Add(r2_1); } ds.Tables.Add(dt1); ds.Tables.Add(dt2); dal.ImpotDt(ds, timeOut); dal.DoImportDt(batchId); } public List GetList(int PageIndex, int PageSize, ref int rcount) { //var query = db.SMS_BATCHMSG.OrderByDescending(p => p.BATCHID); //rcount = query.Count(); //int startIndex = 0; //if (PageIndex > 1) // startIndex = (PageIndex - 1) * PageSize; //List lis = query.Skip(startIndex).Take(PageSize).ToList(); var curDate = System.DateTime.Now.Date; List lis = db.SMS_BATCHMSG.Where(s => s.CTIME >= curDate).OrderByDescending(p => p.BATCHID).ToList(); foreach (var obj in lis) { var msgcodename = db.SMS_MSGTYPE.FirstOrDefault(P => P.TYPECODE == obj.TYPECODE); if (msgcodename != null) obj.map_TYPECODENAME = msgcodename.TYPENAME; var subMsgClient = db.SMS_ACCOUNT.FirstOrDefault(p => p.CLIENTCODE == obj.CLIENTCODE); if (subMsgClient != null) obj.map_CLIENTENAME = subMsgClient.CLIENTNAME; var subuser = db.BAS_INNERUSER.FirstOrDefault(p => p.PKID == obj.CREATEUSER); if (subuser != null) obj.map_CREATEUSERNAME = subuser.UNAME; var shu = db.SMS_BATCHMSGTEMPLATE.FirstOrDefault(p => p.SUBTYPEID == obj.SUBTYPEID); if (shu != null) { string[] str = obj.MESSAGE.Split('|'); obj.MESSAGE = Utility.GetSendMsgModel(str[1], shu.TEMPLATEVALUE); } } return lis; } public WX.CRM.Model.Entity.SMS_BATCHMSG GetTopInfo() { var q = from b in db.SMS_BATCHMSG join d in db.SMS_BATCHMSGDETAIL on b.BATCHID equals d.BATCHID select b; var info = q.OrderBy(p => p.BATCHID).FirstOrDefault(); LogHelper.Info("info:" + info.ToJson()); //Common.LogHelper.Error("【批量短信为空GetTopInfoSql】:" + q.ToString()); if (info == null) return null; info.numberCount = db.SMS_BATCHMSGDETAIL.Where(p => p.BATCHID == info.BATCHID).Count(); var clientCode = info.CLIENTCODE.Trim(); var acc = db.SMS_ACCOUNT.FirstOrDefault(p => p.CLIENTCODE == clientCode); //LogHelper.Info("acc:" + acc.ToJson()); if (acc != null) { info.interfaceCode = acc.SMSSP_CODE; info.interfaceAccount = acc.SMSACCOUNT; info.interfacePwd = acc.SMSPASSWORD; } else { // 如果没有找到对应的发送接口,转移到历史表 //WX.CRM.Model.Entity.SMS_SENDLOG logInfo = new WX.CRM.Model.Entity.SMS_SENDLOG(); //logInfo.SENDID = new BLL.Base.SEQUENCES_BL().Seq_base_get(WX.CRM.Model.Enum.PKIDType.LargeTable); //logInfo.MSGSOURCEID = info.BATCHID; //logInfo.SENDSUCCESS = 0; //logInfo.SENDTIME = System.DateTime.Now; //logInfo.RETURNMSG = "未找到对应的发送接口!"; //db.SMS_SENDLOG.Add(logInfo); //var details = db.SMS_BATCHMSGDETAIL.Where(p => p.BATCHID == info.BATCHID).ToList(); //foreach (var obj in details) //{ // db.SMS_BATCHMSGDETAIL_HIS.Add(new WX.CRM.Model.Entity.SMS_BATCHMSGDETAIL_HIS() // { // PKID = obj.PKID, // RESID = obj.RESID, // BATCHID = obj.BATCHID, // SENDID = logInfo.SENDID, // SENDSUCCESS = logInfo.SENDSUCCESS, // SENDTIME = logInfo.SENDTIME, // CTIME = System.DateTime.Now // }); // db.SMS_BATCHMSGDETAIL.Remove(obj); //} //db.SaveChanges(); LogHelper.Info("acc is null,配置有误" + clientCode); } return info; } public List GetDetailList(int topNum, decimal batchid) { var q = from d in db.SMS_BATCHMSGDETAIL join r in db.RES_RESOURCEMOBILE on d.RESID equals r.RESID into res from rt in res.DefaultIfEmpty() where d.BATCHID == batchid select new { RESID = d.RESID, mobile = rt.MOBILE, PKID = d.PKID, BATCHID = d.BATCHID }; //LogHelper.Error("list:start,clientid:" + clientid); //var lis = q.OrderBy(p => p.PKID).Skip(0).Take(topNum).ToList().Select(c => new WX.CRM.Model.Entity.SMS_BATCHMSGDETAIL //{ // RESID = c.RESID, // mobile = sHelper.decyptData(clientid, c.mobile.ToString().Trim()), // PKID = c.PKID, // BATCHID = c.BATCHID //}).ToList(); var lis = q.OrderBy(p => p.PKID).Take(topNum).ToList(); var list = new List(); foreach (var item in lis) { var mobile = string.Empty; try { mobile = sHelper.decyptData(clientid, item.mobile); } catch { //解密出错手机号码,尝试使用默认进行解密 try { mobile = sHelper.decyptData("gd_crm", item.mobile); } catch { //客户ID没有找到对应的手机号,则转移到历表,并标为发送失败! var delInfo = db.SMS_BATCHMSGDETAIL.FirstOrDefault(p => p.PKID == item.PKID); var his = new SMS_BATCHMSGDETAIL_HIS { PKID = delInfo.PKID, BATCHID = delInfo.BATCHID, CTIME = DateTime.Now, RESID = delInfo.RESID, SENDSUCCESS = 0, SENDTIME = DateTime.Now }; db.SMS_BATCHMSGDETAIL_HIS.Add(his); db.SMS_BATCHMSGDETAIL.Remove(delInfo); db.SaveChanges(); } } if (!string.IsNullOrEmpty(mobile)) list.Add(new SMS_BATCHMSGDETAIL() { RESID = item.RESID, mobile = mobile, PKID = item.PKID, BATCHID = item.BATCHID }); } return list; } public List GetPopularDetailList(int topNum, decimal batchid) { var q = from d in db.SMS_BATCHMSGDETAIL join r in db.RES_RESOURCEMOBILE on d.RESID equals r.RESID join b in db.SMS_RESCODE on d.RESID equals b.RESID into tmp1 from ab in tmp1.DefaultIfEmpty() where d.BATCHID == batchid select new { RESID = d.RESID, mobile = r.MOBILE, PKID = d.PKID, BATCHID = d.BATCHID, numEncry = ab.CODE }; var list = q.OrderBy(p => p.PKID).Skip(0).Take(topNum).ToList().Select(c => new WX.CRM.Model.Entity.SMS_BATCHMSGDETAIL { RESID = c.RESID, mobile = sHelper.decyptData(clientid, c.mobile.ToString().Trim()), PKID = c.PKID, BATCHID = c.BATCHID, numEncry = c.numEncry }).ToList(); foreach (var o in list) { if (string.IsNullOrWhiteSpace(o.numEncry)) { o.numEncry = Common.Utility.Conver10To64Ext((long)o.PKID); } var t = db.SMS_MOBILEPOPULAR.Where(p => p.PKID == o.PKID).FirstOrDefault(); if (t == null) db.SMS_MOBILEPOPULAR.Add(new WX.CRM.Model.Entity.SMS_MOBILEPOPULAR() { PKID = o.PKID, BATCHID = o.BATCHID, RESID = o.RESID, CTIME = System.DateTime.Now, CLICKCOUNT = 0, NUMENCRY = o.numEncry }); } db.SaveChanges(); return list; } public void ExecLog(List detaisIds, WX.CRM.Model.Entity.SMS_SENDLOG logInfo) { string pkids = string.Join(",", detaisIds); if (string.IsNullOrEmpty(pkids)) return; new DAL.Sms.BATCHMSG_DAL().ExecLog(pkids, logInfo.SENDSTR, logInfo.CLIENTCODE, logInfo.MSGSOURCEID, logInfo.RETURNMSG, logInfo.SENDSUCCESS); //try //{ // WX.CRM.Model.Entity.crmContext db1 = new Model.Entity.crmContext(); // logInfo.SENDID = new BLL.Base.SEQUENCES_BL().Seq_base_get(Model.Enum.PKIDType.LargeTable); // db1.SMS_SENDLOG.Add(logInfo); // var details = db1.SMS_BATCHMSGDETAIL.Where(p => detaisIds.Contains(p.PKID)).ToList(); // foreach (var obj in details) // { // Model.Entity.SMS_BATCHMSGDETAIL_HIS o = new Model.Entity.SMS_BATCHMSGDETAIL_HIS(); // o.PKID = obj.PKID; // o.RESID = obj.RESID; // o.BATCHID = obj.BATCHID; // o.SENDID = logInfo.SENDID; // o.SENDSUCCESS = logInfo.SENDSUCCESS; // o.SENDTIME = logInfo.SENDTIME; // o.CTIME = System.DateTime.Now; // db1.SMS_BATCHMSGDETAIL_HIS.Add(o); // db1.SMS_BATCHMSGDETAIL.Remove(obj); // } // db1.SaveChanges(); //} //catch (System.Data.Entity.Validation.DbEntityValidationException ex) //{ // Common.LogHelper.Error("=====1111111ExecLog" + ex.Message + ex.EntityValidationErrors + ex.StackTrace); // foreach (var er in ex.EntityValidationErrors) // { // Common.LogHelper.Error("【"+er.ToString() + "#" + er.ValidationErrors.First().PropertyName + "#" + er.ValidationErrors.First().ErrorMessage+"】"); // } // throw; //} //catch (Exception ex) //{ // Common.LogHelper.Error("==222222222ExecLog" + ex.Message + ex.StackTrace); // throw; //} } public List GetList(ref Pager pager, string Stime, string Etime, string msgType, QueryUserComboDto userComboDto) { using (var db = new WX.CRM.Model.Entity.crmContext()) { var queryData = db.SMS_BATCHMSG.AsQueryable(); if (!string.IsNullOrEmpty(msgType) && msgType != "0") { msgType = msgType.Trim(); queryData = queryData.Where(m => m.TYPECODE == msgType); } DateTime dt; if (!string.IsNullOrWhiteSpace(Stime) && DateTime.TryParse(Stime, out dt)) queryData = queryData.Where(a => a.CTIME >= dt); DateTime dt2; if (!string.IsNullOrWhiteSpace(Etime) && DateTime.TryParse(Etime, out dt2)) { //dt2 = dt2.AddDays(1); queryData = queryData.Where(a => a.CTIME <= dt2); } if (userComboDto.userId.HasValue) { queryData = queryData.Where(m => m.CREATEUSER == userComboDto.userId.Value); } else if (!string.IsNullOrEmpty(userComboDto.groupIds)) { decimal[] _groupids = OperationUtil.ConvertToDecimal(userComboDto.groupIds.Split(',')); var userIds = db.BAS_INNERUSERGROUP.Where(m => _groupids.Contains(m.GID.Value)).Select(m => m.INNERUSERID); queryData = queryData.Where(m => userIds.Contains(m.CREATEUSER)); } else if (!string.IsNullOrEmpty(userComboDto.deptId)) { decimal[] _saleDeptId = OperationUtil.ConvertToDecimal(userComboDto.deptId.Split(',')); var groupIds = db.BAS_INNERGROUP.Where(m => _saleDeptId.Contains(m.SALEDEPTID.Value)).Select(p => p.GID).ToList(); var userIds = (from a in db.BAS_INNERUSERGROUP where groupIds.Contains(a.GID.Value) select a.INNERUSERID); queryData = queryData.Where(a => userIds.Contains(a.CREATEUSER)); } else if (userComboDto.companyId.HasValue) { queryData = from a in queryData join u in db.BAS_INNERUSER on a.CREATEUSER equals u.PKID join ug in db.BAS_INNERUSERGROUP on u.PKID equals ug.INNERUSERID join g in db.BAS_INNERGROUP on ug.GID equals g.GID join d in db.BAS_SALESDEPARTMENT on g.SALEDEPTID equals d.SALEDEPTID where d.COMPANYID == userComboDto.companyId.Value select a; } queryData = queryData.OrderByDescending(m => m.CTIME); PagerUtil.SetPager(ref queryData, ref pager); var obj = queryData.ToList(); return obj; } } public System.Data.DataSet GetMessageList(ref Pager pager, string resid, int? rn, DateTime? stime, DateTime? etime) { return dal.GetMessageList(ref pager, resid, rn, stime, etime); } public void ImpotDtResCode(int timeOut = 300) { System.Data.DataSet ds = new System.Data.DataSet(); //主表SMS_BATCHMSG System.Data.DataTable dt1 = new System.Data.DataTable("SMS_RESCODE"); dt1.Columns.Add("CODE", typeof(string)); dt1.Columns.Add("RESID", typeof(string)); string s = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; char[] c = new char[4]; for (int i = 0; i < s.Length; i++) { c[0] = s[i]; for (int j = 0; j < s.Length; j++) { c[1] = s[j]; for (int k = 0; k < s.Length; k++) { c[2] = s[k]; for (int n = 0; n < s.Length; n++) { c[3] = s[n]; string r = new string(c); System.Data.DataRow r1_1 = dt1.NewRow(); r1_1["CODE"] = r; r1_1["RESID"] = ""; dt1.Rows.Add(r1_1); } } } } ds.Tables.Add(dt1); dal.ImpotDtResCode(ds, timeOut); } } }