浏览代码

Merge branch 'fix/step_temp' of Fengwo/hotline into release

xf 3 月之前
父节点
当前提交
faf55563e0

+ 1 - 1
src/Hotline.Api/Controllers/OrderController.cs

@@ -1252,7 +1252,7 @@ public class OrderController : BaseController
     public async Task Visit([FromBody] VisitDto dto)
     {
         // 发送延迟关联通话记录消息
-        await _callApplication.PublishVisitRelevanceCallIdAsync(dto.Adapt<OrderRelevanceCallIdDto>(), HttpContext.RequestAborted);
+        dto.CallId = await _callApplication.PublishVisitRelevanceCallIdAsync(dto.Adapt<OrderRelevanceCallIdDto>(), HttpContext.RequestAborted);
         dto.CallId = await _callApplication.GetOrSetCallIdAsync(dto.CallId, HttpContext.RequestAborted);
         await _orderApplication.SaveOrderVisit(dto, HttpContext.RequestAborted);
     }

+ 53 - 1
src/Hotline.Application.Tests/Controller/OrderControllerTest.cs

@@ -17,6 +17,8 @@ using Hotline.Orders;
 using Hotline.Repository.SqlSugar;
 using Hotline.Settings;
 using Hotline.Settings.Hotspots;
+using Hotline.Share.Dtos;
+using Hotline.Share.Dtos.CallCenter;
 using Hotline.Share.Dtos.File;
 using Hotline.Share.Dtos.FlowEngine;
 using Hotline.Share.Dtos.Order;
@@ -29,6 +31,7 @@ using Hotline.Share.Enums.Order;
 using Hotline.Share.Enums.Settings;
 using Hotline.Share.Tools;
 using Hotline.Users;
+using Mapster;
 using MediatR;
 using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Mvc;
@@ -57,14 +60,17 @@ public class OrderControllerTest : TestBase
     private readonly IRepository<OrderPublish> _orderPublishRepository;
     private readonly INotificationHandler<EndWorkflowNotify> _orderPublishEndWorkflowHandler;
     private readonly IOrderVisitRepository _orderVisitRepository;
+    private readonly IRepository<OrderVisitDetail> _orderVisitDetailRepository;
     private readonly IRepository<SystemSetting> _systemSettingRepository;
     private readonly ISystemSettingCacheManager _systemSettingCacheManager;
     private readonly IRepository<CallNative> _callNativeRepository;
     private readonly IRepository<CallidRelation> _callIdRelationRepository;
     private readonly XingTangCallApplication _defaultCallApplication;
     private readonly ISqlSugarClient _capSqlClient;
+    private readonly ISystemLogRepository _systemLogRepository;
+    private readonly IOrderVisitDomainService _orderVisitDomainService;
 
-    public OrderControllerTest(IAccountRepository accountRepository, IRepository<Role> roleRepository, UserController userController, IRepository<Hotspot> hotspotRepository, OrderController orderController, IOrderRepository orderRepository, IServiceScopeFactory scopeFactory, IRepository<User> userRepository, OrderServiceMock orderServiceMock, IRepository<OrderPublish> orderPublishRepository, INotificationHandler<EndWorkflowNotify> orderPublishEndWorkflowHandler, IOrderVisitRepository orderVisitRepository, IRepository<SystemSetting> systemSettingRepository, ISystemSettingCacheManager systemSettingCacheManager, IRepository<CallNative> callNativeRepository, IRepository<CallidRelation> callIdRelationRepository, XingTangCallApplication defaultCallApplication, ISugarUnitOfWork<CapDbContext> capDbContext, IHttpContextAccessor httpContextAccessor) : base(accountRepository, roleRepository, userController, scopeFactory, userRepository, httpContextAccessor)
+    public OrderControllerTest(IAccountRepository accountRepository, IRepository<Role> roleRepository, UserController userController, IRepository<Hotspot> hotspotRepository, OrderController orderController, IOrderRepository orderRepository, IServiceScopeFactory scopeFactory, IRepository<User> userRepository, OrderServiceMock orderServiceMock, IRepository<OrderPublish> orderPublishRepository, INotificationHandler<EndWorkflowNotify> orderPublishEndWorkflowHandler, IOrderVisitRepository orderVisitRepository, IRepository<SystemSetting> systemSettingRepository, ISystemSettingCacheManager systemSettingCacheManager, IRepository<CallNative> callNativeRepository, IRepository<CallidRelation> callIdRelationRepository, XingTangCallApplication defaultCallApplication, ISugarUnitOfWork<CapDbContext> capDbContext, IHttpContextAccessor httpContextAccessor, ISystemLogRepository systemLogRepository, IOrderVisitDomainService orderVisitDomainService, IRepository<OrderVisitDetail> orderVisitDetailRepository) : base(accountRepository, roleRepository, userController, scopeFactory, userRepository, httpContextAccessor)
     {
         _hotspotRepository = hotspotRepository;
         _orderController = orderController;
@@ -83,6 +89,9 @@ public class OrderControllerTest : TestBase
         _callIdRelationRepository = callIdRelationRepository;
         _defaultCallApplication = defaultCallApplication;
         _capSqlClient = capDbContext.Db;
+        _systemLogRepository = systemLogRepository;
+        _orderVisitDomainService = orderVisitDomainService;
+        _orderVisitDetailRepository = orderVisitDetailRepository;
     }
 
     /// <summary>
