Ver código fonte

Merge branch 'end_recall_startcs' into test

xf 5 meses atrás
pai
commit
bee571f7e7

+ 37 - 2
src/Hotline.Api/Controllers/TestController.cs

@@ -1,4 +1,5 @@
-using DotNetCore.CAP;
+using DocumentFormat.OpenXml.Drawing.Charts;
+using DotNetCore.CAP;
 using Hotline.Ai.Visit;
 using Hotline.Application.CallCenter;
 using Hotline.Application.ExportExcel;
@@ -26,6 +27,7 @@ using Hotline.JudicialManagement;
 using Hotline.Orders;
 using Hotline.Realtimes;
 using Hotline.Repository.SqlSugar;
+using Hotline.Repository.SqlSugar.CallCenter;
 using Hotline.Repository.SqlSugar.Ts;
 using Hotline.Settings;
 using Hotline.Settings.Hotspots;
@@ -43,6 +45,7 @@ using Hotline.Share.Enums.Order;
 using Hotline.Share.Enums.Quality;
 using Hotline.Share.Mq;
 using Hotline.Users;
+using Mapster;
 using MapsterMapper;
 using MediatR;
 using Microsoft.AspNetCore.Authorization;
@@ -53,6 +56,7 @@ using MiniExcelLibs;
 using Newtonsoft.Json;
 using SqlSugar;
 using StackExchange.Redis;
+using System.Threading;
 using XC.RSAUtil;
 using XF.Domain.Authentications;
 using XF.Domain.Cache;
@@ -129,6 +133,7 @@ public class TestController : BaseController
     //private readonly ITypedCache<List<User>> _cache;
     //private readonly ICacheManager<User> _cache;
     private readonly ICalcExpireTime _expireTime;
+    private readonly ICallNativeRepository _callNativeRepository;
 
 
     public TestController(
@@ -181,7 +186,8 @@ ICallApplication callApplication,
         IOptionsSnapshot<AppConfiguration> appOptions,
         ISystemSettingCacheManager systemSettingCacheManager,
         ICalcExpireTime expireTime
-        )
+,
+        ICallNativeRepository callNativeRepository)
     {
         _logger = logger;
         //_authorizeGenerator = authorizeGenerator;
@@ -230,6 +236,7 @@ ICallApplication callApplication,
         _appOptions = appOptions;
         _systemSettingCacheManager = systemSettingCacheManager;
         _expireTime = expireTime;
+        _callNativeRepository = callNativeRepository;
     }
 
 
@@ -1039,4 +1046,32 @@ ICallApplication callApplication,
         _capPublisher.PublishDelay(ExpiredTime - DateTime.Now.AddHours(1), EventNames.HotlineOrderAutomaticDelay, new PublishAutomaticDelayDto() { OrderId = orderId });
     }
 
+
+    /// <summary>
+    /// 根据省编号修复工单和通话记录
+    /// </summary>
+    /// <param name="ProvinceNos">省编号</param>
+    /// <returns></returns>
+    [HttpPost("push_order_call")]
+    [AllowAnonymous]
+    public async Task PushOrderCallAsync([FromBody]List<string> ProvinceNos)
+    {
+        var orders = await _orderRepository.Queryable()
+            .Where(m => ProvinceNos.Contains(m.ProvinceNo))
+            .ToListAsync();
+        foreach (var order in orders)
+        {
+            var call = await _callNativeRepository.Queryable()
+                .Where(m => m.Id == order.CallId)
+                .FirstAsync();
+            if (call == null) continue;
+            var orderDto = order.Adapt<OrderDto>();
+            await _capPublisher.PublishAsync(EventNames.HotlineCallConnectWithOrder, new PublishCallRecrodDto()
+            {
+                Order = orderDto,
+                TrCallRecordDto = call.Adapt<TrCallDto>()
+            }, cancellationToken: HttpContext.RequestAborted);
+        }
+    }
+
 }

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

