Explorar el Código

智能回访需求

Dun.Jason hace 9 meses
padre
commit
d0e1d5eb67

+ 11 - 0
src/Hotline.Ai.Jths/AiVisitService.cs

@@ -183,6 +183,17 @@ namespace Hotline.Ai.Jths
             return null;
         }
 
+        public async Task<AiVisitQueryData> QueryAiVisitTaskEx(string batchId, string taskId, CancellationToken cancellationToken)
+        {
+            var dto = new AiVisitServiceQueryRequest() { BatchUid = batchId, TaskUid = taskId, PageNo = 1, PageSize = 100 };
+            var response = await ExecuteAsync<AiVisitServiceQueryRequest, AiVisitServiceQueryResponse>(_baseUrl + "/edas/task/status/history", Method.Get, dto, cancellationToken);
+            if (response != null && response.Result != null && response.Result.Result.Count > 0)
+            {
+                return new AiVisitQueryData() { Uid = response.Result.Result[0].Uid, Status = response.Result.Result[0].Status };
+            }
+            return null;
+        }
+
 
         public async Task<TResponse> ExecuteAsync<TRequest,TResponse>(string path, Method httpMethod, TRequest request,
             CancellationToken cancellationToken)

+ 4 - 1
src/Hotline.Api/Controllers/AiController.cs

@@ -559,6 +559,7 @@ namespace Hotline.Api.Controllers
                             {
                                 aiOrderVisitDetail.AiOrderVisitState = Share.Enums.Ai.EAiOrderVisitState.Ended; //更新AI子表
                                 aiOrderVisitDetail.AiVisitTime = DateTime.Now;
+                                aiOrderVisitDetail.CallTime = callRecord.CallTime;
                                 aiOrderVisit.VisitedCount++;
                                 //处理结果
                                 var visitDetail = _orderVisitDetailRepository.Queryable().Where(x => x.VisitId == aiOrderVisitDetail.OrderVisit.Id).ToList();
@@ -671,15 +672,17 @@ namespace Hotline.Api.Controllers
                                     x.VisitContent = visitContent;
                                     x.Volved = isSolve;
                                     x.IsContact = isContact;
-                                    if (string.IsNullOrEmpty(orgProcessingResults.Key) || seatEvaluate == null || isSolve == null || isContact == null ||  orgProcessingResults.Value == "不满意")
+                                    if (string.IsNullOrEmpty(orgProcessingResults.Key) || seatEvaluate == null || isSolve == null || isContact == null ||  orgProcessingResults.Value == "不满意" || seatEvaluate== ESeatEvaluate.NoSatisfied)
                                     {
                                         //x.OrgNoSatisfiedReason = new List<Kv>() { new Kv() { Key = "7", Value = "未回复" } };
                                         //TODO 记录不满意原因到内容中供人工回访甄别选择不满意原因
                                         aiOrderVisitDetail.OrderVisit.VisitState = Share.Enums.Order.EVisitState.WaitForVisit;
+                                        aiOrderVisitDetail.OrderVisit.IsEffectiveAiVisit = false;
                                     }
                                     else
                                     {
                                         aiOrderVisitDetail.OrderVisit.VisitState = Share.Enums.Order.EVisitState.Visited;
+                                        aiOrderVisitDetail.OrderVisit.IsEffectiveAiVisit = true;
                                     }
                                 });
                                 await _orderVisitDetailRepository.UpdateRangeAsync(orgDetail, HttpContext.RequestAborted);

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

@@ -794,6 +794,7 @@ public class OrderController : BaseController
             .WhereIF(!string.IsNullOrEmpty(dto.EmployeeName), d => !string.IsNullOrEmpty(d.EmployeeId) && d.Employee.Name == dto.EmployeeName)
             .WhereIF(dto.IsProvince != null && dto.IsProvince == true, d => d.Order.IsProvince == true)
             .WhereIF(dto.IsProvince != null && dto.IsProvince == false, d => d.Order.IsProvince == false)
+            .WhereIF(dto.IsEffectiveAiVisit != null,d=>d.IsEffectiveAiVisit == dto.IsEffectiveAiVisit)
             .OrderByDescending(x => x.PublishTime)
             .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
         return new PagedDto<OrderVisitDto>(total, _mapper.Map<IReadOnlyList<OrderVisitDto>>(items));

+ 4 - 7
src/Hotline.Api/Controllers/TestController.cs

@@ -272,12 +272,6 @@ IRepository<Hotspot> hotspotRepository
         }
     }
 
-
-
-
-
-
-
     [HttpGet("addcontingencymanagementhotspot")]
     [AllowAnonymous]
     public async Task AddContingencyManagementHotspot([FromQuery] string? Id,string? ParentId)
@@ -593,7 +587,10 @@ IRepository<Hotspot> hotspotRepository
         //var endTime = _timeLimitDomainService
         //.CalcEndTime(DateTime.Parse("2024-07-09 14:57:51"), ETimeType.WorkDay, -3, 0, 0);///.EndTime;
         //var timeResult = _timeLimitDomainService.CalcEndTime(DateTime.Now, ETimeType.WorkDay, 3, 80, 50);
