WorkflowEndHandler.cs 12 KB

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