WorkflowStartHandler.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  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.Push.Notifies;
  10. using Hotline.Share.Dtos.FlowEngine.Workflow;
  11. using Hotline.Share.Dtos.Order;
  12. using Hotline.Share.Dtos.TrCallCenter;
  13. using Hotline.Share.Enums.Push;
  14. using Hotline.Share.Enums.Quality;
  15. using Hotline.Share.Mq;
  16. using Hotline.Users;
  17. using MapsterMapper;
  18. using MediatR;
  19. using Microsoft.AspNetCore.Http;
  20. using Microsoft.Extensions.Logging;
  21. using XF.Domain.Entities;
  22. using XF.Domain.Repository;
  23. namespace Hotline.Application.Handlers.FlowEngine
  24. {
  25. public class WorkflowStartHandler : INotificationHandler<StartWorkflowNotify>
  26. {
  27. private readonly IOrderDomainService _orderDomainService;
  28. private readonly IKnowledgeDomainService _knowledgeDomainService;
  29. private readonly ITelDomainService _telDomainService;
  30. private readonly IOrderRepository _orderRepository;
  31. private readonly ICapPublisher _capPublisher;
  32. private readonly IMapper _mapper;
  33. private readonly ILogger<WorkflowStartHandler> _logger;
  34. private readonly IQualityApplication _qualityApplication;
  35. private readonly IRepository<TrCallRecord> _trCallRecordRepository;
  36. private readonly IOrderScreenRepository _orderScreenRepository;
  37. private readonly IOrderDelayRepository _orderDelayRepository;
  38. private readonly IRepository<User> _userRepository;
  39. private readonly IMediator _mediator;
  40. public WorkflowStartHandler(
  41. IOrderDomainService orderDomainService,
  42. IKnowledgeDomainService knowledgeDomainService,
  43. ITelDomainService telDomainService,
  44. IOrderRepository orderRepository,
  45. ICapPublisher capPublisher,
  46. IQualityApplication qualityApplication,
  47. IMapper mapper,
  48. ILogger<WorkflowStartHandler> logger,
  49. IRepository<TrCallRecord> trCallRecordRepository,
  50. IOrderScreenRepository orderScreenRepository,
  51. IOrderDelayRepository orderDelayRepository,
  52. IRepository<User> userRepository,
  53. IMediator mediator
  54. )
  55. {
  56. _orderDomainService = orderDomainService;
  57. _knowledgeDomainService = knowledgeDomainService;
  58. _telDomainService = telDomainService;
  59. _orderRepository = orderRepository;
  60. _capPublisher = capPublisher;
  61. _qualityApplication = qualityApplication;
  62. _mapper = mapper;
  63. _logger = logger;
  64. _trCallRecordRepository = trCallRecordRepository;
  65. _orderScreenRepository = orderScreenRepository;
  66. _orderDelayRepository = orderDelayRepository;
  67. _userRepository = userRepository;
  68. _mediator = mediator;
  69. }
  70. /// <summary>Handles a notification</summary>
  71. /// <param name="notification">The notification</param>
  72. /// <param name="cancellationToken">Cancellation token</param>
  73. public async Task Handle(StartWorkflowNotify notification, CancellationToken cancellationToken)
  74. {
  75. //基础拉丁字母和中日韩统一表意文字的基础Unicode 块(U+4E00-U+9FCC)。 基本涵盖了除使用西里尔字母以外所有西方国家的文字和亚洲中日韩越的文字
  76. _logger.LogInformation(
  77. //$"收到{nameof(StartWorkflowNotify)}, notification: {JsonSerializer.Serialize(notification, new JsonSerializerOptions { Encoder = JavaScriptEncoder.Create(UnicodeRanges.BasicLatin, UnicodeRanges.CjkUnifiedIdeographs) })}");
  78. $"收到{nameof(StartWorkflowNotify)}, workflowId: {notification.Workflow.Id}");
  79. var workflow = notification.Workflow;
  80. var data = notification.Dto;
  81. switch (workflow.ModuleCode)
  82. {
  83. case WorkflowModuleConsts.OrderHandle:
  84. var order = await _orderDomainService.GetOrderAsync(workflow.ExternalId, withHotspot: true, withAcceptor: true,
  85. withExtension: true, cancellationToken);
  86. order.CheckIfFiled();
  87. order.StartManageFlow();
  88. _mapper.Map(workflow, order);
  89. await _orderRepository.UpdateAsync(order, cancellationToken);
  90. var publishCallRecordDto = new PublishCallRecrodDto() { };
  91. //查询通话记录
  92. //var callRecord = await _trCallRecordRepository.GetAsync(p => p.CallAccept == order.CallId, cancellationToken); //由CallAccept改为OtherAccept
  93. var callRecord = await _trCallRecordRepository.GetAsync(p => p.OtherAccept == order.CallId, cancellationToken);
  94. if (callRecord != null)
  95. {
  96. publishCallRecordDto.TrCallRecordDto = _mapper.Map<TrCallDto>(callRecord);
  97. }
  98. publishCallRecordDto.Order = _mapper.Map<OrderDto>(order);
  99. publishCallRecordDto.WorkflowTrace = _mapper.Map<WorkflowTraceDto>(notification.Trace);
  100. await _capPublisher.PublishAsync(EventNames.HotlineOrderFlowStarted, publishCallRecordDto,
  101. cancellationToken: cancellationToken);
  102. try
  103. {
  104. if (notification.Dto.IsSms)
  105. {
  106. switch (notification.FlowAssignInfo.FlowAssignType)
  107. {
  108. case EFlowAssignType.Org:
  109. var orgCodes = notification.FlowAssignInfo.HandlerObjects.Select(x => x.Key);
  110. var orgList = await _userRepository.Queryable().Where(x => orgCodes.Contains(x.OrgId) && x.Roles.Any(d => d.Id == "08dae71e-0eca-4bc4-89fe-7eaefae8a98e")).ToListAsync();
  111. foreach (var item in orgList)
  112. {
  113. if (!string.IsNullOrEmpty(item.PhoneNo))
  114. {
  115. var messageDto = new Share.Dtos.Push.MessageDto
  116. {
  117. PushBusiness = EPushBusiness.OrderSupervise,
  118. ExternalId = order.Id,
  119. OrderId = order.Id,
  120. PushPlatform = EPushPlatform.Sms,
  121. Remark = order.Title,
  122. Name = item.Name,
  123. TemplateCode = "1007",
  124. Params = new List<string>() { order.No },
  125. TelNumber = item.PhoneNo,
  126. };
  127. await _mediator.Publish(new PushMessageNotify(messageDto), cancellationToken);
  128. }
  129. }
  130. break;
  131. case EFlowAssignType.User:
  132. var userCodes = notification.FlowAssignInfo.HandlerObjects.Select(x => x.Key);
  133. var userList = await _userRepository.Queryable().Where(x => userCodes.Contains(x.Id) && x.Roles.Any(d => d.Id == "08dae71e-0eca-4bc4-89fe-7eaefae8a98e")).ToListAsync();
  134. foreach (var item in userList)
  135. {
  136. var messageDto = new Share.Dtos.Push.MessageDto
  137. {
  138. PushBusiness = EPushBusiness.OrderSupervise,
  139. ExternalId = order.Id,
  140. OrderId = order.Id,
  141. PushPlatform = EPushPlatform.Sms,
  142. Remark = order.Title,
  143. Name = item.Name,
  144. TemplateCode = "1007",
  145. Params = new List<string>() { order.No },
  146. TelNumber = item.PhoneNo,
  147. };
  148. await _mediator.Publish(new PushMessageNotify(messageDto), cancellationToken);
  149. }
  150. break;
  151. default:
  152. break;
  153. }
  154. }
  155. }
  156. catch{}
  157. //写入质检
  158. await _qualityApplication.AddQualityAsync(EQualitySource.Accepted, order.Id, cancellationToken);
  159. break;
  160. case WorkflowModuleConsts.KnowledgeAdd:
  161. case WorkflowModuleConsts.KnowledgeUpdate:
  162. case WorkflowModuleConsts.KnowledgeDelete:
  163. await _knowledgeDomainService.UpdateWorkFlowId(workflow.ExternalId, workflow.Id,
  164. workflow.HandlerUsers, workflow.HandlerOrgs, workflow.FlowedUserIds, workflow.FlowedOrgIds,
  165. cancellationToken);
  166. break;
  167. case WorkflowModuleConsts.OrderScreen:
  168. var screen = await _orderScreenRepository.Queryable().Includes(x => x.Order)
  169. .Where(x => x.Id == workflow.ExternalId).FirstAsync(cancellationToken);
  170. if (screen != null)
  171. {
  172. screen.WorkflowId = workflow.Id;
  173. screen.Flowed(workflow.FlowedUserIds, workflow.FlowedOrgIds, workflow.HandlerUsers, workflow.HandlerOrgs);
  174. await _orderScreenRepository.UpdateAsync(screen, cancellationToken);
  175. }
  176. break;
  177. case WorkflowModuleConsts.OrderDelay:
  178. var orderDelay = await _orderDelayRepository.Queryable()
  179. .Where(x => x.Id == workflow.ExternalId).FirstAsync(cancellationToken);
  180. if (orderDelay != null)
  181. {
  182. orderDelay.WorkflowId = workflow.Id;
  183. orderDelay.Flowed(workflow.FlowedUserIds, workflow.FlowedOrgIds, workflow.HandlerUsers, workflow.HandlerOrgs);
  184. await _orderDelayRepository.UpdateAsync(orderDelay, cancellationToken);
  185. }
  186. break;
  187. }
  188. }
  189. }
  190. }