Ver Fonte

Merge branch 'dev' of http://git.12345lm.cn/Fengwo/hotline into dev

tangjiang há 11 meses atrás
pai
commit
615021da8f

+ 54 - 1
src/Hotline.Api/Controllers/IPPbxController.cs

@@ -55,6 +55,7 @@ namespace Hotline.Api.Controllers
         private readonly IAiQualityService _aiQualityService;
         private readonly IRepository<QualityTemplate> _qualityTemplate;
         private readonly ISystemSettingCacheManager _systemSettingCacheManager;
+        private readonly IRepository<TelActionRecord> _telActionRecordRepository;
 
 
         public IPPbxController(ITrClient trClient, IMapper mapper, IUserDomainService userDomainService,
@@ -65,7 +66,8 @@ namespace Hotline.Api.Controllers
             IUserCacheManager userCacheManager, ICapPublisher capPublisher,
             ITelRestRepository telRestRepository, IRepository<User> userRepository,
             ITelApplication telApplication, IRepository<Quality.Quality> qualiteyRepository,
-            IAiQualityService aiQualityService, IRepository<QualityTemplate> qualityTemplate, ISystemSettingCacheManager systemSettingCacheManager)
+            IAiQualityService aiQualityService, IRepository<QualityTemplate> qualityTemplate, 
+            ISystemSettingCacheManager systemSettingCacheManager,IRepository<TelActionRecord> telActionRecordRepository)
         {
             _trClient = trClient;
             _mapper = mapper;
@@ -87,6 +89,7 @@ namespace Hotline.Api.Controllers
             _aiQualityService = aiQualityService;
             _qualityTemplate = qualityTemplate;
             _systemSettingCacheManager = systemSettingCacheManager;
+            _telActionRecordRepository = telActionRecordRepository;
         }
 
         #region 添添呼
@@ -265,6 +268,8 @@ namespace Hotline.Api.Controllers
             var user = await _userRepository.GetAsync(work.UserId, HttpContext.RequestAborted);
             var telRest = new TelRest(work.TelNo, work.TelNo, work.UserId, work.UserName, dto.Reason, false, user.StaffNo);
             await _telRestRepository.AddAsync(telRest, HttpContext.RequestAborted);
+            var telAction = new TelActionRecord(work.UserId, work.UserName, work.TelNo, work.QueueId, EActionType.TelRest);
+            await _telActionRecordRepository.AddAsync(telAction, HttpContext.RequestAborted);
         }
 
         /// <summary>
@@ -283,10 +288,58 @@ namespace Hotline.Api.Controllers
                 throw UserFriendlyException.SameMessage("未查询到分机休息信息");
             telRest.EndRest();
             await _telRestRepository.UpdateAsync(telRest, HttpContext.RequestAborted);
+
+            var telAction = await _telActionRecordRepository.GetAsync(x => x.TelNo == work.TelNo && x.ActionType == EActionType.TelRest && !x.EndTime.HasValue, HttpContext.RequestAborted);
+            if (telAction!=null)
+            {
+                telAction.EndAction();
+                await _telActionRecordRepository.UpdateAsync(telAction);
+            }
         }
 
         #endregion
 
+        #region 添添呼话后整理
+
+        /// <summary>
+        /// 话后整理开始
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet("callennd-arrange-begin")]
+        public async Task CallEndArrangeBegin()
+        {
+            var work = _userCacheManager.GetWorkByUser(_sessionContext.RequiredUserId);
+
+            if (work is null)
+                throw UserFriendlyException.SameMessage("分机未签入,不能操作");
+
+            var telAction = new TelActionRecord(work.UserId, work.UserName, work.TelNo, work.QueueId, EActionType.CallEndArrange);
+            await _telActionRecordRepository.AddAsync(telAction, HttpContext.RequestAborted);
+        }
+
+        /// <summary>
+        /// 话后整理结束
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet("callend-arrange-end")]
+        public async Task CallEndArrangeEnd()
+        {
+            var work = _userCacheManager.GetWorkByUser(_sessionContext.RequiredUserId);
+            if (work is null)
+                throw UserFriendlyException.SameMessage("分机未签入,不能操作");
+
+            var telAction = await _telActionRecordRepository.GetAsync(x => x.TelNo == work.TelNo && !x.EndTime.HasValue, HttpContext.RequestAborted);
+            if (telAction != null)
+            {
+                telAction.EndAction();
+                await _telActionRecordRepository.UpdateAsync(telAction);
+            }
+        }
+
+
+        #endregion
+
+
         #region 通话记录(对外)
         /// <summary>
         /// 接收通话记录

