一个学校项目中需要使用手机短信群发功能,一些重要消息需要向学生、教师、学生家长的短信群发,可按照学校、年级、班级进行发送,可以导入文件群发,根据需求,实现效果:
前端功能界面
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CXs0zaHRGcWdUYuVzVa9GczoVdG1mWfVGc5RHLwIzX39GZhh2csATMflHLwEzX4xSZz91ZsAzMfRHLGZkRGZkRfJ3bs92YskmNhVTYykVNQJVMRhXVEF1X0hXZ0xCNx8VZ6l2cssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL0MjZxgjZyIzYhVGZyQWZmVDM4QzN4kjMiJWZhJjN2gDZ1YDN2I2LcVDMyIDMy8CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
实现按年级发送,年级列表是该校所有年级的列表,选择具体的年级,可将短信发送给该年级的全部学生。
选择某个年级以后,列出该年级的全部班级,选择要发送的班级,实现按班级的发送。
选择具体的班级,列表出该班级的全部学生,选择学生,实现向指定的学生发送手机短信。
左侧菜单下面的教师短信、年级短信、班级短信也是类似处理,只是做了权限的判断,年级短信由年级管理员发送,班级短信由班主任发送。
后台功能实现
1、短信发送的实现,使用接收类型判断,将按学校、年级、班级、学生发送的用一个方法处理,为避免短信误发,增加了10分钟内不允许再次发送,同时增加了短信预览的功能;
同时短信中的变量也会替换成与接收者有关的对应的值。
/// <summary>
/// 发送短信
/// </summary>
/// <param name="receiverType">接收对象 年级grades,班级classes,学生students</param>
/// <param name="ids">接收对象Id</param>
/// <param name="message">短信内容</param>
/// <param name="otherphones">同时发到其它号码</param>
/// <param name="isPreview">是否是预览短信</param>
/// <returns></returns>
public ActionResult SendSMS(string receiverType, string ids, string message, string otherphones, bool isPreview)
{
BaseResult baseResult = new BaseResult();
// 判断是否能够发送短信
if (!SMSHelper.CanSendSMS(UserHelper.UserInfo) && !isPreview)
{
baseResult.status = false;
baseResult.message = "发送短信时间间隔不能小于10分钟。";
return Json(baseResult, JsonRequestBehavior.AllowGet);
}
string previewResult = string.Empty;
if (string.IsNullOrWhiteSpace(receiverType) || string.IsNullOrWhiteSpace(ids) || string.IsNullOrWhiteSpace(message))
{
baseResult.status = false;
baseResult.message = "参数不能为空";
return Json(baseResult, JsonRequestBehavior.AllowGet);
}
// 替换发送者姓名
string realName = UserHelper.UserInfo.RealName;
if (isPreview)
{
realName = "<span style='color:blue'>" + realName + "</span>";
}
message = message.Replace("{发送者姓名}", realName);
bool needContinue = true;
string[] receverIds = ids.Split(',');
List<string> listResult = new List<string>();
try
{
baseResult.status = true;
baseResult.message = "短信已提交成功";
// 判断接收对象
if (receiverType.Equals("grades", StringComparison.CurrentCultureIgnoreCase))
{
//List<BaseStudentEntity> baseClassEntities = SMSHelper.GetAllStudentByBatchIds(ids);
// 向指定的年级发送
// 先添加到发送表中,然后用后台程序读取表中数据逐条发送
//List<BaseStudentEntity> baseClassEntities = SMSHelper.GetAllStudentByBatchIds(ids);
// 循环年级
foreach (var id in receverIds)
{
if (!needContinue)
{
break;
}
// 获取班级
List<BaseClassEntity> baseClassEntities = SMSHelper.GetClassByBatchId(id);
if (baseClassEntities != null && baseClassEntities.Any())
{
// 循环全部班级
for (int i = 0; i < baseClassEntities.Count; i++)
{
SMSHelper.SendSMSToClass(message, baseClassEntities[i], out previewResult, isPreview);
if (isPreview && string.IsNullOrWhiteSpace(previewResult))
{
continue;
}
listResult.Add(previewResult);
if (isPreview && listResult.Count > 2)
{
previewResult = string.Join("<br/>", listResult);
needContinue = false;
break;
}
}
}
}
}
else if (receiverType.Equals("classes", StringComparison.CurrentCultureIgnoreCase))
{
// 循环班级
foreach (var id in receverIds)
{
BaseClassEntity baseClassEntity = new BaseClassManager().GetObject(id);
SMSHelper.SendSMSToClass(message, baseClassEntity, out previewResult, isPreview);
if (isPreview && string.IsNullOrWhiteSpace(previewResult))
{
continue;
}
listResult.Add(previewResult);
if (isPreview && listResult.Count > 2)
{
previewResult = string.Join("<br/>", listResult);
break;
}
}
}
else if (receiverType.Equals("students", StringComparison.CurrentCultureIgnoreCase))
{
// 循环学生发送
foreach (var id in receverIds)
{
BaseStudentEntity studentEntity = new BaseStudentManager().GetObject(id);
if (studentEntity != null)
{
// 取到该学生所在班级 获取班主任信息
BaseClassEntity baseClassEntity = new BaseClassManager().GetObject(studentEntity.ClassId);
// 获取班主任姓名 班主任手机
BaseTeacherEntity headTeacherEntity = new BaseTeacherManager().GetObject(baseClassEntity.HeadTeacherId);
// 替换有关班主任的信息
message = SMSHelper.ChangeMessageByHeadTeacher(message, headTeacherEntity);
SMSHelper.AddSMSSentLogToStudent(message, studentEntity, out previewResult, isPreview);
if (isPreview && string.IsNullOrWhiteSpace(previewResult))
{
continue;
}
listResult.Add(previewResult);
if (isPreview && listResult.Count > 2)
{
previewResult = string.Join("<br/>", listResult);
break;
}
}
}
}
else if (receiverType.Equals("phones", StringComparison.CurrentCultureIgnoreCase))
{
// 向手机号码发送 ids 是手机号码
SMSHelper.AddSMSSentLog(message, ids, out previewResult, isPreview);
}
else
{
baseResult.status = false;
baseResult.message = "receiverType参数不正确";
}
}
catch (Exception ex)
{
baseResult.status = false;
baseResult.message = "系统异常:" + ex.Message;
}
// 向另外指定的手机号码同时发送
if (!string.IsNullOrWhiteSpace(otherphones))
{
SMSHelper.AddSMSSentLog(message, otherphones, out previewResult, isPreview);
}
// 如果是预览
if (isPreview)
{
baseResult.message = previewResult;
}
return Json(baseResult, JsonRequestBehavior.AllowGet);
}
2、具体发送功能,实现将待发短信插入到表中及异步调用短信发送接口。
/// <summary>
/// 短信发给指定班级
/// </summary>
/// <param name="message"></param>
/// <param name="baseClassEntity"></param>
/// <param name="previewResult"></param>
/// <param name="isPreview"></param>
public static void SendSMSToClass(string message, BaseClassEntity baseClassEntity, out string previewResult, bool isPreview = false)
{
previewResult = string.Empty;
// 获取班主任姓名 班主任手机
BaseTeacherEntity headTeacherEntity = new BaseTeacherManager().GetObject(baseClassEntity.HeadTeacherId);
message = SMSHelper.ChangeMessageByHeadTeacher(message, headTeacherEntity, isPreview);
SMSSentLogManager smsSentLogManager = new SMSSentLogManager();
// 获取班级的全部学生
List<BaseStudentEntity> studentEntities = SMSHelper.GetClassAllStudent(baseClassEntity.Id);
if (studentEntities != null && studentEntities.Any())
{
for (int j = 0; j < studentEntities.Count; j++)
{
SMSHelper.AddSMSSentLogToStudent(message, studentEntities[j], out previewResult, isPreview);
if (isPreview)
{
break;
}
}
}
}
/// <summary>
/// 将要向学生发送的信息先添加到发送表中
/// </summary>
/// <param name="message"></param>
/// <param name="studentEntity"></param>
/// <param name="previewResult"></param>
/// <param name="isPreview"></param>
public static void AddSMSSentLogToStudent(string message, BaseStudentEntity studentEntity, out string previewResult, bool isPreview = false)
{
previewResult = string.Empty;
SMSSentLogManager smsSentLogManager = new SMSSentLogManager();
if (message.Contains("{接收者姓名}"))
{
string studentName = studentEntity.StudentName;
if (isPreview)
{
studentName = "<span style='color:blue'>" + studentName + "</span>";
}
message = message.Replace("{接收者姓名}", studentName);
}
// 获取预览短信的内容
if (isPreview)
{
previewResult = message;
return;
}
// 将短信内容添加到发送表中
SMSSentLogEntity smsSentLogEntity = new SMSSentLogEntity();
smsSentLogEntity.SystemCode = BaseSystemInfo.SystemCode;
// 短信内容
smsSentLogEntity.MessageID = Guid.NewGuid().ToString();
smsSentLogEntity.MessageContent = Regex.Replace(message, @"\r\n", "");
smsSentLogEntity.MessageCount = (int)Math.Ceiling(message.Length / 65.0); ;
// 发送者
smsSentLogEntity.SendCompanyId = UserHelper.UserInfo.CompanyId;
smsSentLogEntity.SendCompanyName = UserHelper.UserInfo.CompanyName;
smsSentLogEntity.SendCompanyCode = UserHelper.UserInfo.CompanyCode;
smsSentLogEntity.SendUserId = UserHelper.UserInfo.Id;
smsSentLogEntity.SendUserName = UserHelper.UserInfo.UserName;
smsSentLogEntity.SendUserCode = UserHelper.UserInfo.Code;
// 接受者
smsSentLogEntity.ReceiverUserId = studentEntity.Id;
smsSentLogEntity.ReceiverUserName = studentEntity.StudentName;
smsSentLogEntity.ReceiverUserMobile = studentEntity.Phone;
smsSentLogEntity.ReceiverType = "student";
// 短信创建时间
smsSentLogEntity.CreateTime = DateTime.Now;
//发送时间不要设置
smsSentLogEntity.SendTime = null;
smsSentLogManager.Add(smsSentLogEntity);
// 异步调用短信发送接口
SendDaHanTask(smsSentLogEntity.MessageID, smsSentLogEntity.ReceiverUserMobile, smsSentLogEntity.MessageContent);
}
3、异步短信发送,调用第三方短信接口,实现短信的异步发送及短信状态的获取。
/// <summary>
/// 异步发送短信
/// </summary>
/// <param name="msgid"></param>
/// <param name="phone"></param>
/// <param name="content"></param>
/// <returns></returns>
public static async Task SendDaHanTask(string msgid, string phone, string content)
{
SendDaHan(msgid, phone, content);
}
/// <summary>
/// 发送短信
/// </summary>
/// <param name="msgid">记录guid</param>
/// <param name="phone">手机号</param>
/// <param name="content">短信内容</param>
/// <returns></returns>
public static string SendDaHan(string msgid, string phone, string content)
{
string result = string.Empty;
// 发送短信
string account = "XXX";
string password = "YYYY";
string url = MobileHost + "/http/sms/Submit";
string subcode = null;
// string msgid = null;
string sendtime = null;
string sign = null;
string message = DocXml(account, password, msgid, phone, content, subcode, sendtime, sign);
string xmlResult = Post(url, message);
// Clipboard.SetText(xmlResult);
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.LoadXml(xmlResult);
string selectPath = "//response/msgid";
XmlNodeList xmlNodeList = xmlDocument.SelectNodes(selectPath);
foreach (XmlNode xmlNode in xmlNodeList)
{
if (xmlNode.Name.Equals("msgid"))
{
// System.Console.WriteLine(xmlNode.FirstChild.Value);
result = xmlNode.FirstChild.Value;
}
}
/*
selectPath = "//response/result";
xmlNodeList = xmlDocument.SelectNodes(selectPath);
foreach (XmlNode xmlNode in xmlNodeList)
{
if (xmlNode.Name.Equals("result"))
{
System.Console.WriteLine(xmlNode.FirstChild.Value);
}
}
*/
return result;
}
/// <summary>
/// 向服务器发送POST数据
/// </summary>
/// <param name="url"></param>
/// <param name="message"></param>
/// <returns></returns>
public static string Post(string url, string message)
{
WebClient webClient = new WebClient();
NameValueCollection postValues = new NameValueCollection();
postValues.Add("message", message);
//向服务器发送POST数据
byte[] responseArray = webClient.UploadValues(url, postValues);
return Encoding.UTF8.GetString(responseArray);
}
/// <summary>
/// MD5运算(32位小写)
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static string md5(string str)
{
byte[] result = Encoding.Default.GetBytes(str);
MD5 md5 = new MD5CryptoServiceProvider();
byte[] output = md5.ComputeHash(result);
String md = BitConverter.ToString(output).Replace("-", "");
return md.ToLower();
}
/// <summary>
/// 封装xml
/// </summary>
/// <param name="account"></param>
/// <param name="password"></param>
/// <param name="msgid"></param>
/// <param name="phones"></param>
/// <param name="content"></param>
/// <param name="subcode"></param>
/// <param name="sendtime"></param>
/// <param name="sign"></param>
/// <returns></returns>
public static string DocXml(string account, string password, string msgid, string phones, string content, string subcode, string sendtime, string sign)
{
XmlDocument doc = new XmlDocument();
XmlNode xmlnode = doc.CreateXmlDeclaration("1.0", "utf-8", null);
doc.AppendChild(xmlnode);
XmlElement xe1 = doc.CreateElement("response");
XmlElement sub1 = doc.CreateElement("account");
sub1.InnerText = account;
xe1.AppendChild(sub1);
XmlElement sub2 = doc.CreateElement("password");
sub2.InnerText = md5(password);
xe1.AppendChild(sub2);
XmlElement sub3 = doc.CreateElement("msgid");
sub3.InnerText = msgid;
xe1.AppendChild(sub3);
XmlElement sub4 = doc.CreateElement("phones");
sub4.InnerText = phones;
xe1.AppendChild(sub4);
XmlElement sub5 = doc.CreateElement("content");
sub5.InnerText = content;
xe1.AppendChild(sub5);
XmlElement sub6 = doc.CreateElement("subcode");
sub6.InnerText = subcode;
xe1.AppendChild(sub6);
XmlElement sub7 = doc.CreateElement("sendtime");
sub7.InnerText = sendtime;
xe1.AppendChild(sub7);
XmlElement sub8 = doc.CreateElement("sign");
sub8.InnerText = sign;
xe1.AppendChild(sub8);
doc.AppendChild(xe1);
return xe1.OuterXml;
}
/// <summary>
/// 获取发送状态
/// </summary>
/// <returns>影响行数</returns>
public static int GatawayStatusDaHan()
{
int result = 0;
string account = "XXX";
string password = md5("YYY");
string smsId = string.Empty;
string url = MobileHost + "/http/sms/Report";
string phone = string.Empty;
//String data = "account=" + account + "&password=" + password + "&phone=" + phone + "&smsId=" + smsId;
string message = "<?xml version='1.0' encoding='UTF-8'?><message>"
+ "<account>" + account + "</account>" + "<password>"
+ password + "</password>"
+ "<msgid>" + smsId + "</msgid><phone>" + phone + "</phone></message>";
string xmlResult = Post(url, message);
// txtResult.Text = xmlResult;
// Clipboard.SetText(xmlResult);
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.LoadXml(xmlResult);
string selectPath = "//response/report";
XmlNodeList xmlNodeList = xmlDocument.SelectNodes(selectPath);
result = 0;
using (IDbHelper dbHelper = DbHelperFactory.GetHelper(BaseSystemInfo.UserCenterDbType, BaseSystemInfo.UserCenterDbConnection))
{
dbHelper.Open();
foreach (XmlNode xmlNode in xmlNodeList)
{
// System.Console.WriteLine(xmlNode["wgcode"].InnerText);
// System.Console.WriteLine(xmlNode["msgid"].InnerText);
string msgid = xmlNode["msgid"].InnerText;
string status = xmlNode["status"].InnerText;
string wgcode = xmlNode["wgcode"].InnerText;
if (status.Equals("0"))
{
wgcode = "DELIVRD";
}
else
{
if (string.IsNullOrEmpty(wgcode))
{
wgcode = status;
}
}
string sqlQuery = @"UPDATE SMSSentLog SET GatawayStatus = " + dbHelper.GetParameter("GatawayStatus") + " WHERE Channel = " + dbHelper.GetParameter("Channel") + " AND MessageID = " + dbHelper.GetParameter("MessageID") + "";
dbHelper.ExecuteNonQuery(sqlQuery, new[] { dbHelper.MakeParameter("GatawayStatus", wgcode), dbHelper.MakeParameter("Channel", 3), dbHelper.MakeParameter("MessageID", msgid) });
result++;
}
dbHelper.Close();
}
// 若有状态报告,继续读取状态
if (result > 40)
{
GatawayStatusDaHan();
}
//Console.WriteLine(DateTime.Now.ToString(BaseSystemInfo.DateTimeFormat) + " GatawayStatusDaHan ..." + result);
return result;
}
表结构
发送的短信存储在表中,目前的表创建语句:
CREATE TABLE [dbo].[SMSSentLog](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Channel] [tinyint] NULL,
[SystemCode] [nvarchar](50) NULL,
[SendCompanyId] [varchar](50) NULL,
[SendCompanyCode] [nvarchar](20) NULL,
[SendCompanyName] [nvarchar](20) NULL,
[SendUserId] [varchar](50) NULL,
[SendUserCode] [nvarchar](20) NULL,
[SendUserName] [nvarchar](20) NULL,
[MessageID] [varchar](50) NOT NULL,
[MessageCode] [nvarchar](50) NULL,
[MessageContent] [nvarchar](1000) NOT NULL,
[MessageCount] [tinyint] NOT NULL,
[ReceiverUserId] [varchar](50) NULL,
[ReceiverUserName] [varchar](50) NULL,
[ReceiverUserMobile] [varchar](40) NOT NULL,
[ReceiverType] [varchar](20) NULL,
[IsWapPush] [int] NULL,
[WapUrl] [varchar](200) NULL,
[CreateTime] [datetime] NOT NULL,
[SendType] [int] NOT NULL,
[SendTime] [datetime] NULL,
[GatawayStatus] [varchar](20) NULL,
CONSTRAINT [PK_SmsSentLog] PRIMARY KEY CLUSTERED
(
[Id] DESC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'短信通道' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SMSSentLog', @level2type=N'COLUMN',@level2name=N'Channel'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'发送短信的系统编号' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SMSSentLog', @level2type=N'COLUMN',@level2name=N'SystemCode'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'学校ID' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SMSSentLog', @level2type=N'COLUMN',@level2name=N'SendCompanyId'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'学校编号' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SMSSentLog', @level2type=N'COLUMN',@level2name=N'SendCompanyCode'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'学校名称' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SMSSentLog', @level2type=N'COLUMN',@level2name=N'SendCompanyName'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'发送者的Id' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SMSSentLog', @level2type=N'COLUMN',@level2name=N'SendUserId'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'发送者的Code' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SMSSentLog', @level2type=N'COLUMN',@level2name=N'SendUserCode'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'发送者的登录账号' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SMSSentLog', @level2type=N'COLUMN',@level2name=N'SendUserName'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'消息Id,回复时将对这个' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SMSSentLog', @level2type=N'COLUMN',@level2name=N'MessageID'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'短信类型' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SMSSentLog', @level2type=N'COLUMN',@level2name=N'MessageCode'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'消息内容' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SMSSentLog', @level2type=N'COLUMN',@level2name=N'MessageContent'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'消息条数,用于统计' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SMSSentLog', @level2type=N'COLUMN',@level2name=N'MessageCount'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'接收者用户Id,注意可能不是学生' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SMSSentLog', @level2type=N'COLUMN',@level2name=N'ReceiverUserId'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'接收者项目' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SMSSentLog', @level2type=N'COLUMN',@level2name=N'ReceiverUserName'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'接收者手机号码' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SMSSentLog', @level2type=N'COLUMN',@level2name=N'ReceiverUserMobile'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'接收对象的类型:学生、教师' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SMSSentLog', @level2type=N'COLUMN',@level2name=N'ReceiverType'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'是WAPPUSH短信?' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SMSSentLog', @level2type=N'COLUMN',@level2name=N'IsWapPush'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'WAPPUSH链接' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SMSSentLog', @level2type=N'COLUMN',@level2name=N'WapUrl'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'短信添加时间,添加的同时并不是发送的时间' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SMSSentLog', @level2type=N'COLUMN',@level2name=N'CreateTime'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'发送类型' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SMSSentLog', @level2type=N'COLUMN',@level2name=N'SendType'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'短信发送时间' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SMSSentLog', @level2type=N'COLUMN',@level2name=N'SendTime'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'网关状态,短信发送后的状态 发送状态码(成功,失败,异常等)' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SMSSentLog', @level2type=N'COLUMN',@level2name=N'GatawayStatus'
GO
ALTER TABLE [dbo].[SMSSentLog] ADD CONSTRAINT [DF_SMSSentLog_Channel] DEFAULT ((1)) FOR [Channel]
GO
ALTER TABLE [dbo].[SMSSentLog] ADD CONSTRAINT [DF_SMSSentLog_Channel1] DEFAULT ((1)) FOR [MessageCount]
GO
ALTER TABLE [dbo].[SMSSentLog] ADD CONSTRAINT [DF_SmsSentLog_CreateTime] DEFAULT (getdate()) FOR [CreateTime]
GO
ALTER TABLE [dbo].[SMSSentLog] ADD CONSTRAINT [DF_SMSSentLog_SendTime] DEFAULT (getdate()) FOR [SendTime]
GO