浏览代码

智能回访

Dun.Jason 11 月之前
父节点
当前提交
e2f7434ee4

+ 38 - 1
src/Hotline.Ai.Jths/AiVisitConfig.cs

@@ -9,18 +9,55 @@ namespace Hotline.Ai.Jths
         public string SceneUid { get; set; }
         public string RuleUid { get;set; }
 
+        /// <summary>
+        /// 来电名称
+        /// </summary>
         public string VisitFromNameKey { get; set; }
 
+
+        /// <summary>
+        /// 来电性别
+        /// </summary>
         public string VisitFromGenderKey { get; set; }
 
+        /// <summary>
+        /// 来电时间
+        /// </summary>
         public string VisitCreationTimeKey { get; set; }
 
+        /// <summary>
+        /// 工单标题
+        /// </summary>
         public string VisitOrderTitleKey { get; set; }
 
+        /// <summary>
+        /// 是否来电工单
+        /// </summary>
+        public bool VisitIsCallOrder { get; set; }
+
+        /// <summary>
+        /// 是否解决
+        /// </summary>
         public string QuestionIdOne { get; set; }
 
+        /// <summary>
+        /// 办件结果满意度
+        /// </summary>
         public string QuestionIdTwo { get; set;}
 
-        public string VisitContentId { get; set; }
+        /// <summary>
+        /// 坐席是否满意
+        /// </summary>
+        public string QuestionIdThree { get; set; }
+
+        /// <summary>
+        /// 办件结果不满意原因
+        /// </summary>
+        public string VisitContentIdOne { get; set; }
+
+        /// <summary>
+        /// 坐席不满意原因
+        /// </summary>
+        public string VisitContentIdTwo { get; set;}
     }
 }

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

@@ -101,7 +101,6 @@ namespace Hotline.Ai.Jths
                     else
                     {
                         aiOrderVisit.AiOrderVisitDetails[i].AiOrderVisitState = Share.Enums.Ai.EAiOrderVisitState.LoseEfficacy;
-                        //处理回访状态TODO
                     }
                 }
             }

+ 56 - 11
src/Hotline.Api/Controllers/AiController.cs

@@ -23,6 +23,7 @@ using Newtonsoft.Json;
 using System.Threading;
 using XF.Domain.Authentications;
 using XF.Domain.Constants;
+using XF.Domain.Exceptions;
 using XF.Domain.Repository;
 
 namespace Hotline.Api.Controllers
@@ -147,20 +148,34 @@ namespace Hotline.Api.Controllers
                             //过滤结果
                             var orgProcessingResults = new Kv();
                             var orgHandledAttitude = new Kv();
+                            EVoiceEvaluate? seatEvaluate;
                             var visitContent = "";
+                            var seatVisitContent = "";
                             foreach (var item in callRecord.QuestionnaireResult)
                             {
-                                //服务过程满意度
+                                ////服务过程满意度
+                                //if (item.QuestionId == _options.Value.QuestionIdOne)
+                                //{
+                                //    if (item.QuestionResult == "满意")
+                                //    {
+                                //        orgHandledAttitude = new Kv() { Key="4", Value="满意" };
+                                //    }
+                                //    else
+                                //    {
+                                //        orgHandledAttitude = new Kv() { Key = "2", Value = "不满意" };
+
+                                //    }
+                                //}
+                                //是否解决
                                 if (item.QuestionId == _options.Value.QuestionIdOne)
                                 {
-                                    if (item.QuestionResult == "满意")
+                                    if (item.QuestionResult == "")
                                     {
-                                        orgHandledAttitude = new Kv() { Key="4", Value="满意" };
+
                                     }
                                     else
                                     {
-                                        orgHandledAttitude = new Kv() { Key = "2", Value = "不满意" };
-                                      
+
                                     }
                                 }
                                 //办件结果满意度
@@ -173,13 +188,28 @@ namespace Hotline.Api.Controllers
                                     else
                                     {
                                         orgProcessingResults = new Kv() { Key = "2", Value = "不满意" };
-                                        visitContent = callRecord.SceneVariable[_options.Value.VisitContentId];
+                                        visitContent = callRecord.SceneVariable[_options.Value.VisitContentIdOne];
                                     }
                                 }
                                 else
                                 {
                                     aiOrderVisitDetail.OrderVisit.VisitState = Share.Enums.Order.EVisitState.WaitForVisit;
                                 }
