Dun.Jason 1 yıl önce
ebeveyn
işleme
040c90904d

+ 39 - 2
src/Hotline.Api/Controllers/AiController.cs

@@ -1,5 +1,6 @@
 
 using Consul;
+using DotNetCore.CAP;
 using Hotline.Ai.Jths;
 using Hotline.Ai.Visit;
 using Hotline.Caching.Interfaces;
@@ -9,6 +10,7 @@ using Hotline.Repository.SqlSugar.Extensions;
 using Hotline.Share.Dtos;
 using Hotline.Share.Dtos.Ai;
 using Hotline.Share.Dtos.Order;
+using Hotline.Share.Enums.Order;
 using MapsterMapper;
 using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Mvc;
@@ -30,8 +32,10 @@ namespace Hotline.Api.Controllers
         private readonly IOptionsSnapshot<AiVisitConfig> _options;
         private readonly IAiVisitService _aiVisitService;
         private readonly ILogger<AiController> _logger;
+        private readonly ICapPublisher _capPublisher;
+        private readonly IOrderRepository _orderRepository;
 
-        public AiController(ISystemSettingCacheManager systemSettingCacheManager,IRepository<AiOrderVisit> aiOrderVisitRepository,IRepository<AiOrderVisitDetail>  aiOrderVisitDetailRepository,IRepository<OrderVisit> orderVisitRepository,IRepository<OrderVisitDetail> orderVisitDetailRepository,IMapper mapper, IOptionsSnapshot<AiVisitConfig> options,IAiVisitService aiVisitService, ILogger<AiController> logger)
+        public AiController(ISystemSettingCacheManager systemSettingCacheManager,IRepository<AiOrderVisit> aiOrderVisitRepository,IRepository<AiOrderVisitDetail>  aiOrderVisitDetailRepository,IRepository<OrderVisit> orderVisitRepository,IRepository<OrderVisitDetail> orderVisitDetailRepository,IMapper mapper, IOptionsSnapshot<AiVisitConfig> options,IAiVisitService aiVisitService, ILogger<AiController> logger,ICapPublisher capPublisher,IOrderRepository orderRepository)
         {
            _systemSettingCacheManager = systemSettingCacheManager;
             _aiOrderVisitRepository = aiOrderVisitRepository;
@@ -42,6 +46,8 @@ namespace Hotline.Api.Controllers
             _options = options;
             _aiVisitService = aiVisitService;
             _logger = logger;
+            _capPublisher = capPublisher;
+            _orderRepository = orderRepository;
         }
 
 
@@ -96,7 +102,7 @@ namespace Hotline.Api.Controllers
 
 
             var aiOrderVisit = await _aiOrderVisitRepository.Queryable()
-                .Includes(x => x.AiOrderVisitDetails,s=>s.OrderVisit)
+                .Includes(x => x.AiOrderVisitDetails,s=>s.OrderVisit,d=>d.Order)
                 .FirstAsync(x => x.BatchUid == dto.BatchUid);
             if (aiOrderVisit!=null)
             {
@@ -167,6 +173,8 @@ namespace Hotline.Api.Controllers
                                 }
                             });
                             await _orderVisitDetailRepository.UpdateRangeAsync(orgDetail, HttpContext.RequestAborted);
+
+                            var first = aiOrderVisitDetail.OrderVisit.OrderVisitDetails.FirstOrDefault(x => x.VisitTarget == EVisitTarget.Org);
                             //处理主表
                             aiOrderVisitDetail.OrderVisit.VisitState = Share.Enums.Order.EVisitState.Visited;
                             aiOrderVisitDetail.OrderVisit.AiVisitCount++;
@@ -174,7 +182,36 @@ namespace Hotline.Api.Controllers
                             aiOrderVisitDetail.OrderVisit.IsPutThrough = false;
                             aiOrderVisitDetail.OrderVisit.VisitType = Share.Enums.Order.EVisitType.ChipVoiceVisit;
                             aiOrderVisitDetail.OrderVisit.AiVisitTime();
+                            if (first!=null)
+                            {
+                                aiOrderVisitDetail.OrderVisit.NowEvaluate = first.OrgProcessingResults;
+                            }
                             await _orderVisitRepository.UpdateAsync(aiOrderVisitDetail.OrderVisit, HttpContext.RequestAborted);
