using CallCenter.Caches; using CallCenter.Calls; using CallCenter.Realtimes; using CallCenter.Share.Enums; using CallCenter.Share.Notifications; using MediatR; namespace CallCenter.Application.Handlers { public class ByeVisitorOffNotificationHandler:INotificationHandler { private readonly ICallRepository _callRepository; private readonly ICallDetailRepository _callDetailRepository; private readonly ICallCacheManager _callCacheManager; private readonly IUserCacheManager _userCacheManager; private readonly IRealtimeService _realtimeService; public ByeVisitorOffNotificationHandler(ICallRepository callRepository, ICallDetailRepository callDetailRepository,ICallCacheManager callCacheManager, IUserCacheManager userCacheManager, IRealtimeService realtimeService) { _callRepository = callRepository; _callDetailRepository = callDetailRepository; _callCacheManager = callCacheManager; _userCacheManager = userCacheManager; _realtimeService = realtimeService; } public async Task Handle(ByeVisitorOffNotification 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.Bye; model.EndBy = EEndBy.To; model.RingOffType = ERingOffType.Normal; await _callRepository.UpdateAsync(model, cancellationToken); var detail = new CallDetail() { CallId = model.Id, CallStatus = ECallStatus.Bye, OMCallId = notification.Visitor.CallId, ConversationId = notification.Visitor.Id, EventName = notification.Attribute, FromNo = notification.Visitor.From, ToNo = notification.Visitor.To, Recording = notification.Recording, }; await _callDetailRepository.AddAsync(detail, cancellationToken); //处理队列记录 TODO //_callCacheManager.RemoveCallCache(model.Id); //查询应答分机分机号 var callDetailAnswer = await _callDetailRepository.GetAsync(x => x.CallId == model.Id && x.EventName == "ANSWER", true, d => d.CreationTime); if (callDetailAnswer != null) { //调用业务通知 通知前端 var workModel = _userCacheManager.GetWorkByTel(callDetailAnswer.AnswerNo); if (workModel != null) { await _realtimeService.ByeAsync(workModel.UserId, new ByeDto() { Id = model.Id }, cancellationToken); } } } } } }