WorkflowEndHandler.cs 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. using DotNetCore.CAP;
  2. using Hotline.Article;
  3. using Hotline.Article.Notifications;
  4. using Hotline.CallCenter.Tels;
  5. using Hotline.FlowEngine.Notifications;
  6. using Hotline.FlowEngine.WorkflowModules;
  7. using Hotline.FlowEngine.Workflows;
  8. using Hotline.KnowledgeBase;
  9. using Hotline.Orders;
  10. using Hotline.Repository.SqlSugar.Orders;
  11. using Hotline.Settings;
  12. using Hotline.Share.Dtos;
  13. using Hotline.Share.Dtos.Article;
  14. using Hotline.Share.Dtos.FlowEngine.Workflow;
  15. using Hotline.Share.Dtos.Order;
  16. using Hotline.Share.Enums.Order;
  17. using Hotline.Share.Mq;
  18. using MapsterMapper;
  19. using MediatR;
  20. using Microsoft.AspNetCore.Http;
  21. using XF.Domain.Exceptions;
  22. using XF.Domain.Repository;
  23. namespace Hotline.Application.Handlers.FlowEngine;
  24. public class WorkflowEndHandler : INotificationHandler<EndWorkflowNotify>
  25. {
  26. private readonly IKnowledgeDomainService _knowledgeDomainService;
  27. private readonly IOrderDomainService _orderDomainService;
  28. private readonly ITelDomainService _telDomainService;
  29. private readonly IOrderRepository _orderRepository;
  30. private readonly ICapPublisher _capPublisher;
  31. private readonly IMapper _mapper;
  32. private readonly IRepository<OrderVisitDetail> _orderVisitedDetailRepository;
  33. private readonly IRepository<OrderScreen> _orderScreenRepository;
  34. private readonly IRepository<Bulletin> _bulletinRepository;
  35. private readonly IRepository<Circular> _circularRepository;
  36. private readonly IRepositorySqlSugar<CircularReadGroup> _circularReadGroupRepository;
  37. private readonly IRepositorySqlSugar<CircularRecord> _circularRecordRepository;
  38. private readonly ICircularRecordDomainService _circularRecordDomainService;
  39. private readonly IRepository<OrderVisit> _orderVisitRepository;
  40. private readonly IRepository<OrderDelay> _orderDelayRepository;
  41. private readonly IRepository<OrderVisitApply> _orderVisitApplyRepository;
  42. private readonly IMediator _mediator;
  43. public WorkflowEndHandler(
  44. IKnowledgeDomainService knowledgeDomainService,
  45. IOrderDomainService orderDomainService,
  46. ITelDomainService telDomainService,
  47. IOrderRepository orderRepository,
  48. ICapPublisher capPublisher,
  49. IMapper mapper,
  50. IRepository<OrderVisitDetail> orderVisitedDetailRepository,
  51. IRepository<OrderScreen> orderScreenRepository,
  52. IRepository<Bulletin> bulletinRepository,
  53. IRepository<Circular> circularRepository,
  54. IRepository<CircularReadGroup> circularReadGroupRepository,
  55. IRepository<CircularRecord> circularRecordRepository,
  56. ICircularRecordDomainService circularRecordDomainService,
  57. IRepository<OrderDelay> orderDelayRepository,
  58. IRepository<OrderVisit> orderVisitRepository,
  59. IRepository<OrderVisitApply> orderVisitApplyRepository,
  60. IMediator mediator
  61. )
  62. {
  63. _knowledgeDomainService = knowledgeDomainService;
  64. _orderDomainService = orderDomainService;
  65. _telDomainService = telDomainService;
  66. _orderRepository = orderRepository;
  67. _capPublisher = capPublisher;
  68. _mapper = mapper;
  69. _orderScreenRepository = orderScreenRepository;
  70. _orderVisitedDetailRepository = orderVisitedDetailRepository;
  71. _bulletinRepository = bulletinRepository;
  72. _circularRepository = circularRepository;
  73. _circularReadGroupRepository = circularReadGroupRepository;
  74. _circularRecordRepository = circularRecordRepository;
  75. _circularRecordDomainService = circularRecordDomainService;
  76. _orderDelayRepository = orderDelayRepository;
  77. _orderVisitRepository = orderVisitRepository;
  78. _orderVisitApplyRepository = orderVisitApplyRepository;
  79. _mediator = mediator;
  80. }
  81. /// <summary>Handles a notification</summary>
  82. /// <param name="notification">The notification</param>
  83. /// <param name="cancellationToken">Cancellation token</param>
  84. public async Task Handle(EndWorkflowNotify notification, CancellationToken cancellationToken)
  85. {
  86. var workflow = notification.Workflow;
  87. //审批是否通过
  88. var isReviewPass = workflow.IsReviewPass();
  89. switch (workflow.ModuleCode)
  90. {
  91. case WorkflowModuleConsts.KnowledgeAdd://新增知识库
  92. case WorkflowModuleConsts.KnowledgeUpdate://修改知识库
  93. case WorkflowModuleConsts.KnowledgeDelete://删除知识库
  94. if (isReviewPass)
  95. {
  96. await _knowledgeDomainService.EndWorkKnowledge(workflow, cancellationToken);
  97. }
  98. else
  99. {
  100. await _knowledgeDomainService.TerminateWorkKnowledge(workflow, cancellationToken);
  101. }
  102. break;
  103. case WorkflowModuleConsts.TelRestApply:
  104. await _telDomainService.TelRestApplyPassAsync(workflow.ExternalId, cancellationToken);
  105. break;
  106. case WorkflowModuleConsts.OrderHandle:
  107. var order = await _orderDomainService.GetOrderAsync(workflow.ExternalId, cancellationToken);
  108. order.CheckIfFiled();
  109. _mapper.Map(workflow, order);
  110. order.Filed();
  111. await _orderRepository.UpdateAsync(order, cancellationToken);
  112. await _capPublisher.PublishAsync(EventNames.HotlineOrderFiled, new OrderFlowDto
  113. {
  114. Order = _mapper.Map<OrderDto>(order),
  115. WorkflowTrace = _mapper.Map<WorkflowTraceDto>(notification.Trace)
  116. }, cancellationToken: cancellationToken);
  117. break;
  118. case WorkflowModuleConsts.OrderScreen:
  119. var screen = await _orderScreenRepository.GetAsync(workflow.ExternalId, cancellationToken);
  120. if (screen != null)
  121. {
  122. if (isReviewPass)
  123. {
  124. screen.Status = EScreenStatus.End;
  125. screen.ReplyContent = workflow.ActualOpinion;
  126. await _orderScreenRepository.UpdateAsync(screen, cancellationToken);
  127. var visitDetail =
  128. await _orderVisitedDetailRepository.GetAsync(screen.VisitDetailId, cancellationToken);
  129. if (visitDetail != null)
  130. {
  131. var screenSatisfy = new Kv() { Key = "6", Value = "甄别满意" };
  132. visitDetail.OrgProcessingResults = screenSatisfy;
  133. visitDetail.OrgHandledAttitude = screenSatisfy;
  134. await _orderVisitedDetailRepository.UpdateAsync(visitDetail, cancellationToken);
  135. //获取回访信息
  136. var visit = await _orderVisitRepository.Queryable().Includes(x => x.Order)
  137. .Includes(x => x.OrderVisitDetails)
  138. .Where(x => x.Id == screen.VisitId).FirstAsync(cancellationToken);
  139. if (visit != null)
  140. {
  141. //获取回访明细
  142. var visitDe = visit.OrderVisitDetails.First(x => x.Id == screen.VisitDetailId);
  143. //推省上
  144. _capPublisher.Publish(EventNames.HotlineOrderScreenApplyed,
  145. new PublishVisitDto()
  146. {
  147. Order = _mapper.Map<OrderDto>(visit.Order),
  148. No = visit.No,
  149. VisitType = visit.VisitType,
  150. VisitName = visit.CreatorName,
  151. VisitTime = visit.VisitTime,
  152. VisitRemark = visitDe.VisitContent,
  153. AreaCode = visit.Order.AreaCode!,
  154. SubjectResultSatifyCode = visitDe.OrgProcessingResults?.Key,
  155. FirstSatisfactionCode = visit.Order.FirstVisitResultCode!,
  156. ClientGuid = ""
  157. });
  158. }
  159. }
  160. }
  161. else
  162. {
  163. await _orderRepository.OrderScreenRevisionVisit(screen.VisitId, true, cancellationToken);
  164. screen.Status = EScreenStatus.Refuse;
  165. screen.ReplyContent = workflow.ActualOpinion;
  166. await _orderScreenRepository.UpdateAsync(screen, cancellationToken);
  167. }
  168. }
  169. break;
  170. case WorkflowModuleConsts.OrderDelay:
  171. var delay = await _orderDelayRepository.GetAsync(workflow.ExternalId, cancellationToken);
  172. if (delay != null)
  173. {
  174. if (isReviewPass)
  175. {
  176. delay.DelayState = isReviewPass ? EDelayState.Pass : EDelayState.NoPass;
  177. await _orderDelayRepository.UpdateAsync(delay, cancellationToken);
  178. //处理工单延期TODO
  179. }
  180. else
  181. {
  182. delay.DelayState = EDelayState.NoPass;
  183. await _orderDelayRepository.UpdateAsync(delay, cancellationToken);
  184. }
  185. }
  186. break;
  187. }
  188. }
  189. }