소스 검색

新增消息通知

dss 2 년 전
부모
커밋
9d492671ba

+ 17 - 1
src/CallCenter.Api/Controllers/TestController.cs

@@ -107,9 +107,25 @@ namespace CallCenter.Api.Controllers
         [HttpGet("ring")]
         public async Task RingTest()
         {
-            await _realtimeService.RingAsync(_sessionContext.RequiredUserId, new RingDto { From = "13512341234" }, HttpContext.RequestAborted);
+            await _realtimeService.RingAsync(_sessionContext.RequiredUserId, new RingDto { Id="123", From = "13512341234",To="65123495",CallType = Share.Enums.ECallType.VisitorCallIn }, HttpContext.RequestAborted);
         }
 
+        /// <summary>
+        /// signalR测试(method:Answered)
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet("answered")]
+        public async Task AnsweredTest()
+        {
+            await _realtimeService.AnsweredAsync(_sessionContext.RequiredUserId, new AnseredDto() { Id = "123", From = "13408389849", To = "65123495" }, HttpContext.RequestAborted);
+        }
+
+        public async Task ByeTest()
+        {
+            await _realtimeService.ByeAsync(_sessionContext.RequiredUserId, new ByeDto() { Id = "123" }, HttpContext.RequestAborted);
+        }
+
+
         [HttpGet("t2")]
         public async Task GetVoiceEndAnswerAsyncTest()
         {

+ 11 - 0
src/CallCenter.Api/Realtimes/RealtimeMethods.cs

@@ -0,0 +1,11 @@
+namespace CallCenter.Api.Realtimes
+{
+    public static class RealtimeMethods
+    {
+        public static string Ring = "Ring";
+
+        public static string Answered = "Answered";
+
+        public static string Bye = "Bye";
+    }
+}

+ 68 - 0
src/CallCenter.Api/Realtimes/RealtimeService.cs

@@ -0,0 +1,68 @@
+using CallCenter.Caches;
+using CallCenter.Realtimes;
+using Microsoft.AspNetCore.SignalR;
+using XF.Domain.Dependency;
+using XF.Domain.Exceptions;
+
+namespace CallCenter.Api.Realtimes
+{
+    public class RealtimeService : IRealtimeService, IScopeDependency
+    {
+        private readonly IHubContext<CallCenterHub> _hubContext;
+        private readonly IUserCacheManager _userCacheManager;
+
+        public RealtimeService(IHubContext<CallCenterHub> hubContext,IUserCacheManager userCacheManager)
+        {
+            _hubContext= hubContext;
+            _userCacheManager= userCacheManager;
+        }
+
+        /// <summary>
+        /// 振铃事件通知
+        /// </summary>
+        /// <param name="userId"></param>
+        /// <param name="dto"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        /// <exception cref="NotImplementedException"></exception>
+        public async Task RingAsync(string userId, RingDto dto, CancellationToken cancellationToken)
+        {
+            var work = _userCacheManager.GetWorkByUser(userId);
+            if (string.IsNullOrEmpty(work.SignalRId))
+                throw new UserFriendlyException("无效signalr.connectionId");
+            await _hubContext.Clients.Client(work.SignalRId).SendAsync(RealtimeMethods.Ring, dto, cancellationToken);
+        }
+
+        /// <summary>
+        /// 应答事件通知
+        /// </summary>
+        /// <param name="userId"></param>
+        /// <param name="dto"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        /// <exception cref="NotImplementedException"></exception>
+        public async Task AnsweredAsync(string userId, AnseredDto dto, CancellationToken cancellationToken)
+        {
+            var work = _userCacheManager.GetWorkByUser(userId);
+            if (string.IsNullOrEmpty(work.SignalRId))
+                throw new UserFriendlyException("无效signalr.connectionId");
+            await _hubContext.Clients.Client(work.SignalRId).SendAsync(RealtimeMethods.Answered, dto, cancellationToken);
+        }
+
+        /// <summary>
+        /// 电话挂断事件通知
+        /// </summary>
+        /// <param name="userId"></param>
+        /// <param name="dto"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        /// <exception cref="NotImplementedException"></exception>
+        public async Task ByeAsync(string userId, ByeDto dto, CancellationToken cancellationToken)
+        {
+            var work = _userCacheManager.GetWorkByUser(userId);
+            if (string.IsNullOrEmpty(work.SignalRId))
+                throw new UserFriendlyException("无效signalr.connectionId");
+            await _hubContext.Clients.Client(work.SignalRId).SendAsync(RealtimeMethods.Bye, dto, cancellationToken);
+        }
+    }
+}

+ 26 - 1
src/CallCenter/Realtimes/IRealtimeService.cs

@@ -1,4 +1,5 @@
-using System;
+using CallCenter.Share.Enums;
+using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
@@ -9,10 +10,34 @@ namespace CallCenter.Realtimes
     public interface IRealtimeService
     {
         Task RingAsync(string userId, RingDto dto, CancellationToken cancellationToken);
+
+        Task AnsweredAsync(string userId, AnseredDto dto, CancellationToken cancellationToken);
+
+        Task ByeAsync(string userId, ByeDto dto, CancellationToken cancellationToken);
     }
 
+    public record ByeDto
+    {
+        public string Id { get; set; }
+    }
+
+
     public record RingDto
     {
+        public string Id { get; set; }
+
+        public string From { get; set; }
+
+        public string To { get; set; }
+        public ECallType CallType { get; set; }
+    }
+
+    public record AnseredDto
+    {
+        public string Id { get; set; }
+
         public string From { get; set; }
+
+        public string To { get; set; }
     }
 }

+ 5 - 5
src/CallCenter/Users/UserDomainService.cs

@@ -83,14 +83,14 @@ namespace CallCenter.Users
             var tel = _telCacheManager.GetTel(work.TelNo);
             work.OffDuty();
             await _workRepository.UpdateAsync(work, cancellationToken);
-            await _deviceManager.UpdateStaffNoAsync(work.TelNo, string.Empty, tel.LineId, cancellationToken);
+            //await _deviceManager.UpdateStaffNoAsync(work.TelNo, string.Empty, tel.LineId, cancellationToken);
             _cacheWork.Remove(work.GetKey(KeyMode.UserId));
             _cacheWork.Remove(work.GetKey(KeyMode.TelNo));
 
-            //foreach (var group in tel.Groups)
-            //{
-            //    await _deviceManager.ModifyGroupExtAsync(group.No, tel.No, group.Voice,false, cancellationToken);
-            //}
+            foreach (var group in tel.Groups)
+            {
+                await _deviceManager.ModifyGroupExtAsync(group.No, tel.No, group.Voice, false, cancellationToken);
+            }
 
             return _mapper.Map<WorkDto>(work);
         }