Browse Source

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

libin 5 days ago
parent
commit
9d1acf8dcb

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

@@ -2,7 +2,6 @@
 using Hotline.Ai.CallOut;
 using Hotline.Ai.Jths.OrderVisits;
 using Hotline.Ai.Visit;
-using Hotline.Orders;
 using Hotline.Share.Dtos.Order;
 using Hotline.Share.Enums.Order;
 using Microsoft.Extensions.Logging;

+ 34 - 30
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 = string.IsNullOrEmpty(callRecord.CallTime)? null : DateTime.Parse(callRecord.CallTime);
+                                aiOrderVisitDetail.SentenceList = _mapper.Map<List<SentenceList>>(callRecord.SentenceList);
                                 aiOrderVisit.VisitedCount++;
                                 //处理结果
                                 var visitDetail = _orderVisitDetailRepository.Queryable().Where(x => x.VisitId == aiOrderVisitDetail.OrderVisit.Id).ToList();
@@ -594,40 +595,44 @@ namespace Hotline.Api.Controllers
 
                                         //    }
                                         //}
-                                        //是否联系
-                                        if (item.QuestionId == QuestionIdZero)
-                                        {
-                                            if (item.QuestionResult == "有联系")
-                                            {
-                                                isContact = true;
-                                            }
-                                            else if (item.QuestionResult == "没有联系")
-                                            {
-                                                isContact = false;
-                                            }
-                                        }
-                                        //是否解决
-                                        if (item.QuestionId == QuestionIdOne)
-                                        {
-                                            if (item.QuestionResult == "得到解决")
-                                            {
-                                                isSolve = true;
-                                            }
-                                            else if (item.QuestionResult == "未得到解决")
-                                            {
-                                                isSolve = false;
-                                            }
-                                        }
+                                        ////是否联系
+                                        //if (item.QuestionId == QuestionIdZero)
+                                        //{
+                                        //    if (item.QuestionResult == "有联系")
+                                        //    {
+                                        //        isContact = true;
+                                        //    }
+                                        //    else if (item.QuestionResult == "没有联系")
+                                        //    {
+                                        //        isContact = false;
+                                        //    }
+                                        //}
+                                        ////是否解决
+                                        //if (item.QuestionId == QuestionIdOne)
+                                        //{
+                                        //    if (item.QuestionResult == "得到解决")
+                                        //    {
+                                        //        isSolve = true;
+                                        //    }
+                                        //    else if (item.QuestionResult == "未得到解决")
+                                        //    {
+                                        //        isSolve = false;
+                                        //    }
+                                        //}
                                         //办件结果满意度
                                         if (item.QuestionId == QuestionIdTwo)
                                         {
                                             if (item.QuestionResult == "办件结果满意")
                                             {
                                                 orgProcessingResults = new Kv() { Key = "4", Value = "满意" };
+                                                isContact = true;
+                                                isSolve = true;
                                             }
                                             else if (item.QuestionResult == "办件结果不满意")
                                             {
                                                 orgProcessingResults = new Kv() { Key = "2", Value = "不满意" };
+                                                isContact = false;
+                                                isSolve = false;
                                                 visitContent = callRecord.SceneVariable != null ? callRecord.SceneVariable[VisitContentIdOne] : "";
                                             }
                                         }
@@ -661,8 +666,6 @@ namespace Hotline.Api.Controllers
                                     x.VisitContent = seatVisitContent;
                                 });
 