@@ -152,6 +161,49 @@ public class OrderControllerTest : TestBase
         }
     }
 
+    [Fact]
+    public async Task Visit_Test()
+    {
+        SetZuoXi();
+        var order = _orderServiceMock.CreateOrder()
+            .办理到一级部门()
+            .办理到二级部门(Set一级部门)
+            .办理一级部门汇总(Set二级部门)
+            .办理到归档(Set一级部门)
+            .发布工单(SetZuoXi)
+            .GetCreateResult();
+
+        var visit = await _orderVisitRepository.Queryable()
+            .Where(m => m.OrderId == order.Id)
+            .FirstAsync();
+        var visitDetaila = await _orderVisitDetailRepository.Queryable().Where(m => m.VisitId == visit.Id).ToListAsync();
+        var visitDetail = visitDetaila.Adapt<List<VisitDetailDto>>();
+        visitDetail.ForEach(m => { 
+            m.SeatEvaluate = ESeatEvaluate.DefaultSatisfied;
+            m.OrgProcessingResults = _orderVisitDomainService.GetVisitEvaluateByReplyTxt<Kv>("0");
+            m.OrgHandledAttitude = _orderVisitDomainService.GetVisitEvaluateByReplyTxt<Kv>("0");
+        });
+
+        var callNo = DateTime.Now.ToString("yyyyMMddhhmmss") + "Flow";
+        var inDto = _fixture.Build<CallNative>()
+            .With(m => m.Id, Ulid.NewUlid().ToString())
+            .With(m => m.CallNo, callNo)
+            .With(m => m.Direction, ECallDirection.In)
+            .With(m => m.IsDeleted, false)
+            .Create();
+        await _callNativeRepository.AddAsync(inDto);
+
+        _systemLogRepository.Add("回访外呼已经接通", "", new CallRemarkDto { CallId = callNo,  CallNumber = inDto.ToNo }.ToJson(), "", 1, visit.Id);
+        var visitDto = new VisitDto
+        { 
+            Id = visit.Id,
+            IsPutThrough = true,
+            VisitDetails = visitDetail
+        };
+
+        await _orderController.Visit(visitDto);
+    }
+
     /// <summary>
     /// 创建工单并派送给派单员
     /// </summary>

+ 25 - 22
src/Hotline.Application/CallCenter/DefaultCallApplication.cs

@@ -331,28 +331,6 @@ public abstract class DefaultCallApplication : ICallApplication
         return callOrder.CallId;
     }
 
