WorkflowEndHandler.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. using DotNetCore.CAP;
  2. using Hotline.Application.Orders;
  3. using Hotline.Article;
  4. using Hotline.CallCenter.Tels;
  5. using Hotline.FlowEngine.Notifications;
  6. using Hotline.FlowEngine.WorkflowModules;
  7. using Hotline.KnowledgeBase;
  8. using Hotline.Orders;
  9. using Hotline.Share.Dtos;
  10. using Hotline.Share.Dtos.FlowEngine.Workflow;
  11. using Hotline.Share.Dtos.Order;
  12. using Hotline.Share.Enums.Order;
  13. using MapsterMapper;
  14. using MediatR;
  15. using Microsoft.AspNetCore.Http;
  16. using Microsoft.Extensions.Logging;
  17. using XF.Domain.Authentications;
  18. using XF.Domain.Entities;
  19. using XF.Domain.Repository;
  20. namespace Hotline.Application.Handlers.FlowEngine;
  21. public class WorkflowEndHandler : INotificationHandler<EndWorkflowNotify>
  22. {
  23. private readonly IKnowledgeDomainService _knowledgeDomainService;
  24. private readonly IOrderDomainService _orderDomainService;
  25. private readonly IOrderApplication _orderApplication;
  26. private readonly ITelDomainService _telDomainService;
  27. private readonly IOrderRepository _orderRepository;
  28. private readonly ICapPublisher _capPublisher;
  29. private readonly IMapper _mapper;
  30. private readonly IRepository<OrderVisitDetail> _orderVisitedDetailRepository;
  31. private readonly IRepository<OrderScreen> _orderScreenRepository;
  32. private readonly IRepository<Circular> _circularRepository;
  33. private readonly IRepositorySqlSugar<CircularReadGroup> _circularReadGroupRepository;
  34. private readonly IRepositorySqlSugar<CircularRecord> _circularRecordRepository;
  35. private readonly ICircularRecordDomainService _circularRecordDomainService;
  36. private readonly IRepository<OrderVisit> _orderVisitRepository;
  37. private readonly IRepository<OrderDelay> _orderDelayRepository;
  38. private readonly IRepository<OrderVisitApply> _orderVisitApplyRepository;
  39. private readonly IMediator _mediator;
  40. private readonly ILogger<WorkflowEndHandler> _logger;
  41. public WorkflowEndHandler(
  42. IKnowledgeDomainService knowledgeDomainService,
  43. IOrderDomainService orderDomainService,
  44. IOrderApplication orderApplication,
  45. ITelDomainService telDomainService,
  46. IOrderRepository orderRepository,
  47. ICapPublisher capPublisher,
  48. IMapper mapper,
  49. IRepository<OrderVisitDetail> orderVisitedDetailRepository,
  50. IRepository<OrderScreen> orderScreenRepository,
  51. IRepository<Bulletin> bulletinRepository,
  52. IRepository<Circular> circularRepository,
  53. IRepository<CircularReadGroup> circularReadGroupRepository,
  54. IRepository<CircularRecord> circularRecordRepository,
  55. ICircularRecordDomainService circularRecordDomainService,
  56. IRepository<OrderDelay> orderDelayRepository,
  57. IRepository<OrderVisit> orderVisitRepository,
  58. IRepository<OrderVisitApply> orderVisitApplyRepository,
  59. IMediator mediator,
  60. ILogger<WorkflowEndHandler> logger)
  61. {
  62. _knowledgeDomainService = knowledgeDomainService;
  63. _orderDomainService = orderDomainService;
  64. _orderApplication = orderApplication;
  65. _telDomainService = telDomainService;
  66. _orderRepository = orderRepository;
  67. _capPublisher = capPublisher;
  68. _mapper = mapper;
  69. _orderScreenRepository = orderScreenRepository;
  70. _orderVisitedDetailRepository = orderVisitedDetailRepository;
  71. _circularRepository = circularRepository;
  72. _circularReadGroupRepository = circularReadGroupRepository;
  73. _circularRecordRepository = circularRecordRepository;
  74. _circularRecordDomainService = circularRecordDomainService;
  75. _orderDelayRepository = orderDelayRepository;
  76. _orderVisitRepository = orderVisitRepository;
  77. _orderVisitApplyRepository = orderVisitApplyRepository;
  78. _mediator = mediator;
  79. _logger = logger;
  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: cancellationToken);
  108. order.CheckIfFiled();
  109. _mapper.Map(workflow, order);
  110. order.File();
  111. await _orderRepository.UpdateAsync(order, cancellationToken);
  112. await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderFiled, new OrderFlowDto
  113. {
  114. Order = _mapper.Map<OrderDto>(order),
  115. WorkflowTrace = _mapper.Map<WorkflowTraceDto>(notification.Trace)
  116. }, cancellationToken: cancellationToken);
  117. //try
  118. //{
  119. // await _provinceService.OrderFiled(new OrderFlowDto
  120. // {
  121. // Order = _mapper.Map<OrderDto>(order),
  122. // WorkflowTrace = _mapper.Map<WorkflowTraceDto>(notification.Trace)
  123. // }, cancellationToken: cancellationToken);
  124. //}
  125. //catch (Exception e)
  126. //{
  127. // _logger.LogError("_provinceService.OrderFiled throw exception: {ex}", e.Message);
  128. //}
  129. break;
  130. case WorkflowModuleConsts.OrderScreen:
  131. var screen = await _orderScreenRepository.GetAsync(workflow.ExternalId, cancellationToken);
  132. if (screen != null)
  133. {
  134. screen.Flowed(workflow.FlowedUserIds, workflow.FlowedOrgIds, workflow.HandlerUsers, workflow.HandlerOrgs);
  135. if (isReviewPass)
  136. {
  137. screen.Status = EScreenStatus.End;
  138. screen.ReplyContent = workflow.ActualOpinion;
  139. await _orderScreenRepository.UpdateAsync(screen, cancellationToken);
  140. var visitDetail =
  141. await _orderVisitedDetailRepository.GetAsync(screen.VisitDetailId, cancellationToken);
  142. if (visitDetail != null)
  143. {
  144. var screenSatisfy = new Kv() { Key = "6", Value = "甄别满意" };
  145. visitDetail.OrgProcessingResults = screenSatisfy;
  146. visitDetail.OrgHandledAttitude = screenSatisfy;
  147. await _orderVisitedDetailRepository.UpdateAsync(visitDetail, cancellationToken);
  148. //获取回访信息
  149. var visit = await _orderVisitRepository.Queryable().Includes(x => x.Order)
  150. .Includes(x => x.OrderVisitDetails)
  151. .Where(x => x.Id == screen.VisitId).FirstAsync(cancellationToken);
  152. if (visit != null)
  153. {
  154. //获取回访明细
  155. var visitDe = visit.OrderVisitDetails.First(x => x.Id == screen.VisitDetailId);
  156. //推省上
  157. await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderScreenApplyed,
  158. new PublishVisitDto()
  159. {
  160. Order = _mapper.Map<OrderDto>(visit.Order),
  161. No = visit.No,
  162. VisitType = visit.VisitType,
  163. VisitName = visit.CreatorName,
  164. VisitTime = visit.VisitTime,
  165. VisitRemark = visitDe.VisitContent,
  166. AreaCode = visit.Order.AreaCode!,
  167. SubjectResultSatifyCode = visitDe.OrgProcessingResults?.Key,
  168. FirstSatisfactionCode = visit.Order.FirstVisitResultCode!,
  169. ClientGuid = ""
  170. });
  171. //推门户
  172. await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderVisitedWeb, new PublishVisitAllDto()
  173. {
  174. Id = visit.Id,
  175. Order = _mapper.Map<OrderDto>(visit.Order),
  176. OrderVisitDetails = _mapper.Map<List<VisitDetailDto>>(visit.OrderVisitDetails),
  177. VisitName = visit.CreatorName,
  178. VisitTime = visit.VisitTime,
  179. VisitType = visit.VisitType,
  180. VisitState = visit.VisitState,
  181. PublishTime = visit.PublishTime,
  182. }, cancellationToken: cancellationToken);
  183. }
  184. }
  185. }
  186. else
  187. {
  188. await _orderRepository.OrderScreenRevisionVisit(screen.VisitId, true, cancellationToken);
  189. screen.Status = EScreenStatus.Refuse;
  190. screen.ReplyContent = workflow.ActualOpinion;
  191. await _orderScreenRepository.UpdateAsync(screen, cancellationToken);
  192. }
  193. }
  194. break;
  195. case WorkflowModuleConsts.OrderDelay:
  196. var delay = await _orderDelayRepository.GetAsync(workflow.ExternalId, cancellationToken);
  197. if (delay != null)
  198. {
  199. delay.Flowed(workflow.FlowedUserIds, workflow.FlowedOrgIds, workflow.HandlerUsers, workflow.HandlerOrgs);
  200. if (isReviewPass)
  201. {
  202. delay.DelayState = isReviewPass ? EDelayState.Pass : EDelayState.NoPass;
  203. await _orderDelayRepository.UpdateAsync(delay, cancellationToken);
  204. //处理工单延期TODO
  205. await _orderApplication.DelayOrderExpiredTimeAsync(delay.OrderId, delay.DelayNum,
  206. delay.DelayUnit, cancellationToken);
  207. }
  208. else
  209. {
  210. delay.DelayState = EDelayState.NoPass;
  211. await _orderDelayRepository.UpdateAsync(delay, cancellationToken);
  212. }
  213. }
  214. break;
  215. }
  216. }
  217. }