Browse Source

兴唐转写

田爽 3 months ago
parent
commit
7173a943a4

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

@@ -21,6 +21,8 @@ using Hotline.Application.CallCenter;
 using Hotline.CallCenter.Configs;
 using Microsoft.Extensions.Options;
 using Hotline.Configurations;
+using Hotline.CallCenter.Calls;
+using System.Linq;
 
 namespace Hotline.Api.Controllers
 {
@@ -619,14 +621,9 @@ namespace Hotline.Api.Controllers
 		[AllowAnonymous]
 		[HttpPost("AiResult_XT")]
 		[LogFilter("智能质检转写_兴唐")]
-		public async Task AiResult([FromBody] List<AiQualityXTDto> dto)
+		public async Task AiResult_XT([FromBody] List<AiQualityXTDto> dto)
 		{
-            foreach (var item in dto)
-            {
-                var quality = await _qualitey.GetAsync(item.Id);
-
-			}
-            
+            await _qualityApplication.AiResult_XT(dto, HttpContext.RequestAborted);
 		}
 
 

+ 2 - 0
src/Hotline.Application/Quality/IQualityApplication.cs

@@ -11,5 +11,7 @@ namespace Hotline.Application.Quality
 		Task UpdateQualityAsync(UpdateQualityDto model, CancellationToken cancellationToken);
 		Task AiResultAsync(List<AiQualityResultDto> model, CancellationToken cancellationToken);
 
+		Task AiResult_XT(List<AiQualityXTDto> dto, CancellationToken cancellationToken);
+
 	}
 }

+ 81 - 3
src/Hotline.Application/Quality/QualityApplication.cs

@@ -27,6 +27,11 @@ using XF.Domain.Repository;
 using Hotline.Share.Enums.CallCenter;
 using Hotline.Configurations;
 using Hotline.Tools;
+using Hotline.Share.Dtos;
+using MathNet.Numerics;
+using Microsoft.Extensions.DependencyInjection;
+using NPOI.HPSF;
+using System.Threading;
 
 namespace Hotline.Application.Quality
 {
@@ -45,8 +50,10 @@ namespace Hotline.Application.Quality
         private readonly Publisher _publisher;
         private readonly IRepository<TrCallRecord> _trCallRecordRepository;
         private readonly IRepository<OrderWord> _orderWordRepository;
+		private readonly IServiceProvider _serviceProvider;
+		private readonly IRepository<QualityItem> _qualiteyItem;
 
-        public QualityApplication(
+		public QualityApplication(
             ISessionContext sessionContext,
             IMapper mapper,
             IRepository<QualityDetail> qualiteyDetail,
@@ -59,7 +66,9 @@ namespace Hotline.Application.Quality
             ILogger<Hotline.Quality.Quality> logger,
             Publisher publisher,
             IRepository<TrCallRecord> trCallRecordRepository,
-            IRepository<OrderWord> orderWordRepository)
+			IServiceProvider serviceProvider,
+			IRepository<QualityItem> qualiteyItem,
+			IRepository<OrderWord> orderWordRepository)
         {
             _sessionContext = sessionContext;
             _mapper = mapper;
@@ -74,7 +83,9 @@ namespace Hotline.Application.Quality
             _publisher = publisher;
             _trCallRecordRepository = trCallRecordRepository;
             _orderWordRepository = orderWordRepository;
-        }
+            _serviceProvider = serviceProvider;
+			_qualiteyItem = qualiteyItem;
+		}
 
         /// <summary>
         /// 新增质检
@@ -369,6 +380,73 @@ namespace Hotline.Application.Quality
 			}
 		}
 
+		/// <summary>
+		/// 智能质检转写_兴唐
+		/// </summary>
+		/// <param name="dto"></param>
+		/// <param name="cancellationToken"></param>
+		/// <returns></returns>
+		public async Task AiResult_XT(List<AiQualityXTDto> dto, CancellationToken cancellationToken) 
+        {
+			foreach (var item in dto)
+			{
+				var quality = await _qualityRepository.Queryable().Includes(x => x.Order).Where(x => x.Id == item.Id).FirstAsync();
+				var call = await _callApplication.GetCallAsync(quality.Order.CallId, cancellationToken);
+				var qualityItems = await _qualiteyItem.Queryable().Where(x => x.IsEnable == 0 && x.IsDeleted == true && x.IsIntelligent == 1).ToListAsync();
+                await _qualityRepository.Updateable().SetColumns(x => new Hotline.Quality.Quality { TransferState = EQualityTransferState.Translating }).Where(x=>x.Id == quality.Id).ExecuteCommandAsync();
+                Transfer_XT(quality, call, qualityItems, cancellationToken);
+			}
+		}
 
