田爽 1 rok pred
rodič
commit
0b737f6c7a

+ 76 - 7
src/Hotline.Ai.Jths/AiQualityService.cs

@@ -1,13 +1,82 @@
 using Hotline.Ai.Quality;
-using XF.Domain.Dependency;
+using RestSharp;
+using Fw.Utility.UnifyResponse;
+using Hotline.Share.Dtos.Quality;
+using Hotline.CallCenter.Calls;
+using Hotline.Orders;
+using Newtonsoft.Json;
 
 namespace Hotline.Ai.Jths
 {
     public class AiQualityService : IAiQualityService
-    {
-        public async Task CreateAiOrderQualityTask(object obj)
-        {
-            throw new NotImplementedException();
-        }
-    }
+	{
+		private readonly RestClient _client;
+
+		public async Task CreateAiOrderQualityTask(Hotline.Quality.Quality model, TrCallRecord call, Order order, CancellationToken cancellationToken)
+		{
+			AiQualityDto  aiQuality = new AiQualityDto
+			{
+				RecordID = model.Id,
+				RecordPath = call.RecordingFileUrl,
+				AgentID = order.AcceptorStaffNo!,
+				CallNumber = call.CPN,
+				CallTime = call.CreatedTime.ToString("yyyy-MM-dd HH:mm:ss"),
+				RecordForm = model.Id,
+				Extend = model.Source.ToString(),
+			};
+			var data =JsonConvert.SerializeObject(aiQuality);
+			//todo  缺少地址
+			await ExecuteAsync("......./routeinfo/api", Method.Post, data, cancellationToken);
+		}
+
+		public async Task<ApiResponse<TResponse>> ExecuteAsync<TRequest, TResponse>(string path, Method httpMethod,
+			TRequest request, CancellationToken cancellationToken)
+			where TRequest : class
+		{
+			var req = new RestRequest(path, httpMethod);
+			if (httpMethod is Method.Get)
+			{
+				req.AddObject(request);
+			}
+			else
+			{
+				req.AddJsonBody(request);
+			}
+
+			try
+			{
+				var response = await _client.ExecuteAsync<ApiResponse<TResponse>>(req, cancellationToken);
+				return response.Data;
+			}
+			catch (Exception e)
+			{
+				throw new HttpRequestException($"智能质检平台错误,Error: {e.Message}");
+			}
+		}
+
+		public async Task<ApiResponse> ExecuteAsync<TRequest>(string path, Method httpMethod, TRequest request,
+			CancellationToken cancellationToken)
+			where TRequest : class
+		{
+			var req = new RestRequest(path, httpMethod);
+			if (httpMethod is Method.Get)
+			{
+				req.AddObject(request);
+			}
+			else
+			{
+				req.AddJsonBody(request);
+			}
+
+			try
+			{
+				var response = await _client.ExecuteAsync<ApiResponse>(req, cancellationToken);
+				return response.Data;
+			}
+			catch (Exception e)
+			{
+				throw new HttpRequestException($"智能质检平台错误,Error: {e.Message}");
+			}
+		}
+	}
 }

+ 25 - 6
src/Hotline.Application/Quality/QualityApplication.cs

@@ -1,4 +1,6 @@
 using Hotline.Ai.Quality;
+using Hotline.CallCenter.Calls;
+using Hotline.Orders;
 using Hotline.Quality;
 using Hotline.Share.Dtos.Quality;
 using Hotline.Share.Enums.Quality;
@@ -17,21 +19,28 @@ namespace Hotline.Application.Quality
         private readonly IRepository<QualityDetail> _qualiteyDetail;
         private readonly IQualityRepository _qualityRepository;
         private readonly IAiQualityService _aiQualityService;
+        private readonly IOrderRepository _orderRepository;
+        private readonly IRepository<TrCallRecord> _trCallRecordRepository;
 
