tangjiang 1 ngày trước cách đây
mục cha
commit
042ef33b83

+ 129 - 6
src/Hotline.Api/Controllers/IPPbxController.cs

@@ -73,6 +73,8 @@ namespace Hotline.Api.Controllers
         private readonly ICallTelClient _callTelClient;
         private readonly IRepository<TelOperation> _telOperationRepository;
         private readonly IOptionsSnapshot<AppConfiguration> _appOptions;
+        private readonly ITypedCache<List<TelNotifyStatusDto>> _cacheTelNotifyStatusDto;
+        private const string TelNotifyStatusListKey = "Tel_NotifyStatus_List";
 
         public IPPbxController(IMapper mapper, IUserDomainService userDomainService,
             ISessionContext sessionContext, IRepository<TrCallRecord> trCallRecordRepository,
@@ -92,7 +94,8 @@ namespace Hotline.Api.Controllers
             IIPPbxApplication iPPbxApplication,
             ICallTelClient callTelClient,
             IRepository<TelOperation> telOperationRepository,
-           IOptionsSnapshot<AppConfiguration> appOptions)
+           IOptionsSnapshot<AppConfiguration> appOptions,
+           ITypedCache<List<TelNotifyStatusDto>> cacheTelNotifyStatusDto)
         {
             _mapper = mapper;
             _userDomainService = userDomainService;
@@ -122,6 +125,7 @@ namespace Hotline.Api.Controllers
             _callTelClient = callTelClient;
             _telOperationRepository = telOperationRepository;
             _appOptions = appOptions;
+            _cacheTelNotifyStatusDto = cacheTelNotifyStatusDto;
         }
 
         #region 添添呼
@@ -682,16 +686,135 @@ namespace Hotline.Api.Controllers
         [LogFilterAlpha("话机状态通知")]
         public async Task NotifyStatus(NotifyInDto dto)
         {
-            var userName = _sessionContext.UserName;
-            if (dto.Status == 0) // 签出
+            if (dto.Status == 202)//如果是繁忙状态将状态改成小休
+                dto.Status = 201;
+
+            #region 处理动作数据
+            var time = DateTime.Now;
+            TelOperation telOperation = new()
+            {
+                StaffNo = dto.StaffNo,
+                TelNo = dto.TelNo,
+                OperateState = dto.Status,
+                OperateTime = time,
+            };
+
+            switch (dto.Status)
+            {
+                case 0:
+                    telOperation.OperateStateText = "签出";
+                    break;
+                case 100:
+                    telOperation.OperateStateText = "签入";
+                    break;
+                case 200:
+                    telOperation.OperateStateText = "空闲";
+                    break;
+                case 201:
+                    telOperation.OperateStateText = "小休";
+                    break;
+                case 202:
+                    telOperation.OperateStateText = "繁忙";
+                    break;
+                case 300:
+                    telOperation.OperateStateText = "呼入振铃";
+                    break;
+                case 301:
+                    telOperation.OperateStateText = "呼入通话";
+                    break;
+                case 302:
+                    telOperation.OperateStateText = "呼出振铃";
+                    break;
+                case 303:
+                    telOperation.OperateStateText = "呼出通话";
+                    break;
+                case 310:
+                    telOperation.OperateStateText = "通话保持";
+                    break;
+                case 320:
+                    telOperation.OperateStateText = "会议";
+                    break;
+                case 330:
+                    telOperation.OperateStateText = "咨询";
+                    break;
+                case 400:
+                    telOperation.OperateStateText = "整理";
+                    break;
+                case 900:
+                    telOperation.OperateStateText = "注册";
+                    break;
+                case 901:
+                    telOperation.OperateStateText = "注销";
+                    break;
+                default:
+                    break;
+            }
+            await _telOperationRepository.AddAsync(telOperation);
+            #endregion
+
+            if (dto.Status == 0)
+            {
+                var telNotifyStatusDto = _mapper.Map<TelNotifyStatusDto>(dto);
+                telNotifyStatusDto.NotifyStatusTime = time;
+                // 如果推送的是签出,则延迟处理数据
+                var list = await _cacheTelNotifyStatusDto.GetAsync(TelNotifyStatusListKey, HttpContext.RequestAborted);
+                if (list == null)
+                {
+                    list = [telNotifyStatusDto];
+                    await _cacheTelNotifyStatusDto.SetAsync(TelNotifyStatusListKey, list, cancellationToken: HttpContext.RequestAborted);
+                }
+                else
+                {
+                    var data = list.Find(p => p.StaffNo == dto.StaffNo && p.TelNo == dto.TelNo && p.Status == dto.Status);
+                    if (data != null)
+                        list.Remove(data);
+
+                    list.Add(telNotifyStatusDto);
+                    await _cacheTelNotifyStatusDto.SetAsync(TelNotifyStatusListKey, list, cancellationToken: HttpContext.RequestAborted);
+                }
+                return;
+            }
+
+            //处理分机状态
+            var telWork = _userCacheManager.GetWorkByTelNoExp(dto.TelNo);
+            if (telWork != null && telWork.ExtensionStatus != (EExtensionStatus)dto.Status)
             {
-                //await _iPPbxApplication.ResetTelStatus(null, dto.TelNo, CancellationToken.None);
+                telWork.OldExtensionStatus = telWork.ExtensionStatus;
+                telWork.ExtensionStatus = (EExtensionStatus)dto.Status;
+                _userCacheManager.SetWorkByUser(telWork);
             }
-            //dto.Status = await _callTelClient.GetStatusAsync(dto.Status);
-            //await _callApplication.EndActionAsync(dto.Adapt<EndActionInDto>());
 
         }
 
