田爽 9 ヶ月 前
コミット
f70dc5518e

+ 23 - 9
src/Hotline.Api/Controllers/IPPbxController.cs

@@ -26,6 +26,7 @@ using Microsoft.AspNetCore.Mvc;
 using Microsoft.Extensions.Options;
 using Newtonsoft.Json;
 using System.Threading;
+using Hotline.EventBus;
 using Tr.Sdk;
 using Tr.Sdk.Blacklist;
 using Tr.Sdk.Tels;
@@ -34,6 +35,8 @@ using XF.Domain.Exceptions;
 using XF.Domain.Filters;
 using XF.Domain.Repository;
 using XF.Utility.EnumExtensions;
+using Hotline.FlowEngine.Notifications;
+using Hotline.Share.Dtos.Quality;
 
 namespace Hotline.Api.Controllers
 {
@@ -61,8 +64,9 @@ namespace Hotline.Api.Controllers
         private readonly ISystemSettingCacheManager _systemSettingCacheManager;
         private readonly IRepository<TelActionRecord> _telActionRecordRepository;
         private readonly ISystemMobilAreaApplication _systemMobilAreaApplication;
+        private readonly Publisher _publisher;
 
-        public IPPbxController(ITrClient trClient, IMapper mapper, IUserDomainService userDomainService,
+		public IPPbxController(ITrClient trClient, IMapper mapper, IUserDomainService userDomainService,
             ISessionContext sessionContext, IRepository<TrCallRecord> trCallRecordRepository,
             ITrApplication trApplication, IRepository<TrCallEvaluate> trCallRecord,
             ISystemDicDataCacheManager systemDicDataCacheManager, ILogger<IPPbxController> logger,
@@ -72,7 +76,7 @@ namespace Hotline.Api.Controllers
             ITelApplication telApplication, IRepository<Quality.Quality> qualiteyRepository,
             IAiQualityService aiQualityService, IRepository<QualityTemplate> qualityTemplate, 
             ISystemSettingCacheManager systemSettingCacheManager,IRepository<TelActionRecord> telActionRecordRepository,
-            ISystemMobilAreaApplication systemMobilAreaApplication)
+            ISystemMobilAreaApplication systemMobilAreaApplication, Publisher publisher)
         {
             _trClient = trClient;
             _mapper = mapper;
@@ -96,7 +100,9 @@ namespace Hotline.Api.Controllers
             _systemSettingCacheManager = systemSettingCacheManager;
             _telActionRecordRepository = telActionRecordRepository;
             _systemMobilAreaApplication = systemMobilAreaApplication;
-        }
+            _publisher = publisher;
+
+		}
 
         #region 添添呼
 
