using DotNetCore.CAP; using Hotline.FlowEngine.Notifications; using Hotline.FlowEngine.WorkflowModules; using Hotline.FlowEngine.Workflows; using Hotline.Orders; using Hotline.Push.Notifies; using Hotline.Settings.TimeLimits; using Hotline.Share.Dtos.Order; using Hotline.Share.Dtos.Push; using Hotline.Share.Enums.FlowEngine; using Hotline.Share.Enums.Order; using Hotline.Share.Enums.Push; using Hotline.Users; using MapsterMapper; using MediatR; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging; using XF.Domain.Repository; namespace Hotline.Application.Handlers.FlowEngine { public class WorkflowPreviousHandler : INotificationHandler { private readonly IOrderDomainService _orderDomainService; private readonly IOrderRepository _orderRepository; private readonly IOrderScreenRepository _orderScreenRepository; private readonly IOrderDelayRepository _orderDelayRepository; private readonly IWorkflowDomainService _workflowDomainService; private readonly ITimeLimitDomainService _timeLimitDomainService; private readonly ICapPublisher _capPublisher; private readonly IMapper _mapper; private readonly ILogger _logger; private readonly IRepository _userRepository; private readonly IMediator _mediator; public WorkflowPreviousHandler( IOrderDomainService orderDomainService, IOrderRepository orderRepository, IOrderScreenRepository orderScreenRepository, IOrderDelayRepository orderDelayRepository, IWorkflowDomainService workflowDomainService, ITimeLimitDomainService timeLimitDomainService, ICapPublisher capPublisher, IMapper mapper, ILogger logger, IRepository userRepository, IMediator mediator ) { _orderDomainService = orderDomainService; _orderRepository = orderRepository; _workflowDomainService = workflowDomainService; _timeLimitDomainService = timeLimitDomainService; _capPublisher = capPublisher; _mapper = mapper; _logger = logger; _userRepository = userRepository; _mediator = mediator; _orderScreenRepository = orderScreenRepository; _orderDelayRepository = orderDelayRepository; } /// Handles a notification /// The notification /// Cancellation token public async Task Handle(PreviousNotify notification, CancellationToken cancellationToken) { var workflow = notification.Workflow; var data = notification.Dto; switch (workflow.ModuleCode) { case WorkflowModuleConsts.OrderHandle: var order = await _orderDomainService.GetOrderAsync(workflow.ExternalId, withHotspot: true, withAcceptor: true, withExtension: true, cancellationToken: cancellationToken); order.CheckIfFiled(); _mapper.Map(workflow, order); if (notification.TargetStep.StepType is EStepType.Start) { order.Status = EOrderStatus.BackToUnAccept; order.BackToUnsign(); } await _orderRepository.UpdateAsync(order, cancellationToken); //if (notification.IsOrgToCenter) //{ // var expiredTimeConfig = _timeLimitDomainService.CalcExpiredTime(DateTime.Now, EFlowDirection.OrgToCenter, order.AcceptTypeCode); // await _workflowDomainService.UpdateExpiredTimeAsync(workflow, expiredTimeConfig.ExpiredTime, // expiredTimeConfig.TimeText, expiredTimeConfig.Count, expiredTimeConfig.TimeType, expiredTimeConfig.NearlyExpiredTime, cancellationToken); // var dto = _mapper.Map(order); // await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderExpiredTimeUpdate, dto, cancellationToken: cancellationToken); // //try // //{ // // await _provinceService.HotlineOrderFlowRecalled(dto, cancellationToken); // //} // //catch (Exception e) // //{ // // _logger.LogError("_provinceService.HotlineOrderFlowRecalled throw exception: {ex}", // // e.Message); // //} //} if (notification.Dto.AcceptSms) { var targetStep = notification.TargetStep; switch (targetStep.HandlerType) { case EHandlerType.Role: case EHandlerType.AssignedUser: var users = await _userRepository.Queryable() .Where(d => targetStep.Handlers.Select(x => x.Key).Contains(d.Id)) .ToListAsync(cancellationToken); foreach (var user in users) { if (!string.IsNullOrEmpty(user.PhoneNo)) { var messageDto = new MessageDto() { PushBusiness = EPushBusiness.OrderSendBack, ExternalId = order.Id, OrderId = order.Id, PushPlatform = EPushPlatform.Sms, Remark = order.Title, Name = user.PhoneNo, TemplateCode = "1004", Params = new List() { order.No }, TelNumber = user.PhoneNo, }; await _mediator.Publish(new PushMessageNotify(messageDto), cancellationToken); } } break; case EHandlerType.OrgLevel: case EHandlerType.OrgType: case EHandlerType.AssignedOrg: //todo 部门经办人联系方式 break; default: throw new ArgumentOutOfRangeException(); } } 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); await _orderDelayRepository.UpdateAsync(delay, cancellationToken); } 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); await _orderScreenRepository.UpdateAsync(screen, cancellationToken); } break; case WorkflowModuleConsts.KnowledgeAdd: case WorkflowModuleConsts.KnowledgeUpdate: case WorkflowModuleConsts.KnowledgeDelete: case WorkflowModuleConsts.TelRestApply: break; } } } }