+
+                                //坐席是否满意
+                                if (item.QuestionId == _options.Value.QuestionIdThree)
+                                {
+                                    if (item.QuestionResult == "满意")
+                                    {
+
+                                    }
+                                    else
+                                    {
+                                        seatVisitContent = callRecord.SceneVariable[_options.Value.VisitContentIdTwo];
+                                    }
+                                }
+
+
                             }
                             //处理结果
                             orgDetail.ForEach(x =>
@@ -414,6 +444,12 @@ namespace Hotline.Api.Controllers
         [HttpPost("aivisit/add-aivisit")]
         public async Task AddAiVisit([FromBody]AddAiVisitDto dto)
         {
+            //验证是否有重复电话
+            if(dto.AiOrderVisitDetails.Distinct().Count() != dto.AiOrderVisitDetails.Count)
+            {
+                throw UserFriendlyException.SameMessage("任务中存在重复外呼号码,请检查后重新提交");
+            }
+
             var model = _mapper.Map<AiOrderVisit>(dto);
 
             var detaillist = _mapper.Map<List<AiOrderVisitDetail>>(dto.AiOrderVisitDetails);
@@ -432,11 +468,7 @@ namespace Hotline.Api.Controllers
                 x.AiOrderVisitState = Share.Enums.Ai.EAiOrderVisitState.InProgress;
             });
             await _aiOrderVisitDetailRepository.AddRangeAsync(detaillist, HttpContext.RequestAborted);
-            //修改回访主表
-             await _orderVisitRepository.Updateable()
-                .SetColumns(x => x.IsCanAiVisit == false)
-                .SetColumns(x=> x.VisitState == EVisitState.Visiting)
-                .Where(x=> detaillist.Select(s=>s.OrderVisitId).Contains(x.Id)).ExecuteCommandAsync(HttpContext.RequestAborted);
+            
             //推送任务
             //准备原始数据
             var pushModel = await _aiOrderVisitRepository.Queryable()
@@ -445,6 +477,19 @@ namespace Hotline.Api.Controllers
                 .FirstAsync(x => x.Id == id);
             
             var newModel = await _aiVisitService.CreateAiOrderVisitTask(pushModel, HttpContext.RequestAborted);
+
+            if (!string.IsNullOrEmpty(newModel.BatchUid))
+            {
+                //修改回访主表
+                await _orderVisitRepository.Updateable()
+                   .SetColumns(x => x.IsCanAiVisit == false)
+                   .SetColumns(x => x.VisitState == EVisitState.Visiting)
+                   .Where(x => detaillist.Select(s => s.OrderVisitId).Contains(x.Id)).ExecuteCommandAsync(HttpContext.RequestAborted);
+            }
+            else
+            {
+                newModel.TaskState = Share.Enums.Ai.EAiOrderVisitTaskState.Ended;
+            }
             await _aiOrderVisitRepository.UpdateAsync(newModel, HttpContext.RequestAborted);
             await _aiOrderVisitDetailRepository.UpdateRangeAsync(newModel.AiOrderVisitDetails, HttpContext.RequestAborted);
         }

+ 2 - 2
src/Hotline.Api/Controllers/TestController.cs

@@ -225,8 +225,8 @@ public class TestController : BaseController
         //var r = _timeLimitDomainService.CalcWorkTime(DateTime.Parse("2024-3-22 05:00:00"), DateTime.Parse("2024-3-22 06:00:00"), false);
         //var r = _timeLimitDomainService.CalcWorkTime(DateTime.Parse("2024-3-24 17:20:00"), DateTime.Parse("2024-3-24 17:21:00"), false);
         //await _aiVisitService.QueryAiVisitTask(batchId, taskId, HttpContext.RequestAborted);