@@ -107,6 +107,7 @@ public class OrderControllerTest : TestBase
             .With(m => m.Id, Ulid.NewUlid().ToString())
             .With(m => m.Direction, ECallDirection.Out)
             .With(m => m.CallNo, callNo)
+            .With(m => m.AudioFile, string.Empty)
             .Create();
         await _callNativeRepository.AddAsync(inDto2);
         var callOrder = new CallidRelation

+ 6 - 1
src/Hotline.Application.Tests/Mock/OrderServiceMock.cs

@@ -40,7 +40,12 @@ public class OrderServiceMock
     {
         var json = "{\"sourceChannel\":\"因特网\",\"sourceChannelCode\":\"YTW\",\"transferPhone\":null,\"fromPhone\":null,\"acceptorName\":\"单元测试\",\"acceptorStaffNo\":\"\",\"fromName\":\"1233333333\",\"fromGender\":1,\"identityType\":1,\"licenceType\":null,\"licenceTypeCode\":null,\"licenceNo\":null,\"ageRange\":null,\"ageRangeCode\":null,\"contact\":\"12333333333\",\"isSecret\":false,\"acceptSms\":false,\"no\":null,\"title\":\"\",\"hotspotId\":\"1912\",\"eventCategoryId\":null,\"incidentTime\":null,\"incidentPurpose\":null,\"areaCode\":\"519800\",\"city\":\"省内\",\"street\":null,\"isRepeat\":\"false\",\"pushType\":null,\"pushTypeCode\":null,\"content\":\"单元测试内容\",\"duplicateIds\":[],\"duplicateTitle\":null,\"callAddress\":null,\"repeatableEventDetails\":[],\"orderExtension\":null,\"transpond\":false,\"isEnforcementOrder\":false,\"focusOnEventsArr\":[],\"focusOnEvents\":null,\"isFormalistWorkOrder\":false,\"isSensitiveWorkOrders\":false,\"isUrgent\":false,\"isThreePartyConference\":false,\"is24HoursComplete\":false,\"company\":null,\"orderPushTypes\":[],\"acceptType\":\"咨询\",\"acceptTypeCode\":\"10\",\"files\":[],\"hotspotSpliceName\":\"互联互通-转接乐山市12345\",\"hotspotName\":\"转接乐山市12345\",\"hotspotCode\":\"1912\",\"hotspotExternal\":\"19\",\"county\":\"\",\"town\":\"\"}";
         AddOrderDto = json.FromJson<AddOrderDto>();
-        if (callId.NotNullOrEmpty()) AddOrderDto.CallId = callId;
+        if (callId.NotNullOrEmpty())
+        {
+            AddOrderDto.CallId = callId;
+            AddOrderDto.SourceChannel = "电话";
+            AddOrderDto.SourceChannelCode = AppDefaults.SourceChannel.DianHua;
+        }
         AddOrderDto.Title = "单元测试" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss");
         CreateOrderOutDto = _orderController.Add(AddOrderDto).GetAwaiter().GetResult().ToJson().FromJson<CreateOrderOutDto>();
         return this;

+ 10 - 5
src/Hotline.Application/FlowEngine/WorkflowApplication.cs

@@ -652,7 +652,9 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
                     var nextStepOption = await GetDynamicStepAsync(currentStep.CountersignPolicy.Value,
                         EStepType.Normal, currentStep.BusinessType, cancellationToken);
 
-                    dto.Steps = new List<NextStepOption> { nextStepOption, countersignEndOption };
+                    dto.Steps = new List<NextStepOption> { nextStepOption };
+                    if(countersignEndOption!= null)
+                        dto.Steps.Add(countersignEndOption);
                     return dto;
                 }
             }
@@ -664,7 +666,9 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
                 var nextStepOption =
                     await GetDynamicStepAsync(currentStep.CountersignPolicy.Value,
                         EStepType.Normal, currentStep.BusinessType, cancellationToken);
