using CallCenter.Caches; using CallCenter.Calls; using CallCenter.Notifications; using CallCenter.Realtimes; using CallCenter.Share.Enums; using MediatR; namespace CallCenter.Application.Handlers { public class RingVisitorToExtNotificationHandler:INotificationHandler { private readonly ICallRepository _callRepository; private readonly ICallDetailRepository _callDetailRepository; private readonly IRealtimeService _realtimeService; private readonly IUserCacheManager _userCacheManager; private readonly ICallCacheManager _callCacheManager; public RingVisitorToExtNotificationHandler(ICallRepository callRepository, ICallDetailRepository callDetailRepository,IRealtimeService realtimeService, IUserCacheManager userCacheManager, ICallCacheManager callCacheManager) { _callRepository = callRepository; _callDetailRepository = callDetailRepository; _realtimeService = realtimeService; _userCacheManager = userCacheManager; _callCacheManager = callCacheManager; } public async Task Handle(RingVisitorToExtNotification notification, CancellationToken cancellationToken) { var model = await _callRepository.GetAsync( x => x.ConversationId == notification.Visitor.Id && x.FromNo == notification.Visitor.From && x.CreationTime>=DateTime.Now.AddHours(-2), cancellationToken); if (model!=null) { model.CallStatus = ECallStatus.Ring; model.OutGroupTime = DateTime.Now; model.InSeaTime = DateTime.Now; await _callRepository.UpdateAsync(model, cancellationToken); var detail = new CallDetail() { CallId = model.Id, CallStatus = ECallStatus.Ring, OMCallId = notification.Visitor.CallId, ConversationId = notification.Visitor.Id, EventName = notification.Attribute, FromNo = notification.Visitor.From, ToNo = notification.Visitor.To }; await _callDetailRepository.AddAsync(detail, cancellationToken); //处理排队缓存数据 _callCacheManager.RemoveCallCache(model.Id); //调用业务弹屏 通知前端 var workModel = _userCacheManager.GetWorkByTel(notification.TelNo); if (workModel!=null) { await _realtimeService.RingAsync(workModel.UserId, new RingDto() { CallType = ECallType.VisitorCallIn, From = notification.Visitor.From, To = notification.Visitor.To, Id = model.Id, ConversationId = notification.Visitor.Id },cancellationToken); } } } } }