Ver código fonte

Merge branch 'master' of http://110.188.24.182:10023/Fengwo/hotline

# Conflicts:
#	src/Hotline.Api/Controllers/OrderController.cs
xf 1 ano atrás
pai
commit
e577782980

+ 2 - 3
src/Hotline.Ai.Jths/AiQualityService.cs

@@ -35,8 +35,7 @@ namespace Hotline.Ai.Jths
 				Extend = model.Source.ToString(),
 			};
 			var data =JsonConvert.SerializeObject(aiQuality);
-			//todo  缺少地址
-			await ExecuteAsync(_baseUrl+"/routeinfo/api", Method.Post, data, cancellationToken);
+			await ExecuteAsync(_baseUrl+"routeinfo/api", Method.Post, data, cancellationToken);
 		}
 
 		public async Task<ApiResponse<TResponse>> ExecuteAsync<TRequest, TResponse>(string path, Method httpMethod,
@@ -71,7 +70,7 @@ namespace Hotline.Ai.Jths
 			var req = new RestRequest(path, httpMethod);
 			req.AddHeader("content-type", "application/json");
 			req.AddHeader("token", "");
-			req.AddHeader("version", "");
+			req.AddHeader("version", "1.0");
 			var appkey = MD5Encrypt(request.ToString());
 			req.AddHeader("appkey", appkey);
 			req.AddHeader("signType", "md5");

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

@@ -44,8 +44,8 @@ namespace Hotline.Ai.Jths
                 BatchStatus = 1,
                 SceneUid = _sceneuid,
                 Priority = 1,
-                StartDate = aiOrderVisit.BeginTime,
-                EndDate = aiOrderVisit.EndTime,
+                StartDate = aiOrderVisit.BeginTime.ToString("yyyy/MM/dd hh:mm:ss"),
+                EndDate = aiOrderVisit.EndTime.ToString("yyyy/MM/dd hh:mm:ss"),
                 FestivalBan = aiOrderVisit.FestivalBan,
                 RuleType = aiOrderVisit.RuleType,
                 RuleUid = _ruleuid,
@@ -61,13 +61,13 @@ namespace Hotline.Ai.Jths
                 {
                     if (!string.IsNullOrEmpty(item.Order.FromName))
                     {
-                        taskData.VariableList.Add(new Variable() { Code = "姓名", Value = item.Order.FromName });
+                        taskData.VariableList.Add(new Variable() { Code = "OC_SCENE_VAR_FIELD11", Value = item.Order.FromName });
                     }
-                    taskData.VariableList.Add(new Variable() { Code = "gender", Value = item.Order.FromGender == EGender.Female ? "女士" : "先生" });
+                    taskData.VariableList.Add(new Variable() { Code = "OC_SCENE_VAR_FIELD14", Value = item.Order.FromGender == EGender.Female ? "女士" : "先生" });
                 }
                
-                taskData.VariableList.Add(new Variable() { Code = "反馈时间", Value = item.Order.CreationTime.ToString("yyyy年MM月dd日hh点mm分") });
-                taskData.VariableList.Add(new Variable() { Code = "反馈问题", Value = item.Order.Title });
+                taskData.VariableList.Add(new Variable() { Code = "OC_SCENE_VAR_FIELD17", Value = item.Order.CreationTime.ToString("yyyy年MM月dd日hh点mm分") });
+                taskData.VariableList.Add(new Variable() { Code = "OC_SCENE_VAR_FIELD18", Value = item.Order.Title });
                 taskDataList.Add(taskData);
             }
             requestData.TaskDataList = taskDataList;

+ 2 - 2
src/Hotline.Ai.Jths/OrderVisits/AiVisitServiceRequest.cs

@@ -26,11 +26,11 @@ namespace Hotline.Ai.Jths.OrderVisits
         /// <summary>
         /// 外呼开始时间
         /// </summary>
-        public DateTime StartDate { get; set; }
+        public string StartDate { get; set; }
         /// <summary>
         /// 外呼结束时间
         /// </summary>
-        public DateTime EndDate { get; set; }
+        public string EndDate { get; set; }
 
         /// <summary>
         /// 节日禁呼 0:否 1:是

+ 30 - 41
src/Hotline.Api/Controllers/OrderController.cs

@@ -38,9 +38,8 @@ using Hotline.CallCenter.Calls;
 using Hotline.DataSharing.Province.Services;
 using Hotline.Share.Dtos.File;
 using Hotline.Application.Quality;
