瀏覽代碼

Merge branch 'test' of http://110.188.24.182:10023/Fengwo/hotline into test

田爽 3 月之前
父節點
當前提交
d32809cc9c

+ 69 - 39
src/Hotline.Api/Controllers/CallController.cs

@@ -13,11 +13,14 @@ using Hotline.Share.Dtos.CallCenter;
 using Hotline.Share.Dtos.Quality;
 using Hotline.Share.Dtos.TrCallCenter;
 using Hotline.Share.Enums.CallCenter;
+using Hotline.Repository.SqlSugar.Extensions;
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.Extensions.Options;
 using System.Threading;
 using XF.Domain.Exceptions;
 using XF.Utility.EnumExtensions;
+using XF.Domain.Repository;
+using MapsterMapper;
 
 namespace Hotline.Api.Controllers
 {
@@ -25,33 +28,39 @@ namespace Hotline.Api.Controllers
     {
         private readonly ICallApplication _callApplication;
         private readonly Publisher _publisher;
+        private readonly IMapper _mapper;
         private readonly IOptionsSnapshot<CallCenterConfiguration> _callcenterOptions;
         private readonly ISystemSettingCacheManager _systemSettingCacheManager;
+        private readonly IRepository<TelOperationXthx> _telOperationXthxRepository;
 
-		public CallController(
+        public CallController(
             ICallApplication callApplication,
             Publisher publisher,
+            IMapper mapper,
             IOptionsSnapshot<CallCenterConfiguration> callcenterOptions,
-            ISystemSettingCacheManager systemSettingCacheManager)
+            ISystemSettingCacheManager systemSettingCacheManager,
+            IRepository<TelOperationXthx> telOperationXthxRepository)
         {
             _callApplication = callApplication;
             _publisher = publisher;
+            _mapper = mapper;
             _callcenterOptions = callcenterOptions;
             _systemSettingCacheManager = systemSettingCacheManager;
-		}
+            _telOperationXthxRepository = telOperationXthxRepository;
+        }
 
         /// <summary>
         /// 查询分机
         /// </summary>
         [HttpGet("tels")]
         public async Task<IList<TelDto>> QueryTels()
-            => (await _callApplication.QueryTelsAsync(new QueryTelsInDto(null) { PageSize = 99999}, HttpContext.RequestAborted)).Item2;
+            => (await _callApplication.QueryTelsAsync(new QueryTelsInDto(null) { PageSize = 99999 }, HttpContext.RequestAborted)).Item2;
 
         /// <summary>
         /// 查询分机
         /// </summary>
         [HttpGet("tels-paged")]
-        public async Task<PagedDto<TelDto>> QueryTelsAsync([FromQuery]QueryTelsInDto dto)
+        public async Task<PagedDto<TelDto>> QueryTelsAsync([FromQuery] QueryTelsInDto dto)
             => (await _callApplication.QueryTelsAsync(dto, HttpContext.RequestAborted)).ToPaged();
 
         /// <summary>
@@ -140,7 +149,7 @@ namespace Hotline.Api.Controllers
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpGet("tel-operations-fixed")]
-        public Task<IReadOnlyList<TelOperation>> QueryTelOperationsFixed([FromQuery] QueryTelOperationsFixedDto dto) => 
+        public Task<IReadOnlyList<TelOperation>> QueryTelOperationsFixed([FromQuery] QueryTelOperationsFixedDto dto) =>
             _callApplication.QueryTelOperationsAsync(dto, HttpContext.RequestAborted);
 
         /// <summary>
@@ -155,8 +164,6 @@ namespace Hotline.Api.Controllers
             };
         }
 
-
-
         /// <summary>
         /// 通话转写
         /// </summary>
