404 lines
18 KiB
C#
404 lines
18 KiB
C#
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<string> 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<WX.CRM.Model.Entity.SMS_BATCHMSG> 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<Model.Entity.SMS_BATCHMSG> lis = query.Skip(startIndex).Take(PageSize).ToList<Model.Entity.SMS_BATCHMSG>();
|
||
var curDate = System.DateTime.Now.Date;
|
||
List<WX.CRM.Model.Entity.SMS_BATCHMSG> lis = db.SMS_BATCHMSG.Where(s => s.CTIME >= curDate).OrderByDescending(p => p.BATCHID).ToList<WX.CRM.Model.Entity.SMS_BATCHMSG>();
|
||
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<WX.CRM.Model.Entity.SMS_BATCHMSGDETAIL> 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<SMS_BATCHMSGDETAIL>();
|
||
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<WX.CRM.Model.Entity.SMS_BATCHMSGDETAIL> 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<decimal> 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<WX.CRM.Model.Entity.SMS_BATCHMSG> 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<WX.CRM.Model.Entity.SMS_BATCHMSG>(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);
|
||
|
||
}
|
||
}
|
||
}
|