+
+                            //处理Order表
+                            if (first != null)
+                            {
+                                aiOrderVisitDetail.OrderVisit.Order.Visited(first.OrgProcessingResults.Key, first.OrgProcessingResults.Value);
+                                await _orderRepository.UpdateAsync(aiOrderVisitDetail.OrderVisit.Order);
+                            }
+
+                            //推省上
+                            var orderDto = _mapper.Map<OrderDto>(aiOrderVisitDetail.OrderVisit.Order);
+                            await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderVisited,
+                            new PublishVisitDto()
+                            {
+                                Order = orderDto,
+                                No = aiOrderVisitDetail.OrderVisit.No,
+                                VisitType = aiOrderVisitDetail.OrderVisit.VisitType,
+                                VisitName = aiOrderVisitDetail.OrderVisit.CreatorName,
+                                VisitTime = aiOrderVisitDetail.OrderVisit.VisitTime,
+                                VisitRemark = first.VisitContent,
+                                AreaCode = aiOrderVisitDetail.OrderVisit.Order.AreaCode!,
+                                SubjectResultSatifyCode = first.OrgProcessingResults.Key,
+                                FirstSatisfactionCode = aiOrderVisitDetail.OrderVisit.Order.FirstVisitResultCode!,
+                                ClientGuid = ""
+                            }, cancellationToken: HttpContext.RequestAborted);
+
                         }
                         else
                         {

+ 47 - 8
src/Hotline.Api/Controllers/IPPbxController.cs

@@ -1,6 +1,6 @@
-using Hotline.Application.CallCenter.Calls;
+using DotNetCore.CAP;
+using Hotline.Application.CallCenter.Calls;
 using Hotline.Caching.Interfaces;
-using Hotline.Caching.Services;
 using Hotline.CallCenter.Calls;
 using Hotline.Orders;
 using Hotline.Permissions;
@@ -10,12 +10,10 @@ using Hotline.Share.Dtos;
 using Hotline.Share.Dtos.Order;
 using Hotline.Share.Dtos.TrCallCenter;
 using Hotline.Share.Enums.CallCenter;
-using Hotline.Share.Enums.KnowledgeBase;
 using Hotline.Users;
 using MapsterMapper;
 using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Mvc;
-using System.Text.Json;
 using Tr.Sdk;
 using Tr.Sdk.Blacklist;
 using Tr.Sdk.Tels;
@@ -40,8 +38,9 @@ namespace Hotline.Api.Controllers
         private readonly IOrderRepository _orderRepository;
         private readonly IRepository<OrderVisit> _orderVisitRepository;
         private readonly IUserCacheManager _userCacheManager;
+        private readonly ICapPublisher _capPublisher;
 
-        public IPPbxController(ITrClient trClient,IMapper mapper,IUserDomainService userDomainService,ISessionContext sessionContext,IRepository<TrCallRecord> trCallRecordRepository,ITrApplication trApplication,IRepository<TrCallEvaluate> trCallRecord,ISystemDicDataCacheManager systemDicDataCacheManager,ILogger<IPPbxController> logger,IOrderRepository orderRepository,IRepository<OrderVisit> orderVisitRepository, IUserCacheManager userCacheManager)
+        public IPPbxController(ITrClient trClient,IMapper mapper,IUserDomainService userDomainService,ISessionContext sessionContext,IRepository<TrCallRecord> trCallRecordRepository,ITrApplication trApplication,IRepository<TrCallEvaluate> trCallRecord,ISystemDicDataCacheManager systemDicDataCacheManager,ILogger<IPPbxController> logger,IOrderRepository orderRepository,IRepository<OrderVisit> orderVisitRepository, IUserCacheManager userCacheManager,ICapPublisher capPublisher)
         {
             _trClient = trClient;
             _mapper = mapper;
@@ -55,6 +54,7 @@ namespace Hotline.Api.Controllers
             _orderRepository = orderRepository;
             _orderVisitRepository = orderVisitRepository;
             _userCacheManager = userCacheManager;
+            _capPublisher = capPublisher;
         }
 
         #region 添添呼
@@ -226,6 +226,24 @@ namespace Hotline.Api.Controllers
             {
                 model.TelNo = model.CPN;
             }
+
+            //获取关联 工单或是回访
+            var order = await _orderRepository.GetAsync(x => x.CallId == model.CallAccept, HttpContext.RequestAborted);
+            if (order!=null)
+            {
+                model.CallOrderType = ECallOrderType.Order;
+                model.ExternalId = order.Id;
+            }
+            else
+            {
+                var orderVisit = await _orderVisitRepository.GetAsync(x => x.CallId == model.CallAccept, HttpContext.RequestAborted);
+                if (orderVisit!=null)
+                {
+                    model.CallOrderType = ECallOrderType.Visit;
+                    model.ExternalId = orderVisit.Id;
+                }
+            }
+
             //获取用户
             var work = await _userCacheManager.GetWorkByTelNoLast(model.TelNo);
             if (work!=null)
@@ -235,6 +253,21 @@ namespace Hotline.Api.Controllers
                 model.StaffNo = work.StaffNo;
             }
             await _trCallRecordRepository.AddAsync(model, HttpContext.RequestAborted);
+
+            if (model.CallDirection == ECallDirection.In)
+            {
+                var publishCallRecordDto = new PublishCallRecrodDto() { };
+                if (order!=null)
+                {
+                    var orderDto = _mapper.Map<OrderDto>(order);
+                    publishCallRecordDto.Order = orderDto;
+                }
+                var trCallDto = _mapper.Map<TrCallDto>(model);
+                publishCallRecordDto.TrCallRecordDto = trCallDto;
+                //推省上
+                await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineCallBye, publishCallRecordDto);
+            }
+
             return OpenResponse.Ok("success");
         }
 
@@ -337,21 +370,27 @@ namespace Hotline.Api.Controllers
         [HttpPost("link-callrecord")]
         public async Task LinkCallRecord([FromBody]LinkCallRecordDto dto)
         {
-            
+            var trRecord = await _trCallRecordRepository.GetAsync(x => x.CallAccept == dto.CallId, HttpContext.RequestAborted);
             if (dto.IsOrder)
             {
                 //工单
                 var order = await _orderRepository.GetAsync(x => x.Id == dto.Id, HttpContext.RequestAborted);
                 order.CallId = dto.CallId;
-                await _orderRepository.UpdateAsync(order);
+                await _orderRepository.UpdateAsync(order,HttpContext.RequestAborted);
+                trRecord.CallOrderType = ECallOrderType.Order;
+                trRecord.ExternalId = order.Id;
+                
             }
             else
             {
                 //回访
                 var visit = await _orderVisitRepository.GetAsync(x => x.Id == dto.Id, HttpContext.RequestAborted);
                 visit.CallId = dto.CallId;
-                await _orderVisitRepository.UpdateAsync(visit);
+                await _orderVisitRepository.UpdateAsync(visit,HttpContext.RequestAborted);
+                trRecord.CallOrderType = ECallOrderType.Visit;
+                trRecord.ExternalId = visit.Id;
             }
+            await _trCallRecordRepository.UpdateAsync(trRecord, HttpContext.RequestAborted);
         }
 
 

+ 5 - 9
src/Hotline.Api/Controllers/OrderController.cs

@@ -262,15 +262,11 @@ public class OrderController : BaseController
         await _orderRepository.UpdateAsync(order);
 
 
-        //TODO 推省上
-        try
-        {
-            var publishPublishOrder = _mapper.Map<PublishPublishOrderDto>(orderPublish);
-            publishPublishOrder.Order = _mapper.Map<OrderDto>(order);
-        }
-        catch
-        {
-        }
+        //推省上
+        var publishPublishOrder = _mapper.Map<PublishPublishOrderDto>(orderPublish);
+        publishPublishOrder.Order = _mapper.Map<OrderDto>(order);
+        await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderPublishOrder, publishPublishOrder);
+       
 
 
         var orderVisit = new OrderVisit();

+ 17 - 10
src/Hotline.Application/Handlers/FlowEngine/WorkflowStartHandler.cs

@@ -3,6 +3,7 @@ using System.Text.Json;
 using System.Text.Unicode;
 using DotNetCore.CAP;
 using Hotline.Application.Quality;
+using Hotline.CallCenter.Calls;
 using Hotline.CallCenter.Tels;
 using Hotline.DataSharing.Province.Services;
 using Hotline.FlowEngine.Notifications;
@@ -11,12 +12,14 @@ using Hotline.KnowledgeBase;
 using Hotline.Orders;
 using Hotline.Quality;
 using Hotline.Share.Dtos.Order;
+using Hotline.Share.Dtos.TrCallCenter;
 using Hotline.Share.Enums.Order;
 using Hotline.Share.Enums.Quality;
 using Hotline.Share.Mq;
 using MapsterMapper;
 using MediatR;
 using Microsoft.Extensions.Logging;
+using XF.Domain.Repository;
 
 namespace Hotline.Application.Handlers.FlowEngine
 {
@@ -31,6 +34,7 @@ namespace Hotline.Application.Handlers.FlowEngine
         private readonly IMapper _mapper;
         private readonly ILogger<WorkflowStartHandler> _logger;
         private readonly IQualityApplication _qualityApplication;
+        private readonly IRepository<TrCallRecord> _trCallRecordRepository;
 
         public WorkflowStartHandler(
             IOrderDomainService orderDomainService,
@@ -41,7 +45,8 @@ namespace Hotline.Application.Handlers.FlowEngine
             IProvinceService provinceService,
             IQualityApplication qualityApplication,
             IMapper mapper,
-            ILogger<WorkflowStartHandler> logger
+            ILogger<WorkflowStartHandler> logger,
+            IRepository<TrCallRecord> trCallRecordRepository
         )
         {
             _orderDomainService = orderDomainService;
@@ -53,6 +58,7 @@ namespace Hotline.Application.Handlers.FlowEngine
             _qualityApplication = qualityApplication;
             _mapper = mapper;
             _logger = logger;
+            _trCallRecordRepository = trCallRecordRepository;
         }
 
         /// <summary>Handles a notification</summary>
@@ -77,16 +83,17 @@ namespace Hotline.Application.Handlers.FlowEngine
                     _mapper.Map(workflow, order);
                     await _orderRepository.UpdateAsync(order, cancellationToken);
 
-                    await _capPublisher.PublishAsync(EventNames.HotlineOrderFlowStarted, _mapper.Map<OrderDto>(order),
+                    var publishCallRecordDto = new PublishCallRecrodDto() { };
+                    //查询通话记录
+                    var callRecord = await _trCallRecordRepository.GetAsync(order.CallId, cancellationToken);
+                    if (callRecord!=null)
+                    {
+                        publishCallRecordDto.TrCallRecordDto = _mapper.Map<TrCallDto>(callRecord);
+                    }
+                    publishCallRecordDto.Order = _mapper.Map<OrderDto>(order);
+
+                    await _capPublisher.PublishAsync(EventNames.HotlineOrderFlowStarted, publishCallRecordDto,
                         cancellationToken: cancellationToken);
-                    //try
-                    //{
-                    //    await _provinceService.OrderFlowStarted(_mapper.Map<OrderDto>(order), cancellationToken);
-                    //}
-                    //catch (Exception e)
-                    //{
-                    //    _logger.LogError("_provinceService.OrderFlowStarted throw exception: {ex}", e.Message);
-                    //}
 
                     //写入质检
                     await _qualityApplication.AddQualityAsync(EQualitySource.Accepted, order.Id, cancellationToken);

+ 8 - 0
src/Hotline.Share/Dtos/TrCallCenter/TrTelDao.cs

@@ -1,5 +1,6 @@
 
 using Hotline.Share.Dtos.DataSharing.Province.Extend;
+using Hotline.Share.Dtos.Order;
 using Hotline.Share.Enums.CallCenter;
 using Hotline.Share.Requests;
 using XF.Utility.EnumExtensions;
@@ -327,6 +328,13 @@ namespace Hotline.Share.Dtos.TrCallCenter
         public int type { get;set; }
     }
 
+    public class PublishCallRecrodDto
+    {
+        public OrderDto? Order { get; set; }
+
+        public TrCallDto? TrCallRecordDto { get; set; }
+    }
+
     #endregion
 
     #region 通话记录(对内)

+ 12 - 0
src/Hotline.Share/Enums/CallCenter/ECallOrderType.cs

@@ -0,0 +1,12 @@
+using System.ComponentModel;
+
+namespace Hotline.Share.Enums.CallCenter
+{
+    public enum ECallOrderType
+    {
+        [Description("工单")]
+        Order = 1,
+        [Description("回访")]
+        Visit = 2,
+    }
+}

+ 7 - 1
src/Hotline/CallCenter/Calls/TrCallRecord.cs

@@ -143,7 +143,13 @@ namespace Hotline.CallCenter.Calls
         [SugarColumn(DefaultValue = "0")]
         public int QueueTims { get; set; }
 
-        
+        public ECallOrderType? CallOrderType { get; set; }
+
+        /// <summary>
+        /// 外部ID
+        /// </summary>
+        public string? ExternalId { get; set; }
+
         #endregion
     }
 }