+        /// <summary>
+        /// 异步转写
+        /// </summary>
+        /// <param name="quality"></param>
+        /// <param name="call"></param>
+        /// <param name="items"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        public async Task Transfer_XT(Hotline.Quality.Quality quality,CallNative call ,List<QualityItem> items, CancellationToken cancellationToken) {
+			var transfers = new List<Transfer>();
+			if (!string.IsNullOrEmpty(call?.AudioFile))
+			{
+				var filename = Path.GetFileName(call.AudioFile);
+				try
+				{
+					var aiQualityService = _serviceProvider.GetRequiredService<IAiQualityService>();
+					var res = await aiQualityService.CreateAiOrderQualityTask(filename, cancellationToken);
+					if (!string.IsNullOrEmpty(res))
+					{
+						var rowList = res.Split("\n");
+						var sort = 0;
+						foreach (var row in rowList)
+						{
+							var model = new Transfer();
+							var statement = row.Split(":");
+							if (statement.Count() == 2)
+							{
+								model.Sort = sort;
+								model.Type = statement[0].ToString() == "spk_01" ? EQualityTransferType.Seats : EQualityTransferType.Citizen;
+								model.Content = statement[1].ToString();
+								model.ReviseContent = model.Content;
+								if (!string.IsNullOrEmpty(model.Content))
+								{
+									var hitWord = items.Where(x => model.Content.Contains(x.Name)).ToList();
+									model.Prohibited = string.Join(";", hitWord);
+								}
+							}
+							transfers.Add(model);
+							sort++;
+						}
+					}
+					await _qualityRepository.Updateable().SetColumns(x => new Hotline.Quality.Quality { TransferState = EQualityTransferState.Succeed,Transfer = transfers }).Where(x => x.Id == quality.Id).ExecuteCommandAsync();
+				}
+				catch (Exception)
+				{
+					await _qualityRepository.Updateable().SetColumns(x => new Hotline.Quality.Quality { TransferState = EQualityTransferState.Lose}).Where(x => x.Id == quality.Id).ExecuteCommandAsync();
+					throw;
+				}
+			}
+		}
 	}
 }

+ 55 - 0
src/Hotline.Share/Dtos/Transfer.cs

@@ -0,0 +1,55 @@
+using Hotline.Share.Enums.Quality;
+using Lucene.Net.Search;
+using Newtonsoft.Json.Linq;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Hotline.Share.Dtos
+{
+	/// <summary>
+	/// 转写
+	/// </summary>
+	public class Transfer
+	{
+		public Transfer()
+		{
+		}
+
+		public Transfer(EQualityTransferType type, string content,string reviseContent, int sort,string prohibited)
+		{
+			Type  = type;
+			Content = content;
+			ReviseContent = reviseContent;
+			Sort = sort;
+			Prohibited = prohibited;
+		}
+
+		/// <summary>
+		/// 转写类型
+		/// </summary>
+		public EQualityTransferType Type { get; set; }
+
+		/// <summary>
+		/// 转写内容
+		/// </summary>
+		public string? Content { get; set; }
+
+		/// <summary>
+		/// 转写修改后内容
+		/// </summary>
+		public string? ReviseContent { get; set; }
+
+		/// <summary>
+		/// 排序
+		/// </summary>
+		public int Sort { get; set; }
+
+		/// <summary>
+		/// 违禁词
+		/// </summary>
+		public string? Prohibited { get; set; }
+	}
+}

+ 42 - 0
src/Hotline.Share/Enums/Quality/EQuality.cs

@@ -42,4 +42,46 @@ namespace Hotline.Share.Enums.Quality
 		[Description("回访待质检")]
 		Visit = 3
 	}
+
+	public enum EQualityTransferState
+	{
+		/// <summary>
+		/// 未开始
+		/// </summary>
+		[Description("未开始")]
+		NotStarted = 0,
+
+		/// <summary>
+		/// 转写中
+		/// </summary>
+		[Description("转写中")]
+		Translating = 1,
+
+		/// <summary>
+		/// 转写成功
+		/// </summary>
+		[Description("转写成功")]
+		Succeed = 1,
+
+		/// <summary>
+		/// 转写失败
+		/// </summary>
+		[Description("转写失败")]
+		Lose = 1,
+	}
+
+	public enum EQualityTransferType {
+
+		/// <summary>
+		/// 坐席
+		/// </summary>
+		[Description("坐席")]
+		Seats = 0,
+
+		/// <summary>
+		/// 市民
+		/// </summary>
+		[Description("市民")]
+		Citizen = 1,
+	}
 }

+ 18 - 0
src/Hotline/Quality/Quality.cs

@@ -1,4 +1,5 @@
 using Hotline.Orders;
+using Hotline.Share.Dtos;
 using Hotline.Share.Enums.Quality;
 using SqlSugar;
 using System;
@@ -12,6 +13,9 @@ using XF.Domain.Repository;
 namespace Hotline.Quality
 {
 	[Description("质检")]
+	[SugarIndex("index_quality_creationtime", nameof(Quality.CreationTime), OrderByType.Desc)]
+	[SugarIndex("index_quality_orderId", nameof(OrderScreen.OrderId), OrderByType.Asc)]
+	[SugarIndex("index_quality_orderId", nameof(OrderScreen.VisitId), OrderByType.Asc)]
 	public class Quality : FullStateEntity
 	{
 		/// <summary>
@@ -90,5 +94,19 @@ namespace Hotline.Quality
 		/// 智能质检
 		/// </summary>
 		public bool? AiQuality { get; set; } = false;
+
+		/// <summary>
+		/// 转写状态
+		/// </summary>
+		[SugarColumn(ColumnDescription = "转写状态", DefaultValue = "0")]
+		public EQualityTransferState? TransferState { get; set; }
+
+		/// <summary>
+		/// 转写内容
+		/// </summary>
+		[SugarColumn(ColumnDataType = "json", IsJson = true, IsNullable = true)]
+		public List<Transfer>? Transfer { get; set; }
+
 	}
+
 }