瀏覽代碼

idle handler

admin 2 年之前
父節點
當前提交
784b089628

+ 57 - 1
src/CallCenter.Application/Handlers/ExtState/IdleNotificationHandler.cs

@@ -1,8 +1,14 @@
 using CallCenter.Caches;
+using CallCenter.Devices;
 using CallCenter.Notifications;
 using CallCenter.Realtimes;
+using CallCenter.Share.Enums;
 using CallCenter.Tels;
 using MediatR;
+using Microsoft.Extensions.Options;
+using NewRock.Sdk;
+using NewRock.Sdk.Control.Request;
+using NewRock.Sdk.Control.Response;
 using XF.Domain.Cache;
 
 namespace CallCenter.Application.Handlers
@@ -14,13 +20,18 @@ namespace CallCenter.Application.Handlers
         private readonly ITypedCache<Tel> _typedCache;
         private readonly IUserCacheManager _userCacheManager;
         private readonly IRealtimeService _realtimeService;
-        public IdleNotificationHandler(ITelRepository telRepository, ITelCacheManager telCacheManager, ITypedCache<Tel> typedCache, IUserCacheManager userCacheManager, IRealtimeService realtimeService)
+        private readonly INewRockClient _newRockClient;
+        private readonly IOptionsSnapshot<DeviceConfigs> _options;
+
+        public IdleNotificationHandler(ITelRepository telRepository, ITelCacheManager telCacheManager, ITypedCache<Tel> typedCache, IUserCacheManager userCacheManager, IRealtimeService realtimeService,INewRockClient newRockClient,IOptionsSnapshot<DeviceConfigs> options)
         {
             _telRepository = telRepository;
             _telCacheManager = telCacheManager;
             _typedCache = typedCache;
             _userCacheManager = userCacheManager;
             _realtimeService = realtimeService;
+            _newRockClient = newRockClient;
+            _options = options;
         }
 
         public async Task Handle(IdleNotification notification, CancellationToken cancellationToken)
@@ -30,6 +41,51 @@ namespace CallCenter.Application.Handlers
             //await _telRepository.UpdateAsync(telModel, cancellationToken);
             _typedCache.Set(notification.TelNo, telModel);
 
+
+            foreach (var group in telModel.Groups)
+            {
+                var result = await _newRockClient.QueryExtGroup(new QueryExtGroupRequest()
+                {
+                    Attribute = "Query",
+                    Group = new QueryExtGroup() { Id = group.No }
+                }, _options.Value.ReceiveKey,
+                _options.Value.Expired,
+                cancellationToken);
+
+                var exts = result.Group.First().Ext.Select(x=>x.Id).ToList();
+                exts.Add(notification.TelNo);
+
+                //更新
+                var groupModel = new Group()
+                {
+                    Id = group.No,
+                    Voicefile = group.Voice,
+                };
+                switch (group.Distribution)
+                {
+                    case EDistribution.Sequential:
+                        groupModel.Distribution = "sequential";
+                        break;
+                    case EDistribution.Group:
+                        groupModel.Distribution = "group";
+                        break;
+                    case EDistribution.Circular:
+                        groupModel.Distribution = "circular";
+                        break;
+                    default:
+                        break;
+                }
+
+                groupModel.Ext = exts;
+                await _newRockClient.ConfigExtGroup(
+                    new AssginConfigGroupRequest() { Attribute = "Assign", Group = groupModel, },
+                    _options.Value.ReceiveKey,
+                    _options.Value.Expired,
+                    cancellationToken
+                    );
+            }
+
+
             var workModel = _userCacheManager.GetWorkByTel(notification.TelNo);
             if (workModel != null)
             {

+ 36 - 3
src/CallCenter.NewRock/DeviceManager.cs

@@ -19,6 +19,7 @@ using XF.Domain.Exceptions;
 using Group = NewRock.Sdk.Control.Request.Group;
 using CallCenter.Share.Enums;
 using CallCenter.Caches;
+using Microsoft.AspNetCore.Http;
 
 namespace CallCenter.NewRock
 {
@@ -31,8 +32,9 @@ namespace CallCenter.NewRock
         private readonly ITelGroupRepository _telGroupRepository;
         private readonly IUserCacheManager _userCacheManager;
         private readonly ITelRestRepository _telRestRepository;
+        private readonly ITelCacheManager _telCacheManager;
 
-        public DeviceManager(INewRockClient newRockClient, IOptionsSnapshot<DeviceConfigs> options, IMapper mapper, ICallRepository callRepository, ITelGroupRepository telGroupRepository,IUserCacheManager userCacheManager, ITelRestRepository telRestRepository)
+        public DeviceManager(INewRockClient newRockClient, IOptionsSnapshot<DeviceConfigs> options, IMapper mapper, ICallRepository callRepository, ITelGroupRepository telGroupRepository,IUserCacheManager userCacheManager, ITelRestRepository telRestRepository, ITelCacheManager telCacheManager)
         {
             _newRockClient = newRockClient;
             _options = options;
@@ -41,6 +43,7 @@ namespace CallCenter.NewRock
             _telGroupRepository = telGroupRepository;
             _userCacheManager = userCacheManager;
             _telRestRepository = telRestRepository;
+            _telCacheManager = telCacheManager;
         }
 
         #region 查询
@@ -140,6 +143,20 @@ namespace CallCenter.NewRock
             return Share.Enums.ETelStatus.Offline;
         }
 
+
+        public async Task<QueryExtGroupResponse> QueryGroup(string groupId,CancellationToken cancellationToken)
+        {
+            var result = await _newRockClient.QueryExtGroup(new QueryExtGroupRequest()
+            {
+                Attribute = "Query",
+                Group = new QueryExtGroup() { Id = groupId }
+            }, _options.Value.ReceiveKey,
+                _options.Value.Expired,
+                cancellationToken);
+            return result;
+        }
+
+
         /// <summary>
         /// 查询所有分机
         /// </summary>
@@ -398,13 +415,19 @@ namespace CallCenter.NewRock
 
             var list = await _telGroupRepository.QueryExtAsync(d =>d.No== groupId, d => d.Includes(x => x.Tels));
 
+            //检查是否上班和是否在空闲中
             List<string> exts = new List<string>();
             foreach (var ext in list[0].Tels)
             {
                 var iswork = await _userCacheManager.IsWorkingByTelAsync(ext.No, cancellationToken);
                 if (iswork)
-                    exts.Add(ext.No);
-
+                {
+                    var tel = _telCacheManager.GetTel(ext.No);
+                    if (tel.TelStatus == Tels.ETelStatus.Ready)
+                    {
+                        exts.Add(ext.No);
+                    }
+                }
             }
 
             //查询所有正在休息的分机
@@ -417,6 +440,16 @@ namespace CallCenter.NewRock
                 }
             }
 
+            //优先加入空闲分机
+            foreach (var ext in exts)
+            {
+                var omExt = await _newRockClient.QueryExt(new QueryExtRequest() { Attribute = "Query", Ext = new Ext() { Id = ext } },_options.Value.ReceiveKey,_options.Value.Expired,cancellationToken);
+                if (omExt.Ext.State != "ready")
+                {
+                    exts.Remove(ext);
+                }
+            }
+
 
             //更新
             var groupModel = new Group()