-using Hotline.Push.FWMessage;
-using Hotline.Share.Dtos.Push;
-using Hotline.Share.Enums.Push;
+using Hotline.Enterprise;
+using Hotline.Share.Dtos.Enterprise;
 
 namespace Hotline.Api.Controllers;
 
@@ -92,9 +91,9 @@ public class OrderController : BaseController
     private readonly IRepository<TrCallRecord> _trCallRecordRepository;
     private readonly ILogger<OrderController> _logger;
     private readonly IOrderApplication _orderApplication;
-    private readonly IPushDomainService _pushDomainService;
+    private readonly IEnterpriseService _enterpriseService;
 
-    public OrderController(
+	public OrderController(
         IOrderDomainService orderDomainService,
         IOrderRepository orderRepository,
         IWorkflowApplication workflowApplication,
@@ -138,7 +137,7 @@ public class OrderController : BaseController
         IRepository<TrCallRecord> trCallRecordRepository,
         ILogger<OrderController> logger,
         IOrderApplication orderApplication,
-        IPushDomainService pushDomainService)
+        IEnterpriseService enterpriseService)
     {
         _orderDomainService = orderDomainService;
         _orderRepository = orderRepository;
@@ -183,8 +182,9 @@ public class OrderController : BaseController
         _trCallRecordRepository = trCallRecordRepository;
         _logger = logger;
         _orderApplication = orderApplication;
-        _pushDomainService = pushDomainService;
-    }
+        _enterpriseService = enterpriseService;
+
+	}
 
     #region 工单发布
 
@@ -1053,7 +1053,7 @@ public class OrderController : BaseController
             startDto.DefinitionModuleCode = WorkflowModuleConsts.OrderDelay;
             startDto.Title = model.DelayReason;
             string workFlowId = await _workflowApplication.StartWorkflowAsync(startDto, model.Id,
-                cancellationToken: HttpContext.RequestAborted);
+                    cancellationToken: HttpContext.RequestAborted);
             model.WorkflowId = workFlowId;
             await _orderDelayRepository.UpdateAsync(model, HttpContext.RequestAborted);
         }
@@ -1272,7 +1272,7 @@ public class OrderController : BaseController
             startDto.DefinitionModuleCode = WorkflowModuleConsts.OrderScreen;
             startDto.Title = dto.Data.Content;
             workflowId = await _workflowApplication.StartWorkflowAsync(startDto, model.Id,
-                cancellationToken: HttpContext.RequestAborted);
+                    cancellationToken: HttpContext.RequestAborted);
             var screen = await _orderScreenRepository.GetAsync(model.Id, HttpContext.RequestAborted);
             if (screen != null)
             {
@@ -1733,13 +1733,11 @@ public class OrderController : BaseController
             .WhereIF(!string.IsNullOrEmpty(dto.TransferPhone), d => d.TransferPhone.Contains(dto.TransferPhone!))
             //.WhereIF(dto.OrgCodes.Any(), d => d.Workflow.Assigns.Any(s => dto.OrgCodes.Contains(s.OrgCode)))
             .WhereIF(dto.OrgCodes.Any(), d => dto.OrgCodes.Contains(d.Workflow.ActualHandleOrgCode))
-            .WhereIF(!string.IsNullOrEmpty(dto.NameOrNo),
-                d => d.AcceptorName.Contains(dto.NameOrNo!) || d.AcceptorStaffNo.Contains(dto.NameOrNo!))
+            .WhereIF(!string.IsNullOrEmpty(dto.NameOrNo), d => d.AcceptorName.Contains(dto.NameOrNo!) || d.AcceptorStaffNo.Contains(dto.NameOrNo!))
             .WhereIF(dto.CreationTimeStart.HasValue, d => d.CreationTime >= dto.CreationTimeStart)
             .WhereIF(dto.CreationTimeEnd.HasValue, d => d.CreationTime <= dto.CreationTimeEnd)
             .WhereIF(dto.EmergencyLevels.Any(), d => dto.EmergencyLevels.Contains(d.EmergencyLevel))
-            .WhereIF(!string.IsNullOrEmpty(dto.PhoneNo),
-                d => d.FromPhone.Contains(dto.PhoneNo!) || d.Contact.Contains(dto.PhoneNo!))
+            .WhereIF(!string.IsNullOrEmpty(dto.PhoneNo), d => d.FromPhone.Contains(dto.PhoneNo!) || d.Contact.Contains(dto.PhoneNo!))
             .WhereIF(!string.IsNullOrEmpty(dto.PushTypeCode), d => d.PushTypeCode == dto.PushTypeCode)
             .WhereIF(dto.ExpiredTimeStart.HasValue, d => d.ExpiredTime >= dto.ExpiredTimeStart)
             .WhereIF(dto.ExpiredTimeEnd.HasValue, d => d.ExpiredTime <= dto.ExpiredTimeEnd)
@@ -1798,7 +1796,7 @@ public class OrderController : BaseController
             .Includes(d => d.OrderDelays)
             .Includes(d => d.OrderScreens)
             .Includes(d => d.OrderVisits, x => x.OrderVisitDetails)
-            .Includes(d => d.OrderVisits, x => x.Employee)
+            .Includes(d=> d.OrderVisits,x=>x.Employee)
             .FirstAsync(d => d.Id == id);
         if (order == null)
             return new();
@@ -1866,27 +1864,6 @@ public class OrderController : BaseController
 
         //内容分词
         await _orderApplication.OrderParticiple(dto.Content, order.Id, HttpContext.RequestAborted);
-
-        try
-        {
-            await _pushDomainService.PushAsync(new MessageDto
-            {
-                PushBusiness = EPushBusiness.OrderAccept,
-                ExternalId = order.Id,
-                OrderId = order.Id,
-                PushPlatform = EPushPlatform.Sms,
-                Content =
-                    $"12345温馨提示:您的来电已受理(流水号:{order.No};提取码:{order.Password}),可通过网站(http://hotline.12345lm.cn)进行查询,谢谢。【12345热线平台】)",
-                Name = order.FromName,
-                Remark = order.Title,
-                TelNumber = order.Contact
-            }, HttpContext.RequestAborted);
-        }
-        catch (Exception e)
-        {
-            _logger.LogError("创建工单推送sms失败,{err}", e.Message);
-        }
-
         return order.Id;
     }
 