+ 1 - 0
src/Hotline.Api/Controllers/OrderController.cs

@@ -1346,6 +1346,7 @@ public class OrderController : BaseController
         var (total, items) = await _orderDelayRepository
             .Queryable(viewFilter: true, handlerFilter: !isHandled)
             .Includes(x => x.Order)
+            .Includes(x=>x.Workflow)
             .WhereIF(!string.IsNullOrEmpty(dto.Keyword),
                 d => d.Order.Title.Contains(dto.Keyword!) || d.No.Contains(dto.Keyword!))
             .WhereIF(dto.IsApply == true, x => x.DelayState != EDelayState.Examining)

+ 24 - 1
src/Hotline.Application/CallCenter/Calls/TelsStatusRefreshService.cs

@@ -1,6 +1,9 @@
-using Hotline.CallCenter.Tels;
+using Hotline.CallCenter.Calls;
+using Hotline.CallCenter.Tels;
 using Hotline.Realtimes;
+using Hotline.Share.Enums.CallCenter;
 using Hotline.Users;
+using Microsoft.AspNetCore.Http;
 using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.Hosting;
 using System.Threading;
@@ -27,6 +30,7 @@ namespace Hotline.Application.CallCenter.Calls
             var _workRepository = scope.ServiceProvider.GetRequiredService<IRepository<Work>>();
             var _telRestRepository = scope.ServiceProvider.GetRequiredService<IRepository<TelRest>>();
             var _cacheWork = scope.ServiceProvider.GetRequiredService<ITypedCache<Work>>();
+            var _telActionRecordRepository = scope.ServiceProvider.GetRequiredService<IRepository<TelActionRecord>>();
             int times = 300000;
             while (!stoppingToken.IsCancellationRequested)
             {
@@ -54,6 +58,25 @@ namespace Hotline.Application.CallCenter.Calls
                                 await _workRepository.UpdateAsync(item, stoppingToken);
                                 _cacheWork.Remove(item.GetKey(KeyMode.UserId));
                                 _cacheWork.Remove(item.GetKey(KeyMode.TelNo));
+
+                                #region 小休状态
+                                var telAction = await _telActionRecordRepository.GetAsync(x => x.TelNo == item.TelNo && x.ActionType == EActionType.TelRest && !x.EndTime.HasValue, stoppingToken);
+                                if (telAction != null)
+                                {
+                                    telAction.EndAction();
+                                    await _telActionRecordRepository.UpdateAsync(telAction);
+                                }
+                                #endregion
+                                #region 话后整理
+
+                                var telarrangeAction = await _telActionRecordRepository.GetAsync(x => x.TelNo == item.TelNo && x.ActionType == EActionType.CallEndArrange && !x.EndTime.HasValue,stoppingToken);
+                                if (telarrangeAction != null)
+                                {
+                                    telarrangeAction.EndAction();
+                                    await _telActionRecordRepository.UpdateAsync(telarrangeAction);
+                                }
+
+                                #endregion
                             }
                         }
                     }

+ 36 - 1
src/Hotline.Application/Tels/TelApplication.cs

@@ -1,9 +1,13 @@
 using Hotline.Caching.Interfaces;
+using Hotline.CallCenter.Calls;
 using Hotline.CallCenter.Tels;
+using Hotline.Share.Enums.CallCenter;
 using Hotline.Users;
+using Microsoft.AspNetCore.Http;
 using XF.Domain.Cache;
 using XF.Domain.Dependency;
 using XF.Domain.Exceptions;
+using XF.Domain.Repository;
 
 namespace Hotline.Application.Tels;
 
@@ -13,17 +17,20 @@ public class TelApplication : ITelApplication, IScopeDependency
     private readonly ITelRestRepository _telRestRepository;
     private readonly ITypedCache<Work> _cacheWork;
     private readonly IWorkRepository _workRepository;
+    private readonly IRepository<TelActionRecord> _telActionRecordRepository;
 
     public TelApplication(
         IUserCacheManager userCacheManager,
         ITelRestRepository telRestRepository,
         ITypedCache<Work> cacheWork,
-        IWorkRepository workRepository)
+        IWorkRepository workRepository,
+        IRepository<TelActionRecord> telActionRecordRepository)
     {
         _userCacheManager = userCacheManager;
         _telRestRepository = telRestRepository;
         _cacheWork = cacheWork;
         _workRepository = workRepository;
+        _telActionRecordRepository = telActionRecordRepository;
     }
 
     /// <summary>