-        var t = _timeLimitDomainService.CalcWorkTimeEx(DateTime.Parse("2024-07-22 11:30:00"), DateTime.Parse("2024-07-23 14:00:00"), false);
+        //var t = _timeLimitDomainService.CalcWorkTimeEx(DateTime.Parse("2024-07-22 11:30:00"), DateTime.Parse("2024-07-23 14:00:00"), false);
+        var r = await _aiVisitService.QueryAiVisitTaskEx("MTAwMDAx173ASS0kSUAqK2rl2sFGME", "", HttpContext.RequestAborted);
+
+
         return OpenResponse.Ok(DateTime.Now.ToString("F"));
     }
 

+ 4 - 0
src/Hotline.Application/Orders/AiOrderVisitApplication.cs

@@ -31,6 +31,10 @@ namespace Hotline.Application.Orders
                 .WhereIF(dto.AiOrderVisitTaskState != null, x => x.TaskState == dto.AiOrderVisitTaskState)
                 .WhereIF(dto.StartTime.HasValue, x => x.CreationTime >= dto.StartTime)
                 .WhereIF(dto.EndTime.HasValue, x => x.CreationTime <= dto.EndTime)
+                .WhereIF(dto.AiVisitTimeBeginStart.HasValue,x=>x.BeginTime>= dto.AiVisitTimeBeginStart)
+                .WhereIF(dto.AiVisitTimeBeginEnd.HasValue,x=>x.BeginTime< dto.AiVisitTimeBeginEnd)
+                .WhereIF(dto.AiVisitTimeEndStart.HasValue,x=>x.EndTime>= dto.AiVisitTimeEndStart)
+                .WhereIF(dto.AiVisitTimeEndEnd.HasValue,x=>x.EndTime< dto.AiVisitTimeEndEnd)
                 .OrderByDescending(x => x.CreationTime);
         }
 

+ 27 - 0
src/Hotline.Share/Dtos/Ai/AiDto.cs

@@ -204,6 +204,8 @@ namespace Hotline.Share.Dtos.Ai
     {
         public int CallNo { get; set; }
 
+        public DateTime? CallTime { get; set; }
+
         /// <summary>
         /// 呼叫状态(1:呼叫中、2:完成、3:呼叫失败)
         /// </summary>
@@ -237,6 +239,26 @@ namespace Hotline.Share.Dtos.Ai
     public record AiVisitListDto : PagedKeywordRequest
     {
         public EAiOrderVisitTaskState? AiOrderVisitTaskState { get; set; }
+
+        /// <summary>
+        /// 智能回访开始时间开始
+        /// </summary>
+        public DateTime? AiVisitTimeBeginStart { get; set; }
+
+        /// <summary>
+        /// 智能回访开始时间结束
+        /// </summary>
+        public DateTime? AiVisitTimeBeginEnd { get; set; }
+
+        /// <summary>
+        /// 智能回访结束时间开始
+        /// </summary>
+        public DateTime? AiVisitTimeEndStart { get; set; }
+
+        /// <summary>
+        /// 智能回访结束时间结束
+        /// </summary>
+        public DateTime? AiVisitTimeEndEnd { get; set; }
     }
 
     public record AiVisitDetailListDto : PagedKeywordRequest
@@ -412,6 +434,11 @@ namespace Hotline.Share.Dtos.Ai
         /// 重呼次数
         /// </summary>
         public int CallTimes { get; set; }
+
+        /// <summary>
+        /// 最新外呼时间
+        /// </summary>
+        public DateTime? CallTime { get; set; }
     }
 
     public class CanAiVisitListDto

+ 5 - 0
src/Hotline.Share/Dtos/Order/OrderVisitDto.cs

@@ -53,6 +53,11 @@ namespace Hotline.Share.Dtos.Order
         /// 是否省工单
         /// </summary>
         public bool? IsProvince { get; set; }
+
+        /// <summary>
+        /// 是否有效智能回访
+        /// </summary>
+        public bool? IsEffectiveAiVisit { get; set; }
     }
 
     public record VisitJudgeQueryReq : PagedKeywordRequest

+ 2 - 0
src/Hotline/Ai/Visit/IAiVisitService.cs

@@ -15,6 +15,8 @@ namespace Hotline.Ai.Visit
 
         Task<AiVisitQueryData> QueryAiVisitTask(string batchId,string taskId, CancellationToken cancellationToken);
 
+        Task<AiVisitQueryData> QueryAiVisitTaskEx(string batchId, string taskId, CancellationToken cancellationToken);
+
         Task<bool> ChangeStatusAsync(string batchUid, string status, CancellationToken cancellationToken);
     }
 }

+ 4 - 0
src/Hotline/Orders/AiOrderVisitDetail.cs

@@ -49,6 +49,10 @@ namespace Hotline.Orders
         /// </summary>
         public DateTime? AiVisitTime { get; set; }
 
+        /// <summary>
+        /// 最新外呼时间
+        /// </summary>
+        public DateTime? CallTime { get; set; }
 
         /// <summary>
         /// 是否成功

+ 5 - 0
src/Hotline/Orders/OrderVisit.cs

@@ -158,6 +158,11 @@ public class OrderVisit : CreationEntity
     /// </summary>
     public DateTime? JudgeTime { get; set; }
 
+    /// <summary>
+    /// 是否有效智能回访
+    /// </summary>
+    public bool? IsEffectiveAiVisit { get; set; }
+
     public void AiVisitTime()
     {
         LastVisitTime = DateTime.Now;