-                               
-
                                 //处理结果
                                 orgDetail.ForEach(x =>
                                 {
@@ -674,13 +677,13 @@ namespace Hotline.Api.Controllers
                                     x.VisitContent = visitContent;
                                     x.Volved = isSolve;
                                     x.IsContact = isContact;
-                                    if (string.IsNullOrEmpty(orgProcessingResults?.Key) || isSolve == null || isContact == null ||  orgProcessingResults?.Value == "不满意")
+                                    if (string.IsNullOrEmpty(orgProcessingResults?.Key) ||  orgProcessingResults?.Value == "不满意")
                                     {
                                         //x.OrgNoSatisfiedReason = new List<Kv>() { new Kv() { Key = "7", Value = "未回复" } };
                                         //TODO 记录不满意原因到内容中供人工回访甄别选择不满意原因
-                                        if (dto.CallTimes.Value>=1 && orgProcessingResults == null && isSolve == null && isContact ==null)
+                                        if (dto.CallTimes.Value>=1 && orgProcessingResults == null)
                                         {
-                                            orgProcessingResults = new Kv() { Key = "0", Value = "默认满意" };
+                                            orgProcessingResults = new Kv() { Key = "6", Value = "未接通" };
                                             aiOrderVisitDetail.OrderVisit.VisitState = EVisitState.Visited;
                                             aiOrderVisitDetail.OrderVisit.NowEvaluate = orgProcessingResults;
                                             x.VisitContent = "智能回访两次未接默认已回访";
@@ -696,7 +699,7 @@ namespace Hotline.Api.Controllers
                                         }
                                         else
                                         {
-                                            aiOrderVisitDetail.OrderVisit.VisitState = Share.Enums.Order.EVisitState.WaitForVisit;
+                                            aiOrderVisitDetail.OrderVisit.VisitState = Share.Enums.Order.EVisitState.AiVisitWaitForVisit;
                                             aiOrderVisitDetail.OrderVisit.IsEffectiveAiVisit = false;
                                         }
                                         
@@ -719,6 +722,7 @@ namespace Hotline.Api.Controllers
                                 aiOrderVisitDetail.OrderVisit.RecordUrl = recordUrl;
                                 aiOrderVisitDetail.OrderVisit.VisitType = Share.Enums.Order.EVisitType.ChipVoiceVisit;
                                 aiOrderVisitDetail.OrderVisit.AiVisitTime();
+                                aiOrderVisitDetail.SentenceList = aiOrderVisitDetail.SentenceList;
                                 aiOrderVisitDetail.IsSuccess = true;
                                 aiOrderVisitDetail.AiVolved = isSolve;
                                 aiOrderVisitDetail.AiIsContact = isContact;

+ 13 - 0
src/Hotline.Api/Controllers/Bi/BiOrderController.cs

@@ -39,6 +39,19 @@ using XF.Domain.Authentications;
 using XF.Domain.Exceptions;
 using XF.Domain.Repository;
 using XF.Utility.EnumExtensions;
+using Hotline.Statistics;
+using DocumentFormat.OpenXml.Drawing;
+using DocumentFormat.OpenXml.Bibliography;
+using NPOI.SS.Formula.Functions;
+using Hotline.Share.Dtos.File;
+using Hotline.File;
+using Hotline.KnowledgeBase;
+using DocumentFormat.OpenXml.Vml.Spreadsheet;
+using Hotline.Application.OrderApp;
+using Hotline.Share.Tools;
+using MediatR;
+using static Hotline.AppDefaults;
+using Hotline.Ai.Visit;
 
 namespace Hotline.Api.Controllers.Bi
 {

+ 2 - 1
src/Hotline.Application/Mappers/OrderMapperConfigs.cs

@@ -1,4 +1,5 @@
-using Hotline.FlowEngine.Workflows;
+using Hotline.Ai.Visit;
+using Hotline.FlowEngine.Workflows;
 using Hotline.Orders;
 using Hotline.Share.Dtos.Ai;
 using Hotline.Share.Dtos.Order;

+ 1 - 1
src/Hotline.Application/OrderApp/AiOrderVisitApplication.cs

@@ -1,4 +1,4 @@
-using Hotline.Orders;
+using Hotline.Ai.Visit;
 using Hotline.Share.Dtos.Ai;
 using SqlSugar;
 using XF.Domain.Dependency;

+ 1 - 1
src/Hotline.Application/OrderApp/IAiOrderVisitApplication.cs

@@ -1,4 +1,4 @@
-using Hotline.Orders;
+using Hotline.Ai.Visit;
 using Hotline.Share.Dtos.Ai;
 using SqlSugar;
 

+ 1 - 0
src/Hotline.Application/OrderApp/OrderApplication.cs

@@ -4479,6 +4479,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         query = query.WhereIF(dto.VisitStateQuery == EVisitStateQuery.Visited, d => d.VisitState == EVisitState.Visited)
             .WhereIF(dto.VisitStateQuery == EVisitStateQuery.SMSUnsatisfied, d => d.VisitState == EVisitState.SMSUnsatisfied)
             .WhereIF(dto.VisitStateQuery == EVisitStateQuery.SMSVisiting, d => d.VisitState == EVisitState.SMSVisiting)
+            .WhereIF(dto.VisitStateQuery == EVisitStateQuery.AiVisitWaitForVisit,d=>d.VisitState == EVisitState.AiVisitWaitForVisit)
             .WhereIF(dto.VisitStateQuery == EVisitStateQuery.NoPutThrough,
                 d => d.IsPutThrough == false && d.VisitState != EVisitState.Visited && d.VisitState != EVisitState.None)
             .WhereIF(_appOptions.Value.IsZiGong && dto.VisitStateQuery == EVisitStateQuery.NoPutThrough,

+ 2 - 2
src/Hotline.Repository.SqlSugar/CallCenter/TrCallRecordRepository.cs

@@ -1,5 +1,5 @@
-using Hotline.CallCenter.Calls;
-using Hotline.Orders;
+using Hotline.Ai.Visit;
+using Hotline.CallCenter.Calls;
 using Hotline.Repository.SqlSugar.DataPermissions;
 using Hotline.Settings;
 using Hotline.Share.Dtos.CallCenter;

+ 1 - 0
src/Hotline.Repository.SqlSugar/Orders/OrderRepository.cs

@@ -39,6 +39,7 @@ using Hotline.Identity.Accounts;
 using Hotline.Share.Dtos.Enterprise;
 using XF.Domain.Exceptions;
 using Microsoft.AspNetCore.Http;
+using Hotline.Ai.Visit;
 using static Hotline.AppDefaults;
 
 namespace Hotline.Repository.SqlSugar.Orders

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

@@ -226,6 +226,68 @@ namespace Hotline.Share.Dtos.Ai
         /// 不满意原因
         /// </summary>
         public Dictionary<string, string> SceneVariable { get; set; }
+
+        /// <summary>
+        /// 语音段列表信息
+        /// </summary>
+        public List<SentenceListDto> SentenceList { get; set; }
+    }
+
+    public class SentenceListDto
+    {
+        /// <summary>
+        /// 序号
+        /// </summary>
+        public int Index { get; set; }
+        /// <summary>
+        /// 开始时间(毫秒)
+        /// </summary>
+        public int StartTime { get; set; }
+
+        /// <summary>
+        /// 结束时间(毫秒)
+        /// </summary>
+        public int EndTime { get; set; }
+
+        /// <summary>
+        /// 角色(机器人:agent,用户:user,未知:unknown)
+        /// </summary>
+        public string Role { get; set; }
+
+        /// <summary>
+        /// 性别(未知:unknow,男:male,女:female)
+        /// </summary>
+        public string Gender { get; set; }
+
+        /// <summary>
+        /// 文本
+        /// </summary>
+        public string Text { get; set; }
+
+        /// <summary>
+        /// 人工编译后文本
+        /// </summary>
+        public string CorrectText { get; set; }
+
+        /// <summary>
+        /// 置信分数(本词条的可信度[0-65535], 分值越高,越可信)
+        /// </summary>
+        public string Score { get; set; }
+
+        /// <summary>
+        /// 语速
+        /// </summary>
+        public string Speed { get; set; }
+
+        /// <summary>
+        /// 最大音量
+        /// </summary>
+        public string MaxVolume { get; set; }
+
+        /// <summary>
+        /// 平均音量
+        /// </summary>
+        public string AvgVolume { get; set; }
     }
 
     public class QuestionnaireResult

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

@@ -713,6 +713,12 @@ namespace Hotline.Share.Dtos.Order
         [Description("短信回访中")]
         SMSVisiting = 21,
 
+        /// <summary>
+        /// 智能回访待处理
+        /// </summary>
+        [Description("智能回访待处理")]
+        AiVisitWaitForVisit = 23,
+
         /// <summary>
         /// 短信不满意待回访
         /// 逻辑需求(Task_317) : 若短信回访结果为不满意,回访状态需从“短信回访中”更新为“短信不满意待回访”

+ 7 - 1
src/Hotline.Share/Enums/Order/EVisitState.cs

@@ -34,6 +34,12 @@ namespace Hotline.Share.Enums.Order
         [Description("智能回访中")]
         AiVisiting = 22,
 
+        /// <summary>
+        /// 智能回访待处理
+        /// </summary>
+        [Description("智能回访待处理")]
+        AiVisitWaitForVisit = 23,
+
         /// <summary>
         /// 已回访
         /// </summary>
@@ -50,7 +56,7 @@ namespace Hotline.Share.Enums.Order
         /// 短信不满意待回访
         /// 逻辑需求(Task_317) : 若短信回访结果为不满意,回访状态需从“短信回访中”更新为“短信不满意待回访”
         /// </summary>
-        [Description("短信不满意待访")]
+        [Description("短信不满意待访")]
         SMSUnsatisfied = 41,
 
         /// <summary>

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

@@ -364,7 +364,8 @@ public record VisitMeasureStatisticsRequest
     public string? VisitName { get; set; }
 }
 
-public record AiVisitNoSatisfiedPageListRequest : PagedRequest
+
+public record AiVisitNoSatisfiedPageListRequest:PagedRequest
 {
     public DateTime StartTime { get; set; }
     public DateTime EndTime { get; set; }

+ 2 - 2
src/Hotline/Orders/AiOrderVisit.cs → src/Hotline/Ai/Visit/AiOrderVisit.cs

@@ -3,7 +3,7 @@ using SqlSugar;
 using System.ComponentModel;
 using XF.Domain.Repository;
 
-namespace Hotline.Orders
+namespace Hotline.Ai.Visit
 {
     [Description("智能回访")]
     public class AiOrderVisit : CreationEntity
@@ -14,7 +14,7 @@ namespace Hotline.Orders
 
         public DateTime EndTime { get; set; }
 
-        public EAiOrderVisitTaskState TaskState {get;set;}
+        public EAiOrderVisitTaskState TaskState { get; set; }
         /// <summary>
         /// 批次上报结果ID
         /// </summary>

+ 68 - 3
src/Hotline/Orders/AiOrderVisitDetail.cs → src/Hotline/Ai/Visit/AiOrderVisitDetail.cs

@@ -1,4 +1,6 @@
-using Hotline.Share.Dtos;
+using Hotline.Orders;
+using Hotline.Share.Dtos;
+using Hotline.Share.Dtos.Ai;
 using Hotline.Share.Enums.Ai;
 using Hotline.Share.Enums.Order;
 using Oracle.ManagedDataAccess.Types;
@@ -10,7 +12,7 @@ using System.Text;
 using System.Threading.Tasks;
 using XF.Domain.Repository;
 
-namespace Hotline.Orders
+namespace Hotline.Ai.Visit
 {
     public class AiOrderVisitDetail : CreationEntity
     {
@@ -42,7 +44,7 @@ namespace Hotline.Orders
         /// </summary>
         public string OuterNo { get; set; }
 
-        public EAiOrderVisitState AiOrderVisitState { get;set;}
+        public EAiOrderVisitState AiOrderVisitState { get; set; }
 
         /// <summary>
         /// 智能回访时间
@@ -106,5 +108,68 @@ namespace Hotline.Orders
         /// </summary>
         [SugarColumn(DefaultValue = "0")]
         public int CallTimes { get; set; }
+
+        /// <summary>
+        /// 语音段列表信息
+        /// </summary>
+        [SugarColumn(ColumnDataType = "json", IsJson = true, IsNullable = true)]
+        public List<SentenceList>? SentenceList { get; set; }
+    }
+
+    public class SentenceList
+    {
+        /// <summary>
+        /// 序号
+        /// </summary>
+        public int Index { get; set; }
+        /// <summary>
+        /// 开始时间(毫秒)
+        /// </summary>
+        public int StartTime { get; set; }
+
+        /// <summary>
+        /// 结束时间(毫秒)
+        /// </summary>
+        public int EndTime { get; set; }
+
+        /// <summary>
+        /// 角色(机器人:agent,用户:user,未知:unknown)
+        /// </summary>
+        public string Role { get; set; }
+
+        /// <summary>
+        /// 性别(未知:unknow,男:male,女:female)
+        /// </summary>
+        public string Gender { get; set; }
+
+        /// <summary>
+        /// 文本
+        /// </summary>
+        public string Text { get; set; }
+
+        /// <summary>
+        /// 人工编译后文本
+        /// </summary>
+        public string CorrectText { get; set; }
+
+        /// <summary>
+        /// 置信分数(本词条的可信度[0-65535], 分值越高,越可信)
+        /// </summary>
+        public string Score { get; set; }
+
+        /// <summary>
+        /// 语速
+        /// </summary>
+        public string Speed { get; set; }
+
+        /// <summary>
+        /// 最大音量
+        /// </summary>
+        public string MaxVolume { get; set; }
+
+        /// <summary>
+        /// 平均音量
+        /// </summary>
+        public string AvgVolume { get; set; }
     }
 }

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

@@ -1,6 +1,5 @@
 
 using Hotline.Ai.CallOut;
-using Hotline.Orders;
 using Hotline.Share.Dtos.Order;
 using Microsoft.AspNetCore.Http;
 

+ 8 - 1
src/Hotline/Orders/OrderVisit.cs

@@ -1,4 +1,5 @@
-using Hotline.Share.Dtos;
+using Hotline.Ai.Visit;
+using Hotline.Share.Dtos;
 using Hotline.Share.Enums.Order;
 using Hotline.Users;
 using SqlSugar;
@@ -172,6 +173,12 @@ public class OrderVisit : CreationEntity
     /// </summary>
     public bool? IsUpdate { get; set; }
 
+    /// <summary>
+    /// 语音段列表信息
+    /// </summary>
+    [SugarColumn(ColumnDataType = "json", IsJson = true, IsNullable = true)]
+    public List<SentenceList>? SentenceList { get; set; }
+
     public void AiVisitTime()
     {
         LastVisitTime = DateTime.Now;