@@ -165,36 +172,59 @@ namespace Hotline.Api.Controllers
         [HttpPost("calls/transliteration")]
         public async Task CallTransliteration([FromBody] CallTransliteration dto)
         {
-	        foreach (var id in dto.Ids)
-	        {
-				var call = await _callApplication.GetTianrunCallAsync(id, HttpContext.RequestAborted);
-				if (call is null)
-					throw UserFriendlyException.SameMessage("通话信息错误");
-				if (call.TransliterationState == ECallTransliterationState.Underway)
-					throw UserFriendlyException.SameMessage("正在转写中,请勿重复点击,请稍作等待");
-				if (call.TransliterationState == ECallTransliterationState.Succeed)
-					throw UserFriendlyException.SameMessage("转写成功,不能重新转写");
-				call.InitTransliterationId();
-				await _callApplication.EditTransliterationStateAsync(call.Id, ECallTransliterationState.Underway, call.TransliterationId, HttpContext.RequestAborted);
-				var audioFile = call.RecordingAbsolutePath;
-				var fromNo = call.CPN;
-				var callStartTime = call.CreatedTime;
-				var Id = call.TransliterationId;
-				var setting = _systemSettingCacheManager.GetSetting(SettingConstants.ViteRecordPrefix);
-
-
-
-				var handler = new AiQualityHandler()
-				{
-					Id = Id,
-					Source = "AiAnswered",
-					AudioFile = audioFile,
-					FromNo = fromNo,
-					CallStartTime = callStartTime,
-					ViteRecordPrefix = setting?.SettingValue[0],
-				};
-				await _publisher.PublishAsync(new AiOrderQualityNotify(handler), PublishStrategy.ParallelNoWait, HttpContext.RequestAborted);
-			}
+            foreach (var id in dto.Ids)
+            {
+                var call = await _callApplication.GetTianrunCallAsync(id, HttpContext.RequestAborted);
+                if (call is null)
+                    throw UserFriendlyException.SameMessage("通话信息错误");
+                if (call.TransliterationState == ECallTransliterationState.Underway)
+                    throw UserFriendlyException.SameMessage("正在转写中,请勿重复点击,请稍作等待");
+                if (call.TransliterationState == ECallTransliterationState.Succeed)
+                    throw UserFriendlyException.SameMessage("转写成功,不能重新转写");
+                call.InitTransliterationId();
+                await _callApplication.EditTransliterationStateAsync(call.Id, ECallTransliterationState.Underway, call.TransliterationId, HttpContext.RequestAborted);
+                var audioFile = call.RecordingAbsolutePath;
+                var fromNo = call.CPN;
+                var callStartTime = call.CreatedTime;
+                var Id = call.TransliterationId;
+                var setting = _systemSettingCacheManager.GetSetting(SettingConstants.ViteRecordPrefix);
+
+
+
+                var handler = new AiQualityHandler()
+                {
+                    Id = Id,
+                    Source = "AiAnswered",
+                    AudioFile = audioFile,
+                    FromNo = fromNo,
+                    CallStartTime = callStartTime,
+                    ViteRecordPrefix = setting?.SettingValue[0],
+                };
+                await _publisher.PublishAsync(new AiOrderQualityNotify(handler), PublishStrategy.ParallelNoWait, HttpContext.RequestAborted);
+            }
+        }
+
+        #region 坐席动作类型统计
+
+        /// <summary>
+        /// 坐席动作类型统计
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("telaction/list")]
+        public async Task<PagedDto<TelActionListXthx>> TelActionList([FromQuery] TelActionXthxDto dto)
+        {
+            var (total, items) = await _telOperationXthxRepository.Queryable()
+                .WhereIF(string.IsNullOrEmpty(dto.TelNo) == false, x => x.TelNo.Contains(dto.TelNo))
+                .WhereIF(dto.OperationStatus != null, x => x.OperationStatus == dto.OperationStatus)
+                .WhereIF(string.IsNullOrEmpty(dto.UserName) == false, x => x.UserName.Contains(dto.UserName))
+                .WhereIF(dto.StartTime.HasValue, x => x.StartTime >= dto.StartTime)
+                .WhereIF(dto.EndTime.HasValue, x => x.StartTime <= dto.EndTime)
+                .OrderByDescending(x => x.StartTime)
+                .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
+            return new PagedDto<TelActionListXthx>(total, _mapper.Map<IReadOnlyList<TelActionListXthx>>(items));
         }
-	}
+
+        #endregion
+    }
 }

+ 4 - 4
src/Hotline.Application/Snapshot/SnapshotApplicationBase.cs

@@ -523,22 +523,22 @@ public abstract class SnapshotApplicationBase
         dto.ValidateObject();
         if (int.TryParse(dto.InvitationCode, out var invitationCode) == false)
         { 
-            throw UserFriendlyException.SameMessage("邀请码格式错误");
+            throw new UserFriendlyException(200, "邀请码格式错误");
         }
         var third = await _thirdAccountRepository.GetByOpenIdAsync(_sessionContext.OpenId)
             ?? throw UserFriendlyException.SameMessage("用户不存在");
         if (third.InvitationCode.NotNullOrEmpty())
         {
-            throw UserFriendlyException.SameMessage("邀请码已存在");
+            throw new UserFriendlyException(200, "邀请码已存在");
         }
         if (_inviteCodeRecordRepository.Queryable().Where(m => m.InviteCode == dto.InvitationCode).Any())
         {
-            throw UserFriendlyException.SameMessage("邀请码已经被使用");
+            throw new UserFriendlyException(200, "邀请码已经被使用");
         }
         third.InvitationCode = dto.InvitationCode;
         var invite = await _inviteCodeRepository.Queryable()
             .Where(m => invitationCode >= m.BeginCode && invitationCode <= m.EndCode)