@@ -1964,8 +1941,7 @@ public class OrderController : BaseController
         try
         {
             //期满时间
-            var expiredTimeConfig =
-                _timeLimitDomainService.CalcExpiredTime(DateTime.Now, EFlowDirection.OrgToCenter, dto.Data.AcceptTypeCode);
+            var expiredTimeConfig = _timeLimitDomainService.CalcExpiredTime(DateTime.Now, EFlowDirection.OrgToCenter, dto.Data.AcceptTypeCode);
 
             var startDto = _mapper.Map<StartWorkflowDto>(dto.Workflow);
             startDto.DefinitionModuleCode = WorkflowModuleConsts.OrderHandle;
@@ -2349,7 +2325,7 @@ public class OrderController : BaseController
                 {
                     await _provinceService.RevokeOrder(
                         new PublishSpecialDto
-                            { Order = _mapper.Map<OrderDto>(order), Special = _mapper.Map<OrderSpecialDto>(model) },
+                        { Order = _mapper.Map<OrderDto>(order), Special = _mapper.Map<OrderSpecialDto>(model) },
                         HttpContext.RequestAborted);
                 }
                 catch (Exception e)
@@ -2414,7 +2390,7 @@ public class OrderController : BaseController
                 {
                     await _provinceService.RevokeOrder(
                         new PublishSpecialDto
-                            { Order = _mapper.Map<OrderDto>(order), Special = _mapper.Map<OrderSpecialDto>(special) },
+                        { Order = _mapper.Map<OrderDto>(order), Special = _mapper.Map<OrderSpecialDto>(special) },
                         HttpContext.RequestAborted);
                 }
                 catch (Exception e)
@@ -3129,5 +3105,18 @@ public class OrderController : BaseController
         await _orderRepository.UpdateAsync(order, HttpContext.RequestAborted);
     }
 
-    #endregion
+	#endregion
+
+	#region 获取企业信息
+    /// <summary>
+    /// 获取企业信息
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+	[HttpGet("enterprise/List")]
+	public async Task<EnterpriseListData> GetEnterpriseList([FromQuery] PagedKeywordRequest dto)
+	{
+		return await _enterpriseService.GetEnterpriseList(dto.Keyword!, dto.PageIndex,dto.PageSize, HttpContext.RequestAborted);
+	}
+	#endregion
 }

+ 35 - 9
src/Hotline.Api/Controllers/QualityController.cs

