Jelajahi Sumber

智能回访统计

Dun.Jason 4 bulan lalu
induk
melakukan
16bc8f2b6c

+ 29 - 19
src/Hotline.Api/Controllers/Bi/BiOrderController.cs

@@ -26,6 +26,7 @@ using Hotline.Share.Enums.Order;
 using Hotline.Share.Requests;
 using Hotline.Tools;
 using MapsterMapper;
+using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Mvc;
 using Org.BouncyCastle.Utilities.Collections;
 using SqlSugar;
@@ -4631,6 +4632,33 @@ namespace Hotline.Api.Controllers.Bi
 
         }
 
+        #region 智能回访统计
+
+        /// <summary>
+        /// 智能回访数据统计
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("aivisit-statistics")]
+        public async Task<QueryAiVisitStatisticsResp> QueryAiVisitStatistics([FromQuery] QueryAiVisitStatisticsRequest dto)
+        {
+            var model = await _orderRepository.QueryAiVisitStatistics(dto);
+            return model;
+        }
+
+        /// <summary>
+        /// 智能回访有效性分析
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("aivisit-effective-analysis")]
+        public async Task<QueryAiVisitEffectiveAnalysisResp> QueryAiVisitEffectiveAnalysis([FromQuery]QueryAiVisitStatisticsRequest dto)
+        {
+            var model = await _orderRepository.QueryAiVisitEffectiveAnalysis(dto);
+            return model;
+        }
+        #endregion
+
         /// <summary>
         /// 扭转信件统计
         /// </summary>
@@ -4693,24 +4721,6 @@ namespace Hotline.Api.Controllers.Bi
         }
 
 
-        #region 智能回访统计
-
-        /// <summary>
-        /// 智能回访数据统计
-        /// </summary>
-        /// <param name="dto"></param>
-        /// <returns></returns>
-        [HttpGet("aivisit-statistics")]
-        public async Task QueryAiVisitStatistics([FromQuery] QueryAiVisitStatisticsRequest dto)
-        {
-            _aiOrderVisitDetailRepository.Queryable().Where(x => x.CreationTime >= dto.StartTime && x.CreationTime <= dto.EndTime).GroupBy(x => x.OrderId)
-                .Select(x => new QueryAiVisitStatisticsResp()
-                {
-                    AiVisitCount = SqlFunc.AggregateCount(x.OrderId),
-                    AiVisitSuccessCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.OrderVisit.IsEffectiveAiVisit==true,1,0))
-                });
-        }
-
-        #endregion
+        
     }
 }

+ 49 - 3
src/Hotline.Repository.SqlSugar/Orders/OrderRepository.cs

@@ -35,6 +35,7 @@ namespace Hotline.Repository.SqlSugar.Orders
         private readonly IRepository<OrderVisitDetail> _orderVisitDetailRepository;
         private readonly ISessionContext _sessionContext;
         private readonly ISystemSettingCacheManager _systemSettingCacheManager;
+        private readonly IRepository<AiOrderVisitDetail> _aiOrderVisitDetailRepository;
 
 		public OrderRepository(ISugarUnitOfWork<HotlineDbContext> uow,
             IDataPermissionFilterBuilder dataPermissionFilterBuilder,
@@ -42,7 +43,8 @@ namespace Hotline.Repository.SqlSugar.Orders
             IRepository<OrderVisit> orderVisitRepository,
             ISessionContext sessionContext,
             IRepository<OrderVisitDetail> orderVisitDetailRepository,
-            ISystemSettingCacheManager systemSettingCacheManager
+            ISystemSettingCacheManager systemSettingCacheManager,
+            IRepository<AiOrderVisitDetail> aiOrderVisitDetailRepository
 			) : base(uow, dataPermissionFilterBuilder)
         {
             _dataPermissionFilterBuilder = dataPermissionFilterBuilder;
@@ -51,7 +53,7 @@ namespace Hotline.Repository.SqlSugar.Orders
             _sessionContext = sessionContext;
             _orderVisitDetailRepository = orderVisitDetailRepository;
             _systemSettingCacheManager = systemSettingCacheManager;
-
+            _aiOrderVisitDetailRepository = aiOrderVisitDetailRepository;
         }
 
         public async Task<string> AddOrderNavAsync(Order order, CancellationToken cancellationToken)
@@ -1432,7 +1434,51 @@ namespace Hotline.Repository.SqlSugar.Orders
                 ;
 
 		}