-        var r = _timeLimitDomainService.CalcWorkTimeReduce(DateTime.Now, 5);
-
+        //var r = _timeLimitDomainService.CalcWorkTimeReduce(DateTime.Now, 5);
+        var r = _timeLimitDomainService.CalcWorkTimeToDecimal(DateTime.Parse("2024-05-14 14:41:42"), DateTime.Parse("2024-05-14 14:44:46"), false);
         return OpenResponse.Ok(DateTime.Now.ToString("F"));
     }
 

+ 6 - 2
src/Hotline.Api/config/appsettings.Development.json

@@ -214,9 +214,13 @@
     "VisitFromGenderKey": "OC_SCENE_VAR_FIELD14", //来电性别     //开发环境: OC_SCENE_VAR_FIELD14   //生产环境:OC_SCENE_VAR_FIELD14
     "VisitCreationTimeKey": "OC_SCENE_VAR_FIELD17", //来电时间   //开发环境:OC_SCENE_VAR_FIELD17    //生产环境:OC_SCENE_VAR_FIELD19
     "VisitOrderTitleKey": "OC_SCENE_VAR_FIELD18", //工单标题      //开发环境:OC_SCENE_VAR_FIELD18    //生产环境:OC_SCENE_VAR_FIELD20
-    "QuestionIdOne": "MTAwMDAxK1F9Qnu-QXYolr9JoOI8fM", //服务过程满意度 //开发环境:MTAwMDAxK1F9Qnu-QXYolr9JoOI8fM  //生产环境:MTAwMDAxvgT-2PoYRR8pxyL4p8AJsM
+    "VisitIsCallOrder": "false", //是否来电工单 //开发环境:          //生产环境:
+    //"QuestionIdOne": "MTAwMDAxK1F9Qnu-QXYolr9JoOI8fM", //服务过程满意度 //开发环境:MTAwMDAxK1F9Qnu-QXYolr9JoOI8fM  //生产环境:MTAwMDAxvgT-2PoYRR8pxyL4p8AJsM
+    "QuestionIdOne": "1", //是否解决 , //开发环境:   //生产环境:
     "QuestionIdTwo": "MTAwMDAxWQWym04VSRwn4dmWKnYEsQ", //办件结果满意度 //开发环境:MTAwMDAxWQWym04VSRwn4dmWKnYEsQ  //生产环境:MTAwMDAxhIyRJzpwTskpsiXPD-uwl0
-    "VisitContentId": "NotSat2" //不满意原因 // 开发环境:NotSat2   //生产环境:NotSat2
+    "QuestionIdThree": "1", //坐席是否满意  //开发环境:  //生产环境:
+    "VisitContentIdOne": "NotSat2", //办件结果不满意原因 // 开发环境:NotSat2   //生产环境:NotSat2
+    "VisitContentIdTwo": "1" //坐席不满意原因  // 开发环境:    //生产环境:
   },
   //智能质检
   "AiQuality": {

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

@@ -120,6 +120,10 @@ public class OrderVisit : CreationEntity
     [SugarColumn( DefaultValue = "0" )]
     public int AiVisitCount { get; set; }
 
+    /// <summary>
+    /// 录音地址
+    /// </summary>
+    public string? RecordUrl { get; set; }
 
     public void AiVisitTime()
     {

+ 14 - 16
src/Hotline/Orders/OrderVisitDetail.cs

@@ -28,22 +28,20 @@ namespace Hotline.Orders
         /// </summary>
         public ESeatEvaluate? SeatEvaluate { get; set; }
 
-        ///// <summary>
-        ///// 是否联系
-        ///// </summary>
-        //public bool? IsContact { get; set; }
-
-        ///// <summary>
-        ///// 处理结果
-        ///// </summary>
-        //public bool? Volved { get; set; }
-
-        ///// <summary>
-        ///// 未处理内容
-        ///// </summary>
-        //public string? VolveConent { get; set; }
-
-        //public string? RecordUrl { get; set; }
+        /// <summary>
+        /// 是否联系
+        /// </summary>
+        public bool? IsContact { get; set; }
+
+        /// <summary>
+        /// 处理结果
+        /// </summary>
+        public bool? Volved { get; set; }
+
+        /// <summary>
+        /// 未处理内容
+        /// </summary>
+        public string? VolveConent { get; set; }
 
 
         /// <summary>