@@ -20,6 +20,8 @@ using System.Threading;
 using Hotline.CallCenter.Calls;
 using Hotline.Application.Quality;
 using Microsoft.AspNetCore.Authorization;
+using Hotline.Orders;
+using Hotline.Ai.Quality;
 
 namespace Hotline.Api.Controllers
 {
@@ -36,6 +38,8 @@ namespace Hotline.Api.Controllers
 		private readonly ISystemDicDataCacheManager _systemDicDataCacheManager;
 		private readonly IRepository<TrCallRecord> _trCallRecordRepository;
 		private readonly IQualityApplication _qualityApplication;
+		private readonly IOrderRepository _orderRepository;
+		private readonly IAiQualityService _aiQualityService;
 
 		public QualityController(
 			ISessionContext sessionContext,
@@ -48,7 +52,11 @@ namespace Hotline.Api.Controllers
 			IRepository<QualityProhibited> qualiteyProhibited,
 			ISystemDicDataCacheManager systemDicDataCacheManager,
 			IRepository<TrCallRecord> trCallRecordRepository,
-			IQualityApplication qualityApplication
+			IQualityApplication qualityApplication,
+
+			IOrderRepository orderRepository,
+			IAiQualityService aiQualityService
+
 		)
 		{
 			_sessionContext = sessionContext;
@@ -62,6 +70,8 @@ namespace Hotline.Api.Controllers
 			_systemDicDataCacheManager = systemDicDataCacheManager;
 			_trCallRecordRepository = trCallRecordRepository;
 			_qualityApplication = qualityApplication;
+			_orderRepository = orderRepository;
+			_aiQualityService = aiQualityService;
 		}
 		#region 质检管理
 		/// <summary>
@@ -105,13 +115,13 @@ namespace Hotline.Api.Controllers
 				.Includes(x => x.Visit)
 				.Includes(x => x.Visit,e=>e.Employee)
 				.Includes(x => x.QualityDetails)
-				.WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Order.Title.Contains(dto.Keyword!) || d.Order.No.Contains(dto.Keyword!))
-				.WhereIF(dto.State.HasValue, d => d.State == dto.State)
-				.WhereIF(dto.Source.HasValue, d => d.Source == dto.Source)
+				.WhereIF(!string.IsNullOrEmpty(dto.Keyword), x => x.Order.Title.Contains(dto.Keyword!) || x.Order.No.Contains(dto.Keyword!))
+				.WhereIF(dto.State.HasValue, x => x.State == dto.State)
+				.WhereIF(dto.Source.HasValue, x=> x.Source == dto.Source)
 				.WhereIF(dto.Source.HasValue && dto.Source == EQualitySource.Accepted, x=> !string.IsNullOrEmpty(x.Order.CallId))
 				.WhereIF(dto.Source.HasValue && dto.Source == EQualitySource.Visit, x => !string.IsNullOrEmpty(x.Visit.CallId))
-				.WhereIF(dto.CreationTimeStart.HasValue, d => d.CreationTime >= dto.CreationTimeStart)
-				.WhereIF(dto.CreationTimeEnd.HasValue, d => d.CreationTime <= dto.CreationTimeEnd)
+				.WhereIF(dto.CreationTimeStart.HasValue, x => x.CreationTime >= dto.CreationTimeStart)
+				.WhereIF(dto.CreationTimeEnd.HasValue, x => x.CreationTime <= dto.CreationTimeEnd)
 				.OrderByDescending(x => x.CreationTime)
 				.ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
 			return new PagedDto<QualityDto>(total, _mapper.Map<IReadOnlyList<QualityDto>>(items));
