Commit 0ed24383 authored by 吴春's avatar 吴春

提交代码

parent fa037662
......@@ -273,5 +273,14 @@ namespace Edu.Common
return _isOnline;
}
}
public static int IsSendMsg {
get
{
int.TryParse(ReadConfigKey("IsSendMsg"), out int _isSendMsg);
return _isSendMsg;
}
}
}
}
\ No newline at end of file
......@@ -16,6 +16,11 @@ namespace Edu.Common.Enum.Public
/// 阿里云
/// </summary>
[EnumField("阿里云")]
Alicloud = 2
Alicloud = 2,
/// <summary>
/// 系统
/// </summary>
[EnumField("系统")]
System = 3
}
}
using System;
using System.Collections.Generic;
using System.Text;
using Edu.Common.Plugin;
namespace Edu.Common.Enum.System
{
public enum BaseTemplateTypeEnum
{
/// <summary>
/// 订单下单成功通知
/// </summary>
[EnumField("订单下单成功通知")]
OrderSuccess = 1,
/// <summary>
/// 订单下单失败通知
/// </summary>
[EnumField("订单下单失败通知")]
OrderFail = 2
}
}
using System;
using System.Collections.Generic;
using System.Text;
using Edu.Common.Plugin;
namespace Edu.Common.Enum.System
{
public enum MsgSendStatusEnum
{
//发送状态1:等待回执,2:发送失败,3:发送成功。
/// <summary>
/// 等待回执
/// </summary>
[EnumField("等待回执")]
InReceipt = 1,
/// <summary>
/// 发送失败
/// </summary>
[EnumField("发送失败")]
Fail = 2,
/// <summary>
/// 发送成功
/// </summary>
[EnumField("发送成功")]
Success = 3,
}
}
using System;
using System.Collections.Generic;
using System.Text;
using Edu.Common.Enum.Public;
using Edu.Common.Enum.System;
using VT.FW.DB;
namespace Edu.Model.Entity.System
{
/// <summary>
/// 短信发送记录实体表
/// </summary>
[Serializable]
[DB(ConnectionName = "DefaultConnection")]
public class RB_Msg_BaseTemplate
{
public int ID { get; set; }
/// <summary>
/// 集团编号
/// </summary>
public int Group_Id { get; set; }
/// <summary>
/// 模板状态,0-正常,1-禁用
/// </summary>
public int TemplateStaus { get; set; }
public BaseTemplateTypeEnum BaseTemplateType { get; set; }
/// <summary>
/// 存储位置,1-腾讯云,2-阿里,3-其他
/// </summary>
public StoreTypeEnum StoreType { get; set; }
/// <summary>
/// 签名
/// </summary>
public string Sign { get; set; }
/// <summary>
/// 消息配置信息
/// </summary>
public string TemplateId { get; set; }
/// <summary>
/// 创建人
/// </summary>
public int CreateBy { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime CreateDate { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Text;
using Edu.Common.Enum.System;
using VT.FW.DB;
namespace Edu.Model.Entity.System
......@@ -36,10 +37,10 @@ namespace Edu.Model.Entity.System
public DateTime CreateDate { get; set; }
/// <summary>
/// 发送状态1-失败,2-成功
/// 发送状态1:等待回执,2:发送失败,3:发送成功。
/// </summary>
public int SendStatus { get; set; }
public MsgSendStatusEnum? SendStatus { get; set; }
/// <summary>
......@@ -67,5 +68,17 @@ namespace Edu.Model.Entity.System
/// 接收人电话
/// </summary>
public string ReceiverPhone { get; set; }
/// <summary>
/// 存储位置,1-腾讯云,2-阿里,3-其他
/// </summary>
public Common.Enum.Public.StoreTypeEnum StoreType { get; set; }
/// <summary>
/// 消息配置信息
/// </summary>
public string MsgConfigure { get; set; }
}
}
......@@ -56,6 +56,10 @@ namespace Edu.Model.Public
/// </summary>
public string CustomDomain { get; set; }
/// <summary>
/// 上传域名
/// </summary>
public string UploadDomain { get; set; }
/// <summary>
/// 自定义域名
......@@ -65,7 +69,7 @@ namespace Edu.Model.Public
/// 自定义域名
/// </summary>
public string SecretId { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Text;
using Edu.Model.Entity.System;
namespace Edu.Model.ViewModel.System
{
public class RB_Msg_BaseTemplate_ViewModel: RB_Msg_BaseTemplate
{
/// <summary>
/// 创建时间字符串
/// </summary>
public string CreateDateStr
{
get
{
return Common.ConvertHelper.FormatTime(this.CreateDate);
}
}
public string BaseTemplateTypeStr { get; set; }
}
}
......@@ -28,5 +28,8 @@ namespace Edu.Model.ViewModel.System
/// </summary>
public string EndDate { get; set; }
public RB_Msg_Base_ViewModel MsgBase { get; set; }
}
}
......@@ -9,6 +9,13 @@
<ProjectReference Include="..\Edu.Common\Edu.Common.csproj" />
<ProjectReference Include="..\Edu.Model\Edu.Model.csproj" />
<ProjectReference Include="..\Edu.Repository\Edu.Repository.csproj" />
<ProjectReference Include="..\Edu.ThirdCore\Edu.ThirdCore.csproj" />
</ItemGroup>
<ItemGroup>
<Reference Include="aliyun-net-sdk-dysmsapi">
<HintPath>..\Edu.ThirdCore\lib\aliyun-net-sdk-dysmsapi.dll</HintPath>
</Reference>
</ItemGroup>
</Project>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Edu.Common.Enum;
using Edu.Model.Entity.System;
using Edu.Model.ViewModel.System;
using Edu.Repository.System;
using VT.FW.DB;
using Aliyun.Net.SDK.Core;
namespace Edu.Module.System
{
......@@ -21,6 +23,11 @@ namespace Edu.Module.System
/// </summary>
private readonly RB_Msg_BaseRepository msgBaseRepository = new RB_Msg_BaseRepository();
/// <summary>
/// 短信模板配置仓储层对象
/// </summary>
private readonly RB_Msg_BaseTemplateRepository msgBaseTemplateRepository = new RB_Msg_BaseTemplateRepository();
#region 短信记录
......@@ -42,7 +49,7 @@ namespace Edu.Module.System
/// <summary>
/// 获取班级列表
/// 获取短信配置列表
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
......@@ -52,7 +59,7 @@ namespace Edu.Module.System
}
/// <summary>
/// 获取班级分页列表
/// 获取短信配置列表
/// </summary>
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
......@@ -76,7 +83,8 @@ namespace Edu.Module.System
{
{ nameof(RB_Msg_Base.CreateDate),model.CreateDate},
{ nameof(RB_Msg_Base.CreateBy),model.CreateBy},
{ nameof(RB_Msg_Base.MsgConfigure),model.MsgConfigure}
{ nameof(RB_Msg_Base.StoreType),model.StoreType},
{ nameof(RB_Msg_Base.MsgConfigure),model.MsgConfigure}
};
return msgBaseRepository.Update(fileds, new WhereHelper(nameof(RB_Msg_Base.ID), model.ID));
}
......@@ -111,5 +119,194 @@ namespace Edu.Module.System
return msgBaseRepository.Update(fileds, new WhereHelper(nameof(RB_Msg_Base.ID), ID));
}
#endregion
#region 短信模板配置
/// <summary>
/// 获取短信模板配置列表
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
public List<RB_Msg_BaseTemplate_ViewModel> GetMsgBaseTemplateListModule(RB_Msg_BaseTemplate_ViewModel query)
{
return msgBaseTemplateRepository.GetListRepository(query);
}
/// <summary>
/// 获取短信模板配置分页列表
/// </summary>
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
/// <param name="rowsCount"></param>
/// <param name="query"></param>
/// <returns></returns>
public List<RB_Msg_BaseTemplate_ViewModel> GetMsgBaseTemplatePageListModule(int pageIndex, int pageSize, out long rowsCount, RB_Msg_BaseTemplate_ViewModel query)
{
return msgBaseTemplateRepository.GetPageListRepository(pageIndex, pageSize, out rowsCount, query);
}
/// <summary>
/// 新增修改 短信模板配置
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public bool SetMsgBaseTemplateModule(RB_Msg_BaseTemplate_ViewModel model)
{
if (model.ID > 0)
{
Dictionary<string, object> fileds = new Dictionary<string, object>()
{
{ nameof(RB_Msg_BaseTemplate_ViewModel.CreateDate),model.CreateDate},
{ nameof(RB_Msg_BaseTemplate_ViewModel.CreateBy),model.CreateBy},
{ nameof(RB_Msg_BaseTemplate_ViewModel.TemplateStaus),model.TemplateStaus},
{ nameof(RB_Msg_BaseTemplate_ViewModel.TemplateId),model.TemplateId},
{ nameof(RB_Msg_BaseTemplate_ViewModel.StoreType),model.StoreType},
{ nameof(RB_Msg_BaseTemplate_ViewModel.Sign),model.Sign},
{ nameof(RB_Msg_BaseTemplate_ViewModel.BaseTemplateType),model.BaseTemplateType}
};
return msgBaseTemplateRepository.Update(fileds, new WhereHelper(nameof(RB_Msg_BaseTemplate_ViewModel.ID), model.ID));
}
else
{
var newId = msgBaseTemplateRepository.Insert(model);
return newId > 0;
}
}
/// <summary>
/// 根据短信模板配置编号获取短信配置详细信息
/// </summary>
/// <param name="ClassId"></param>
/// <returns></returns>
public RB_Msg_BaseTemplate_ViewModel GetMsgBaseTemplateModule(object ClassId)
{
return msgBaseTemplateRepository.GetEntity<RB_Msg_BaseTemplate_ViewModel>(ClassId);
}
/// <summary>
/// 删除短信模板配置
/// </summary>
/// <param name="ClassId"></param>
/// <returns></returns>
public bool RemoveMsgBaseTemplateModule(object ID)
{
Dictionary<string, object> fileds = new Dictionary<string, object>()
{
{ nameof(RB_Msg_BaseTemplate_ViewModel.TemplateStaus),(int)DateStateEnum.Delete},
};
return msgBaseTemplateRepository.Update(fileds, new WhereHelper(nameof(RB_Msg_BaseTemplate_ViewModel.ID), ID));
}
#endregion
#region 发送短信统一方法
public void SendMsg(object PhoneMessage, Common.Enum.System.BaseTemplateTypeEnum BaseTemplateType, RB_Msg_Log msgLogModel)
{
//查询当前集团的短信基础配置
var msgBaseList = msgBaseRepository.GetListRepository(new RB_Msg_Base_Function_ViewModel { Group_Id = msgLogModel.Group_Id });
//查询当前下面是否有模板
var allMsgBaseTemplateList = msgBaseTemplateRepository.GetListRepository(new RB_Msg_BaseTemplate_ViewModel { BaseTemplateType = BaseTemplateType, Group_Id = msgLogModel.Group_Id }).Where(x => x.TemplateStaus == 0);
if (msgBaseList != null && msgBaseList.Any() && allMsgBaseTemplateList != null && allMsgBaseTemplateList.Any())
{
RB_Msg_Base_Function_ViewModel model = new RB_Msg_Base_Function_ViewModel(); // msgBaseList.OrderBy(x => x.ID).FirstOrDefault();
if (allMsgBaseTemplateList.Where(x => x.BaseTemplateType == BaseTemplateType).GroupBy(x => x.StoreType).Count() > 1)
{
model = msgBaseList.OrderBy(x => x.ID).FirstOrDefault();
}
else
{
model = msgBaseList.Where(x => x.StoreType == allMsgBaseTemplateList.FirstOrDefault().StoreType).FirstOrDefault();
}
if (model != null && model.ID > 0)
{
if (!string.IsNullOrWhiteSpace(model.MsgConfigure))
{
msgLogModel.StoreType = model.StoreType;
msgLogModel.MsgConfigure = model.MsgConfigure;
int id = msgLogRepository.Insert(msgLogModel);
model.MsgBase = Common.Plugin.JsonHelper.DeserializeObject<RB_Msg_Base_ViewModel>(model.MsgConfigure);
var msgBaseTemplateList = allMsgBaseTemplateList.Where(x => x.BaseTemplateType == BaseTemplateType);
if (!string.IsNullOrWhiteSpace(model.MsgBase.AccessKeyId) && !string.IsNullOrWhiteSpace(model.MsgBase.AccessSecret) && !string.IsNullOrWhiteSpace(model.MsgBase.Domain) && !string.IsNullOrWhiteSpace(model.MsgBase.RegionId))
{
if (msgBaseTemplateList != null && msgBaseTemplateList.Any(x => x.TemplateStaus == 0))
{
var msgBaseTemplateModel = msgBaseTemplateList.Where(x => x.TemplateStaus == 0).FirstOrDefault();
if (Common.Config.IsSendMsg == 1)
{
ThirdCore.Message.SMSService.SendMsg(msgLogModel.ReceiverPhone, PhoneMessage, msgBaseTemplateModel.TemplateId, msgBaseTemplateModel.Sign, model.MsgBase.Domain, model.MsgBase.AccessKeyId, model.MsgBase.AccessSecret, model.MsgBase.RegionId, id.ToString());
}
}
}
}
}
}
// ThirdCore.Message.SMSService.SendMsg("13551132417", PhoneMessage, "SMS_201722097", "印象之旅", "dysmsapi.aliyuncs.com", "LTAIwE7l9dImZSa3", "j47Ajn0d0WzUCIX8Biyj3P2r8QDltI", "cn-hangzhou");
}
/// <summary>
/// 更新消息发送状态
/// </summary>
public void UpdateMsgSendStatus()
{
var list = msgLogRepository.GetListRepository(new RB_Msg_Log { SendStatus = Common.Enum.System.MsgSendStatusEnum.InReceipt });
foreach (var item in list.GroupBy(x => new { x.ReceiverPhone, x.StoreType, x.MsgConfigure, CreateDate = x.CreateDate.ToString("yyyyMMdd") }))
{
if (item.Key.StoreType == Common.Enum.Public.StoreTypeEnum.Alicloud)
{
try
{
RB_Msg_Base_ViewModel msgBase = new RB_Msg_Base_ViewModel();
if (!string.IsNullOrWhiteSpace(item.Key.MsgConfigure))
{
msgBase = Common.Plugin.JsonHelper.DeserializeObject<RB_Msg_Base_ViewModel>(item.Key.MsgConfigure);
}
Aliyun.Acs.Dysmsapi.Model.V20170525.QuerySendDetailsResponse querySendDetailsResponse = Edu.ThirdCore.Message.MessageCore.QuerySendDetails(item.Key.ReceiverPhone, DateTime.Now.ToString("yyyyMMdd"), "", msgBase.Domain, msgBase.AccessKeyId, msgBase.AccessSecret, msgBase.RegionId);
if (querySendDetailsResponse.Code == "OK")
{
if (querySendDetailsResponse.SmsSendDetailDTOs != null && querySendDetailsResponse.SmsSendDetailDTOs.Any())
{
foreach (var modelSmsSendDetailDTO in querySendDetailsResponse.SmsSendDetailDTOs)
{
int sendStatus = 1;
if (modelSmsSendDetailDTO != null && !string.IsNullOrWhiteSpace(modelSmsSendDetailDTO.OutId))
{
sendStatus = (int)(modelSmsSendDetailDTO.SendStatus ?? 1);
}
if (sendStatus > 1)
{
Dictionary<string, object> fileds = new Dictionary<string, object>()
{
{ nameof(RB_Msg_Log.SendStatus),sendStatus}
};
msgLogRepository.Update(fileds, new WhereHelper(nameof(RB_Msg_Log.ID), Convert.ToInt32(modelSmsSendDetailDTO.OutId)));
}
}
}
}
}
catch (Exception ex)
{
}
}
}
}
#endregion
}
}
......@@ -7,7 +7,7 @@ using Edu.Model.ViewModel.System;
namespace Edu.Repository.System
{
public class RB_Msg_BaseRepository:BaseRepository<RB_Msg_Base>
public class RB_Msg_BaseRepository : BaseRepository<RB_Msg_Base>
{
/// <summary>
/// 表名称
......@@ -22,7 +22,7 @@ namespace Edu.Repository.System
public List<RB_Msg_Base_Function_ViewModel> GetListRepository(RB_Msg_Base_Function_ViewModel query)
{
StringBuilder builder = new StringBuilder();
builder.Append($" SELECT * FROM {TableName} ");
builder.Append($" SELECT * FROM {TableName} where Status=0 ");
if (query != null)
{
if (query.Group_Id > 0)
......@@ -31,9 +31,9 @@ namespace Edu.Repository.System
}
if (query.StoreType > 0)
{
builder.Append($" AND {nameof(RB_Msg_Base.StoreType)}={query.StoreType}");
builder.Append($" AND {nameof(RB_Msg_Base.StoreType)}={(int)query.StoreType}");
}
}
return Get<RB_Msg_Base_Function_ViewModel>(builder.ToString()).ToList();
......@@ -48,7 +48,7 @@ namespace Edu.Repository.System
public List<RB_Msg_Base_Function_ViewModel> GetPageListRepository(int pageIndex, int pageSize, out long rowsCount, RB_Msg_Base_Function_ViewModel query)
{
StringBuilder builder = new StringBuilder();
builder.Append($" SELECT * FROM {TableName} where 1=1 ");
builder.Append($" SELECT * FROM {TableName} where Status=0 ");
if (query != null)
{
if (query.Group_Id > 0)
......@@ -57,7 +57,7 @@ namespace Edu.Repository.System
}
if (query.StoreType > 0)
{
builder.Append($" AND {nameof(RB_Msg_Base.StoreType)}={query.StoreType}");
builder.Append($" AND {nameof(RB_Msg_Base.StoreType)}={(int)query.StoreType}");
}
}
......
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Edu.Model.Entity.System;
using Edu.Model.ViewModel.System;
namespace Edu.Repository.System
{
/// <summary>
/// 短信模板仓储层
/// </summary>
public class RB_Msg_BaseTemplateRepository : BaseRepository<RB_Msg_BaseTemplate>
{
/// <summary>
/// 表名称
/// </summary>
public string TableName { get { return nameof(RB_Msg_BaseTemplate); } }
/// <summary>
/// 获取短信模板配置信息
/// </summary>
/// <param name="query">查询条件</param>
/// <returns></returns>
public List<RB_Msg_BaseTemplate_ViewModel> GetListRepository(RB_Msg_BaseTemplate_ViewModel query)
{
StringBuilder builder = new StringBuilder();
builder.Append($" SELECT * FROM {TableName} where 1=1 ");
if (query != null)
{
if (query.Group_Id > 0)
{
builder.Append($" AND {nameof(RB_Msg_BaseTemplate.Group_Id)}={query.Group_Id}");
}
if (query.StoreType > 0)
{
builder.Append($" AND {nameof(RB_Msg_BaseTemplate.StoreType)}={(int)query.StoreType}");
}
if (query.BaseTemplateType > 0)
{
builder.Append($" AND {nameof(RB_Msg_BaseTemplate.BaseTemplateType)}={(int)query.BaseTemplateType}");
}
}
return Get<RB_Msg_BaseTemplate_ViewModel>(builder.ToString()).ToList();
}
/// <summary>
/// 获取短信模板配置信息
/// </summary>
/// <param name="query">查询条件</param>
/// <returns></returns>
public List<RB_Msg_BaseTemplate_ViewModel> GetPageListRepository(int pageIndex, int pageSize, out long rowsCount, RB_Msg_BaseTemplate_ViewModel query)
{
StringBuilder builder = new StringBuilder();
builder.Append($" SELECT * FROM {TableName} where 1=1 ");
if (query != null)
{
if (query.Group_Id > 0)
{
builder.Append($" AND {nameof(RB_Msg_BaseTemplate.Group_Id)}={query.Group_Id}");
}
if (query.StoreType > 0)
{
builder.Append($" AND {nameof(RB_Msg_BaseTemplate.StoreType)}={(int)query.StoreType}");
}
if (query.BaseTemplateType > 0)
{
builder.Append($" AND {nameof(RB_Msg_BaseTemplate.BaseTemplateType)}={(int)query.BaseTemplateType}");
}
}
return GetPage<RB_Msg_BaseTemplate_ViewModel>(pageIndex, pageSize, out rowsCount, builder.ToString()).ToList();
}
}
}
......@@ -21,7 +21,7 @@ namespace Edu.Repository.System
public List<RB_Msg_Log> GetListRepository(RB_Msg_Log query)
{
StringBuilder builder = new StringBuilder();
builder.Append($" SELECT * FROM {TableName} ");
builder.Append($" SELECT * FROM {TableName} where 1=1 ");
if (query != null)
{
if (query.Group_Id > 0)
......@@ -32,7 +32,7 @@ namespace Edu.Repository.System
{
builder.Append($" AND {nameof(RB_Msg_Log.School_Id)}={query.School_Id}");
}
if (query.SendStatus > 0)
if (query.SendStatus.HasValue&& query.SendStatus > 0)
{
builder.Append($" AND {nameof(RB_Msg_Log.SendStatus)}={(int)query.SendStatus}");
}
......@@ -62,7 +62,7 @@ namespace Edu.Repository.System
builder.Append($" AND {nameof(RB_Msg_Log.School_Id)}={query.School_Id}");
}
if (query.SendStatus > 0)
if (query.SendStatus.HasValue && query.SendStatus > 0)
{
builder.Append($" AND {nameof(RB_Msg_Log.SendStatus)}={(int)query.SendStatus}");
}
......
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<Folder Include="Oss\" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Aliyun.Net.SDK.Core" Version="1.0.3" />
<PackageReference Include="Aliyun.OSS.SDK.NetCore" Version="2.10.0" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
</ItemGroup>
<ItemGroup>
<Reference Include="aliyun-net-sdk-core">
<HintPath>lib\aliyun-net-sdk-core.dll</HintPath>
</Reference>
<Reference Include="aliyun-net-sdk-dysmsapi">
<HintPath>lib\aliyun-net-sdk-dysmsapi.dll</HintPath>
</Reference>
</ItemGroup>
</Project>
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Threading;
using Aliyun.Acs.Core;
using Aliyun.Acs.Core.Exceptions;
using Aliyun.Acs.Core.Profile;
using Aliyun.Acs.Dysmsapi.Model.V20170525;
namespace Edu.ThirdCore.Message
{
/// <summary>
/// 消息发送中心
/// </summary>
public class MessageCore
{
private static bool IsFinish = true;
public static void Init()
{
while (QueueHelper.Queue.Count == 0 || !IsFinish)
{
Thread.Sleep(1000);
};
IsFinish = false;
string content = QueueHelper.Queue.Dequeue() as string;
Run(content);
Init();
}
public static void Run(string content)
{
try
{
JObject obj = JObject.Parse(content);
switch (obj["cmd"].ToString().ToLower())
{
case "sms":
SendSMS(obj);
break;
default:
break;
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
IsFinish = true;
}
private static void SendSMS(JObject obj)
{
SendSmsRequest request = new SendSmsRequest();
try
{
String product = "Dysmsapi";//短信API产品名称(短信产品名固定,无需修改)
String domain = obj["Domain"].ToString(); //短信API产品域名(接口地址固定,无需修改)
String accessKeyId = obj["AccessKeyId"].ToString();
String accessKeySecret = obj["AccessKeySecret"].ToString();
IClientProfile profile = DefaultProfile.GetProfile(obj["RegionId"].ToString(), accessKeyId, accessKeySecret);
DefaultProfile.AddEndpoint(obj["RegionId"].ToString(), obj["RegionId"].ToString(), product, domain);
IAcsClient acsClient = new DefaultAcsClient(profile);
//必填:待发送手机号。支持以逗号分隔的形式进行批量调用,批量上限为1000个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式
request.PhoneNumbers = obj["phoneNumber"].ToString();
request.SignName = obj["SignName"].ToString(); //aliSms["signName"].ToString();
//必填:短信模板-可在短信控制台中找到
request.TemplateCode = obj["templateCode"].ToString();
//可选:模板中的变量替换JSON串,如模板内容为"您的验证码为${code}"时,此处的值为
request.TemplateParam = obj["templateParam"].ToString();
//可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
request.OutId = obj["OutId"].ToString();
//请求失败这里会抛ClientException异常
SendSmsResponse sendSmsResponse = acsClient.GetAcsResponse(request);
if (!sendSmsResponse.Code.Equals("OK"))
{
var data = new { phoneNumber = obj["phoneNumber"].ToString(), templateParam = obj["templateParam"].ToString(), code = sendSmsResponse.Code, message = sendSmsResponse.Message };
//return data;
}
var datatst = new { phoneNumber = obj["phoneNumber"].ToString(), templateParam = obj["templateParam"].ToString(), code = sendSmsResponse.Code, message = sendSmsResponse.Message };
//return datatst;
// Mall.Common.Plugin.LogHelper.WriteInfo(JsonConvert.SerializeObject(datatst));
}
catch (Aliyun.Acs.Core.Exceptions.ServerException ex)
{
var data = new { phoneNumber = obj["phoneNumber"].ToString(), templateParam = obj["templateParam"].ToString(), code = "NO", message = ex.ToString() };
// return data;
//LogHelper.Write(ex, "SendSMS1");
}
catch (ClientException ex)
{
var data = new { phoneNumber = obj["phoneNumber"].ToString(), templateParam = obj["templateParam"].ToString(), code = "NO", message = ex.ToString() };
// return data;
// LogHelper.Write(ex, "SendSMS2");
}
}
/// <summary>
/// java调用
/// </summary>
/// <param name="obj"></param>
public static string SendSMSToJava(string phoneNumber, string templateCode, string templateParam, string SignName, string Domain, string AccessKeyId, string AccessKeySecret, string RegionId)
{
SendSmsRequest request = new SendSmsRequest();
try
{
//JObject aliSms = Config.AliSms;
//String product = "Dysmsapi";//短信API产品名称(短信产品名固定,无需修改)
//String domain = "dysmsapi.aliyuncs.com";//短信API产品域名(接口地址固定,无需修改)
//String accessKeyId = aliSms["accessKeyId"].ToString();
//String accessKeySecret = aliSms["accessKeySecret"].ToString();
//IClientProfile profile = DefaultProfile.GetProfile("cn-hangzhou", accessKeyId, accessKeySecret);
//DefaultProfile.AddEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
String product = "Dysmsapi";//短信API产品名称(短信产品名固定,无需修改)
String domain = Domain; //短信API产品域名(接口地址固定,无需修改)
String accessKeyId = AccessKeyId;
String accessKeySecret = AccessKeySecret;
IClientProfile profile = DefaultProfile.GetProfile(RegionId, accessKeyId, accessKeySecret);
DefaultProfile.AddEndpoint(RegionId, RegionId, product, domain);
IAcsClient acsClient = new DefaultAcsClient(profile);
//必填:待发送手机号。支持以逗号分隔的形式进行批量调用,批量上限为1000个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式
request.PhoneNumbers = phoneNumber;
request.SignName = SignName;// aliSms["signName"].ToString();
//必填:短信模板-可在短信控制台中找到
request.TemplateCode = templateCode;
//可选:模板中的变量替换JSON串,如模板内容为"您的验证码为${code}"时,此处的值为
request.TemplateParam = templateParam;
//可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
request.OutId = "";
//请求失败这里会抛ClientException异常
SendSmsResponse sendSmsResponse = acsClient.GetAcsResponse(request);
if (!sendSmsResponse.Code.Equals("OK"))
{
var data = new { phoneNumber, templateParam, code = sendSmsResponse.Code, message = sendSmsResponse.Message };
return "";
}
else
{
return sendSmsResponse.BizId;
}
}
catch (Aliyun.Acs.Core.Exceptions.ServerException ex)
{
//LogHelper.Write(ex, "SendSMSToJava1");
}
catch (ClientException ex)
{
//LogHelper.Write(ex, "SendSMSToJava2");
}
return "";
}
/// <summary>
/// 获取短信发送状态
/// </summary>
/// <param name="phoneNumber"></param>
/// <param name="SendDate"></param>
/// <param name="BizId"></param>
/// <returns></returns>
public static string SendSMSStatus(string phoneNumber, string SendDate, string BizId, string Domain, string AccessKeyId, string AccessKeySecret, string RegionId)
{
// JObject aliSms = Config.AliSms;
String product = "Dysmsapi";//短信API产品名称(短信产品名固定,无需修改)
String domain = Domain;// "dysmsapi.aliyuncs.com";//短信API产品域名(接口地址固定,无需修改)
String accessKeyId = AccessKeyId;// aliSms["accessKeyId"].ToString();
String accessKeySecret = AccessKeySecret; //aliSms["accessKeySecret"].ToString();
IClientProfile profile = DefaultProfile.GetProfile(RegionId, accessKeyId, accessKeySecret);
DefaultProfile.AddEndpoint(RegionId, RegionId, product, domain);
IAcsClient acsClient = new DefaultAcsClient(profile);
//拼接参数 返回url
string url = $@"https://{domain}/?AccessKeyId={accessKeyId}&Action=QuerySendDetails&CurrentPage=1&Format=JSON&PageSize=12&PhoneNumber={phoneNumber}&RegionId=cn-hangzhou&SecureTransport=true&SendDate={SendDate}&BizId={BizId}&SignatureMethod=HMAC-SHA1&SignatureNonce=46edc0b6cc74e437aa0ba1703c71a99b&SignatureVersion=1.0&SourceIp=171.88.98.6&Timestamp=2019-09-25T02%3A12%3A35Z&Version=2017-05-25&Signature=Uvqz3E13092wPxNYUt3ytDojV50%3D";
return url;
}
/// <summary>
/// 获取短信发送状态
/// </summary>
/// <param name="phoneNumber"></param>
/// <param name="SendDate"></param>
/// <param name="BizId"></param>
/// <returns></returns>
public static QuerySendDetailsResponse QuerySendDetails(string phoneNumber, string SendDate, string BizId, string Domain, string AccessKeyId, string AccessKeySecret, string RegionId)
{
String product = "Dysmsapi";//短信API产品名称(短信产品名固定,无需修改)
// 初始化acsClient,暂不支持region化
IClientProfile profile = DefaultProfile.GetProfile(RegionId, AccessKeyId, AccessKeySecret);
DefaultProfile.AddEndpoint(RegionId, RegionId, product, Domain);
IAcsClient acsClient = new DefaultAcsClient(profile);
// 组装请求对象
QuerySendDetailsRequest request = new QuerySendDetailsRequest
{
PhoneNumber = phoneNumber,
BizId = BizId,
SendDate = SendDate,
PageSize = 10,
CurrentPage = 1
};
QuerySendDetailsResponse querySendDetailsResponse = null;
try
{
// 请求失败这里会抛ClientException异常
querySendDetailsResponse = acsClient.GetAcsResponse(request);
}
catch (ServerException e)
{
querySendDetailsResponse = new QuerySendDetailsResponse();
// LogHelper.LogException<ServerException>(e.ErrorMessage);
}
catch (ClientException e)
{
querySendDetailsResponse = new QuerySendDetailsResponse();
// LogHelper.LogException<ClientException>(e.ErrorMessage);
}
return querySendDetailsResponse;
}
/// <summary>
/// 获取短信状态
/// </summary>
/// <param name="phoneNumber"></param>
/// <param name="SendDate"></param>
/// <param name="BizId"></param>
/// <returns></returns>
public static string SendSMSStatus2(string phoneNumber, string SendDate, string BizId, string Domain, string AccessKeyId, string AccessKeySecret, string RegionId)
{
//JObject aliSms = Config.AliSms;
String product = "Dysmsapi";//短信API产品名称(短信产品名固定,无需修改)
String domain = Domain;//"dysmsapi.aliyuncs.com";//短信API产品域名(接口地址固定,无需修改)
String accessKeyId = AccessKeyId;//aliSms["accessKeyId"].ToString();
String accessKeySecret = AccessKeySecret; //aliSms["accessKeySecret"].ToString();
IClientProfile profile = DefaultProfile.GetProfile(RegionId, accessKeyId, accessKeySecret);
DefaultProfile.AddEndpoint(RegionId, RegionId, product, domain);
IAcsClient acsClient = new DefaultAcsClient(profile);
QuerySendDetailsRequest request = new QuerySendDetailsRequest();
request.CurrentPage = 1;
request.PageSize = 12;
request.PhoneNumber = phoneNumber;
request.SendDate = SendDate;
request.BizId = BizId;
//请求失败这里会抛ClientException异常
var robj = acsClient.DoAction(request);
if (robj.Status == 200)
{
System.IO.Stream stream = new System.IO.MemoryStream(robj.Content);
var reader = new System.IO.StreamReader(stream, System.Text.Encoding.UTF8);
string rrrr = reader.ReadToEnd();
return rrrr;
}
return "";
}
}
}
using System.Collections.Generic;
using System.Linq;
using System.Threading;
namespace Edu.ThirdCore.Message
{
/// <summary>
/// 消息队列
/// </summary>
public class QueueHelper
{
/// <summary>
/// 任务队列
/// </summary>
public static Queue<string> Queue = new Queue<string>();
/// <summary>
/// 线程锁
/// </summary>
private static object locker = new object();
/// <summary>
/// 添加消息到队列
/// </summary>
/// <param name="task"></param>
public static void EnqueueTask(string task)
{
lock (locker)
{
//同样的任务,不同时加入
IList<string> tasks = Queue.ToList();
if (tasks.Count(p => p == task) == 0)
{
Queue.Enqueue(task);
Monitor.PulseAll(locker);
}
}
}
}
}

using System;
using System.Collections.Generic;
using System.Text;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace Edu.ThirdCore.Message
{
/// <summary>
/// 短信消息
/// </summary>
public class SMSService
{
/// <summary>
/// 发送证码
/// </summary>
/// <param name="phoneNumber">电话号码</param>
/// <param name="code">验证码</param>
public static void SendCode(string phoneNumber, string code, string templateCode, string SignName, string Domain, string AccessKeyId, string AccessKeySecret, string RegionId, string OutId)
{
JObject obj = new JObject();
obj["cmd"] = "sms";
obj["phoneNumber"] = phoneNumber;
obj["templateCode"] = templateCode;
obj["SignName"] = SignName;
obj["Domain"] = Domain;
obj["AccessKeyId"] = AccessKeyId;
obj["AccessKeySecret"] = AccessKeySecret;
obj["RegionId"] = RegionId;
var TemplateParam = new { code = code };
obj["OutId"] = OutId;
obj["templateParam"] = JsonConvert.SerializeObject(TemplateParam);
QueueHelper.EnqueueTask(JsonConvert.SerializeObject(obj));
}
/// <summary>
/// 发送短信通知
/// </summary>
/// <param name="phoneNumber"></param>
/// <param name="content"></param>
/// <param name="templateCode"></param>
public static void SendMsg(string phoneNumber, string content, string templateCode, string SignName, string Domain, string AccessKeyId, string AccessKeySecret, string RegionId, string OutId)
{
JObject obj = new JObject();
obj["cmd"] = "sms";
obj["phoneNumber"] = phoneNumber;
obj["templateCode"] = templateCode;
obj["SignName"] = SignName;
obj["Domain"] = Domain;
obj["AccessKeyId"] = AccessKeyId;
obj["RegionId"] = RegionId;
obj["AccessKeySecret"] = AccessKeySecret;
var TemplateParam = new { content };
obj["OutId"] = OutId;
obj["templateParam"] = JsonConvert.SerializeObject(TemplateParam);
//LogHelper.WriteInfo("发送短信信息");
QueueHelper.EnqueueTask(JsonConvert.SerializeObject(obj));
}
/// <summary>
/// 发送短信通知
/// </summary>
/// <param name="phoneNumber"></param>
/// <param name="templateParam">通知参数</param>
/// <param name="templateCode"></param>
public static void SendMsg(string phoneNumber, object templateParam, string templateCode, string SignName, string Domain, string AccessKeyId, string AccessKeySecret, string RegionId,string OutId)
{
JObject obj = new JObject();
obj["cmd"] = "sms";
obj["phoneNumber"] = phoneNumber;
obj["templateCode"] = templateCode;
var TemplateParam = templateParam;
obj["SignName"] = SignName;
obj["Domain"] = Domain;
obj["RegionId"] = RegionId;
obj["AccessKeyId"] = AccessKeyId;
obj["AccessKeySecret"] = AccessKeySecret;
obj["OutId"] = OutId;
obj["templateParam"] = JsonConvert.SerializeObject(TemplateParam);
QueueHelper.EnqueueTask(JsonConvert.SerializeObject(obj));
}
}
}
......@@ -28,7 +28,7 @@ namespace Edu.WebApi.Controllers.Public
/// </summary>
private readonly MsgLogModule msgLogModule = new MsgLogModule();
#region 短信记录信息
/// <summary>
/// 获取短信记录分页列表
/// </summary>
......@@ -47,6 +47,18 @@ namespace Edu.WebApi.Controllers.Public
}
/// <summary>
/// 获取触发事件枚举
/// </summary>
/// <returns></returns>
[HttpPost]
public ApiResult GetMsgSendStatusEnumList()
{
var list = EnumHelper.EnumToList(typeof(Common.Enum.System.MsgSendStatusEnum));
return ApiResult.Success("", list);
}
#endregion
#region 短信配置
......@@ -71,6 +83,7 @@ namespace Edu.WebApi.Controllers.Public
}
pageModel.Count = rowsCount;
pageModel.PageData = list;
return ApiResult.Success(data: pageModel);
}
......@@ -106,13 +119,14 @@ namespace Edu.WebApi.Controllers.Public
var model = new RB_Msg_Base();
model.CreateDate = DateTime.Now;
model.CreateBy = UserInfo.Id;
model.Group_Id = this.UserInfo.Group_Id;
model.Group_Id = base.UserInfo.Group_Id;
model.ID = extModel.ID;
model.StoreType = extModel.StoreType;
if (extModel.MsgBase != null)
{
model.MsgConfigure = Common.Plugin.JsonHelper.Serialize(extModel.MsgBase);
}
bool flag = msgLogModule.SetMsgBaseModule(extModel);
bool flag = msgLogModule.SetMsgBaseModule(model);
return flag ? ApiResult.Success() : ApiResult.Failed();
}
......@@ -145,5 +159,153 @@ namespace Edu.WebApi.Controllers.Public
}
#endregion
#region 短信模板配置
/// <summary>
/// 获取触发事件枚举
/// </summary>
/// <returns></returns>
[HttpPost]
public ApiResult GetBaseTemplateTypeEnumList()
{
var list = EnumHelper.EnumToList(typeof(Common.Enum.System.BaseTemplateTypeEnum));
return ApiResult.Success("", list);
}
/// <summary>
/// 获取短信模板配置页列表
/// </summary>
/// <returns></returns>
[HttpPost]
public ApiResult GetMsgBaseTemplatePageList()
{
var pageModel = Common.Plugin.JsonHelper.DeserializeObject<ResultPageModel>(RequestParm.Msg.ToString());
var query = Common.Plugin.JsonHelper.DeserializeObject<RB_Msg_BaseTemplate_ViewModel>(RequestParm.Msg.ToString());
query.Group_Id = base.UserInfo.Group_Id;
var list = msgLogModule.GetMsgBaseTemplatePageListModule(pageModel.PageIndex, pageModel.PageSize, out long rowsCount, query);
foreach (var item in list)
{
item.BaseTemplateTypeStr = EnumHelper.ToName(item.BaseTemplateType);
}
pageModel.Count = rowsCount;
pageModel.PageData = list;
return ApiResult.Success(data: pageModel);
}
/// <summary>
/// 获取短信模板配置列表
/// </summary>
/// <returns></returns>
[HttpPost]
public ApiResult GetMsgBaseTemplateList()
{
var query = Common.Plugin.JsonHelper.DeserializeObject<RB_Msg_BaseTemplate_ViewModel>(RequestParm.Msg.ToString());
query.Group_Id = base.UserInfo.Group_Id;
var list = msgLogModule.GetMsgBaseTemplateModule(query);
return ApiResult.Success(data: list);
}
/// <summary>
/// 添加修改短信模板配置
/// </summary>
/// <returns></returns>
[HttpPost]
public ApiResult SetMsgBaseTemplate()
{
var extModel = Common.Plugin.JsonHelper.DeserializeObject<RB_Msg_BaseTemplate_ViewModel>(RequestParm.Msg.ToString());
extModel.CreateDate = DateTime.Now;
extModel.CreateBy = UserInfo.Id;
extModel.Group_Id = base.UserInfo.Group_Id;
bool flag = msgLogModule.SetMsgBaseTemplateModule(extModel);
return flag ? ApiResult.Success() : ApiResult.Failed();
}
/// <summary>
/// 获取短信模板配置实体
/// </summary>
/// <returns></returns>
[HttpPost]
public ApiResult GetMsgBaseTemplate()
{
var ID = base.ParmJObj.GetInt("ID", 0);
var extModel = msgLogModule.GetMsgBaseTemplateModule(ID);
return ApiResult.Success(data: extModel);
}
/// <summary>
/// 删除短信模板配置
/// </summary>
/// <returns></returns>
[HttpPost]
public ApiResult RemoveMsgBaseTemplate()
{
var ClassId = base.ParmJObj.GetInt("ID", 0);
var flag = msgLogModule.RemoveMsgBaseTemplateModule(ClassId);
return flag ? ApiResult.Success() : ApiResult.Failed();
}
#endregion
#region 发短信测试
[HttpPost]
public ApiResult TestSendMsg()
{
object PhoneMessage = new
{
OrderNo = "1111111111111",
Name = "李三",
Mobile = "13551132418",
TripDate = "2020-11-30",//item.TripSTime.Value.ToString("yyyy-MM-dd HH:mm") + " " + ((item.UseDay ?? 0) == Convert.ToDecimal(0.5) ? "半" : Convert.ToInt32(item.UseDay ?? 0).ToString()) + "日",
Address = "阳光新业2号楼",
Number = "李四"
};
//新增短信记录信息
var msgLogModel = new RB_Msg_Log
{
Group_Id = 100000,
School_Id = 1,
Student_Id = 2,
CreateDate = DateTime.Now,
SendStatus = Common.Enum.System.MsgSendStatusEnum.InReceipt,
CreateBy = 0,
CreateByName = "系统自动发送",
SendContent = "测试内容",
ReceiverName = "张学生",
ReceiverPhone = "13551132417"
};
msgLogModule.SendMsg(PhoneMessage, Common.Enum.System.BaseTemplateTypeEnum.OrderSuccess, msgLogModel);
// ThirdCore.Message.SMSService.SendMsg("13551132417", PhoneMessage, "SMS_201722097", "印象之旅", "dysmsapi.aliyuncs.com", "LTAIwE7l9dImZSa3", "j47Ajn0d0WzUCIX8Biyj3P2r8QDltI", "cn-hangzhou");
return ApiResult.Success("");
}
[HttpPost]
public ApiResult TestUpdateSendMsg()
{
msgLogModule.UpdateMsgSendStatus();
return ApiResult.Success("");
}
#endregion
}
}
......@@ -369,8 +369,17 @@ namespace Edu.WebApi.Controllers.Public
[HttpPost]
public ApiResult GetStoreTypeEnumList()
{
int type = base.ParmJObj.GetInt("ID", 0);
var list = EnumHelper.EnumToList(typeof(Common.Enum.Public.StoreTypeEnum));
return ApiResult.Success("", list);
if (type == 1)
{
return ApiResult.Success("", list.Where(x => x.Id != 3));
}
else
{
return ApiResult.Success("", list);
}
}
/// <summary>
......
using System.Collections.Generic;
using System.Text.Encodings.Web;
using System.Text.Unicode;
using System.Threading.Tasks;
using Edu.ThirdCore.Message;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
......@@ -50,7 +52,7 @@ namespace Edu.WebApi
};
services.AddCors(options => options.AddPolicy("AllowCors", policy => policy.AllowAnyHeader().AllowAnyMethod().AllowCredentials().WithOrigins(corsArray.ToArray())));
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IHostApplicationLifetime appLifetime)
......@@ -67,7 +69,9 @@ namespace Edu.WebApi
app.UseCors("AllowCors");
app.UseAuthorization();
//启动信息发送
// Task.Run(() => MessageCore.Init());
Task.Run(() => MessageCore.Init());
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
......
{
"ConnectionStrings": {
"DefaultConnection": "server=192.168.1.214;user id=reborn;password=Reborn@2018;database=reborn_edu;CharSet=utf8mb4; Convert Zero Datetime=true; ",
"DefaultConnectionPName": "MySql.Data.MySqlClient"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"JwtSecretKey": "@VIITTOREBORN*2018",
"JwtExpirTime": 2592000,
"AllowedHosts": "*",
"OpenValidation": "False",
"UploadSiteUrl": "http://192.168.1.214:8120",
"ViewFileSiteUrl": "https://viitto-1301420277.cos.ap-chengdu.myqcloud.com",
"Mongo": "mongodb://47.96.25.130:27017",
"MongoDBName": "Edu",
"RabbitMqConfig": {
"HostName": "47.96.25.130",
"VirtualHost": "/",
"Port": 5672,
"UserName": "guest",
"Password": "viitto2019"
},
"RedisSetting": {
"RedisServer": "47.96.23.199",
"RedisPort": "6379",
"RedisPwd": "Viitto2018"
},
"VirtualDirectory": "WebFile",
//Ƿϻ
"IsOnline": false
"ConnectionStrings": {
"DefaultConnection": "server=192.168.1.214;user id=reborn;password=Reborn@2018;database=reborn_edu;CharSet=utf8mb4; Convert Zero Datetime=true; ",
"DefaultConnectionPName": "MySql.Data.MySqlClient"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"JwtSecretKey": "@VIITTOREBORN*2018",
"JwtExpirTime": 2592000,
"IsSendMsg": 1,
"AllowedHosts": "*",
"OpenValidation": "False",
"UploadSiteUrl": "http://192.168.1.214:8120",
"ViewFileSiteUrl": "https://viitto-1301420277.cos.ap-chengdu.myqcloud.com",
"Mongo": "mongodb://47.96.25.130:27017",
"MongoDBName": "Edu",
"RabbitMqConfig": {
"HostName": "47.96.25.130",
"VirtualHost": "/",
"Port": 5672,
"UserName": "guest",
"Password": "viitto2019"
},
"RedisSetting": {
"RedisServer": "47.96.23.199",
"RedisPort": "6379",
"RedisPwd": "Viitto2018"
},
"VirtualDirectory": "WebFile",
//Ƿϻ
"IsOnline": false
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment