using CallCenter.Calls; using CallCenter.Share.Enums; using NewRock.Sdk.Control.Request; using NewRock.Sdk.Transfer.Connect.Request; using NewRock.Sdk.Transfer.Queue.Request; using CallCenter.Share.Dtos; using NewRock.Sdk; using CallCenter.Devices; using Microsoft.Extensions.Options; using CallCenter.Caches; using CallCenter.Repository.SqlSugar; namespace CallCenter.Application.Handlers { public class BaseHandler { private readonly INewRockClient _newRockClient; private readonly IOptionsSnapshot _options; private readonly ICallCacheManager _callCacheManager; private readonly ICallRepository _callRepository; public BaseHandler(INewRockClient newRockClient, IOptionsSnapshot options,ICallCacheManager callCacheManager, ICallRepository callRepository) { _newRockClient = newRockClient; _options = options; _callCacheManager = callCacheManager; _callRepository = callRepository; } public async Task HandlerIvr(IvrAnswer? runResult,Call model,CancellationToken cancellationToken) { if (runResult != null) { var ivrAnswer = runResult; switch (ivrAnswer.IvrAnswerType) { case EIvrAnswerType.Voice: var tomenuId = ivrAnswer.Content; switch (model?.CallType) { case ECallType.ExtToOuter: await _newRockClient.OuterToMenu(new OuterToMenuRequest() { Attribute = "Connect", Menu = new OuterToMenuMenu() { Id = tomenuId }, Outer = new OuterToMenuOuter() { Id = model.ConversationId }, //VoiceFile = string.IsNullOrEmpty(ivrAnswer.PreVoice) ? "" : ivrAnswer.PreVoice, }, _options.Value.ReceiveKey, _options.Value.Expired, cancellationToken); break; case ECallType.VisitorCallIn: await _newRockClient.VisitorToMenu(new VisitorToMenuRequest() { Attribute = "Connect", Menu = new VisitorToMenuMenu() { Id = tomenuId }, Visitor = new VisitorToMenuVisitor() { Id = model.ConversationId }, //VoiceFile = string.IsNullOrEmpty(ivrAnswer.PreVoice) ? "" : ivrAnswer.PreVoice, }, _options.Value.ReceiveKey, _options.Value.Expired, cancellationToken); break; default: throw new ArgumentOutOfRangeException(); } break; case EIvrAnswerType.Tel: var telNo = ivrAnswer.Content; switch (model.CallType) { case ECallType.VisitorCallIn: //await _newRockClient.VisitorToExt(new VisitorToExtRequest() //{ // Attribute = "Connect", // Ext = new VisitorToExtExt() { Id = telNo }, // VoiceFile = string.IsNullOrEmpty(ivrAnswer.PreVoice) ? "" : ivrAnswer.PreVoice, // AutoAnswer = "", //}, _options.Value.ReceiveKey, _options.Value.Expired, cancellationToken); //来电去队列 await _newRockClient.VisitorToExtQueue(new VisitorToExtQueueRequest() { Attribute = "Queue", Ext = new VisitorToExtQueueExt() { Id = telNo }, Visitor = new VisitorToExtQueueVisitor() { Id = model.ConversationId } }, _options.Value.ReceiveKey, _options.Value.Expired, cancellationToken); break; case ECallType.ExtToOuter: await _newRockClient.OuterToExt(new OuterToExtRequest() { Attribute = "Connect", Ext = new OuterToExtExt() { Id = telNo }, Outer = new OuterToExtOuter() { Id = model.ConversationId } }, _options.Value.ReceiveKey, _options.Value.Expired, cancellationToken); break; default: throw new ArgumentOutOfRangeException(); } break; case EIvrAnswerType.TelGroup: var groupId = ivrAnswer.Content; if (model.InIvrTime!=null) { model.OutIvrTime = DateTime.Now; } model.InGroupTime = DateTime.Now; await _callRepository.UpdateAsync(model,cancellationToken); await _newRockClient.VisitorToGroupQueue(new VisitorToGroupQueueRequest() { Attribute = "Queue", Group = new VisitorToGroupQueueGroup() { Id = groupId }, Visitor = new VisitorToGroupQueueVisitor() { Id = model.ConversationId } }, _options.Value.ReceiveKey, _options.Value.Expired, cancellationToken); //处理队列记录 TODO //_callCacheManager.AddCallCache(model); break; case EIvrAnswerType.Out: var phoneNo = ivrAnswer.Content; switch (model.CallType) { case ECallType.VisitorCallIn: await _newRockClient.VisitorToOuter(new VisitorToOuterRequest() { Attribute = "Connect", Visitor = new VisitorToOuterVisitor() { Id = model.ConversationId }, Outer = new VisitorToOuterOuter() { To = phoneNo, //TODO DISPLAY属性待定 } }, _options.Value.ReceiveKey, _options.Value.Expired, cancellationToken); break; case ECallType.ExtToOuter: await _newRockClient.OuterToOuter(new OuterToOuterRequest() { Attribute = "Connect", Outer = new List(){ new(){Id = model.ConversationId}, new(){To = phoneNo}, } }, _options.Value.ReceiveKey, _options.Value.Expired, cancellationToken); break; default: throw new ArgumentOutOfRangeException(); } break; case EIvrAnswerType.HangUp: var id = ivrAnswer.Content; switch (model?.CallType) { case ECallType.VisitorCallIn: await _newRockClient.ClearCall(new ClearCallRequest() { Attribute = "Clear", Visitor = new ClearCallVisitor() { Id = model.ConversationId }, }, _options.Value.ReceiveKey, _options.Value.Expired, cancellationToken); break; case ECallType.ExtToOuter: await _newRockClient.ClearCall(new ClearCallRequest() { Attribute = "Clear", Outer = new ClearCallOuter() { Id = model.ConversationId }, }, _options.Value.ReceiveKey, _options.Value.Expired, cancellationToken); break; } break; default: throw new ArgumentOutOfRangeException(); } } } } }