using Hotline.Caching.Interfaces; using Hotline.CallCenter.Calls; using Hotline.DI; using Hotline.Realtimes; using Hotline.Share.Enums.CallCenter; using Hotline.Share.Notifications.NewRockCallCenter; using MediatR; namespace Hotline.Application.Handlers.CallCenter.FlowControl { [Injection(EventHandlerType = EEventHandlerType.CallCenter, Label = AppDefaults.CallCenterType.XunShi)] public class ByeVisitorAndExtNotificationHandler : INotificationHandler { private readonly ICallRepository _callRepository; private readonly ICallDetailRepository _callDetailRepository; private readonly IUserCacheManager _userCacheManager; private readonly IRealtimeService _realtimeService; private readonly ICallCacheManager _callCacheManager; public ByeVisitorAndExtNotificationHandler(ICallRepository callRepository, ICallDetailRepository callDetailRepository, IUserCacheManager userCacheManager, IRealtimeService realtimeService, ICallCacheManager callCacheManager) { _callRepository = callRepository; _callDetailRepository = callDetailRepository; _userCacheManager = userCacheManager; _realtimeService = realtimeService; _callCacheManager = callCacheManager; } public async Task Handle(ByeVisitorAndExtNotification 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), true, x => x.CreationTime, cancellationToken); if (model != null) { model.CallStatus = ECallStatus.Bye; model.EndBy = EEndBy.From; 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.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); //处理队列记录 _callCacheManager.RemoveCallCache(model.Id); await _realtimeService.CallQueueAsync(_callCacheManager.GetCallQueueList(), cancellationToken); //查询应答分机分机号 var callDetailAnswer = await _callDetailRepository.GetAsync(x => x.CallId == model.Id && x.EventName == "ANSWER", true, d => d.CreationTime, cancellationToken); if (callDetailAnswer != null) { var workModel = _userCacheManager.GetWorkByTel(callDetailAnswer.AnswerNo); if (workModel != null) { //调用业务通知 通知前端 await _realtimeService.ByeAsync(workModel.UserId, new Share.Dtos.Realtime.ByeDto() { Id = model.Id }, cancellationToken); } } } } } }