qinchaoyue 6 сар өмнө
parent
commit
8899dee194

+ 66 - 2
src/Hotline.Api/Controllers/PushMessageController.cs

@@ -1,4 +1,5 @@
-using DotNetCore.CAP;
+using Amazon.Runtime.Internal.Transform;
+using DotNetCore.CAP;
 using Hotline.Permissions;
 using Hotline.Push;
 using Hotline.Push.FWMessage;
@@ -8,10 +9,15 @@ using Hotline.Share.Dtos.Push;
 using Hotline.Share.Dtos.Push.FWMessage;
 using Hotline.Share.Enums.Push;
 using Hotline.Share.Mq;
+using Hotline.Share.Tools;
+using Hotline.Users;
+using J2N.Text;
 using MapsterMapper;
 using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.IdentityModel.Tokens;
+using Swashbuckle.AspNetCore.SwaggerGen;
+using System.Text;
 using XF.Domain.Exceptions;
 using XF.Domain.Repository;
 using XF.Utility.EnumExtensions;
@@ -29,6 +35,7 @@ namespace Hotline.Api.Controllers
         private readonly IRepository<BatchSmsTask> _batchSmsTaskRepository;
         private readonly IRepository<BatchSmsTaskDetail> _batchSmsTaskDetailRepository;
         private readonly ICapPublisher _capPublisher;
+        private readonly IRepository<User> _userRepository;
 
         /// <summary>
         /// 
@@ -43,7 +50,8 @@ namespace Hotline.Api.Controllers
             IMessageCodeDomainService messageCodeDomainService,
             IRepository<BatchSmsTask> batchSmsTaskRepository,
             IRepository<BatchSmsTaskDetail> batchSmsTaskDetailRepository,
-            ICapPublisher capPublisher)
+            ICapPublisher capPublisher,
+            IRepository<User> userRepository)
         {
             _messageRepository = messageRepository;
             _mapper = mapper;
@@ -52,6 +60,7 @@ namespace Hotline.Api.Controllers
             _batchSmsTaskRepository = batchSmsTaskRepository;
             _batchSmsTaskDetailRepository = batchSmsTaskDetailRepository;
             _capPublisher = capPublisher;
+            _userRepository = userRepository;
         }
 
         #endregion
@@ -114,6 +123,61 @@ namespace Hotline.Api.Controllers
             await _pushDomainService.PushMsgAsync(dto, HttpContext.RequestAborted);
         }
 
+        /// <summary>
+        /// 发送短信
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost("send")]
+        public async Task<string> SendMessage([FromBody] MessageInDto dto)
+        {
+            var telNumbers = dto.TelNumbers.Split(",");
+            var count = 0;
+            var errorSB = new StringBuilder("失败原因: ");
+            var errorCount = 0;
+            for (int i = 0;i < telNumbers.Length;i++)
+            {
+                var telNumber = telNumbers[i];
+                if (telNumber.IsPhoneNumber() == false)
+                {
+                    errorCount++;
+                    errorSB.Append($" {telNumber}不是合法的手机号码.");
+                    continue;
+                }
+
+                var inDto = new MessageDto
+                {
+                    TelNumber = telNumber,
+                    Content = dto.Content,
+                    PushBusiness = EPushBusiness.ManualSms,
+                    Name = "",
+                };
+                try
+                {
+                    await _pushDomainService.PushMsgAsync(inDto, HttpContext.RequestAborted);
+                }
+                catch (Exception e)
+                {
+                    errorSB.Append(e.Message);
+                    errorCount++;
+                    continue;
+                }
+                count++;
+            }
+            return $"成功发送: {count}, 失败: {errorCount}. " + (errorCount != 0 ? "" : errorSB.ToString());
+        }
+
+        /// <summary>
+        /// 手动发送短信页面基础数据
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet("send/basedata")]
+        public async Task<dynamic> SendMessageBaseDataAsync()
+        {
+            var users = await _userRepository.Queryable()
+                .Select(m => new {m.Id,  m.PhoneNo, m.Name }).ToListAsync();
+            return new Dictionary<string, dynamic>() { { "contacts", users } };
+        }
 
         #endregion
 

+ 71 - 59
src/Hotline.Share/Dtos/Push/MessageDto.cs

@@ -1,63 +1,75 @@
 using Hotline.Share.Enums.Push;
 