@@ -256,8 +266,8 @@ namespace Hotline.Api.Controllers
 		[HttpPost("template")]
 		public async Task Add([FromBody] TemplateAddDto dto)
 		{
-			var groupingCount = await _qualityTemplate.CountAsync(x => x.Grouping == dto.Grouping && x.IsEnable == 0);
-			if (groupingCount > 0)
+			var groupingCount = await _qualityTemplate.CountAsync(x => x.Grouping == dto.Grouping && x.IsEnable == 1);
+			if (groupingCount > 0 && dto.IsEnable == 1)
 				throw UserFriendlyException.SameMessage("当前已存在");
 			var names = dto.TemplateDetails.Select(x => x.ItemId).ToList();
 			var nameCount= names.GroupBy(x => x).Count(c => c.Count() > 1);
@@ -317,7 +327,7 @@ namespace Hotline.Api.Controllers
 			var template = await _qualityTemplate.GetAsync(dto.Id, HttpContext.RequestAborted);
 			if (template is null)
 				throw UserFriendlyException.SameMessage("无效质检模版");
-			var groupingCount = await _qualityTemplate.CountAsync(x => x.Grouping == dto.Grouping && x.Id != dto.Id && x.IsEnable == 0);
+			var groupingCount = await _qualityTemplate.CountAsync(x => x.Grouping == dto.Grouping && x.Id != dto.Id && x.IsEnable == 1);
 			if (groupingCount > 0)
 				throw UserFriendlyException.SameMessage("当前质检分类已存在");
 			_mapper.Map(dto, template);
@@ -380,6 +390,9 @@ namespace Hotline.Api.Controllers
 		public async Task Enable([FromBody] TemplateUpdateDto dto)
 		{
 			var template = await _qualityTemplate.GetAsync(dto.Id, HttpContext.RequestAborted);
+			var groupingCount = await _qualityTemplate.CountAsync(x => x.Grouping == dto.Grouping && x.Id != dto.Id && x.IsEnable == 1);
+			if (groupingCount > 0)
+				throw UserFriendlyException.SameMessage("当前质检分类已存在");
 			if (template is null)
 				throw UserFriendlyException.SameMessage("无效质检模版");
 			_mapper.Map(dto, template);
@@ -561,5 +574,18 @@ namespace Hotline.Api.Controllers
 				await _qualiteyDetail.AddRangeAsync(details);
 			}
 		}
+		[AllowAnonymous]
+		[HttpPost("AiResultTest")]
+		public async Task TaskAsync()
+		{
+			var quality = await _qualitey.GetAsync("08dbfc81-a43b-4be1-8266-8f0f55fb0024");
+			var order = await _orderRepository.GetAsync(quality.OrderId);
+			if (order != null && !string.IsNullOrEmpty(order.CallId))
+			{
+				var call = await _trCallRecordRepository.GetAsync(x => x.CallAccept == order.CallId);
+				await _aiQualityService.CreateAiOrderQualityTask(quality, call, order, HttpContext.RequestAborted);
+			}
+		}
+
 	}
 }

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

@@ -202,14 +202,14 @@
   //智能回访
   "AiVisit": {
     "Url": "http://118.121.201.140:19061",
-    "Appkey": "fwkj",
+    "Appkey": "MTAwMDAx",
     "ServiceVersion": "V1.0.0", //接口版本号
-    "SceneUid": "MTAwMDAxX0T7BfPTIqh8biWrOf58", //场景ID
+    "SceneUid": "MTAwMDAxM4yRrAE5SsihkQkKuyMwM", //场景ID
     "RuleUid": "MTAwMDAxSGdDJryoQUgoDeiKlsTEyc" //现有规则ID
   },
   //智能质检
   "AiQuality": {
-    "Url": ""
+    "Url": "http://118.121.201.140:19072/"
   },
   //企业服务
   "Enterprise": {

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

@@ -100,14 +100,14 @@
   },
   //智能质检
   "AiQuality": {
-    "Url": ""
+    "Url": "http://118.121.201.140:19072/"
   },
   //智能回访
   "AiVisit": {
     "Url": "http://118.121.201.140:19061",
-    "Appkey": "fwkj",
+    "Appkey": "MTAwMDAx",
     "ServiceVersion": "V1.0.0", //接口版本号
-    "SceneUid": "MTAwMDAxX0T7BfPTIqh8biWrOf58", //场景ID
+    "SceneUid": "MTAwMDAxM4yRrAE5SsihkQkKuyMwM", //场景ID
     "RuleUid": "MTAwMDAxSGdDJryoQUgoDeiKlsTEyc" //现有规则ID
   }
 }

+ 1 - 1
src/Hotline.Application/Quality/QualityApplication.cs

@@ -95,7 +95,7 @@ namespace Hotline.Application.Quality
 					var order = await _orderRepository.GetAsync(model.OrderId);
 					if (order != null && !string.IsNullOrEmpty(order.CallId))
 					{
-						var call = await _trCallRecordRepository.GetAsync(order.CallId);
+						var call = await _trCallRecordRepository.GetAsync(x=>x.CallAccept == order.CallId);
 						await _aiQualityService.CreateAiOrderQualityTask(quality, call, order, cancellationToken);
 					}
 				}