-            .FirstAsync() ?? throw UserFriendlyException.SameMessage("邀请码无效");
+            .FirstAsync() ?? throw new UserFriendlyException(200, "邀请码无效");
         var entity = new InviteCodeRecord
         {
             OrgId = invite.Id,

+ 96 - 22
src/Hotline.Share/Dtos/TrCallCenter/TrTelDao.cs

@@ -227,7 +227,7 @@ namespace Hotline.Share.Dtos.TrCallCenter
         /// 工号
         /// </summary>
         public string? StaffNo { get; set; }
-        
+
         public int Second => CalcSecond();
 
         public ETelModel? TelModel { get; set; }
@@ -582,13 +582,13 @@ namespace Hotline.Share.Dtos.TrCallCenter
     public class TrCallDto
     {
         public string Id { get; set; }
-		/// <summary>
-		/// 可直接访问的通话录音地址
-		/// </summary>
-		public string? RecordingFileUrl { get; set; }
+        /// <summary>
+        /// 可直接访问的通话录音地址
+        /// </summary>
+        public string? RecordingFileUrl { get; set; }
         public string? RecordingBaseAddress { get; set; }
         public string? RecordingAbsolutePath { get; set; }
-        
+
         /// <summary>
         /// 呼叫方向
         /// </summary>
@@ -778,10 +778,10 @@ namespace Hotline.Share.Dtos.TrCallCenter
 
         public string TransliterationStateText => TransliterationState.GetDescription();
 
-		/// <summary>
-		/// 转写id  涉及转写失败后再次推送  id需要更换
-		/// </summary>
-		public string? TransliterationId { get; set; }
+        /// <summary>
+        /// 转写id  涉及转写失败后再次推送  id需要更换
+        /// </summary>
+        public string? TransliterationId { get; set; }
 
         /// <summary>
         /// 敏感标签
@@ -793,7 +793,7 @@ namespace Hotline.Share.Dtos.TrCallCenter
         #endregion
     }
 
-    public class CallRecordOutDto 
+    public class CallRecordOutDto
     {
         /// <summary>
         /// 可直接访问的通话录音地址
@@ -1102,7 +1102,7 @@ namespace Hotline.Share.Dtos.TrCallCenter
         /// <summary>
         /// 工单Id
         /// </summary>
-        public string  OrderId { get; set; }
+        public string OrderId { get; set; }
 
         /// <summary>
         /// 工单编号
@@ -1117,17 +1117,18 @@ namespace Hotline.Share.Dtos.TrCallCenter
     }
 
 
-    public record class CallTransliteration {
-		/// <summary>
-		/// 主叫
-		/// </summary>
-		public List<string> Ids { get; set; }
-	}
-	#endregion
+    public record class CallTransliteration
+    {
+        /// <summary>
+        /// 主叫
+        /// </summary>
+        public List<string> Ids { get; set; }
+    }
+    #endregion
 
-	#region 关联
+    #region 关联
 
-	public class LinkCallRecordDto
+    public class LinkCallRecordDto
     {
         public bool IsOrder { get; set; }
 
@@ -1140,7 +1141,7 @@ namespace Hotline.Share.Dtos.TrCallCenter
 
     #region 坐席动作类型
 
-    public record TelActionListDto:PagedRequest
+    public record TelActionListDto : PagedRequest
     {
         public string TelNo { get; set; }
 
@@ -1153,6 +1154,18 @@ namespace Hotline.Share.Dtos.TrCallCenter
         public DateTime? EndTime { get; set; }
     }
 
+    public record TelActionXthxDto : PagedRequest
+    {
+        public string TelNo { get; set; }
+
+        public EOperationStatus? OperationStatus { get; set; }
+
+        public string? UserName { get; set; }
+
+        public DateTime? StartTime { get; set; }
+        public DateTime? EndTime { get; set; }
+    }
+
     public class TelActionListRep
     {
         public string Id { get; set; }
@@ -1201,5 +1214,66 @@ namespace Hotline.Share.Dtos.TrCallCenter
 
     }
 
+    public class TelActionListXthx
+    {
+        public string Id { get; set; }
+
+        /// <summary>
+        /// 分机id
+        /// </summary>
+        public string? TelId { get; set; }
+
+        /// <summary>
+        /// 分机号
+        /// </summary>
+        public string? TelNo { get; set; }
+
+        /// <summary>
+        /// 工号
+        /// </summary>
+        public string? StaffNo { get; set; }
+
+        /// <summary>
+        /// 用户id
+        /// </summary>
+        public string? UserId { get; set; }
+
+        /// <summary>
+        /// 用户名称
+        /// </summary>
+        public string? UserName { get; set; }
+
+        /// <summary>
+        /// 分组
+        /// </summary>
+        public string? UserGroup { get; set; }
+
+        /// <summary>
+        /// 开始时间
+        /// </summary>
+        public DateTime? StartTime { get; set; }
+
+        /// <summary>
+        /// 结束时间
+        /// </summary>
+        public DateTime? EndTime { get; set; }
+
+        /// <summary>
+        /// 时长(单位:秒)
+        /// </summary>
+        public double? RestDuration { get; set; }
+
+        /// <summary>
+        /// 备注(冗余)
+        /// </summary>
+        public string? Reason { get; set; }
+
+        /// <summary>
+        /// 分机状态
+        /// </summary>
+        public EOperationStatus OperationStatus { get; set; }
+
+    }
+
     #endregion
 }

+ 27 - 0
src/Hotline.Share/Enums/CallCenter/EOperationStatus.cs

@@ -0,0 +1,27 @@
+using System.ComponentModel;
+
+namespace Hotline.Share.Enums.CallCenter;
+
+/// <summary>
+/// 动作状态
+/// </summary>
+public enum EOperationStatus
+{
+    /// <summary>
+    /// 签入
+    /// </summary>
+    [Description("签入")]
+    CheckIn = 100,
+
+    /// <summary>
+    /// 示忙
+    /// </summary>
+    [Description("示忙")]
+    ShowBusy = 202,
+
+    /// <summary>
+    /// 小休
+    /// </summary>
+    [Description("小休")]
+    ShortBreak = 201
+}

+ 82 - 0
src/Hotline/CallCenter/Tels/TelOperationXthx.cs

@@ -0,0 +1,82 @@
+using Hotline.Share.Enums.CallCenter;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using XF.Domain.Repository;
+
+namespace Hotline.CallCenter.Tels
+{
+    [Description("坐席动作类型")]
+    public class TelOperationXthx : CreationEntity
+    {
+        /// <summary>
+        /// 分机id
+        /// </summary>
+        [SugarColumn(ColumnDescription = "分机id")]
+        public string? TelId { get; set; }
+
+        /// <summary>
+        /// 分机号
+        /// </summary>
+        [SugarColumn(ColumnDescription = "分机号")]
+        public string? TelNo { get; set; }
+
+        /// <summary>
+        /// 工号
+        /// </summary>
+        [SugarColumn(ColumnDescription = "工号")]
+        public string? StaffNo { get; set; }
+
+        /// <summary>
+        /// 用户id
+        /// </summary>
+        [SugarColumn(ColumnDescription = "用户id")]
+        public string? UserId { get; set; }
+
+        /// <summary>
+        /// 用户名称
+        /// </summary>
+        [SugarColumn(ColumnDescription = "用户名称")]
+        public string? UserName { get; set; }
+
+        /// <summary>
+        /// 分组
+        /// </summary>
+        [SugarColumn(ColumnDescription = "分组")]
+        public string? UserGroup { get; set; }
+
+        /// <summary>
+        /// 开始时间
+        /// </summary>
+        [SugarColumn(ColumnDescription = "开始时间")]
+        public DateTime? StartTime { get; set; }
+
+        /// <summary>
+        /// 结束时间
+        /// </summary>
+        [SugarColumn(ColumnDescription = "结束时间")]
+        public DateTime? EndTime { get; set; }
+
+        /// <summary>
+        /// 时长(单位:秒)
+        /// </summary>
+        [SugarColumn(ColumnDescription = "时长(单位:秒)")]
+        public double? RestDuration { get; set; }
+
+        /// <summary>
+        /// 备注(冗余)
+        /// </summary>
+        [SugarColumn(ColumnDescription = "备注(冗余)")]
+        public string? Reason { get; set; }
+
+        /// <summary>
+        /// 分机状态
+        /// </summary>
+        public EOperationStatus OperationStatus { get; set; }
+
+    }
+}