WorkflowEndHandler.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. using DotNetCore.CAP;
  2. using Hotline.Application.JudicialManagement;
  3. using Hotline.Application.Orders;
  4. using Hotline.Application.Quality;
  5. using Hotline.Article;
  6. using Hotline.CallCenter.Calls;
  7. using Hotline.CallCenter.Tels;
  8. using Hotline.FlowEngine.Notifications;
  9. using Hotline.FlowEngine.WorkflowModules;
  10. using Hotline.KnowledgeBase;
  11. using Hotline.Orders;
  12. using Hotline.Settings.TimeLimits;
  13. using Hotline.Share.Dtos;
  14. using Hotline.Share.Dtos.FlowEngine.Workflow;
  15. using Hotline.Share.Dtos.Order;
  16. using Hotline.Share.Dtos.TrCallCenter;
  17. using Hotline.Share.Enums.Order;
  18. using Hotline.Share.Enums.Quality;
  19. using MapsterMapper;
  20. using MediatR;
  21. using Microsoft.Extensions.Logging;
  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 IOrderApplication _orderApplication;
  29. private readonly ITelDomainService _telDomainService;
  30. private readonly IOrderRepository _orderRepository;
  31. private readonly ICapPublisher _capPublisher;
  32. private readonly IMapper _mapper;
  33. private readonly IRepository<OrderVisitDetail> _orderVisitedDetailRepository;
  34. private readonly IRepository<OrderScreen> _orderScreenRepository;
  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 ITimeLimitDomainService _timeLimitDomainService;
  43. private readonly IMediator _mediator;
  44. private readonly ILogger<WorkflowEndHandler> _logger;
  45. private readonly IKnowledgeRepository _knowledgeRepository;
  46. private readonly IKnowledgeWorkFlowRepository _knowledgeWorkFlowRepository;
  47. private readonly IRepository<TrCallRecord> _trCallRecordRepository;
  48. private readonly IQualityApplication _qualityApplication;
  49. private readonly IEnforcementApplication _enforcementApplication;
  50. public WorkflowEndHandler(
  51. IKnowledgeDomainService knowledgeDomainService,
  52. IOrderDomainService orderDomainService,
  53. IOrderApplication orderApplication,
  54. ITelDomainService telDomainService,
  55. IOrderRepository orderRepository,
  56. ICapPublisher capPublisher,
  57. IMapper mapper,
  58. IRepository<OrderVisitDetail> orderVisitedDetailRepository,
  59. IRepository<OrderScreen> orderScreenRepository,
  60. IRepository<Bulletin> bulletinRepository,
  61. IRepository<Circular> circularRepository,
  62. IRepository<CircularReadGroup> circularReadGroupRepository,
  63. IRepository<CircularRecord> circularRecordRepository,
  64. ICircularRecordDomainService circularRecordDomainService,
  65. IRepository<OrderDelay> orderDelayRepository,
  66. IRepository<OrderVisit> orderVisitRepository,
  67. IRepository<OrderVisitApply> orderVisitApplyRepository,
  68. ITimeLimitDomainService timeLimitDomainService,
  69. IMediator mediator,
  70. IKnowledgeRepository knowledgeRepository,
  71. IKnowledgeWorkFlowRepository knowledgeWorkFlowRepository,
  72. ILogger<WorkflowEndHandler> logger,
  73. IRepository<TrCallRecord> trCallRecordRepository,
  74. IQualityApplication qualityApplication,
  75. IEnforcementApplication enforcementApplication)
  76. {
  77. _knowledgeDomainService = knowledgeDomainService;
  78. _orderDomainService = orderDomainService;
  79. _orderApplication = orderApplication;
  80. _telDomainService = telDomainService;
  81. _orderRepository = orderRepository;
  82. _capPublisher = capPublisher;
  83. _mapper = mapper;
  84. _orderScreenRepository = orderScreenRepository;
  85. _orderVisitedDetailRepository = orderVisitedDetailRepository;
  86. _circularRepository = circularRepository;
  87. _circularReadGroupRepository = circularReadGroupRepository;
  88. _circularRecordRepository = circularRecordRepository;
  89. _circularRecordDomainService = circularRecordDomainService;
  90. _orderDelayRepository = orderDelayRepository;
  91. _orderVisitRepository = orderVisitRepository;
  92. _orderVisitApplyRepository = orderVisitApplyRepository;
  93. _timeLimitDomainService = timeLimitDomainService;
  94. _mediator = mediator;
  95. _logger = logger;
  96. _knowledgeRepository = knowledgeRepository;
  97. _knowledgeWorkFlowRepository = knowledgeWorkFlowRepository;
  98. _trCallRecordRepository = trCallRecordRepository;
  99. _qualityApplication = qualityApplication;
  100. _enforcementApplication = enforcementApplication;
  101. }
  102. /// <summary>Handles a notification</summary>
  103. /// <param name="notification">The notification</param>
  104. /// <param name="cancellationToken">Cancellation token</param>
  105. public async Task Handle(EndWorkflowNotify notification, CancellationToken cancellationToken)
  106. {
  107. var workflow = notification.Workflow;
  108. //审批是否通过
  109. var isReviewPass = workflow.IsReviewPass();
  110. switch (workflow.ModuleCode)
  111. {
  112. case WorkflowModuleConsts.KnowledgeAdd://新增知识库
  113. case WorkflowModuleConsts.KnowledgeUpdate://修改知识库
  114. case WorkflowModuleConsts.KnowledgeDelete://删除知识库
  115. var knowledgeWork = await _knowledgeWorkFlowRepository.Queryable().Where(x => x.Id == workflow.ExternalId).FirstAsync(cancellationToken);
  116. var knowledge = await _knowledgeRepository.Queryable().Where(x => x.Id == knowledgeWork.KnowledgeId).FirstAsync(cancellationToken);
  117. knowledge.Flowed(workflow.FlowedUserIds, workflow.FlowedOrgIds, workflow.HandlerUsers, workflow.HandlerOrgs);
  118. await _knowledgeRepository.UpdateAsync(knowledge, cancellationToken);
  119. if (isReviewPass)
  120. {
  121. await _knowledgeDomainService.EndWorkKnowledge(workflow, cancellationToken);
  122. }
  123. else
  124. {
  125. await _knowledgeDomainService.TerminateWorkKnowledge(workflow, cancellationToken);
  126. }
  127. break;
  128. case WorkflowModuleConsts.TelRestApply:
  129. await _telDomainService.TelRestApplyPassAsync(workflow.ExternalId, cancellationToken);
  130. break;
  131. case WorkflowModuleConsts.OrderHandle:
  132. var order = await _orderDomainService.GetOrderAsync(workflow.ExternalId,
  133. withExtension: true, cancellationToken: cancellationToken);
  134. order.CheckIfFiled();
  135. _mapper.Map(workflow, order);
  136. var now = DateTime.Now;
  137. var handleDuration = order.StartTime.HasValue
  138. ? _timeLimitDomainService.CalcWorkTime(order.StartTime.Value,
  139. now, order.ProcessType is EProcessType.Zhiban)
  140. : 0;
  141. var fileDuration = order.CenterToOrgTime.HasValue
  142. ? _timeLimitDomainService.CalcWorkTime(order.CenterToOrgTime.Value,
  143. now, order.ProcessType is EProcessType.Zhiban)
  144. : 0;
  145. var allDuration = order.StartTime.HasValue
  146. ? _timeLimitDomainService.CalcWorkTime(order.StartTime.Value, now,
  147. order.ProcessType is EProcessType.Zhiban)
  148. : 0;
  149. order.File(now, handleDuration, fileDuration, allDuration);
  150. await _orderRepository.UpdateAsync(order, cancellationToken);
  151. var callRecord = await _trCallRecordRepository.GetAsync(p => p.CallAccept == order.CallId, cancellationToken);
  152. var orderFlowDto = new OrderFlowDto
  153. {
  154. Order = _mapper.Map<OrderDto>(order),
  155. WorkflowTrace = _mapper.Map<WorkflowTraceDto>(notification.Trace)
  156. };
  157. if (callRecord != null)
  158. {
  159. orderFlowDto.TrCallRecordDto = _mapper.Map<TrCallDto>(callRecord);
  160. }
  161. await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderFiled, orderFlowDto, cancellationToken: cancellationToken);
  162. //写入质检 针对受理之后直接结束的工单
  163. await _qualityApplication.AddQualityAsync(EQualitySource.Accepted, order.Id, cancellationToken);
  164. //司法行政监督管理-工单处理
  165. await _enforcementApplication.AddEnforcementOrderAsync(order, cancellationToken);
  166. break;
  167. case WorkflowModuleConsts.OrderScreen:
  168. var screen = await _orderScreenRepository.GetAsync(workflow.ExternalId, cancellationToken);
  169. if (screen != null)
  170. {
  171. screen.Flowed(workflow.FlowedUserIds, workflow.FlowedOrgIds, workflow.HandlerUsers, workflow.HandlerOrgs);
  172. if (isReviewPass)
  173. {
  174. screen.Status = EScreenStatus.End;
  175. screen.ReplyContent = workflow.ActualOpinion;
  176. await _orderScreenRepository.UpdateAsync(screen, cancellationToken);
  177. var visitDetail =
  178. await _orderVisitedDetailRepository.GetAsync(screen.VisitDetailId, cancellationToken);
  179. if (visitDetail != null)
  180. {
  181. var screenSatisfy = new Kv() { Key = "-1", Value = "视为满意" };
  182. visitDetail.OrgProcessingResults = screenSatisfy;
  183. visitDetail.OrgHandledAttitude = screenSatisfy;
  184. await _orderVisitedDetailRepository.UpdateAsync(visitDetail, cancellationToken);
  185. // 修改主表当前评价结果
  186. await _orderVisitRepository.Updateable().SetColumns(v=> new OrderVisit() { NowEvaluate = screenSatisfy }).Where(v=>v.Id == visitDetail.VisitId).ExecuteCommandAsync(cancellationToken);
  187. //获取回访信息
  188. var visit = await _orderVisitRepository.Queryable().Includes(x => x.Order)
  189. .Includes(x => x.OrderVisitDetails)
  190. .Where(x => x.Id == screen.VisitId).FirstAsync(cancellationToken);
  191. if (visit != null)
  192. {
  193. //获取回访明细
  194. var visitDe = visit.OrderVisitDetails.First(x => x.Id == screen.VisitDetailId);
  195. //推省上
  196. await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderScreenApplyed,
  197. new PublishVisitDto()
  198. {
  199. Order = _mapper.Map<OrderDto>(visit.Order),
  200. No = visit.No,
  201. VisitType = visit.VisitType,
  202. VisitName = visit.CreatorName,
  203. VisitTime = visit.VisitTime,
  204. VisitRemark = visitDe.VisitContent,
  205. AreaCode = visit.Order.AreaCode!,
  206. SubjectResultSatifyCode = visitDe.OrgProcessingResults?.Key,
  207. FirstSatisfactionCode = visit.Order.FirstVisitResultCode!,
  208. ClientGuid = ""
  209. });
  210. //推门户
  211. await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderVisitedWeb, new PublishVisitAllDto()
  212. {
  213. Id = visit.Id,
  214. Order = _mapper.Map<OrderDto>(visit.Order),
  215. OrderVisitDetails = _mapper.Map<List<VisitDetailDto>>(visit.OrderVisitDetails),
  216. VisitName = visit.CreatorName,
  217. VisitTime = visit.VisitTime,
  218. VisitType = visit.VisitType,
  219. VisitState = visit.VisitState,
  220. PublishTime = visit.PublishTime,
  221. }, cancellationToken: cancellationToken);
  222. }
  223. }
  224. }
  225. else
  226. {
  227. await _orderRepository.OrderScreenRevisionVisit(screen.VisitId, true, cancellationToken);
  228. screen.Status = EScreenStatus.Refuse;
  229. screen.ReplyContent = workflow.ActualOpinion;
  230. await _orderScreenRepository.UpdateAsync(screen, cancellationToken);
  231. }
  232. }
  233. break;
  234. case WorkflowModuleConsts.OrderDelay:
  235. var delay = await _orderDelayRepository.GetAsync(workflow.ExternalId, cancellationToken);
  236. if (delay != null)
  237. {
  238. delay.Flowed(workflow.FlowedUserIds, workflow.FlowedOrgIds, workflow.HandlerUsers, workflow.HandlerOrgs);
  239. if (isReviewPass)
  240. {
  241. delay.DelayState = isReviewPass ? EDelayState.Pass : EDelayState.NoPass;
  242. await _orderDelayRepository.UpdateAsync(delay, cancellationToken);
  243. //处理工单延期
  244. await _orderApplication.DelayOrderExpiredTimeAsync(delay.OrderId, delay.DelayNum,
  245. delay.DelayUnit, cancellationToken);
  246. }
  247. else
  248. {
  249. delay.DelayState = EDelayState.NoPass;
  250. await _orderDelayRepository.UpdateAsync(delay, cancellationToken);
  251. }
  252. }
  253. break;
  254. }
  255. }
  256. }