瀏覽代碼

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

田爽 10 月之前
父節點
當前提交
5e6b5f085c

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

@@ -44,7 +44,7 @@ namespace Hotline.Ai.Jths
                 StartDate = callOutTask.BeginTime.ToString("yyyy/MM/dd HH:mm:ss"),
                 EndDate = callOutTask.EndTime.ToString("yyyy/MM/dd HH:mm:ss"),
                 FestivalBan = callOutTask.FestivalBan,
-                RuleType = 1,
+                RuleType = 2,
                 RuleUid = ruleuId,
             };
             var taskDataList = new List<TaskData>();

+ 40 - 5
src/Hotline.Api/Controllers/AiController.cs

@@ -131,7 +131,7 @@ namespace Hotline.Api.Controllers
                     Id = x.Id,
                     TemplateName = x.TemplateName,
                     TemplateContent = x.TemplateContent,
-                    //CallOutTaskCount = x.CallOutTasks != null ? x.CallOutTasks.Count() : 0,
+                    CallOutTaskCount = x.CallOutTasks.Count(),
                     CreationTime = x.CreationTime,
                     IsEnable = x.IsEnable,
                     CreatorName = x.CreatorName,
@@ -255,9 +255,9 @@ namespace Hotline.Api.Controllers
         [HttpGet("callout/list-basedata")]
         public async Task<object> AiCallOuttListBaseData()
         {
-            var aiCallOutTaskState = EnumExts.GetDescriptions<EAiCallOutTaskState>();
             return new {
-                AiCallOutTaskState = aiCallOutTaskState
+                AiCallOutTaskState = EnumExts.GetDescriptions<EAiCallOutTaskState>(),
+                AiCallOutState = EnumExts.GetDescriptions<EAiCallOutState>()
             };
         }
 
@@ -271,6 +271,9 @@ namespace Hotline.Api.Controllers
         {
             var (total, items) = await _callOutTaskDetailRepository.Queryable()
                 .Where(x => x.CallOutTaskId == dto.Id)
+                .WhereIF(!string.IsNullOrEmpty(dto.OuterNo),x=>x.OuterNo.Contains(dto.OuterNo))
+                .WhereIF(!string.IsNullOrEmpty(dto.Name),x=>x.Name.Contains(dto.Name))
+                .WhereIF(dto.AiCallOutState!=null,x=>x.AiCallOutState== dto.AiCallOutState)
                 .OrderByDescending(x => x.CreationTime)
                 .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
             return new PagedDto<AiCallOutDetailListRep>(total,_mapper.Map<IReadOnlyList<AiCallOutDetailListRep>>(items));
@@ -291,7 +294,7 @@ namespace Hotline.Api.Controllers
             }
             var model = _mapper.Map<CallOutTask>(dto);
             var detaillist = _mapper.Map<List<CallOutTaskDetail>>(dto.AddAiCallOutTaskDetailDtos);
-            model.AiCallOutTaskState = EAiCallOutTaskState.InProgress;
+            model.AiCallOutTaskState = EAiCallOutTaskState.NoStarted;
             model.HasVisitCount = dto.AddAiCallOutTaskDetailDtos.Count;
             model.VisitedCount = 0;
             model.VisitedFailCount = 0;
@@ -334,6 +337,26 @@ namespace Hotline.Api.Controllers
             return _mapper.Map<List<CanUseCallOutTemplateListRep>>(list);
         }
 
+        /// <summary>
+        /// 终止外呼任务
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost("callout/closecallouttask")]
+        public async Task CloseCalloutTask([FromBody] CloseCalloutTaskReq request)
+        {
+            var callOut = await _callOutTaskRepository.Queryable()
+                    .Includes(x => x.CallOutTaskDetails)
+                    .FirstAsync(x => x.BatchUid == request.Id);
+
+            if (callOut!=null)
+            {
+                if (callOut.AiCallOutTaskState != EAiCallOutTaskState.NoStarted)
+                    throw UserFriendlyException.SameMessage("当前状态不能终止");
+                
+
+            }
+        }
 
 
         #endregion
@@ -582,6 +605,10 @@ namespace Hotline.Api.Controllers
                             {
                                 aiOrderVisit.TaskState = Share.Enums.Ai.EAiOrderVisitTaskState.Ended;
                             }
+                            else
+                            {
+                                aiOrderVisit.TaskState = EAiOrderVisitTaskState.InProgress;
+                            }
                             await _aiOrderVisitRepository.UpdateAsync(aiOrderVisit, HttpContext.RequestAborted);
                             #region 注释
                             //处理不满意结果(如果差评没有不满意原因则不能视为回访完成)   --(不满意设置为失效,生成新的人工回访记录)