-        public QualityApplication(
+		public QualityApplication(
             ISessionContext sessionContext,
             IMapper mapper,
             IRepository<QualityDetail> qualiteyDetail,
             IQualityRepository qualityRepository,
-            IAiQualityService aiQualityService
-        )
+            IAiQualityService aiQualityService,
+            IRepository<TrCallRecord> trCallRecordRepository,
+			IOrderRepository orderRepository
+		)
         {
             _sessionContext = sessionContext;
             _mapper = mapper;
             _qualiteyDetail = qualiteyDetail;
             _qualityRepository = qualityRepository;
             _aiQualityService = aiQualityService;
-        }
+            _trCallRecordRepository = trCallRecordRepository;
+			_orderRepository = orderRepository;
+
+		}
 
         public async Task AddQualityAsync(EQualitySource Source, string OrderId, string VisitId, CancellationToken cancellationToken)
         {
@@ -61,16 +70,26 @@ namespace Hotline.Application.Quality
         public async Task AddQualityAsync(QualityAddDto model, CancellationToken cancellationToken)
         {
             var quality = _mapper.Map<Hotline.Quality.Quality>(model);
-            var id = await _qualityRepository.AddAsync(quality, cancellationToken);
+            quality.InitId();
+			await _qualityRepository.AddAsync(quality, cancellationToken);
             if (model.QualityDetails.Any())
             {
                 foreach (var item in model.QualityDetails)
                 {
-                    item.QualityId = id;
+                    item.QualityId = quality.Id;
                 }
                 List<QualityDetail> details = _mapper.Map<List<QualityDetail>>(model.QualityDetails);
                 await _qualiteyDetail.AddRangeAsync(details, cancellationToken);
             }
+            //受理智能质检
+            if (model.Source == EQualitySource.Accepted) {
+                var order = await _orderRepository.GetAsync(model.OrderId);
+				if (order != null  && !string.IsNullOrEmpty(order.CallId))
+	            {
+		            var call = await _trCallRecordRepository.GetAsync(order.CallId);
+                    await _aiQualityService.CreateAiOrderQualityTask(quality, call, order, cancellationToken);
+                }
+            }
         }
 
         public async Task UpdateQualityAsync(UpdateQualityDto model, CancellationToken cancellationToken)

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

@@ -0,0 +1,76 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Hotline.Share.Dtos.Quality
+{
+	public class AiQualityDto
+	{
+		/// <summary>
+		/// 录音来源方式:sftp,ftp,http,nas
+		/// </summary>
+		public string AudioSource { get; set; } = "ftp";
+
+		/// <summary>
+		/// 工单号:录音的唯一ID
+		/// </summary>
+		public string RecordID { get; set; }
+
+		/// <summary>
+		/// 录音的存储路径:此处录音路径格式与audioSource方式有关
+		/// </summary>
+		public string RecordPath { get; set; }
+
+		/// <summary>
+		/// 坐席工号
+		/// </summary>
+		public string AgentID { get; set; }
+
+		/// <summary>
+		/// 坐席组编号
+		/// </summary>
+		public string AgentTeamID { get; set; } = "0";
+
+		/// <summary>
+		/// 来电号码
+		/// </summary>
+		public string CallNumber { get; set; }
+
+		/// <summary>
+		/// 来电时间,固定格式:yyyy-MM-dd HH:mm:ss
+		/// </summary>
+		public string CallTime { get; set; }
+
+		/// <summary>
+		/// 录音格式
+		/// </summary>
+		public string RecordForm { get; set; }
+
+		/// <summary>
+		/// 采样率
+		/// </summary>
+		public string SamplingRate { get; set; } = "8k";
+
+		/// <summary>
+		/// 编码方式
+		/// </summary>
+		public string Encoding { get; set; } = "16bit";
+
+		/// <summary>
+		/// 声道数(1:单声道,2:双声道)
+		/// </summary>
+		public string SoundChannel { get; set; } = "2";
+
+		/// <summary>
+		/// 坐席对应声道(1:单声道,2:双声道,左声道为坐席,3:双声道,右声道为坐席)
+		/// </summary>
+		public string AgentChannel { get; set; } = "3";
+
+		/// <summary>
+		/// 扩展字段
+		/// </summary>
+		public string Extend { get; set; } 
+	}
+}

+ 0 - 4
src/Hotline.Share/Dtos/Quality/QualityDto.cs

@@ -201,8 +201,4 @@ namespace Hotline.Share.Dtos.Quality
 		public DateTime? CreationTimeEnd { get; set; }
 	}
 
