WorkflowStartHandler.cs 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. using DotNetCore.CAP;
  2. using Hotline.Application.Quality;
  3. using Hotline.CallCenter.Calls;
  4. using Hotline.CallCenter.Tels;
  5. using Hotline.FlowEngine.Notifications;
  6. using Hotline.FlowEngine.WorkflowModules;
  7. using Hotline.KnowledgeBase;
  8. using Hotline.Orders;
  9. using Hotline.Share.Dtos.FlowEngine.Workflow;
  10. using Hotline.Share.Dtos.Order;
  11. using Hotline.Share.Dtos.TrCallCenter;
  12. using Hotline.Share.Enums.Quality;
  13. using Hotline.Share.Mq;
  14. using MapsterMapper;
  15. using MediatR;
  16. using Microsoft.Extensions.Logging;
  17. using XF.Domain.Repository;
  18. namespace Hotline.Application.Handlers.FlowEngine
  19. {
  20. public class WorkflowStartHandler : INotificationHandler<StartWorkflowNotify>
  21. {
  22. private readonly IOrderDomainService _orderDomainService;
  23. private readonly IKnowledgeDomainService _knowledgeDomainService;
  24. private readonly ITelDomainService _telDomainService;
  25. private readonly IOrderRepository _orderRepository;
  26. private readonly ICapPublisher _capPublisher;
  27. private readonly IMapper _mapper;
  28. private readonly ILogger<WorkflowStartHandler> _logger;
  29. private readonly IQualityApplication _qualityApplication;
  30. private readonly IRepository<TrCallRecord> _trCallRecordRepository;
  31. private readonly IOrderScreenRepository _orderScreenRepository;
  32. private readonly IOrderDelayRepository _orderDelayRepository;
  33. public WorkflowStartHandler(
  34. IOrderDomainService orderDomainService,
  35. IKnowledgeDomainService knowledgeDomainService,
  36. ITelDomainService telDomainService,
  37. IOrderRepository orderRepository,
  38. ICapPublisher capPublisher,
  39. IQualityApplication qualityApplication,
  40. IMapper mapper,
  41. ILogger<WorkflowStartHandler> logger,
  42. IRepository<TrCallRecord> trCallRecordRepository,
  43. IOrderScreenRepository orderScreenRepository,
  44. IOrderDelayRepository orderDelayRepository
  45. )
  46. {
  47. _orderDomainService = orderDomainService;
  48. _knowledgeDomainService = knowledgeDomainService;
  49. _telDomainService = telDomainService;
  50. _orderRepository = orderRepository;
  51. _capPublisher = capPublisher;
  52. _qualityApplication = qualityApplication;
  53. _mapper = mapper;
  54. _logger = logger;
  55. _trCallRecordRepository = trCallRecordRepository;
  56. _orderScreenRepository = orderScreenRepository;
  57. _orderDelayRepository = orderDelayRepository;
  58. }
  59. /// <summary>Handles a notification</summary>
  60. /// <param name="notification">The notification</param>
  61. /// <param name="cancellationToken">Cancellation token</param>
  62. public async Task Handle(StartWorkflowNotify notification, CancellationToken cancellationToken)
  63. {
  64. //基础拉丁字母和中日韩统一表意文字的基础Unicode 块(U+4E00-U+9FCC)。 基本涵盖了除使用西里尔字母以外所有西方国家的文字和亚洲中日韩越的文字
  65. _logger.LogInformation(
  66. //$"收到{nameof(StartWorkflowNotify)}, notification: {JsonSerializer.Serialize(notification, new JsonSerializerOptions { Encoder = JavaScriptEncoder.Create(UnicodeRanges.BasicLatin, UnicodeRanges.CjkUnifiedIdeographs) })}");
  67. $"收到{nameof(StartWorkflowNotify)}, workflowId: {notification.Workflow.Id}");
  68. var workflow = notification.Workflow;
  69. var data = notification.Dto;
  70. switch (workflow.ModuleCode)
  71. {
  72. case WorkflowModuleConsts.OrderHandle:
  73. var order = await _orderDomainService.GetOrderAsync(workflow.ExternalId, withHotspot: true, withAcceptor: true,
  74. withExtension: true, cancellationToken);
  75. order.CheckIfFiled();
  76. order.StartManageFlow();
  77. _mapper.Map(workflow, order);
  78. await _orderRepository.UpdateAsync(order, cancellationToken);
  79. var publishCallRecordDto = new PublishCallRecrodDto() { };
  80. //查询通话记录
  81. var callRecord = await _trCallRecordRepository.GetAsync(p => p.CallAccept == order.CallId, cancellationToken);
  82. if (callRecord != null)
  83. {
  84. publishCallRecordDto.TrCallRecordDto = _mapper.Map<TrCallDto>(callRecord);
  85. }
  86. publishCallRecordDto.Order = _mapper.Map<OrderDto>(order);
  87. publishCallRecordDto.WorkflowTrace = _mapper.Map<WorkflowTraceDto>(notification.Trace);
  88. await _capPublisher.PublishAsync(EventNames.HotlineOrderFlowStarted, publishCallRecordDto,
  89. cancellationToken: cancellationToken);
  90. try
  91. {
  92. if (notification.Dto.IsSms)
  93. {
  94. //TODO
  95. }
  96. }
  97. catch{}
  98. //写入质检
  99. await _qualityApplication.AddQualityAsync(EQualitySource.Accepted, order.Id, cancellationToken);
  100. break;
  101. case WorkflowModuleConsts.KnowledgeAdd:
  102. case WorkflowModuleConsts.KnowledgeUpdate:
  103. case WorkflowModuleConsts.KnowledgeDelete:
  104. await _knowledgeDomainService.UpdateWorkFlowId(workflow.ExternalId, workflow.Id,
  105. workflow.HandlerUsers, workflow.HandlerOrgs, workflow.FlowedUserIds, workflow.FlowedOrgIds,
  106. cancellationToken);
  107. break;
  108. case WorkflowModuleConsts.OrderScreen:
  109. var screen = await _orderScreenRepository.Queryable().Includes(x => x.Order)
  110. .Where(x => x.Id == workflow.ExternalId).FirstAsync(cancellationToken);
  111. if (screen != null)
  112. {
  113. screen.WorkflowId = workflow.Id;
  114. screen.Flowed(workflow.FlowedUserIds, workflow.FlowedOrgIds, workflow.HandlerUsers, workflow.HandlerOrgs);
  115. await _orderScreenRepository.UpdateAsync(screen, cancellationToken);
  116. }
  117. break;
  118. case WorkflowModuleConsts.OrderDelay:
  119. var orderDelay = await _orderDelayRepository.Queryable()
  120. .Where(x => x.Id == workflow.ExternalId).FirstAsync(cancellationToken);
  121. if (orderDelay != null)
  122. {
  123. orderDelay.WorkflowId = workflow.Id;
  124. orderDelay.Flowed(workflow.FlowedUserIds, workflow.FlowedOrgIds, workflow.HandlerUsers, workflow.HandlerOrgs);
  125. await _orderDelayRepository.UpdateAsync(orderDelay, cancellationToken);
  126. }
  127. break;
  128. }
  129. }
  130. }
  131. }