@@ -45,6 +52,20 @@ public class TelApplication : ITelApplication, IScopeDependency
         await _workRepository.UpdateAsync(work, cancellationToken);
         _cacheWork.Remove(work.GetKey(KeyMode.UserId));
         _cacheWork.Remove(work.GetKey(KeyMode.TelNo));
+
+        var telAction = await _telActionRecordRepository.GetAsync(x => x.TelNo == work.TelNo && x.ActionType == EActionType.TelRest && !x.EndTime.HasValue, cancellationToken);
+        if (telAction != null)
+        {
+            telAction.EndAction();
+            await _telActionRecordRepository.UpdateAsync(telAction);
+        }
+
+        var telarrangeAction = await _telActionRecordRepository.GetAsync(x => x.TelNo == work.TelNo && x.ActionType == EActionType.CallEndArrange && !x.EndTime.HasValue, cancellationToken);
+        if (telarrangeAction != null)
+        {
+            telarrangeAction.EndAction();
+            await _telActionRecordRepository.UpdateAsync(telarrangeAction);
+        }
     }
 
     public async Task SignOutByTelNoAsync(string telNo,CancellationToken cancellationToken)
@@ -63,5 +84,19 @@ public class TelApplication : ITelApplication, IScopeDependency
         await _workRepository.UpdateAsync(work, cancellationToken);
         _cacheWork.Remove(work.GetKey(KeyMode.UserId));
         _cacheWork.Remove(work.GetKey(KeyMode.TelNo));
+
+        var telAction = await _telActionRecordRepository.GetAsync(x => x.TelNo == work.TelNo && x.ActionType == EActionType.TelRest && !x.EndTime.HasValue, cancellationToken);
+        if (telAction != null)
+        {
+            telAction.EndAction();
+            await _telActionRecordRepository.UpdateAsync(telAction);
+        }
+
+        var telarrangeAction = await _telActionRecordRepository.GetAsync(x => x.TelNo == work.TelNo && x.ActionType == EActionType.CallEndArrange && !x.EndTime.HasValue, cancellationToken);
+        if (telarrangeAction != null)
+        {
+            telarrangeAction.EndAction();
+            await _telActionRecordRepository.UpdateAsync(telarrangeAction);
+        }
     }
 }

+ 14 - 0
src/Hotline.Share/Enums/CallCenter/EActionType.cs

@@ -0,0 +1,14 @@
+using System.ComponentModel;
+
+
+namespace Hotline.Share.Enums.CallCenter
+{
+    public enum EActionType
+    {
+        [Description("小休")]
+        TelRest = 0,
+
+        [Description("话后整理")]
+        CallEndArrange = 1,
+    }
+}

+ 70 - 0
src/Hotline/CallCenter/Calls/TelActionRecord.cs

@@ -0,0 +1,70 @@
+using Hotline.Share.Enums.CallCenter;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using XF.Domain.Repository;
+
+namespace Hotline.CallCenter.Calls
+{
+    public class TelActionRecord: CreationEntity
+    {
+        /// <summary>
+        /// 用户ID
+        /// </summary>
+        public string UserId { get; set; }
+
+        /// <summary>
+        /// 用户名称
+        /// </summary>
+        public string UserName { get; set; }
+
+        /// <summary>
+        /// 分机号
+        /// </summary>
+        public string TelNo { get; set; }
+
+        /// <summary>
+        /// 分机组
+        /// </summary>
+        public string QueueId { get; set; }
+
+        /// <summary>
+        /// 开始时间
+        /// </summary>
+        public DateTime StartTime { get; set; }
+
+        /// <summary>
+        /// 结束时间
+        /// </summary>
+        public DateTime? EndTime { get; set; }
+
+        /// <summary>
+        /// 动作类型
+        /// </summary>
+        public EActionType ActionType { get; set; }
+
+        /// <summary>
+        /// 用时
+        /// </summary>
+        public double Duration { get; private set; }
+
+        public TelActionRecord()
+        {
+            
+        }
+
+        public TelActionRecord(string userId,string userName,string telNo,string queueId,EActionType actionType)
+        {
+            UserId = userId;UserName = userName;TelNo = telNo;QueueId = queueId;ActionType = actionType;StartTime = DateTime.Now;
+        }
+
+
+        public void EndAction()
+        {
+            EndTime = DateTime.Now;
+            Duration = (EndTime.Value - StartTime).TotalSeconds;
+        }
+    }
+}