using Hotline.Caches; using Hotline.CallCenter.Calls; using Hotline.Realtimes; using Hotline.Share.Enums.CallCenter; using Hotline.Share.Notifications; using MediatR; namespace Hotline.Application.Handlers.CallCenter.FlowControl { public class AnsweredVisitorToExtNotificationHandler:INotificationHandler { private readonly ICallRepository _callRepository; private readonly ICallDetailRepository _callDetailRepository; private readonly IUserCacheManager _userCacheManager; private readonly IRealtimeService _realtimeService; public AnsweredVisitorToExtNotificationHandler(ICallRepository callRepository, ICallDetailRepository callDetailRepository,IUserCacheManager userCacheManager,IRealtimeService realtimeService) { _callRepository = callRepository; _callDetailRepository = callDetailRepository; _userCacheManager = userCacheManager; _realtimeService = realtimeService; } public async Task Handle(AnsweredVisitorToExtNotification 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); var workModel = _userCacheManager.GetWorkByTel(notification.TelNo); if (model != null) { model.CallStatus = ECallStatus.Answered; //model.ToNo = notification.TelNo; model.AnsweredTime = DateTime.Now; model.UserId = workModel.UserId; model.UserName = workModel.UserName; await _callRepository.UpdateAsync(model, cancellationToken); var detail = new CallDetail() { CallId = model.Id, CallStatus = ECallStatus.Answered, OMCallId = notification.Visitor.CallId, ConversationId = notification.Visitor.Id, EventName = notification.Attribute, AnswerNo = notification.TelNo, FromNo = notification.Visitor.From, ToNo = notification.Visitor.To, }; await _callDetailRepository.AddAsync(detail, cancellationToken); //调用业务通知 通知前端 await _realtimeService.AnsweredAsync(workModel.UserId, new Share.Dtos.Realtime.AnsweredDto() { Id=model.Id,From = notification.Visitor.From,To = notification.TelNo }, cancellationToken); } } } }