using Hotline.Caching.Interfaces; using Hotline.Caching.Services; using Hotline.CallCenter.Calls; using Hotline.Realtimes; using Hotline.Share.Dtos.Realtime; using Hotline.Share.Enums.CallCenter; using Hotline.Share.Notifications; using MediatR; namespace Hotline.Application.Handlers.CallCenter.FlowControl { public class ByeExtAndOuterTwoNotificationHandler : INotificationHandler { private readonly ICallRepository _callRepository; private readonly ICallDetailRepository _callDetailRepository; private readonly IUserCacheManager _userCacheManager; private readonly IRealtimeService _realtimeService; public ByeExtAndOuterTwoNotificationHandler(ICallRepository callRepository, ICallDetailRepository callDetailRepository,IUserCacheManager userCacheManager,IRealtimeService realtimeService) { _callRepository = callRepository; _callDetailRepository = callDetailRepository; _userCacheManager = userCacheManager; _realtimeService = realtimeService; } public async Task Handle(ByeExtAndOuterTwoNotification notification, CancellationToken cancellationToken) { var model = await _callRepository.GetAsync( x => x.ConversationId == notification.Outer.Id && x.ToNo == notification.Outer.To && x.Trunk==notification.Outer.Trunk && x.CreationTime>=DateTime.Now.AddHours(-2),true,x=>x.CreationTime, cancellationToken); if (model != null) { model.CallStatus = ECallStatus.Bye; model.EndBy = EEndBy.To; model.RingOffType = ERingOffType.Normal; model.ByeTime = DateTime.Now; await _callRepository.UpdateAsync(model, cancellationToken); var detail = new CallDetail() { CallId = model.Id, CallStatus = ECallStatus.Bye, OMCallId = notification.Outer.CallId, ConversationId = notification.Outer.Id, EventName = notification.Attribute, FromNo = notification.Outer.From, ToNo = notification.Outer.To, Recording = notification.Recording }; await _callDetailRepository.AddAsync(detail, cancellationToken); //调用业务通知 通知前端 var workModel = _userCacheManager.GetWorkByTel(notification.Outer.From); if (workModel != null) { await _realtimeService.ByeAsync(workModel.UserId, new ByeDto() { Id = model.Id }, cancellationToken); } } } } }