@@ -502,12 +508,20 @@ namespace Hotline.Api.Controllers
 
 							try
 							{
-								 _aiQualityService.CreateAiOrderQualityTask(
-									quality,
-									model.RecordingAbsolutePath,
-									model.CPN,
-									model.CreatedTime,
-									order, setting?.SettingValue[0], HttpContext.RequestAborted);
+								 //_aiQualityService.CreateAiOrderQualityTask(
+									//quality,
+									//model.RecordingAbsolutePath,
+									//model.CPN,
+									//model.CreatedTime,
+									//order, setting?.SettingValue[0], HttpContext.RequestAborted);
+								 var handler = new AiQualityHandler()
+								 {
+									 AudioFile = model.RecordingAbsolutePath,
+									 FromNo = model.CPN,
+									 CallStartTime = model.CreatedTime,
+									 ViteRecordPrefix = setting?.SettingValue[0],
+								 };
+								await _publisher.PublishAsync(new AiOrderQualityNotify(quality, order, handler), PublishStrategy.ParallelNoWait, HttpContext.RequestAborted);
 							}
 							catch (Exception e)
 							{

+ 42 - 0
src/Hotline.Application/Quality/AiOrderQualityHandler.cs

@@ -0,0 +1,42 @@
+using Hotline.Ai.Quality;
+using Hotline.Application.Handlers.FlowEngine;
+using Hotline.FlowEngine.Notifications;
+using Hotline.FlowEngine.WorkflowModules;
+using MediatR;
+using Microsoft.Extensions.Logging;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Hotline.Application.Quality
+{
+	public class AiOrderQualityHandler : INotificationHandler<AiOrderQualityNotify>
+	{
+		private readonly IAiQualityService _aiQualityService;
+		private readonly ILogger<AiOrderQualityHandler> _logger;
+		public AiOrderQualityHandler(IAiQualityService aiQualityService, ILogger<AiOrderQualityHandler> logger) { _aiQualityService = aiQualityService; _logger = logger; }
+
+		/// <summary>Handles a notification</summary>
+		/// <param name="notification">The notification</param>
+		/// <param name="cancellationToken">Cancellation token</param>
+		public async Task Handle(AiOrderQualityNotify notification, CancellationToken cancellationToken)
+		{
+			try
+			{
+				await _aiQualityService.CreateAiOrderQualityTask(
+					notification.Quality,
+					notification.QualityHandler.AudioFile,
+					notification.QualityHandler.FromNo,
+					notification.QualityHandler.CallStartTime,
+					notification.Order, notification.QualityHandler.ViteRecordPrefix, cancellationToken);
+			}
+			catch (Exception e)
+			{
+				_logger.LogError($"推送质检信息错误! QualityId: {notification.Quality.Id},\r\n{e.Message}");
+				throw;
+			}
+		}
+	}
+}

+ 47 - 40
src/Hotline.Application/Quality/QualityApplication.cs

@@ -3,6 +3,8 @@ using Hotline.Application.CallCenter;
 using Hotline.Caching.Interfaces;
 using Hotline.CallCenter.Calls;
 using Hotline.CallCenter.Configs;
+using Hotline.EventBus;
+using Hotline.FlowEngine.Notifications;
 using Hotline.Orders;
 using Hotline.Quality;
 using Hotline.Settings;
@@ -38,6 +40,7 @@ namespace Hotline.Application.Quality
         private readonly ILogger<Hotline.Quality.Quality> _logger;
         private readonly ICallApplication _callApplication;
         private readonly IOptionsSnapshot<CallCenterConfiguration> _callcenterOptions;
+        private readonly Publisher _publisher;
 
         public QualityApplication(
             ISessionContext sessionContext,
@@ -51,7 +54,8 @@ namespace Hotline.Application.Quality
             ISystemSettingCacheManager systemSettingCacheManager,
             ICallApplication callApplication,
             IOptionsSnapshot<CallCenterConfiguration> callcenterOptions,
-            ILogger<Hotline.Quality.Quality> logger)
+            ILogger<Hotline.Quality.Quality> logger,
+            Publisher publisher)
         {
             _sessionContext = sessionContext;
             _mapper = mapper;
@@ -65,8 +69,9 @@ namespace Hotline.Application.Quality
             _callApplication = callApplication;
             _callcenterOptions = callcenterOptions;
             _logger = logger;
+            _publisher = publisher;
 
-        }
+		}
 
         public async Task AddQualityAsync(EQualitySource Source, string OrderId, string VisitId, CancellationToken cancellationToken)
         {
@@ -129,46 +134,48 @@ namespace Hotline.Application.Quality
                 }
             }
             await _qualityRepository.AddAsync(quality, cancellationToken);
-   //         ///调用智能质检 捷通
-			//if (quality.AiQuality is true)
-   //         {
-			//	try
-			//	{
-			//		var audioFile = string.Empty;
-			//		var fromNo = string.Empty;
-			//		DateTime? callStartTime = null;
-			//		if (_callcenterOptions.Value.CallCenterType == AppDefaults.CallCenterType.TianRun)
-			//		{
-			//			var call = await _callApplication.GetTianrunCallAsync(order.CallId, cancellationToken);
-			//			audioFile = call.RecordingAbsolutePath;
-			//			fromNo = call.CPN;
-			//			callStartTime = call.CreatedTime;
-			//		}
-			//		else if (_callcenterOptions.Value.CallCenterType == AppDefaults.CallCenterType.XingTang)
-			//		{
-			//			var call = await _callApplication.GetCallAsync(order.CallId, cancellationToken);
-			//			audioFile = call.AudioFile;
-			//			fromNo = call.FromNo;
-			//			callStartTime = call.BeginIvrTime;
-			//		}
+            ///调用智能质检 捷通
+			if (quality.AiQuality is true)
+            {
+                try
+                {
+                    var audioFile = string.Empty;
+                    var fromNo = string.Empty;
+                    DateTime? callStartTime = null;
+                    if (_callcenterOptions.Value.CallCenterType == AppDefaults.CallCenterType.TianRun)
+                    {
+                        var call = await _callApplication.GetTianrunCallAsync(order.CallId, cancellationToken);
+                        audioFile = call.RecordingAbsolutePath;
+                        fromNo = call.CPN;
+                        callStartTime = call.CreatedTime;
+                    }
+                    else if (_callcenterOptions.Value.CallCenterType == AppDefaults.CallCenterType.XingTang)
+                    {
+                        var call = await _callApplication.GetCallAsync(order.CallId, cancellationToken);
+                        audioFile = call.AudioFile;
+                        fromNo = call.FromNo;
+                        callStartTime = call.BeginIvrTime;
+                    }
 
-			//		var setting = _systemSettingCacheManager.GetSetting(SettingConstants.ViteRecordPrefix);
-			//		_aiQualityService.CreateAiOrderQualityTask(
-			//			quality,
-			//			audioFile,
-			//			fromNo,
-			//		callStartTime,
-			//			order, setting?.SettingValue[0], cancellationToken);
-			//	}
-			//	catch (Exception e)
-			//	{
-			//		_logger.LogError($"写入智能质检异常!, \r\n{e.Message}");
-			//	}
-			//}
+                    var setting = _systemSettingCacheManager.GetSetting(SettingConstants.ViteRecordPrefix);
+                    var handler = new AiQualityHandler() 
+                    {
+                        AudioFile =audioFile,
+                        FromNo = fromNo,
+                        CallStartTime = callStartTime,
+                        ViteRecordPrefix = setting?.SettingValue[0],
+					};
+                   await  _publisher.PublishAsync(new AiOrderQualityNotify(quality, order, handler),PublishStrategy.ParallelNoWait,cancellationToken);
+                }
+                catch (Exception e)
+                {
+                    _logger.LogError($"写入智能质检异常!, \r\n{e.Message}");
+                }
+            }
 