@@ -700,6 +727,14 @@ namespace Hotline.Api.Controllers
                             aicallOutDetail.CallOutTime = DateTime.Now;
                             callOut.VisitedFailCount++;
                         }
+                        if ((callOut.VisitedFailCount + callOut.VisitedCount) == callOut.HasVisitCount)
+                        {
+                            callOut.AiCallOutTaskState = EAiCallOutTaskState.Ended;
+                        }
+                        else
+                        {
+                            callOut.AiCallOutTaskState = EAiCallOutTaskState.InProgress;
+                        }
                         await _callOutTaskRepository.UpdateAsync(callOut,HttpContext.RequestAborted);
                         await _callOutTaskDetailRepository.UpdateAsync(aicallOutDetail,HttpContext.RequestAborted);
                     }
@@ -796,7 +831,7 @@ namespace Hotline.Api.Controllers
 
             var detaillist = _mapper.Map<List<AiOrderVisitDetail>>(dto.AiOrderVisitDetails);
 
-            model.TaskState = Share.Enums.Ai.EAiOrderVisitTaskState.InProgress;
+            model.TaskState = Share.Enums.Ai.EAiOrderVisitTaskState.NoStarted;
             model.RuleType = 2;
             model.HasVisitCount = dto.AiOrderVisitDetails.Count;
             model.VisitedCount = 0;

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

@@ -548,8 +548,8 @@ namespace Hotline.Api.Controllers
                 .WhereIF(!string.IsNullOrEmpty(dto.OrderNo), x => x.Order.No.Contains(dto.OrderNo))
                 .WhereIF(!string.IsNullOrEmpty(dto.Title), x => x.Order.Title.Contains(dto.Title))
                 .WhereIF(!string.IsNullOrEmpty(dto.Gateway), x => x.Gateway.Contains(dto.Gateway))
-                // .WhereIF(dto.StartTime.HasValue, x => x.CreatedTime >= dto.StartTime)
-                //.WhereIF(dto.EndTime.HasValue, x => x.CreatedTime <= dto.EndTime)
+                
+                .WhereIF(dto.IsAiAnswered == true,x=>string.IsNullOrEmpty(x.UserId) == true)
                 .OrderByDescending(x => x.CreatedTime)
                 .ToPagedListAsync(dto.PageIndex, dto.PageSize);
             return new PagedDto<TrCallDto>(total, _mapper.Map<IReadOnlyList<TrCallDto>>(items));

+ 1 - 1
src/Hotline.Api/config/appsettings.Development.json

@@ -25,7 +25,7 @@
     "Host": "110.188.24.182",
     "Port": 50179,
     //"Password": "fengwo22@@",
-    "Database": 3
+    "Database": 5
   },
   "Swagger": true,
   "Cors": {

+ 1 - 1
src/Hotline.Api/config/appsettings.json

@@ -25,7 +25,7 @@
     "Host": "110.188.24.182",
     "Port": 50179,
     "Password": "fengwo22@@",
-    "Database": 3
+    "Database": 5
   },
   "Swagger": true,
   "Cors": {

+ 13 - 1
src/Hotline.Share/Dtos/Ai/AiDto.cs

@@ -13,6 +13,12 @@ namespace Hotline.Share.Dtos.Ai
     public record AiCallOutDetailListRequest:PagedRequest
     {
         public string Id { get; set; }
+
+        public string? OuterNo { get; set; }
+
+        public string? Name { get; set; }
+
+        public EAiCallOutState? AiCallOutState { get; set; }
     }
 
 
@@ -373,9 +379,15 @@ namespace Hotline.Share.Dtos.Ai
         public List<AddAiOrderVisitDetailDto> AiOrderVisitDetails { get; set; }
     }
 
