OrderScreenEndWorkflowHandler.cs 7.8 KB

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