WorkflowPreviousHandler.cs 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. using DotNetCore.CAP;
  2. using Hotline.FlowEngine.Notifications;
  3. using Hotline.FlowEngine.WorkflowModules;
  4. using Hotline.FlowEngine.Workflows;
  5. using Hotline.Orders;
  6. using Hotline.Push.Notifies;
  7. using Hotline.Settings.TimeLimits;
  8. using Hotline.Share.Dtos.Order;
  9. using Hotline.Share.Dtos.Push;
  10. using Hotline.Share.Enums.FlowEngine;
  11. using Hotline.Share.Enums.Order;
  12. using Hotline.Share.Enums.Push;
  13. using Hotline.Users;
  14. using MapsterMapper;
  15. using MediatR;
  16. using Microsoft.AspNetCore.Http;
  17. using Microsoft.Extensions.Logging;
  18. using XF.Domain.Repository;
  19. namespace Hotline.Application.Handlers.FlowEngine
  20. {
  21. public class WorkflowPreviousHandler : INotificationHandler<PreviousNotify>
  22. {
  23. private readonly IOrderDomainService _orderDomainService;
  24. private readonly IOrderRepository _orderRepository;
  25. private readonly IOrderScreenRepository _orderScreenRepository;
  26. private readonly IOrderDelayRepository _orderDelayRepository;
  27. private readonly IWorkflowDomainService _workflowDomainService;
  28. private readonly ITimeLimitDomainService _timeLimitDomainService;
  29. private readonly ICapPublisher _capPublisher;
  30. private readonly IMapper _mapper;
  31. private readonly ILogger<WorkflowPreviousHandler> _logger;
  32. private readonly IRepository<User> _userRepository;
  33. private readonly IMediator _mediator;
  34. public WorkflowPreviousHandler(
  35. IOrderDomainService orderDomainService,
  36. IOrderRepository orderRepository,
  37. IOrderScreenRepository orderScreenRepository,
  38. IOrderDelayRepository orderDelayRepository,
  39. IWorkflowDomainService workflowDomainService,
  40. ITimeLimitDomainService timeLimitDomainService,
  41. ICapPublisher capPublisher,
  42. IMapper mapper,
  43. ILogger<WorkflowPreviousHandler> logger,
  44. IRepository<User> userRepository,
  45. IMediator mediator
  46. )
  47. {
  48. _orderDomainService = orderDomainService;
  49. _orderRepository = orderRepository;
  50. _workflowDomainService = workflowDomainService;
  51. _timeLimitDomainService = timeLimitDomainService;
  52. _capPublisher = capPublisher;
  53. _mapper = mapper;
  54. _logger = logger;
  55. _userRepository = userRepository;
  56. _mediator = mediator;
  57. _orderScreenRepository = orderScreenRepository;
  58. _orderDelayRepository = orderDelayRepository;
  59. }
  60. /// <summary>Handles a notification</summary>
  61. /// <param name="notification">The notification</param>
  62. /// <param name="cancellationToken">Cancellation token</param>
  63. public async Task Handle(PreviousNotify notification, CancellationToken cancellationToken)
  64. {
  65. var workflow = notification.Workflow;
  66. var data = notification.Dto;
  67. switch (workflow.ModuleCode)
  68. {
  69. case WorkflowModuleConsts.OrderHandle:
  70. var order = await _orderDomainService.GetOrderAsync(workflow.ExternalId, withHotspot: true, withAcceptor: true,
  71. withExtension: true, cancellationToken: cancellationToken);
  72. order.CheckIfFiled();
  73. _mapper.Map(workflow, order);
  74. if (notification.TargetStep.StepType is EStepType.Start)
  75. {
  76. order.Status = EOrderStatus.BackToUnAccept;
  77. order.BackToUnsign();
  78. }
  79. await _orderRepository.UpdateAsync(order, cancellationToken);
  80. //if (notification.IsOrgToCenter)
  81. //{
  82. // var expiredTimeConfig = _timeLimitDomainService.CalcExpiredTime(DateTime.Now, EFlowDirection.OrgToCenter, order.AcceptTypeCode);
  83. // await _workflowDomainService.UpdateExpiredTimeAsync(workflow, expiredTimeConfig.ExpiredTime,
  84. // expiredTimeConfig.TimeText, expiredTimeConfig.Count, expiredTimeConfig.TimeType, expiredTimeConfig.NearlyExpiredTime, cancellationToken);
  85. // var dto = _mapper.Map<OrderDto>(order);
  86. // await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderExpiredTimeUpdate, dto, cancellationToken: cancellationToken);
  87. // //try
  88. // //{
  89. // // await _provinceService.HotlineOrderFlowRecalled(dto, cancellationToken);
  90. // //}
  91. // //catch (Exception e)
  92. // //{
  93. // // _logger.LogError("_provinceService.HotlineOrderFlowRecalled throw exception: {ex}",
  94. // // e.Message);
  95. // //}
  96. //}
  97. if (notification.Dto.AcceptSms)
  98. {
  99. var targetStep = notification.TargetStep;
  100. switch (targetStep.HandlerType)
  101. {
  102. case EHandlerType.Role:
  103. case EHandlerType.AssignedUser:
  104. var users = await _userRepository.Queryable()
  105. .Where(d => targetStep.Handlers.Select(x => x.Key).Contains(d.Id))
  106. .ToListAsync(cancellationToken);
  107. foreach (var user in users)
  108. {
  109. if (!string.IsNullOrEmpty(user.PhoneNo))
  110. {
  111. var messageDto = new MessageDto()
  112. {
  113. PushBusiness = EPushBusiness.OrderSendBack,
  114. ExternalId = order.Id,
  115. OrderId = order.Id,
  116. PushPlatform = EPushPlatform.Sms,
  117. Remark = order.Title,
  118. Name = user.PhoneNo,
  119. TemplateCode = "1004",
  120. Params = new List<string>() { order.No },
  121. TelNumber = user.PhoneNo,
  122. };
  123. await _mediator.Publish(new PushMessageNotify(messageDto), cancellationToken);
  124. }
  125. }
  126. break;
  127. case EHandlerType.OrgLevel:
  128. case EHandlerType.OrgType:
  129. case EHandlerType.AssignedOrg:
  130. //todo 部门经办人联系方式
  131. break;
  132. default:
  133. throw new ArgumentOutOfRangeException();
  134. }
  135. }
  136. break;
  137. case WorkflowModuleConsts.OrderDelay:
  138. var delay = await _orderDelayRepository.GetAsync(workflow.ExternalId, cancellationToken);
  139. if (delay != null)
  140. {
  141. delay.Flowed(workflow.FlowedUserIds, workflow.FlowedOrgIds, workflow.HandlerUsers, workflow.HandlerOrgs);
  142. await _orderDelayRepository.UpdateAsync(delay, cancellationToken);
  143. }
  144. break;
  145. case WorkflowModuleConsts.OrderScreen:
  146. var screen = await _orderScreenRepository.GetAsync(workflow.ExternalId, cancellationToken);
  147. if (screen != null)
  148. {
  149. screen.Flowed(workflow.FlowedUserIds, workflow.FlowedOrgIds, workflow.HandlerUsers, workflow.HandlerOrgs);
  150. await _orderScreenRepository.UpdateAsync(screen, cancellationToken);
  151. }
  152. break;
  153. case WorkflowModuleConsts.KnowledgeAdd:
  154. case WorkflowModuleConsts.KnowledgeUpdate:
  155. case WorkflowModuleConsts.KnowledgeDelete:
  156. case WorkflowModuleConsts.TelRestApply:
  157. break;
  158. }
  159. }
  160. }
  161. }