+        /// <summary>
+        /// 处理状态
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet("processing-checked-out-data")]
+        [AllowAnonymous]
+        public async Task ProcessingCheckedOutData()
+        {
+            var list = await _cacheTelNotifyStatusDto.GetAsync(TelNotifyStatusListKey, HttpContext.RequestAborted);
+            if (list != null && list.Any())
+            {
+                foreach (var dto in list)
+                {
+                    var data = await _telOperationRepository.GetAsync(p => p.TelNo == dto.TelNo && p.StaffNo == dto.StaffNo && p.CreationTime > dto.NotifyStatusTime);
+                    if (data != null)
+                    {
+                        list.Remove(dto);
+                    }
+                    else
+                    {
+                        list.Remove(dto);
+                        //处理签出
+                        await _callApplication.SingOutAsync(HttpContext.RequestAborted);
+                    }
+                }
+                await _cacheTelNotifyStatusDto.SetAsync(TelNotifyStatusListKey, list, cancellationToken: HttpContext.RequestAborted);
+            }
+        }
+
         #endregion
 
         #region 通话记录(对内)

+ 30 - 8
src/Hotline.Application/CallCenter/DefaultCallApplication.cs

@@ -313,15 +313,37 @@ public abstract class DefaultCallApplication : ICallApplication
     /// <returns></returns>
     public virtual async Task<TrOnDutyResponseDto> GetTelStateAsync(CancellationToken cancellationToken)
     {
-        var work = _userCacheManager.GetWorkByUserNoExp(_sessionContext.RequiredUserId);
-        if (work is null) return null;
-        return await Task.FromResult(new TrOnDutyResponseDto
+        var userId = _sessionContext.RequiredUserId;
+        var work = _userCacheManager.GetWorkByUserNoExp(userId);
+        if (work is not null)
         {
-            TelNo = work.TelNo,
-            QueueId = work.QueueId,
-            StartTime = work.StartTime,
-            StaffNo = work.StaffNo
-        });
+            //小休
+            bool isRest = await _telRestRepository.AnyAsync(x => x.TelNo == work.TelNo && x.UserId == userId && !x.EndTime.HasValue, cancellationToken);
+
+            //保持
+            bool isCallHold = await _telActionRecordRepository.AnyAsync(x => x.TelNo == work.TelNo && x.UserId == userId && x.ActionType == EActionType.CallHold
+            && !x.EndTime.HasValue, cancellationToken);
+
+            //整理
+            bool isCallEndArrange = await _telActionRecordRepository.AnyAsync(x => x.TelNo == work.TelNo && x.UserId == userId &&
+            x.ActionType == EActionType.CallEndArrange && !x.EndTime.HasValue, cancellationToken);
+
+            return new TrOnDutyResponseDto()
+            {
+                TelNo = work.TelNo,
+                StaffNo = work.StaffNo,
+                Description = work.Description,
+                QueueId = work.QueueId,
+                StartTime = work.StartTime,
+                IsRest = isRest,
+                IsCallHold = isCallHold,
+                IsCallEndArrange = isCallEndArrange,
+                ExtensionStatus = work.ExtensionStatus,
+                OldExtensionStatus = work.OldExtensionStatus
+            };
+
+        }
+        return null;
     }
 
     /// <summary>

+ 25 - 0
src/Hotline.Share/Dtos/CallCenter/TelNotifyStatusDto.cs

@@ -0,0 +1,25 @@
+namespace Hotline.Share.Dtos.CallCenter
+{
+    public class TelNotifyStatusDto
+    {
+        /// <summary>
+        /// 分机号
+        /// </summary>
+        public string TelNo { get; set; }
+
+        /// <summary>
+        /// 工号
+        /// </summary>
+        public string StaffNo { get; set; }
+
+        /// <summary>
+        /// 状态
+        /// </summary>
+        public int Status { get; set; }
+
+        /// <summary>
+        /// 收到时间
+        /// </summary>
+        public DateTime? NotifyStatusTime { get; set; }
+    }
+}

+ 10 - 0
src/Hotline.Share/Dtos/TrCallCenter/TrTelDao.cs

@@ -236,6 +236,16 @@ namespace Hotline.Share.Dtos.TrCallCenter
         {
             return (int)(DateTime.Now - StartTime).TotalSeconds;
         }
+
+        /// <summary>
+        ///话机状态
+        /// </summary>
+        public EExtensionStatus? OldExtensionStatus { get; set; }
+
+        /// <summary>
+        ///话机状态
+        /// </summary>
+        public EExtensionStatus? ExtensionStatus { get; set; }
     }
 
 

+ 1 - 1
src/Hotline/Users/Work.cs

@@ -61,7 +61,7 @@ public class Work : CreationModificationEntity
     /// <summary>
     ///话机状态
     /// </summary>
-    public EExtensionStatus ExtensionStatus { get; set; }
+    public EExtensionStatus? ExtensionStatus { get; set; }
 
     ///// <summary>
     ///// SignalR.ConnectionId