OrderScreenEndWorkflowHandler.cs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. using DotNetCore.CAP;
  2. using Hotline.FlowEngine.Notifications;
  3. using Hotline.FlowEngine.WorkflowModules;
  4. using Hotline.Orders;
  5. using Hotline.Share.Dtos.Order;
  6. using Hotline.Share.Enums.Order;
  7. using MapsterMapper;
  8. using MediatR;
  9. using Hotline.Share.Dtos;
  10. using XF.Domain.Repository;
  11. using XF.Domain.Authentications;
  12. namespace Hotline.Application.Orders.OrderScreenHandler;
  13. public class OrderScreenEndWorkflowHandler : INotificationHandler<EndWorkflowNotify>
  14. {
  15. private readonly IOrderRepository _orderRepository;
  16. private readonly ICapPublisher _capPublisher;
  17. private readonly IMapper _mapper;
  18. private readonly IRepository<OrderVisitDetail> _orderVisitedDetailRepository;
  19. private readonly IRepository<OrderScreen> _orderScreenRepository;
  20. private readonly IRepository<OrderVisit> _orderVisitRepository;
  21. private readonly ISessionContext _sessionContext;
  22. private readonly IRepository<OrderScreenDetail> _orderScreenDetailRepository;
  23. public OrderScreenEndWorkflowHandler(
  24. IOrderRepository orderRepository,
  25. ICapPublisher capPublisher,
  26. IMapper mapper,
  27. IRepository<OrderVisitDetail> orderVisitedDetailRepository,
  28. IRepository<OrderScreen> orderScreenRepository,
  29. IRepository<OrderVisit> orderVisitRepository,
  30. ISessionContext sessionContext,
  31. IRepository<OrderScreenDetail> orderScreenDetailRepository)
  32. {
  33. _orderRepository = orderRepository;
  34. _capPublisher = capPublisher;
  35. _mapper = mapper;
  36. _orderScreenRepository = orderScreenRepository;
  37. _orderVisitedDetailRepository = orderVisitedDetailRepository;
  38. _orderVisitRepository = orderVisitRepository;
  39. _sessionContext = sessionContext;
  40. _orderScreenDetailRepository = orderScreenDetailRepository;
  41. }
  42. /// <summary>Handles a notification</summary>
  43. /// <param name="notification">The notification</param>
  44. /// <param name="cancellationToken">Cancellation token</param>
  45. public async Task Handle(EndWorkflowNotify notification, CancellationToken cancellationToken)
  46. {
  47. if (notification.Workflow.ModuleCode == WorkflowModuleConsts.OrderScreen)
  48. {
  49. var workflow = notification.Workflow;
  50. //审批是否通过
  51. var isReviewPass = workflow.IsReviewPass();
  52. var screen = await _orderScreenRepository.GetAsync(workflow.ExternalId, cancellationToken);
  53. if (screen != null)
  54. {
  55. screen.Flowed(workflow.FlowedUserIds, workflow.FlowedOrgIds, workflow.HandlerUsers, workflow.HandlerOrgs);
  56. if (isReviewPass)
  57. {
  58. screen.Status = EScreenStatus.End;
  59. screen.ReplyContent = workflow.ActualOpinion;
  60. //await _orderScreenRepository.UpdateAsync(screen, cancellationToken);
  61. var visitDetail =
  62. await _orderVisitedDetailRepository.GetAsync(screen.VisitDetailId, cancellationToken);
  63. if (visitDetail != null)
  64. {
  65. if (screen.ScreenType == EOrderScreenType.Seat)
  66. {
  67. visitDetail.SeatEvaluate = ESeatEvaluate.DefaultSatisfied;
  68. await _orderVisitedDetailRepository.UpdateAsync(visitDetail, cancellationToken);
  69. }
  70. else {
  71. var screenSatisfy = new Kv() { Key = "-1", Value = "视为满意" };
  72. visitDetail.OrgProcessingResults = screenSatisfy;
  73. visitDetail.OrgNoSatisfiedReason = new List<Kv>();
  74. //visitDetail.OrgHandledAttitude = screenSatisfy;
  75. await _orderVisitedDetailRepository.UpdateAsync(visitDetail, cancellationToken);
  76. // 修改主表当前评价结果
  77. await _orderVisitRepository.Updateable().SetColumns(v => new OrderVisit() { NowEvaluate = screenSatisfy }).Where(v => v.Id == visitDetail.VisitId).ExecuteCommandAsync(cancellationToken);
  78. //获取回访信息
  79. var visit = await _orderVisitRepository.Queryable().Includes(x => x.Order)
  80. .Includes(x => x.OrderVisitDetails)
  81. .Where(x => x.Id == screen.VisitId).FirstAsync(cancellationToken);
  82. if (visit != null)
  83. {
  84. //获取回访明细
  85. var visitDe = visit.OrderVisitDetails.First(x => x.Id == screen.VisitDetailId);
  86. //推省上
  87. await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderScreenApplyed,
  88. new PublishVisitDto()
  89. {
  90. Order = _mapper.Map<OrderDto>(visit.Order),
  91. No = visit.No,
  92. VisitType = visit.VisitType,
  93. VisitName = visit.CreatorName,
  94. VisitTime = visit.VisitTime,
  95. VisitRemark = string.IsNullOrEmpty(visitDe.VisitContent) ? screenSatisfy.Value : visitDe.VisitContent,
  96. AreaCode = visit.Order.AreaCode!,
  97. SubjectResultSatifyCode = visitDe.OrgProcessingResults?.Key,
  98. FirstSatisfactionCode = visit.Order.FirstVisitResultCode!,
  99. ClientGuid = ""
  100. });
  101. //推门户
  102. await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderVisitedWeb, new PublishVisitAllDto()
  103. {
  104. Id = visit.Id,
  105. Order = _mapper.Map<OrderDto>(visit.Order),
  106. OrderVisitDetails = _mapper.Map<List<VisitDetailDto>>(visit.OrderVisitDetails),
  107. VisitName = visit.CreatorName,
  108. VisitTime = visit.VisitTime,
  109. VisitType = visit.VisitType,
  110. VisitState = visit.VisitState,
  111. PublishTime = visit.PublishTime,
  112. }, cancellationToken: cancellationToken);
  113. }
  114. }
  115. }
  116. }
  117. else
  118. {
  119. screen.Status = EScreenStatus.Refuse;
  120. screen.ReplyContent = workflow.ActualOpinion;
  121. }
  122. await _orderRepository.OrderScreenRevisionVisit(screen.VisitId, true, cancellationToken);
  123. screen.NewestAuditTime = DateTime.Now;
  124. await _orderScreenRepository.UpdateAsync(screen, cancellationToken);
  125. OrderScreenDetail detail = new OrderScreenDetail
  126. {
  127. ScreenId = screen.Id
  128. };
  129. detail.Audit(_sessionContext.UserId, _sessionContext.UserName, _sessionContext.OrgId, _sessionContext.OrgName, 1);
  130. await _orderScreenDetailRepository.AddAsync(detail, cancellationToken);
  131. }
  132. }
  133. }
  134. }