-namespace Hotline.Share.Dtos.Push
+namespace Hotline.Share.Dtos.Push;
+
+public class MessageDto
+{
+    /// <summary>
+    /// 消息推送业务
+    /// </summary>
+    public EPushBusiness PushBusiness { get; set; }
+
+    /// <summary>
+    /// 接收姓名
+    /// </summary>
+    public string Name { get; set; }
+
+    /// <summary>
+    /// 接收手机号码
+    /// </summary>
+    public string TelNumber { get; set; }
+
+    /// <summary>
+    /// 外部业务唯一编号
+    /// </summary>
+    public string? ExternalId { get; set; }
+
+    /// <summary>
+    /// 关联工单编号
+    /// </summary>
+    public string? OrderId { get; set; }
+
+    /// <summary>
+    /// 推送平台
+    /// </summary>
+    public EPushPlatform? PushPlatform { get; set; } = EPushPlatform.Sms;
+
+    /// <summary>
+    /// 模板
+    /// </summary>
+    public string? TemplateCode { get; set; }
+
+    /// <summary>
+    /// 内容
+    /// </summary>
+    public string? Content { get; set; }
+
+    /// <summary>
+    /// 备注
+    /// </summary>
+    public string? Remark { get; set; }
+
+    /// <summary>
+    /// 参数
+    /// </summary>
+    public List<string>? Params { get; set; }
+    public bool IsSmsReply { get; set; }
+    public string? SmsReplyContent { get; set; }
+    /// <summary>
+    /// 消息处理类型  0:推送状态修改,1:发送状态,2:短信回复
+    /// </summary>
+    public string Type { get; set; }
+}
+
+public class MessageInDto
 {
-    public class MessageDto
-    {
-        /// <summary>
-        /// 消息推送业务
-        /// </summary>
-        public EPushBusiness PushBusiness { get; set; }
-
-        /// <summary>
-        /// 接收姓名
-        /// </summary>
-        public string Name { get; set; }
-
-        /// <summary>
-        /// 接收手机号码
-        /// </summary>
-        public string TelNumber { get; set; }
-
-        /// <summary>
-        /// 外部业务唯一编号
-        /// </summary>
-        public string? ExternalId { get; set; }
-
-        /// <summary>
-        /// 关联工单编号
-        /// </summary>
-        public string? OrderId { get; set; }
-
-        /// <summary>
-        /// 推送平台
-        /// </summary>
-        public EPushPlatform? PushPlatform { get; set; } = EPushPlatform.Sms;
-
-        /// <summary>
-        /// 模板
-        /// </summary>
-        public string? TemplateCode { get; set; }
-
-        /// <summary>
-        /// 内容
-        /// </summary>
-        public string? Content { get; set; }
-
-        /// <summary>
-        /// 备注
-        /// </summary>
-        public string? Remark { get; set; }
-
-        /// <summary>
-        /// 参数
-        /// </summary>
-        public List<string>? Params { get; set; }
-        public bool IsSmsReply { get; set; }
-        public string? SmsReplyContent { get; set; }
-        /// <summary>
-        /// 消息处理类型  0:推送状态修改,1:发送状态,2:短信回复
-        /// </summary>
-        public string Type { get; set; }
-    }
+    /// <summary>
+    /// 接收手机号码(多个逗号分隔)
+    /// </summary>
+    public string TelNumbers { get; set; }
+
+    /// <summary>
+    /// 内容
+    /// </summary>
+    public string? Content { get; set; }
 }

+ 7 - 1
src/Hotline.Share/Enums/Push/EPushBusiness.cs

@@ -67,10 +67,16 @@ public enum EPushBusiness
     [Description("撤销短信")]
     OrderRevocationSms = 9,
 
-
     /// <summary>
     /// 自动延期
     /// </summary>
     [Description("自动延期")]
     AutomaticDelay = 10,
+
+    /// <summary>
+    /// 手动发送短信
+    /// </summary>
+    [Description("手动发送短信")]
+    ManualSms = 11,
+
 }

+ 14 - 0
src/Hotline.Share/Tools/StringExtensions.cs

@@ -30,6 +30,20 @@ public static class StringExtensions
         return (TEnum)Enum.Parse(typeof(TEnum), value);
     }
 
+    /// <summary>
+    /// 是否手机号码
+    /// </summary>
+    /// <param name="value"></param>
+    /// <returns></returns>
+    public static bool IsPhoneNumber(this string value)
+    {
+        if (string.IsNullOrWhiteSpace(value))
+            return false;
+
+        var phoneNumberPattern = @"^1[3-9]\d{9}$";
+        return Regex.IsMatch(value, phoneNumberPattern);
+    }
+
     public static IList<string> SplitKeywords(this string value)
     {
         var regex = new Regex(@"[ ,,]+");