WorkflowPreviousHandler.cs 9.2 KB

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