-	}
+
+        /// <summary>
+        /// 智能回访数据统计
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        public async Task<QueryAiVisitStatisticsResp> QueryAiVisitStatistics(QueryAiVisitStatisticsRequest dto)
+        {
+            var list = await _aiOrderVisitDetailRepository.Queryable().Includes(x=>x.OrderVisit).Where(x => x.CreationTime >= dto.StartTime && x.CreationTime <= dto.EndTime && x.OrderVisit.VisitState == EVisitState.Visited).ToListAsync();
+            return new QueryAiVisitStatisticsResp()
+            {
+                AiVisitCount = list.Count,
+                AiVisitSuccessCount = list.Where(x=>x.OrderVisit.IsEffectiveAiVisit==true).Count(), // SqlFunc.AggregateSum(SqlFunc.IIF(x.OrderVisit.IsEffectiveAiVisit == true, 1, 0)),
+                AiVisitArtificialReviewCount = list.Where(x => x.OrderVisit.IsEffectiveAiVisit == false).Count(),
+                AiVisitCallReviewCount = list.Where(x=> x.OrderVisit.IsEffectiveAiVisit == false && !string.IsNullOrEmpty(x.OrderVisit.CallId)).Count(),
+                AiVisitHandReviewCount = list.Where(x=>x.OrderVisit.IsEffectiveAiVisit == false && string.IsNullOrEmpty(x.OrderVisit.CallId)).Count()
+            };
+        }
+
+        /// <summary>
+        /// 智能回访有效性分析
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        public async Task<QueryAiVisitEffectiveAnalysisResp> QueryAiVisitEffectiveAnalysis(QueryAiVisitStatisticsRequest dto)
+        {
+            var list = await _aiOrderVisitDetailRepository.Queryable().Includes(x => x.OrderVisit).Where(x => x.CreationTime >= dto.StartTime && x.CreationTime <= dto.EndTime && x.OrderVisit.VisitState == EVisitState.Visited).ToListAsync();
+            return new QueryAiVisitEffectiveAnalysisResp()
+            {
+                AiVisitCount = list.Count,
+                AiVisitSuccessCount =list.Where(x=> x.OrderVisit.IsEffectiveAiVisit == true).Count(),
+                AiVisitCallTwoFailCount = list.Where(x=> x.CallTimes>=1 && x.AiIsContact ==null && x.AiVolved ==null && (x.AiOrgProcessingResults == null || x.AiOrgProcessingResults.Key == null)).Count(),
+                AiVisitHaveOneAnswerCount = list.Where(x=>x.OrderVisit.IsEffectiveAiVisit == false &&
+                                                                            (x.AiIsContact!= null && x.AiVolved==null && (x.AiOrgProcessingResults == null || x.AiOrgProcessingResults.Key == null)) ||
+                                                                            (x.AiIsContact == null && x.AiVolved != null && (x.AiOrgProcessingResults == null || x.AiOrgProcessingResults.Key == null)) ||
+                                                                            (x.AiIsContact == null && x.AiVolved == null && (x.AiOrgProcessingResults != null || x.AiOrgProcessingResults.Key != null))).Count(), //只有一个答案
+                AiVisitHaveTwoAnswerCount = list.Where(x=> x.OrderVisit.IsEffectiveAiVisit == false &&
+                                                                            (x.AiIsContact != null && x.AiVolved != null && (x.AiOrgProcessingResults == null || x.AiOrgProcessingResults.Key == null)) ||
+                                                                            (x.AiIsContact != null && x.AiVolved == null && (x.AiOrgProcessingResults != null || x.AiOrgProcessingResults.Key != null)) ||
+                                                                            (x.AiIsContact == null && x.AiVolved != null && (x.AiOrgProcessingResults != null || x.AiOrgProcessingResults.Key != null))).Count(),//只有两个答案
+                AiVisitHaveThreeAnswerCount = list.Where(x=> x.OrderVisit.IsEffectiveAiVisit == false && x.AiIsContact != null && x.AiVolved != null && (x.AiOrgProcessingResults != null || x.AiOrgProcessingResults.Key != null)).Count()//有三个答案
+            };
+        }
+
+    }
 
     public class OrderScreenRepository : BaseRepositoryWorkflow<OrderScreen>, IOrderScreenRepository, IScopeDependency
     {

+ 35 - 2
src/Hotline.Share/Requests/PagedKeywordRequest.cs

@@ -1375,12 +1375,12 @@ public class QueryAiVisitStatisticsRequest
 public class QueryAiVisitStatisticsResp
 {
     /// <summary>
-    /// 智能回访总量
+    /// 智能回访总量(去重)
     /// </summary>
     public int AiVisitCount { get; set; }
 
     /// <summary>
-    /// 智能回访有效量
+    /// 智能回访有效量(去重)
     /// </summary>
     public int AiVisitSuccessCount { get; set;}
 
@@ -1400,4 +1400,37 @@ public class QueryAiVisitStatisticsResp
     public int AiVisitHandReviewCount { get; set; }
 }
 
+
+public class QueryAiVisitEffectiveAnalysisResp
+{
+    /// <summary>
+    /// 智能回访总量(不去重)
+    /// </summary>
+    public int AiVisitCount { get; set; }
+
+    /// <summary>
+    /// 智能回访有效量(不去重)
+    /// </summary>
+    public int AiVisitSuccessCount { get; set; }
+
+    /// <summary>
+    /// 拨打两次失败量
+    /// </summary>
+    public int AiVisitCallTwoFailCount { get; set; }
+
+    /// <summary>
+    /// 有一个答案的数量
+    /// </summary>
+    public int AiVisitHaveOneAnswerCount{ get; set; }
+
+    /// <summary>
+    /// 有两个答案的数量
+    /// </summary>
+    public int AiVisitHaveTwoAnswerCount { get; set; }
+
+    /// <summary>
+    /// 有三个答案的数量
+    /// </summary>
+    public int AiVisitHaveThreeAnswerCount { get; set; }
+}
 #endregion

+ 14 - 0
src/Hotline/Orders/IOrderRepository.cs

@@ -186,6 +186,20 @@ namespace Hotline.Orders
 		/// <returns></returns>
 		ISugarQueryable<OrgVisitDetailListResp> OrgVisitDetailFiltrationList(OrgVisitDetailListReq dto, string orgId);
 
+        /// <summary>
+        /// 智能回访数据统计
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        Task<QueryAiVisitStatisticsResp> QueryAiVisitStatistics(QueryAiVisitStatisticsRequest dto);
+
+        /// <summary>
+        /// 智能回访有效性分析
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        Task<QueryAiVisitEffectiveAnalysisResp> QueryAiVisitEffectiveAnalysis(QueryAiVisitStatisticsRequest dto);
+
     }
 
     public interface IOrderScreenRepository : IRepositoryWorkflow<OrderScreen>