-                dto.Steps = new List<NextStepOption> { nextStepOption, countersignEndOption };
+                dto.Steps = new List<NextStepOption> { nextStepOption };
+                if (countersignEndOption != null)
+                    dto.Steps.Add(countersignEndOption);
                 return dto;
             }
         }
@@ -1039,11 +1043,12 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         };
     }
 
-    private NextStepOption GetCsEndStepByTargetPrev(List<WorkflowStep> steps, WorkflowStep step)
+    private NextStepOption? GetCsEndStepByTargetPrev(List<WorkflowStep> steps, WorkflowStep step)
     {
         var prevStep = steps.FirstOrDefault(d => d.Id == step.PrevStepId);
-        if (prevStep is null)
-            throw new UserFriendlyException("未查找到会签上级节点");
+        //归档以后特提发起会签场景
+        if (prevStep is null || !prevStep.IsStartCountersign) return null;
+            
         var text = prevStep.HandlerOrgIsCenter.Value
             ? "热线中心会签汇总"
             : $"{prevStep.HandlerOrgId.CalcOrgLevel().ToChinese()}级部门会签汇总";

+ 20 - 9
src/Hotline.Application/Handlers/FlowEngine/WorkflowStartHandler.cs

@@ -13,9 +13,11 @@ using Hotline.Settings;
 using Hotline.Share.Dtos.FlowEngine.Workflow;
 using Hotline.Share.Dtos.Order;
 using Hotline.Share.Dtos.TrCallCenter;
+using Hotline.Share.Enums.CallCenter;
 using Hotline.Share.Enums.Push;
 using Hotline.Share.Enums.Quality;
 using Hotline.Share.Mq;
+using Hotline.Share.Tools;
 using Hotline.Users;
 using MapsterMapper;
 using MediatR;
@@ -44,7 +46,7 @@ namespace Hotline.Application.Handlers.FlowEngine
         private readonly ISystemSettingCacheManager _systemSettingCacheManager;
         private readonly IRepository<OrderTerminate> _orderTerminateRepository;
 
-		public WorkflowStartHandler(
+        public WorkflowStartHandler(
             IOrderDomainService orderDomainService,
             IKnowledgeDomainService knowledgeDomainService,
             IOrderRepository orderRepository,
@@ -59,7 +61,7 @@ namespace Hotline.Application.Handlers.FlowEngine
             IMediator mediator,
             ISystemSettingCacheManager systemSettingCacheManager,
             IRepository<OrderTerminate> orderTerminateRepository
-		)
+        )
         {
             _orderDomainService = orderDomainService;
             _knowledgeDomainService = knowledgeDomainService;
@@ -76,7 +78,7 @@ namespace Hotline.Application.Handlers.FlowEngine
             _mediator = mediator;
             _systemSettingCacheManager = systemSettingCacheManager;
             _orderTerminateRepository = orderTerminateRepository;
-		}
+        }
 
         /// <summary>Handles a notification</summary>
         /// <param name="notification">The notification</param>
@@ -128,7 +130,16 @@ namespace Hotline.Application.Handlers.FlowEngine
                             {
                                 var call = await _callApplication.GetCallAsync(order?.CallId, cancellationToken);
                                 if (call is not null)
+                                {
                                     publishCallRecordDto.TrCallRecordDto = _mapper.Map<TrCallDto>(call);
+
+                                    // 工单开始办理如果获取的通话记录是呼出并且录音文件是空就不推送通话记录
+                                    // 如果 通话记录是呼入, 并且没有录音文件
+                                    if (_systemSettingCacheManager.OrderStartHandlerPushCallIsNull && call.Direction == ECallDirection.Out && call.AudioFile.IsNullOrEmpty())
+                                    {
+                                        publishCallRecordDto.TrCallRecordDto = null;
+                                    }
+                                }
                             }
                         }
 
