using DotNetCore.CAP; using Hotline.Application.Orders; using Hotline.Article; using Hotline.CallCenter.Tels; using Hotline.FlowEngine.Notifications; using Hotline.FlowEngine.WorkflowModules; using Hotline.KnowledgeBase; using Hotline.Orders; using Hotline.Share.Dtos; using Hotline.Share.Dtos.FlowEngine.Workflow; using Hotline.Share.Dtos.Order; using Hotline.Share.Enums.Order; using MapsterMapper; using MediatR; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging; using XF.Domain.Authentications; using XF.Domain.Entities; using XF.Domain.Repository; namespace Hotline.Application.Handlers.FlowEngine; public class WorkflowEndHandler : INotificationHandler { private readonly IKnowledgeDomainService _knowledgeDomainService; private readonly IOrderDomainService _orderDomainService; private readonly IOrderApplication _orderApplication; private readonly ITelDomainService _telDomainService; private readonly IOrderRepository _orderRepository; private readonly ICapPublisher _capPublisher; private readonly IMapper _mapper; private readonly IRepository _orderVisitedDetailRepository; private readonly IRepository _orderScreenRepository; private readonly IRepository _circularRepository; private readonly IRepositorySqlSugar _circularReadGroupRepository; private readonly IRepositorySqlSugar _circularRecordRepository; private readonly ICircularRecordDomainService _circularRecordDomainService; private readonly IRepository _orderVisitRepository; private readonly IRepository _orderDelayRepository; private readonly IRepository _orderVisitApplyRepository; private readonly IMediator _mediator; private readonly ILogger _logger; public WorkflowEndHandler( IKnowledgeDomainService knowledgeDomainService, IOrderDomainService orderDomainService, IOrderApplication orderApplication, ITelDomainService telDomainService, IOrderRepository orderRepository, ICapPublisher capPublisher, IMapper mapper, IRepository orderVisitedDetailRepository, IRepository orderScreenRepository, IRepository bulletinRepository, IRepository circularRepository, IRepository circularReadGroupRepository, IRepository circularRecordRepository, ICircularRecordDomainService circularRecordDomainService, IRepository orderDelayRepository, IRepository orderVisitRepository, IRepository orderVisitApplyRepository, IMediator mediator, ILogger logger) { _knowledgeDomainService = knowledgeDomainService; _orderDomainService = orderDomainService; _orderApplication = orderApplication; _telDomainService = telDomainService; _orderRepository = orderRepository; _capPublisher = capPublisher; _mapper = mapper; _orderScreenRepository = orderScreenRepository; _orderVisitedDetailRepository = orderVisitedDetailRepository; _circularRepository = circularRepository; _circularReadGroupRepository = circularReadGroupRepository; _circularRecordRepository = circularRecordRepository; _circularRecordDomainService = circularRecordDomainService; _orderDelayRepository = orderDelayRepository; _orderVisitRepository = orderVisitRepository; _orderVisitApplyRepository = orderVisitApplyRepository; _mediator = mediator; _logger = logger; } /// Handles a notification /// The notification /// Cancellation token public async Task Handle(EndWorkflowNotify notification, CancellationToken cancellationToken) { var workflow = notification.Workflow; //审批是否通过 var isReviewPass = workflow.IsReviewPass(); switch (workflow.ModuleCode) { case WorkflowModuleConsts.KnowledgeAdd://新增知识库 case WorkflowModuleConsts.KnowledgeUpdate://修改知识库 case WorkflowModuleConsts.KnowledgeDelete://删除知识库 if (isReviewPass) { await _knowledgeDomainService.EndWorkKnowledge(workflow, cancellationToken); } else { await _knowledgeDomainService.TerminateWorkKnowledge(workflow, cancellationToken); } break; case WorkflowModuleConsts.TelRestApply: await _telDomainService.TelRestApplyPassAsync(workflow.ExternalId, cancellationToken); break; case WorkflowModuleConsts.OrderHandle: var order = await _orderDomainService.GetOrderAsync(workflow.ExternalId, cancellationToken: cancellationToken); order.CheckIfFiled(); _mapper.Map(workflow, order); order.File(); await _orderRepository.UpdateAsync(order, cancellationToken); await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderFiled, new OrderFlowDto { Order = _mapper.Map(order), WorkflowTrace = _mapper.Map(notification.Trace) }, cancellationToken: cancellationToken); //try //{ // await _provinceService.OrderFiled(new OrderFlowDto // { // Order = _mapper.Map(order), // WorkflowTrace = _mapper.Map(notification.Trace) // }, cancellationToken: cancellationToken); //} //catch (Exception e) //{ // _logger.LogError("_provinceService.OrderFiled throw exception: {ex}", e.Message); //} break; case WorkflowModuleConsts.OrderScreen: var screen = await _orderScreenRepository.GetAsync(workflow.ExternalId, cancellationToken); if (screen != null) { screen.Flowed(workflow.FlowedUserIds, workflow.FlowedOrgIds, workflow.HandlerUsers, workflow.HandlerOrgs); if (isReviewPass) { screen.Status = EScreenStatus.End; screen.ReplyContent = workflow.ActualOpinion; await _orderScreenRepository.UpdateAsync(screen, cancellationToken); var visitDetail = await _orderVisitedDetailRepository.GetAsync(screen.VisitDetailId, cancellationToken); if (visitDetail != null) { var screenSatisfy = new Kv() { Key = "6", Value = "甄别满意" }; visitDetail.OrgProcessingResults = screenSatisfy; visitDetail.OrgHandledAttitude = screenSatisfy; await _orderVisitedDetailRepository.UpdateAsync(visitDetail, cancellationToken); //获取回访信息 var visit = await _orderVisitRepository.Queryable().Includes(x => x.Order) .Includes(x => x.OrderVisitDetails) .Where(x => x.Id == screen.VisitId).FirstAsync(cancellationToken); if (visit != null) { //获取回访明细 var visitDe = visit.OrderVisitDetails.First(x => x.Id == screen.VisitDetailId); //推省上 await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderScreenApplyed, new PublishVisitDto() { Order = _mapper.Map(visit.Order), No = visit.No, VisitType = visit.VisitType, VisitName = visit.CreatorName, VisitTime = visit.VisitTime, VisitRemark = visitDe.VisitContent, AreaCode = visit.Order.AreaCode!, SubjectResultSatifyCode = visitDe.OrgProcessingResults?.Key, FirstSatisfactionCode = visit.Order.FirstVisitResultCode!, ClientGuid = "" }); //推门户 await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderVisitedWeb, new PublishVisitAllDto() { Id = visit.Id, Order = _mapper.Map(visit.Order), OrderVisitDetails = _mapper.Map>(visit.OrderVisitDetails), VisitName = visit.CreatorName, VisitTime = visit.VisitTime, VisitType = visit.VisitType, VisitState = visit.VisitState, PublishTime = visit.PublishTime, }, cancellationToken: cancellationToken); } } } else { await _orderRepository.OrderScreenRevisionVisit(screen.VisitId, true, cancellationToken); screen.Status = EScreenStatus.Refuse; screen.ReplyContent = workflow.ActualOpinion; await _orderScreenRepository.UpdateAsync(screen, cancellationToken); } } break; case WorkflowModuleConsts.OrderDelay: var delay = await _orderDelayRepository.GetAsync(workflow.ExternalId, cancellationToken); if (delay != null) { delay.Flowed(workflow.FlowedUserIds, workflow.FlowedOrgIds, workflow.HandlerUsers, workflow.HandlerOrgs); if (isReviewPass) { delay.DelayState = isReviewPass ? EDelayState.Pass : EDelayState.NoPass; await _orderDelayRepository.UpdateAsync(delay, cancellationToken); //处理工单延期TODO await _orderApplication.DelayOrderExpiredTimeAsync(delay.OrderId, delay.DelayNum, delay.DelayUnit, cancellationToken); } else { delay.DelayState = EDelayState.NoPass; await _orderDelayRepository.UpdateAsync(delay, cancellationToken); } } break; } } }