NewRockBaseHandler.cs 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. using Hotline.Caching.Interfaces;
  2. using Hotline.CallCenter.Calls;
  3. using Hotline.CallCenter.Configs;
  4. using Hotline.EventBus;
  5. using Hotline.Realtimes;
  6. using Hotline.Share.Dtos.CallCenter;
  7. using Hotline.Share.Enums.CallCenter;
  8. using Microsoft.Extensions.Options;
  9. using NewRock.Sdk;
  10. using NewRock.Sdk.Control.Request;
  11. using NewRock.Sdk.Transfer.Connect.Request;
  12. using NewRock.Sdk.Transfer.Queue.Request;
  13. namespace Hotline.Application.Handlers.CallCenter
  14. {
  15. [HandlerInject(Labels =)]
  16. public class NewRockBaseHandler
  17. {
  18. private readonly INewRockClient _newRockClient;
  19. private readonly IOptionsSnapshot<CallCenterConfiguration> _options;
  20. private readonly ICallRepository _callRepository;
  21. private readonly ICallCacheManager _callCacheManager;
  22. private readonly IRealtimeService _realtimeService;
  23. public NewRockBaseHandler(
  24. INewRockClient newRockClient,
  25. IOptionsSnapshot<CallCenterConfiguration> options,
  26. ICallRepository callRepository,
  27. ICallCacheManager callCacheManager,
  28. IRealtimeService realtimeService)
  29. {
  30. _newRockClient = newRockClient;
  31. _options = options;
  32. _callRepository = callRepository;
  33. _callCacheManager = callCacheManager;
  34. _realtimeService = realtimeService;
  35. }
  36. public async Task HandlerIvr(IvrAnswer? runResult, Call model, CancellationToken cancellationToken)
  37. {
  38. if (runResult != null)
  39. {
  40. var ivrAnswer = runResult;
  41. switch (ivrAnswer.IvrAnswerType)
  42. {
  43. case EIvrAnswerType.Voice:
  44. var tomenuId = ivrAnswer.Content;
  45. switch (model?.CallType)
  46. {
  47. case ECallType.ExtToOuter:
  48. await _newRockClient.OuterToMenu(new OuterToMenuRequest()
  49. {
  50. Attribute = "Connect",
  51. Menu = new OuterToMenuMenu() { Id = tomenuId },
  52. Outer = new OuterToMenuOuter() { Id = model.ConversationId },
  53. //VoiceFile = string.IsNullOrEmpty(ivrAnswer.PreVoice) ? "" : ivrAnswer.PreVoice,
  54. }, _options.Value.NewRock.ReceiveKey, _options.Value.NewRock.Expired, cancellationToken);
  55. break;
  56. case ECallType.VisitorCallIn:
  57. await _newRockClient.VisitorToMenu(new VisitorToMenuRequest()
  58. {
  59. Attribute = "Connect",
  60. Menu = new VisitorToMenuMenu() { Id = tomenuId },
  61. Visitor = new VisitorToMenuVisitor() { Id = model.ConversationId },
  62. //VoiceFile = string.IsNullOrEmpty(ivrAnswer.PreVoice) ? "" : ivrAnswer.PreVoice,
  63. }, _options.Value.NewRock.ReceiveKey, _options.Value.NewRock.Expired, cancellationToken);
  64. break;
  65. default:
  66. throw new ArgumentOutOfRangeException();
  67. }
  68. break;
  69. case EIvrAnswerType.Tel:
  70. var telNo = ivrAnswer.Content;
  71. switch (model.CallType)
  72. {
  73. case ECallType.VisitorCallIn:
  74. //await _newRockClient.VisitorToExt(new VisitorToExtRequest()
  75. //{
  76. // Attribute = "Connect",
  77. // Ext = new VisitorToExtExt() { Id = telNo },
  78. // VoiceFile = string.IsNullOrEmpty(ivrAnswer.PreVoice) ? "" : ivrAnswer.PreVoice,
  79. // AutoAnswer = "",
  80. //}, _options.Value.ReceiveKey, _options.Value.Expired, cancellationToken);
  81. //来电去队列
  82. await _newRockClient.VisitorToExtQueue(new VisitorToExtQueueRequest()
  83. {
  84. Attribute = "Queue",
  85. Ext = new VisitorToExtQueueExt() { Id = telNo },
  86. Visitor = new VisitorToExtQueueVisitor() { Id = model.ConversationId }
  87. }, _options.Value.NewRock.ReceiveKey, _options.Value.NewRock.Expired, cancellationToken);
  88. break;
  89. case ECallType.ExtToOuter:
  90. await _newRockClient.OuterToExt(new OuterToExtRequest()
  91. {
  92. Attribute = "Connect",
  93. Ext = new OuterToExtExt() { Id = telNo },
  94. Outer = new OuterToExtOuter() { Id = model.ConversationId }
  95. }, _options.Value.NewRock.ReceiveKey, _options.Value.NewRock.Expired, cancellationToken);
  96. break;
  97. default:
  98. throw new ArgumentOutOfRangeException();
  99. }
  100. break;
  101. case EIvrAnswerType.TelGroup:
  102. var groupId = ivrAnswer.Content;
  103. model.InQueueTime= DateTime.Now;
  104. await _callRepository.UpdateAsync(model);
  105. await _newRockClient.VisitorToGroupQueue(new VisitorToGroupQueueRequest()
  106. {
  107. Attribute = "Queue",
  108. Group = new VisitorToGroupQueueGroup() { Id = groupId },
  109. Visitor = new VisitorToGroupQueueVisitor() { Id = model.ConversationId }
  110. }, _options.Value.NewRock.ReceiveKey, _options.Value.NewRock.Expired, cancellationToken);
  111. //处理队列记录
  112. _callCacheManager.AddCallCache(model);
  113. await _realtimeService.CallQueueAsync(_callCacheManager.GetCallQueueList(), cancellationToken);
  114. break;
  115. case EIvrAnswerType.Out:
  116. var phoneNo = ivrAnswer.Content;
  117. switch (model.CallType)
  118. {
  119. case ECallType.VisitorCallIn:
  120. await _newRockClient.VisitorToOuter(new VisitorToOuterRequest()
  121. {
  122. Attribute = "Connect",
  123. Visitor = new VisitorToOuterVisitor() { Id = model.ConversationId },
  124. Outer = new VisitorToOuterOuter()
  125. {
  126. To = phoneNo,
  127. //TODO DISPLAY属性待定
  128. }
  129. },
  130. _options.Value.NewRock.ReceiveKey, _options.Value.NewRock.Expired, cancellationToken);
  131. break;
  132. case ECallType.ExtToOuter:
  133. await _newRockClient.OuterToOuter(new OuterToOuterRequest()
  134. {
  135. Attribute = "Connect",
  136. Outer = new List<OuterToOuterOuterModel>(){
  137. new(){Id = model.ConversationId},
  138. new(){To = phoneNo},
  139. }
  140. }, _options.Value.NewRock.ReceiveKey, _options.Value.NewRock.Expired, cancellationToken);
  141. break;
  142. default:
  143. throw new ArgumentOutOfRangeException();
  144. }
  145. break;
  146. case EIvrAnswerType.HangUp:
  147. var id = ivrAnswer.Content;
  148. switch (model?.CallType)
  149. {
  150. case ECallType.VisitorCallIn:
  151. await _newRockClient.ClearCall(new ClearCallRequest()
  152. {
  153. Attribute = "Clear",
  154. Visitor = new ClearCallVisitor() { Id = model.ConversationId },
  155. }, _options.Value.NewRock.ReceiveKey, _options.Value.NewRock.Expired, cancellationToken);
  156. break;
  157. case ECallType.ExtToOuter:
  158. await _newRockClient.ClearCall(new ClearCallRequest()
  159. {
  160. Attribute = "Clear",
  161. Outer = new ClearCallOuter() { Id = model.ConversationId },
  162. }, _options.Value.NewRock.ReceiveKey, _options.Value.NewRock.Expired, cancellationToken);
  163. break;
  164. }
  165. break;
  166. default:
  167. throw new ArgumentOutOfRangeException();
  168. }
  169. }
  170. }
  171. }
  172. }