-	public class AiQualityDto {
-	
-
-	}
 }

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

@@ -3,11 +3,16 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
+using Fw.Utility.UnifyResponse;
+using Hotline.CallCenter.Calls;
+using Hotline.Orders;
+using Hotline.Share.Dtos.Order;
+using RestSharp;
 
 namespace Hotline.Ai.Quality
 {
     public interface IAiQualityService
-    {
-        Task CreateAiOrderQualityTask(object obj);
-    }
+	{
+        Task CreateAiOrderQualityTask(Hotline.Quality.Quality model, TrCallRecord call,Order order, CancellationToken cancellationToken);
+	}
 }

+ 1 - 0
src/Hotline/Hotline.csproj

@@ -12,6 +12,7 @@
     <PackageReference Include="MediatR" Version="12.0.1" />
     <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="7.0.0" />
     <PackageReference Include="Portable.BouncyCastle" Version="1.9.0" />
+    <PackageReference Include="RestSharp" Version="110.2.0" />
     <PackageReference Include="XF.Utility.MQ" Version="1.0.5" />
   </ItemGroup>
 

+ 63 - 0
src/Hotline/Tools/DESExtensions.cs

@@ -0,0 +1,63 @@
+using System.Security.Cryptography;
+using System.Text;
+
+namespace Hotline.Tools
+{
+	public static class DESExtensions
+	{
+		private const string key = "fwayfway";
+
+		/// <summary>
+		/// 加密
+		/// </summary>
+		/// <param name="text"></param>
+		/// <returns></returns>
+		public static string Encrypt(string text)
+		{
+
+			DESCryptoServiceProvider des = new DESCryptoServiceProvider();
+			byte[] inputByteArray;
+			inputByteArray = Encoding.Default.GetBytes(text);
+			des.Key = ASCIIEncoding.ASCII.GetBytes(key);
+			des.IV = ASCIIEncoding.ASCII.GetBytes(key);
+			System.IO.MemoryStream ms = new System.IO.MemoryStream();
+			CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
+			cs.Write(inputByteArray, 0, inputByteArray.Length);
+			cs.FlushFinalBlock();
+			StringBuilder ret = new StringBuilder();
+			foreach (byte b in ms.ToArray())
+			{
+				ret.AppendFormat("{0:X2}", b);
+			}
+			return ret.ToString();
+
+		}
+
+		/// <summary>
+		/// 解密
+		/// </summary>
+		/// <param name="text"></param>
+		/// <returns></returns>
+		public static string Decrypt(string text)
+		{
+			DESCryptoServiceProvider des = new DESCryptoServiceProvider();
+			int len;
+			len = text.Length / 2;
+			byte[] inputByteArray = new byte[len];
+			int x, i;
+			for (x = 0; x < len; x++)
+			{
+				i = Convert.ToInt32(text.Substring(x * 2, 2), 16);
+				inputByteArray[x] = (byte)i;
+			}
+			des.Key = ASCIIEncoding.ASCII.GetBytes(key);
+			des.IV = ASCIIEncoding.ASCII.GetBytes(key);
+			System.IO.MemoryStream ms = new System.IO.MemoryStream();
+			CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
+			cs.Write(inputByteArray, 0, inputByteArray.Length);
+			cs.FlushFinalBlock();
+			return Encoding.Default.GetString(ms.ToArray());
+
+		}
+	}
+}