-            //_logger.LogInformation($"质检对象:{System.Text.Json.JsonSerializer.Serialize(quality, 
-            //    new JsonSerializerOptions { Encoder = JavaScriptEncoder.Create(UnicodeRanges.BasicLatin, UnicodeRanges.CjkUnifiedIdeographs) })}");
-            //await _qualityRepository.AddAsync(quality, cancellationToken);
+            _logger.LogInformation($"质检对象:{System.Text.Json.JsonSerializer.Serialize(quality,
+                new JsonSerializerOptions { Encoder = JavaScriptEncoder.Create(UnicodeRanges.BasicLatin, UnicodeRanges.CjkUnifiedIdeographs) })}");
+            await _qualityRepository.AddAsync(quality, cancellationToken);
         }
 
         public async Task UpdateQualityAsync(UpdateQualityDto model, CancellationToken cancellationToken)

+ 9 - 0
src/Hotline.Share/Dtos/Quality/AiQualityDto.cs

@@ -325,4 +325,13 @@ namespace Hotline.Share.Dtos.Quality
 		/// </summary>
 		public string text { get; set; }
 	}
+
+	public class AiQualityHandler {
+	
+		public string AudioFile { get; set; }
+		public string FromNo { get; set; }
+		public DateTime? CallStartTime { get; set; }
+		public string ViteRecordPrefix { get; set; }
+
+	}
 }

+ 3 - 9
src/Hotline/Ai/Quality/IAiQualityService.cs

@@ -12,14 +12,8 @@ using RestSharp;
 namespace Hotline.Ai.Quality
 {
     public interface IAiQualityService
-	{
-        Task CreateAiOrderQualityTask(Hotline.Quality.Quality model, 
-            //TrCallRecord? call,
-            string audioFile,
-            string fromNo,
-            DateTime? callStartTime,
-            Order order, 
-            string viteRecordPrefix, 
-            CancellationToken cancellationToken);
+	{  
+        //TrCallRecord? call,
+		Task CreateAiOrderQualityTask(Hotline.Quality.Quality model,string audioFile,string fromNo,DateTime? callStartTime,Order order, string viteRecordPrefix, CancellationToken cancellationToken);
 	}
 }

+ 9 - 0
src/Hotline/FlowEngine/Notifications/WorkflowNotify.cs

@@ -1,6 +1,8 @@
 using Hotline.FlowEngine.Definitions;
 using Hotline.FlowEngine.Workflows;
+using Hotline.Orders;
 using Hotline.Share.Dtos.FlowEngine;
+using Hotline.Share.Dtos.Quality;
 using Hotline.Share.Enums.FlowEngine;
 using MediatR;
 
@@ -44,3 +46,10 @@ public record TerminalWorkflowNotify(Workflow Workflow) : INotification;
 /// 撤销
 /// </summary>
 public record CancelWorkflowNotify(Workflow Workflow) : INotification;
+
+
+/// <summary>
+/// 智能质检
+/// </summary>
+/// <param name="Workflow"></param>
+public record AiOrderQualityNotify(Quality.Quality Quality , Order Order , AiQualityHandler QualityHandler) : INotification;