WorkflowPreviousHandler.cs 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  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. var targetStep = notification.TargetStep;
  98. switch (targetStep.HandlerType)
  99. {
  100. case EHandlerType.Role:
  101. case EHandlerType.AssignedUser:
  102. var users = await _userRepository.Queryable()
  103. .Where(d => targetStep.Handlers.Select(x => x.Key).Contains(d.Id))
  104. .ToListAsync(cancellationToken);
  105. foreach (var user in users)
  106. {
  107. if (!string.IsNullOrEmpty(user.PhoneNo))
  108. {
  109. var messageDto = new MessageDto()
  110. {
  111. PushBusiness = EPushBusiness.OrderCallback,
  112. ExternalId = order.Id,
  113. OrderId = order.Id,
  114. PushPlatform = EPushPlatform.Sms,
  115. Remark = order.Title,
  116. Name = user.PhoneNo,
  117. TemplateCode = "1004",
  118. Params = new List<string>() { order.No },
  119. TelNumber = user.PhoneNo,
  120. };
  121. await _mediator.Publish(new PushMessageNotify(messageDto), cancellationToken);
  122. }
  123. }
  124. break;
  125. case EHandlerType.OrgLevel:
  126. case EHandlerType.OrgType:
  127. case EHandlerType.AssignedOrg:
  128. //todo 部门经办人联系方式
  129. break;
  130. default:
  131. throw new ArgumentOutOfRangeException();
  132. }
  133. break;
  134. case WorkflowModuleConsts.OrderDelay:
  135. var delay = await _orderDelayRepository.GetAsync(workflow.ExternalId, cancellationToken);
  136. if (delay != null)
  137. {
  138. delay.Flowed(workflow.FlowedUserIds, workflow.FlowedOrgIds, workflow.HandlerUsers, workflow.HandlerOrgs);
  139. await _orderDelayRepository.UpdateAsync(delay, cancellationToken);
  140. }
  141. break;
  142. case WorkflowModuleConsts.OrderScreen:
  143. var screen = await _orderScreenRepository.GetAsync(workflow.ExternalId, cancellationToken);
  144. if (screen != null)
  145. {
  146. screen.Flowed(workflow.FlowedUserIds, workflow.FlowedOrgIds, workflow.HandlerUsers, workflow.HandlerOrgs);
  147. await _orderScreenRepository.UpdateAsync(screen, cancellationToken);
  148. }
  149. break;
  150. case WorkflowModuleConsts.KnowledgeAdd:
  151. case WorkflowModuleConsts.KnowledgeUpdate:
  152. case WorkflowModuleConsts.KnowledgeDelete:
  153. case WorkflowModuleConsts.TelRestApply:
  154. break;
  155. }
  156. }
  157. }
  158. }