+    public class CloseCalloutTaskReq
+    {
+        public string Id { get; set; }
+    }
+
+
     public class AddAiCallOutRequest
     {
-        public string Name { get; set; }
+        public string TaskName { get; set; }
 
         public DateTime BeginTime { get; set; }
 

+ 23 - 27
src/Hotline.Share/Dtos/TrCallCenter/TrTelDao.cs

@@ -423,92 +423,92 @@ namespace Hotline.Share.Dtos.TrCallCenter
         public EEndBy? EndBy { get; set; }
 
         /// <summary>
-        /// IVR开始开始时间(修改)
+        /// IVR开始开始时间
         /// </summary>
         public DateTime? BeginIvrTimeStart { get; set; }
 
         /// <summary>
-        /// IVR开始结束时间(新增)
+        /// IVR开始结束时间
         /// </summary>
         public DateTime? BeginIvrTimeEnd { get; set; }
 
         /// <summary>
-        /// IVR结束开始时间(修改)
+        /// IVR结束开始时间
         /// </summary>
         public DateTime? EndIvrTimeStart { get; set; }
 
         /// <summary>
-        /// IVR结束结束时间(新增)
+        /// IVR结束结束时间
         /// </summary>
         public DateTime? EndIvrTimeEnd { get; set; }
 
         /// <summary>
-        /// 开始等待开始时间(队列开始时间)(修改)
+        /// 开始等待开始时间(队列开始时间)
         /// </summary>
         public DateTime? BeginQueueTimeStart { get; set; }
 
         /// <summary>
-        /// 开始等待结束时间(队列开始时间)(新增)
+        /// 开始等待结束时间(队列开始时间)
         /// </summary>
         public DateTime? BeginQueueTimeEnd { get; set; }
 
         /// <summary>
-        /// 结束等待开始时间(队列结束时间)(修改)
+        /// 结束等待开始时间(队列结束时间)
         /// </summary>
         public DateTime? EndQueueTimeStart { get; set; }
 
         /// <summary>
-        /// 结束等待结束时间(队列结束时间)(新增)
+        /// 结束等待结束时间(队列结束时间)
         /// </summary>
         public DateTime? EndQueueTimeEnd { get; set; }
 
         /// <summary>
-        /// 应答开始时间(修改)
+        /// 应答开始时间
         /// </summary>
         public DateTime? AnsweredTimeStart { get; set; }
 
         /// <summary>
-        /// 应答结束时间(新增)
+        /// 应答结束时间
         /// </summary>
         public DateTime? AnsweredTimeEnd { get; set; }
 
         /// <summary>
-        /// 通话结束开始时间(修改)
+        /// 通话结束开始时间
         /// </summary>
         public DateTime? OverTimeStart { get; set; }
 
         /// <summary>
-        /// 通话结束结束时间(新增)
+        /// 通话结束结束时间
         /// </summary>
         public DateTime? OverTimeEnd { get; set; }
 
         /// <summary>
-        /// 振铃开始开始时间(新增)
+        /// 振铃开始开始时间
         /// </summary>
         public DateTime? BeginRingTimeStart { get; set; }
 
         /// <summary>
-        /// 振铃开始结束时间(新增)
+        /// 振铃开始结束时间
         /// </summary>
         public DateTime? BeginRingTimeEnd { get; set; }
 
         /// <summary>
-        /// 振铃结束开始时间(新增)
+        /// 振铃结束开始时间
         /// </summary>
         public DateTime? EndRingTimeStart { get; set; }
 
         /// <summary>
-        /// 振铃结束结束时间(新增)
+        /// 振铃结束结束时间
         /// </summary>
         public DateTime? EndRingTimeEnd { get; set; }
 
         /// <summary>
-        /// 通话开始时间开始(新增)
+        /// 通话开始时间开始
         /// </summary>
         public DateTime? CallTimeStart { get; set; }
 
         /// <summary>
-        /// 通话开始时间结束(新增)
+        /// 通话开始时间结束
         /// </summary>
         public DateTime? CallTimeEnd { get; set; }
 
@@ -526,15 +526,11 @@ namespace Hotline.Share.Dtos.TrCallCenter
         /// 中继号
         /// </summary>
         public string? Gateway { get; set; }
-        ///// <summary>
-        ///// 开始时间
-        ///// </summary>
-        //public DateTime? StartTime { get; set; }
-
-        ///// <summary>
-        ///// 结束时间
-        ///// </summary>
-        //public DateTime? EndTime { get; set; }
+
+        /// <summary>
+        /// 是否智能应答(需要OnState条件传 接通)
+        /// </summary>
+        public bool IsAiAnswered { get; set; }
 
     }
 

+ 3 - 0
src/Hotline.Share/Enums/Ai/EAiCallOutTaskState.cs

@@ -17,5 +17,8 @@ namespace Hotline.Share.Enums.Ai
 
         [Description("已结束")]
         Ended = 3,
+
+        [Description("已终止")]
+        Close = 4,
     }
 }

+ 2 - 0
src/Hotline/Ai/CallOut/CallOutTask.cs

@@ -1,4 +1,5 @@
 
+using Hotline.Orders;
 using Hotline.Share.Dtos.Ai;
 using Hotline.Share.Enums.Ai;
 using SqlSugar;
@@ -52,6 +53,7 @@ namespace Hotline.Ai.CallOut
 
         public DateTime EndTime { get; set; }
 
+        [Navigate(NavigateType.OneToMany, nameof(CallOutTaskDetail.CallOutTaskId))]
         public List<CallOutTaskDetail> CallOutTaskDetails{ get; set; }
     }
 }