-    /// <summary>
-    /// 发送延迟消息让回访去关联通话记录
-    /// </summary>
-    /// <param name="cancellationToken"></param>
-    /// <returns></returns>
-    public virtual async Task PublishVisitRelevanceCallIdAsync(OrderRelevanceCallIdDto dto, CancellationToken cancellationToken)
-    {
-        if (dto.CallId.IsNullOrEmpty()) return;
-
-        var seconds = _systemSettingCacheManager.VisitCallDelaySecond;
-        await _capPublisher.PublishDelayAsync(TimeSpan.FromSeconds(seconds), EventNames.VisitCallDelay, dto, cancellationToken: cancellationToken);
-    }
-
-    public virtual async Task PublishOrderRelevanceCallIdAsync(OrderRelevanceCallIdDto dto, CancellationToken cancellationToken)
-    {
-        if (dto.CallId.IsNullOrEmpty()) return;
-
-        var seconds = _systemSettingCacheManager.VisitCallDelaySecond;
-        await _capPublisher.PublishDelayAsync(TimeSpan.FromSeconds(seconds), EventNames.VisitCallDelay, dto, cancellationToken: cancellationToken);
-    }
-
-
     public async Task<CallidRelation> GetRelationAsync(string callNo, CancellationToken cancellation)
     {
         return await _callIdRelationRepository.GetAsync(callNo, cancellation);
@@ -466,6 +444,31 @@ public abstract class DefaultCallApplication : ICallApplication
     }
 
     /// <summary>
+    /// 发送延迟消息让回访去关联通话记录
+    /// 如果前端入参中的CallId为空, 就根据回访Id在systemLog中查询.前端在回访界面点击"回访"按钮拨号时会在systemLog中保存回访的号码,callNo,回访Id;
+    /// 通过systemLog修复前端没有传callId这种情况;
+    /// </summary>
+    /// <param name="cancellationToken"></param>
+    /// <returns></returns>
+    public virtual async Task<string> PublishVisitRelevanceCallIdAsync(OrderRelevanceCallIdDto dto, CancellationToken cancellationToken)
+    {
+        if (dto.CallId.IsNullOrEmpty())
+        {
+            var log = await _systemLogRepository.Queryable()
+                .Where(m => m.IpUrl == dto.Id && m.Name == "回访外呼已经接通")
+                .FirstAsync(cancellationToken);
+            if (log is null || log.Remark.IsNullOrEmpty()) return null;
+            var callRemark = log.Remark.FromJson<CallRemarkDto>();
+            dto.CallId = callRemark.CallId;
+        }
+
+        var seconds = _systemSettingCacheManager.VisitCallDelaySecond;
+        await _capPublisher.PublishDelayAsync(TimeSpan.FromSeconds(seconds), EventNames.VisitCallDelay, dto, cancellationToken: cancellationToken);
+        return dto.CallId;
+    }
+
+    /// <summary>
+    /// 处理: EventNames.VisitCallDelay 消息
     /// 保存回访详情时发送延迟消息同步通话记录
     /// 如果回访通话记录有多条, 需要关联通话时长最长的那条
     /// </summary>

+ 1 - 1
src/Hotline.Application/CallCenter/ICallApplication.cs

@@ -84,7 +84,7 @@ namespace Hotline.Application.CallCenter
         /// </summary>
         /// <param name="cancellationToken"></param>
         /// <returns></returns>
-        Task PublishVisitRelevanceCallIdAsync(OrderRelevanceCallIdDto dto, CancellationToken cancellationToken);
+        Task<string> PublishVisitRelevanceCallIdAsync(OrderRelevanceCallIdDto dto, CancellationToken cancellationToken);
 
         Task<CallidRelation> GetRelationAsync(string callNo, CancellationToken cancellation);
 

+ 2 - 2
src/Hotline.Application/CallCenter/TianRunCallApplication.cs

@@ -109,9 +109,9 @@ namespace Hotline.Application.CallCenter
             return await Task.FromResult(callNo);
         }
 
-        public override async Task PublishVisitRelevanceCallIdAsync(OrderRelevanceCallIdDto dto, CancellationToken cancellationToken)
+        public override async Task<string> PublishVisitRelevanceCallIdAsync(OrderRelevanceCallIdDto dto, CancellationToken cancellationToken)
         {
-            return;
+            return null;
         }
 
         public override async Task OrderVisitRelevanceCallIdAsync(VisitDto dto, CancellationToken cancellationToken)

+ 13 - 0
src/Hotline.Share/Dtos/CallCenter/CallDto.cs

@@ -179,4 +179,17 @@ namespace Hotline.Share.Dtos.CallCenter
         /// </summary>
         public string CallId { get; set; }
     }
+
+    public class CallRemarkDto
+    {
+        /// <summary>
+        /// 电话号码
+        /// </summary>
+        public string CallNumber { get; set; }
+
+        /// <summary>
+        /// CallNo
+        /// </summary>
+        public string CallId { get; set; }
+    }
 }