CallDomainService.cs 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. using Hotline.CallCenter.Configs;
  2. using Hotline.CallCenter.Devices;
  3. using Hotline.Share.Requests;
  4. using Microsoft.Extensions.Options;
  5. using XF.Domain.Dependency;
  6. namespace Hotline.CallCenter.Calls
  7. {
  8. public class CallDomainService : ICallDomainService, IScopeDependency
  9. {
  10. private readonly IDeviceManager _deviceManager;
  11. private readonly ICallRepository _callRepository;
  12. private readonly ICallDetailRepository _callDetailRepository;
  13. private readonly IOptionsSnapshot<CallCenterConfiguration> _options;
  14. public CallDomainService(
  15. IDeviceManager deviceManager,
  16. ICallRepository callRepository,
  17. ICallDetailRepository callDetailRepository,
  18. IOptionsSnapshot<CallCenterConfiguration> options)
  19. {
  20. _deviceManager = deviceManager;
  21. _callRepository = callRepository;
  22. _callDetailRepository = callDetailRepository;
  23. _options = options;
  24. }
  25. #region 来电
  26. /// <summary>
  27. /// 来电转分机
  28. /// </summary>
  29. /// <returns></returns>
  30. public async Task VisitorToTelAsync(VisitorIdToTelRequest request, CancellationToken cancellationToken)
  31. {
  32. ////调用设备拨打电话
  33. //await _deviceManager.VisitorToExtAsync(request.VisitorId, request.ToExtId, cancellationToken);
  34. //var model = await _callRepository.GetAsync(x =>
  35. // x.CallType == ECallType.VisitorToExt && x.ConversationId == request.VisitorId &&
  36. // x.ToNo == request.ToExtId && x.CallStatus != ECallStatus.Bye && x.CallStatus != ECallStatus.Failed, cancellationToken);
  37. //if (model != null)
  38. //{
  39. // model.CallStatus = ECallStatus.PreIncoming;
  40. // model.Modified();
  41. // await _callRepository.UpdateAsync(model, cancellationToken);
  42. //}
  43. //else
  44. //{
  45. // model = new Call()
  46. // {
  47. // CallStatus = ECallStatus.PreIncoming,
  48. // CallDirection = ECallDirection.In,
  49. // ConversationId = request.VisitorId,
  50. // CallType = ECallType.VisitorToExt,
  51. // ToNo = request.ToExtId,
  52. // };
  53. // model.Modified();
  54. // await _callRepository.AddAsync(model, cancellationToken);
  55. //}
  56. }
  57. /// <summary>
  58. /// 来电转外线
  59. /// </summary>
  60. /// <param name="request"></param>
  61. /// <param name="cancellationToken"></param>
  62. /// <returns></returns>
  63. public async Task VisitorToOuterAsync(VisitorToOuterRequest request, CancellationToken cancellationToken)
  64. {
  65. //调用设备接口转外线
  66. await _deviceManager.VisitorToOuterAsync(_options.Value.NewRock, request.VisitorId, request.OuterPhoneNum, cancellationToken);
  67. //TODO 写入数据库通话记录
  68. }
  69. /// <summary>
  70. /// 来电转IVR
  71. /// </summary>
  72. /// <param name="request"></param>
  73. /// <param name="cancellationToken"></param>
  74. /// <returns></returns>
  75. public async Task VisitorToIvrAsync(VisitorToIvrRequest request, CancellationToken cancellationToken)
  76. {
  77. //调用设备接口转语音菜单
  78. await _deviceManager.VisitorToMenuAsync(_options.Value.NewRock, request.VisitorId, request.MenuId, cancellationToken);
  79. //TODO 写入数据库通话记录
  80. }
  81. /// <summary>
  82. /// 来电转分机组
  83. /// </summary>
  84. /// <param name="request"></param>
  85. /// <param name="cancellationToken"></param>
  86. /// <returns></returns>
  87. public async Task VisitorToTelGroupAsync(VisitorToTelGroupRequest request, CancellationToken cancellationToken)
  88. {
  89. await _deviceManager.VisitorToGroupAsync(_options.Value.NewRock, request.VisitorId, request.GroupId, cancellationToken);
  90. //TODO 写入数据库通话记录
  91. }
  92. #endregion
  93. #region 去电
  94. /// <summary>
  95. /// 分机呼外部电话
  96. /// </summary>
  97. /// <param name="request"></param>
  98. /// <param name="cancellationToken"></param>
  99. /// <returns></returns>
  100. public async Task ExtToOuterAsync(ExtToOuterRequest request,CancellationToken cancellationToken)
  101. {
  102. //var callModel = new Call()
  103. //{
  104. // CallStatus = ECallStatus.ExtOuterReady,
  105. // CallDirection = ECallDirection.Out,
  106. // CallType = ECallType.ExtToOuter,
  107. // FromNo = request.ExtId,
  108. // ToNo = request.OuterPhoneNum,
  109. //};
  110. //callModel.Modified();
  111. //var callId = await _callRepository.AddAsync(callModel, cancellationToken);
  112. ////写入明细
  113. //var detail = new CallDetail()
  114. //{
  115. // CallId = callId,
  116. // CallStatus = ECallStatus.ExtOuterReady,
  117. // EventName = "ExtOuterReady", //去电
  118. //};
  119. //await _callDetailRepository.AddAsync(detail, cancellationToken);
  120. //调用设备拨打电话
  121. await _deviceManager.ExtToOuterAsync(_options.Value.NewRock, request.ExtId, request.OuterPhoneNum, cancellationToken);
  122. }
  123. #endregion
  124. #region 来电受理
  125. /// <summary>
  126. /// 来电受理
  127. /// </summary>
  128. /// <param name="request"></param>
  129. /// <param name="cancellationToken"></param>
  130. /// <returns></returns>
  131. public async Task AcceptVisitorAsync(AcceptVisitorRequest request, CancellationToken cancellationToken)
  132. {
  133. //调用设备受理
  134. await _deviceManager.AcceptVisitorAsync(_options.Value.NewRock, request.VisitorId, cancellationToken);
  135. }
  136. #endregion
  137. #region 监听和插播
  138. /// <summary>
  139. /// 监听分机
  140. /// </summary>
  141. /// <param name="request"></param>
  142. /// <param name="cancellationToken"></param>
  143. /// <returns></returns>
  144. public async Task MonitorExt(MonitorExtRequest request,CancellationToken cancellationToken)
  145. {
  146. await _deviceManager.MonitorExtAsync(_options.Value.NewRock, request.firstTelNo, request.secondTelNo, cancellationToken);
  147. }
  148. /// <summary>
  149. /// 从监听到插播状态变换
  150. /// 1. 已知:分机 A 在监听分机 B 与其通话方的通话;
  151. /// 2. 执行分机 A 的从监听到插播状态变换的 API;
  152. /// 3. 执行成功时,分机 A 与分机 B 建立通话,分机 B 的原通话方听保持音。
  153. /// </summary>
  154. /// <param name="request"></param>
  155. /// <param name="cancellationToken"></param>
  156. /// <returns></returns>
  157. public async Task MonitorExtToTalk(MonitorExtToTalkRequest request,CancellationToken cancellationToken)
  158. {
  159. await _deviceManager.MonitorExtToTalkAsync(_options.Value.NewRock, request.telNo, cancellationToken);
  160. }
  161. /// <summary>
  162. /// 从插播到监听状态变换
  163. /// 1. 已知:分机 A 在插播分机 B 的通话;
  164. /// 2. 执行分机 A 的从插播到监听状态变换的 API;
  165. /// 3. 执行成功时,分机 A 监听分机 B 及其原通话方的通话。
  166. /// </summary>
  167. /// <param name="request"></param>
  168. /// <param name="cancellationToken"></param>
  169. /// <returns></returns>
  170. public async Task MonitorExtToListen(MonitorExtToListenRequest request,CancellationToken cancellationToken)
  171. {
  172. await _deviceManager.MonitorExtToListenAsync(_options.Value.NewRock, request.telNo, cancellationToken);
  173. }
  174. #endregion
  175. #region 强插
  176. /// <summary>
  177. /// 强插
  178. /// 1. 已知:分机 A 当前空闲,分机 B 正在通话中;
  179. /// 2. 执行分机 A 强插分机 B 的 API;
  180. /// 3. 执行成功时,分机 A 振铃,摘机后即可形成三方通话。
  181. /// </summary>
  182. /// <param name="request"></param>
  183. /// <param name="cancellationToken"></param>
  184. /// <returns></returns>
  185. public async Task BargeinExt(BargeinExtRequest request,CancellationToken cancellationToken)
  186. {
  187. await _deviceManager.BargeinExtAsync(_options.Value.NewRock, request.firstTelNo, request.secondTelNo, cancellationToken);
  188. }
  189. #endregion
  190. }
  191. }