@@ -216,7 +227,7 @@ namespace Hotline.Application.Handlers.FlowEngine
                     case WorkflowModuleConsts.KnowledgeUpdate:
                     case WorkflowModuleConsts.KnowledgeDelete:
                     case WorkflowModuleConsts.KnowledgeOffshelf:
-						await _knowledgeDomainService.UpdateWorkFlowId(workflow.ExternalId, workflow.Id,
+                        await _knowledgeDomainService.UpdateWorkFlowId(workflow.ExternalId, workflow.Id,
                             workflow.HandlerUsers, workflow.HandlerOrgs, workflow.FlowedUserIds, workflow.FlowedOrgIds,
                             cancellationToken);
                         break;
@@ -244,15 +255,15 @@ namespace Hotline.Application.Handlers.FlowEngine
                         break;
                     case WorkflowModuleConsts.OrderTerminate:
                         var orderTerminate = await _orderTerminateRepository.Queryable()
-	                        .Where(x => x.Id == workflow.ExternalId).FirstAsync(cancellationToken);
+                            .Where(x => x.Id == workflow.ExternalId).FirstAsync(cancellationToken);
                         if (orderTerminate != null)
                         {
-	                        orderTerminate.WorkflowId = workflow.Id;
-							orderTerminate.Status = ETerminateStatus.Approval;
+                            orderTerminate.WorkflowId = workflow.Id;
+                            orderTerminate.Status = ETerminateStatus.Approval;
                             await _orderTerminateRepository.UpdateAsync(orderTerminate, cancellationToken);
-						}
+                        }
                         break;
-				}
+                }
 
             }
             catch (Exception e)

+ 5 - 0
src/Hotline/Caching/Interfaces/ISystemSettingCacheManager.cs

@@ -48,5 +48,10 @@ namespace Hotline.Caching.Interfaces
         /// 即将超期列表调用方法的版本(有优化办法和老版本)
         /// </summary>
         int GetAboutToExpireVersion { get; }
+
+        /// <summary>
+        /// 工单开始办理如果获取的通话记录是呼出并且录音文件是空就不推送通话记录
+        /// </summary>
+        bool OrderStartHandlerPushCallIsNull { get; }
     }
 }

+ 6 - 0
src/Hotline/Caching/Services/SystemSettingCacheManager.cs

@@ -174,5 +174,11 @@ namespace Hotline.Caching.Services
         public int GetAboutToExpireVersion => 
             GetOrDefault("08dc39bd-0ead-477c-87bc-97252dd8fb26", SettingConstants.GetAboutToExpireVersion, "前调用后端超期列表时后端控制调用优化的代码还是老代码", 0, "前调用后端超期列表时后端控制调用优化的代码还是老代码, 目前只有一个优化版本. 该值为 1 调用优化过的代码.");
 
+        /// <summary>
+        /// 工单开始办理如果获取的通话记录是呼出并且录音文件是空就不推送通话记录
+        /// </summary>
+        public bool OrderStartHandlerPushCallIsNull =>
+    GetOrDefault("08dc9a54-d6ea-4757-8934-daff80efb86e", SettingConstants.OrderStartHandlerPushCallIsNull, "工单开始办理如果获取的通话记录是呼出并且录音文件是空就不推送通话记录", false, "工单开始办理如果获取的通话记录是呼出并且录音文件是空就不推送通话记录. true 不推通话记录, false 老逻辑继续推送");
+
     }
 }

+ 5 - 0
src/Hotline/Settings/SettingConstants.cs

@@ -622,5 +622,10 @@ namespace Hotline.Settings
         /// 即将超期列表调用方法的版本(有优化办法和老版本)
         /// </summary>
         public const string GetAboutToExpireVersion = "GetAboutToExpireVersion";
+
+        /// <summary>
+        /// 工单开始办理如果获取的通话记录是呼出并且录音文件是空就不推送通话记录
+        /// </summary>
+        public const string OrderStartHandlerPushCallIsNull = "OrderStartHandlerPushCallIsNull";
     }
 }