NewRockDeviceManager.cs 42 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036
  1. using Hotline.CallCenter.Calls;
  2. using Hotline.CallCenter.Tels;
  3. using MapsterMapper;
  4. using Microsoft.Extensions.Options;
  5. using NewRock.Sdk;
  6. using NewRock.Sdk.Accept.Request;
  7. using NewRock.Sdk.Control.Request;
  8. using NewRock.Sdk.Control.Request.Base;
  9. using NewRock.Sdk.Manage.Request;
  10. using NewRock.Sdk.Transfer.Conference.Request;
  11. using NewRock.Sdk.Transfer.Connect.Request;
  12. using NewRock.Sdk.Transfer.Queue.Request;
  13. using NewRock.Sdk.Control.Response;
  14. using System.Text.RegularExpressions;
  15. using XF.Domain.Dependency;
  16. using XF.Domain.Exceptions;
  17. using Hotline.Share.Dtos.CallCenter;
  18. using Hotline.Share.Enums.CallCenter;
  19. using Hotline.Caching.Interfaces;
  20. using Hotline.CallCenter.Configs;
  21. using Hotline.CallCenter.Devices;
  22. using Group = NewRock.Sdk.Control.Request.Group;
  23. namespace Hotline.NewRock
  24. {
  25. public class NewRockDeviceManager : INewRockDeviceManager
  26. {
  27. private readonly INewRockClient _newRockClient;
  28. private readonly ICallRepository _callRepository;
  29. //private readonly IOptionsSnapshot<CallCenterConfiguration> _options;
  30. private readonly IMapper _mapper;
  31. private readonly ITelGroupRepository _telGroupRepository;
  32. private readonly IUserCacheManager _userCacheManager;
  33. private readonly ITelRestRepository _telRestRepository;
  34. private readonly ITelCacheManager _telCacheManager;
  35. public NewRockDeviceManager(
  36. INewRockClient newRockClient,
  37. //IOptionsSnapshot<CallCenterConfiguration> options,
  38. IMapper mapper,
  39. ICallRepository callRepository,
  40. ITelGroupRepository telGroupRepository,
  41. IUserCacheManager userCacheManager,
  42. ITelRestRepository telRestRepository,
  43. ITelCacheManager telCacheManager)
  44. {
  45. _newRockClient = newRockClient;
  46. //_options = options;
  47. _mapper = mapper;
  48. _callRepository = callRepository;
  49. _telGroupRepository = telGroupRepository;
  50. _userCacheManager = userCacheManager;
  51. _telRestRepository = telRestRepository;
  52. _telCacheManager = telCacheManager;
  53. }
  54. #region 查询
  55. public async Task<TelDto> QueryTelAsync(NewRockConfiguration newRockConfiguration, string TelNo, CancellationToken cancellationToken)
  56. {
  57. try
  58. {
  59. var result = await _newRockClient.QueryExt(
  60. new QueryExtRequest() { Attribute = "Query", Ext = new Ext { Id = TelNo } },
  61. newRockConfiguration.ReceiveKey, newRockConfiguration.Expired, cancellationToken);
  62. if (result?.Ext.Outer != null)
  63. {
  64. var telDto = new TelDto();
  65. telDto.CPN = result.Ext.Outer.From;
  66. telDto.CDPN = result.Ext.Outer.To;
  67. telDto.TelStatusInfo = ETelStatusInfo.Out;
  68. telDto.ConversationId = result.Ext.Outer.Id;
  69. if (result.Ext.Outer.State == "talk")
  70. {
  71. telDto.TelStatus = Share.Enums.CallCenter.ETelStatus.Talk;
  72. return telDto;
  73. }
  74. else if (result.Ext.Outer.State == "wait")
  75. {
  76. telDto.TelStatus = Share.Enums.CallCenter.ETelStatus.Wait;
  77. }
  78. return telDto;
  79. }
  80. if (result?.Ext.Visitor != null)
  81. {
  82. var telDto = new TelDto();
  83. telDto.CPN = result.Ext.Visitor.From;
  84. telDto.CDPN = result.Ext.Visitor.To;
  85. telDto.TelStatusInfo = ETelStatusInfo.Into;
  86. telDto.ConversationId = result.Ext.Visitor.Id;
  87. if (result.Ext.Visitor.State == "talk")
  88. {
  89. telDto.TelStatus = Share.Enums.CallCenter.ETelStatus.Talk;
  90. return telDto;
  91. }
  92. else if (result.Ext.Visitor.State == "wait")
  93. {
  94. telDto.TelStatus = Share.Enums.CallCenter.ETelStatus.Wait;
  95. }
  96. return telDto;
  97. }
  98. if (result?.Ext.Ext != null)
  99. {
  100. var telDto = new TelDto();
  101. telDto.CPN = result.Ext.Ext.Id;
  102. telDto.CDPN = result.Ext.Id;
  103. telDto.TelStatusInfo = ETelStatusInfo.Ext;
  104. if (result.Ext.Ext.State == "talk")
  105. {
  106. telDto.TelStatus = Share.Enums.CallCenter.ETelStatus.Talk;
  107. return telDto;
  108. }
  109. else if (result.Ext.Ext.State == "wait")
  110. {
  111. telDto.TelStatus = Share.Enums.CallCenter.ETelStatus.Wait;
  112. }
  113. return telDto;
  114. }
  115. return null;
  116. }
  117. catch
  118. {
  119. return null;
  120. }
  121. }
  122. /// <summary>
  123. /// 查询分机状态
  124. /// </summary>
  125. /// <param name="TelNo"></param>
  126. /// <param name="cancellationToken"></param>
  127. /// <returns></returns>
  128. public async Task<ETelStatus> QueryTelState(NewRockConfiguration newRockConfiguration, string TelNo, CancellationToken cancellationToken)
  129. {
  130. var result = await _newRockClient.QueryExt(
  131. new QueryExtRequest() { Attribute = "Query", Ext = new Ext { Id = TelNo } },
  132. newRockConfiguration.ReceiveKey, newRockConfiguration.Expired, cancellationToken);
  133. switch (result.Ext.State)
  134. {
  135. case "ready":
  136. return ETelStatus.Ready;
  137. case "active":
  138. return ETelStatus.Active;
  139. case "progress":
  140. return ETelStatus.Progress;
  141. case "offline":
  142. return ETelStatus.Offline;
  143. case "offhook":
  144. return ETelStatus.Offhook;
  145. default:
  146. break;
  147. }
  148. return ETelStatus.Offline;
  149. }
  150. /// <summary>
  151. /// 查询所有分机
  152. /// </summary>
  153. /// <param name="cancellationToken"></param>
  154. /// <returns></returns>
  155. public async Task<List<Tel>> QueryTelsAsync(NewRockConfiguration newRockConfiguration, CancellationToken cancellationToken)
  156. {
  157. var result = await _newRockClient.QueryDeviceInfo(
  158. new QueryDeviceInfoRequest { Attribute = "Query", DeviceInfo = string.Empty },
  159. newRockConfiguration.ReceiveKey,
  160. newRockConfiguration.Expired,
  161. cancellationToken);
  162. var exts = result.Devices.Ext;
  163. return _mapper.Map<List<Tel>>(exts);
  164. }
  165. /// <summary>
  166. /// 查询所有分机组
  167. /// </summary>
  168. /// <param name="cancellationToken"></param>
  169. /// <returns></returns>
  170. public async Task<List<TelGroup>> QueryTelGroupsAsync(NewRockConfiguration newRockConfiguration, CancellationToken cancellationToken)
  171. {
  172. var result = await _newRockClient.QueryDeviceInfo(
  173. new QueryDeviceInfoRequest { Attribute = "Query", DeviceInfo = string.Empty },
  174. newRockConfiguration.ReceiveKey,
  175. newRockConfiguration.Expired,
  176. cancellationToken);
  177. var groups = result.Devices.Group;
  178. return _mapper.Map<List<TelGroup>>(groups);
  179. }
  180. /// <summary>
  181. /// 查询语音文件
  182. /// </summary>
  183. /// <param name="cancellationToken"></param>
  184. /// <returns></returns>
  185. public async Task<string> VoiceQueryListAsync(NewRockConfiguration newRockConfiguration, CancellationToken cancellationToken)
  186. {
  187. var result = await _newRockClient.VoiceQueryList(new VoiceQueryListRequest()
  188. {
  189. Attribute = "Query",
  190. VoiceFile = "",
  191. }, newRockConfiguration.ReceiveKey,
  192. newRockConfiguration.Expired,
  193. cancellationToken);
  194. return result?.VoiceFile;
  195. }
  196. public async Task QueryGroupAsync(NewRockConfiguration newRockConfiguration, string groupId, CancellationToken cancellationToken)
  197. {
  198. await _newRockClient.QueryExtGroup(new QueryExtGroupRequest()
  199. { Attribute = "Query", Group = new QueryExtGroup() { Id = groupId } },
  200. newRockConfiguration.ReceiveKey,
  201. newRockConfiguration.Expired,
  202. cancellationToken
  203. );
  204. }
  205. #endregion
  206. #region 配置
  207. /// <summary>
  208. /// 分机休息
  209. /// </summary>
  210. /// <param name="telNo">分机号</param>
  211. /// <param name="cancellationToken"></param>
  212. /// <returns></returns>
  213. public async Task TelRestAsync(NewRockConfiguration newRockConfiguration, string telNo, CancellationToken cancellationToken)
  214. {
  215. var telModel = await _newRockClient.QueryExt(new QueryExtRequest()
  216. {
  217. Attribute = "Query",
  218. Ext = new Ext() { Id = telNo }
  219. }, newRockConfiguration.ReceiveKey,
  220. newRockConfiguration.Expired,
  221. cancellationToken);
  222. if (telModel == null)
  223. throw new UserFriendlyException("未知分机");
  224. await _newRockClient.ConfigExt(
  225. new AssginConfigExtRequest() { Attribute = "Assign", Ext = new ConfigExt() { Lineid = telModel.Ext.LineId, Groups=Enumerable.Select<QueryExtGroup, string>(telModel.Ext.Group, x=>x.Id).ToList(), No_Disturb = "On" } },
  226. newRockConfiguration.ReceiveKey,
  227. newRockConfiguration.Expired,
  228. cancellationToken);
  229. }
  230. /// <summary>
  231. /// 分机结束休息
  232. /// </summary>
  233. /// <param name="telNo">分机号</param>
  234. /// <param name="cancellationToken"></param>
  235. /// <returns></returns>
  236. public async Task TelEndRestAsync(NewRockConfiguration newRockConfiguration, string telNo, CancellationToken cancellationToken)
  237. {
  238. var telModel = await _newRockClient.QueryExt(new QueryExtRequest()
  239. {
  240. Attribute = "Query",
  241. Ext = new Ext() { Id = telNo }
  242. }, newRockConfiguration.ReceiveKey,
  243. newRockConfiguration.Expired,
  244. cancellationToken);
  245. if (telModel == null)
  246. throw new UserFriendlyException("未知分机");
  247. await _newRockClient.ConfigExt(
  248. new AssginConfigExtRequest() { Attribute = "Assign", Ext = new ConfigExt() { Lineid = telModel.Ext.LineId, Groups = Enumerable.Select<QueryExtGroup, string>(telModel.Ext.Group, x => x.Id).ToList(), No_Disturb = "Off" } },
  249. newRockConfiguration.ReceiveKey,
  250. newRockConfiguration.Expired,
  251. cancellationToken);
  252. }
  253. /// <summary>
  254. /// 删除语音文件
  255. /// </summary>
  256. /// <param name="voiceName"></param>
  257. /// <param name="cancellationToken"></param>
  258. /// <returns></returns>
  259. public async Task RemoveVoiceFileAsync(NewRockConfiguration newRockConfiguration, string voiceName, CancellationToken cancellationToken)
  260. {
  261. await _newRockClient.RemoveVoiceFile(new RemoveVoiceFileRequest()
  262. {
  263. Attribute = "Remove",
  264. VoiceFile = voiceName
  265. }, newRockConfiguration.ReceiveKey,
  266. newRockConfiguration.Expired,
  267. cancellationToken);
  268. }
  269. /// <summary>
  270. /// 配置语音菜单
  271. /// </summary>
  272. /// <param name="menuId"></param>
  273. /// <param name="voiceFile"></param>
  274. /// <param name="repeat"></param>
  275. /// <param name="infoLength"></param>
  276. /// <param name="exit"></param>
  277. /// <param name="cancellationToken"></param>
  278. /// <returns></returns>
  279. public async Task AssginConfigMenuAsync(NewRockConfiguration newRockConfiguration, string menuId, string voiceFile, string repeat, string infoLength,
  280. string exit,
  281. CancellationToken cancellationToken)
  282. {
  283. if (!int.TryParse(menuId, out int mId))
  284. throw new UserFriendlyException("请输入数字");
  285. if (mId < 1 || mId > 50)
  286. throw new UserFriendlyException("菜单只允许在1-50范围内");
  287. if (exit!="")
  288. {
  289. Regex r = new Regex(@"^[a-d]|[A-D]|[1-9]|[*]|[#]$");
  290. if (!r.IsMatch(exit))
  291. throw new UserFriendlyException("输入指令不合法,合法值:A-D、1-9、*、#");
  292. }
  293. var resp = await _newRockClient.ConfigMenu(new AssginConfigMenuRequest()
  294. {
  295. Attribute = "Assign",
  296. Menu = new AssginConfigMenuMenu()
  297. {
  298. Id = menuId,
  299. VoiceFile = voiceFile,
  300. InfoLength = infoLength,
  301. Exit = exit,
  302. Repeat = repeat,
  303. }
  304. }, newRockConfiguration.ReceiveKey,
  305. newRockConfiguration.Expired,
  306. cancellationToken);
  307. }
  308. /// <summary>
  309. /// 配置分机组
  310. /// </summary>
  311. /// <param name="groupId"></param>
  312. /// <param name="voiceFile"></param>
  313. /// <param name="distribution"></param>
  314. /// <param name="ext"></param>
  315. /// <param name="cancellationToken"></param>
  316. /// <returns></returns>
  317. public async Task AssginConfigGroupAsync(NewRockConfiguration newRockConfiguration, string groupId, EDistribution distribution, List<string> ext, string? voiceFile = "",CancellationToken cancellationToken=default)
  318. {
  319. if (!int.TryParse(groupId, out int mId))
  320. throw new UserFriendlyException("请输入数字");
  321. if (mId < 1 || mId > 50)
  322. throw new UserFriendlyException("分机组只允许在1-50范围内");
  323. var groupModel = new Group()
  324. {
  325. Id = groupId,
  326. Ext = ext,
  327. };
  328. switch (distribution)
  329. {
  330. case EDistribution.Sequential:
  331. groupModel.Distribution = "sequential";
  332. break;
  333. case EDistribution.Group:
  334. groupModel.Distribution = "group";
  335. break;
  336. case EDistribution.Circular:
  337. groupModel.Distribution = "circular";
  338. break;
  339. default:
  340. break;
  341. }
  342. if (!string.IsNullOrEmpty(voiceFile))
  343. groupModel.Voicefile = voiceFile;
  344. var resp = await _newRockClient.ConfigExtGroup(new AssginConfigGroupRequest()
  345. {
  346. Attribute = "Assign",
  347. Group = groupModel
  348. }, newRockConfiguration.ReceiveKey,
  349. newRockConfiguration.Expired,
  350. cancellationToken);
  351. }
  352. /// <summary>
  353. /// 更新分机组
  354. /// </summary>
  355. /// <param name="groupId"></param>
  356. /// <param name="ext"></param>
  357. /// <param name="cancellationToken"></param>
  358. /// <param name="isAdd"></param>
  359. /// <returns></returns>
  360. public async Task ModifyGroupExtAsync(NewRockConfiguration newRockConfiguration, string groupId, EDistribution distribution, string voicefile = "", string extId = "", bool isAdd = true, CancellationToken cancellationToken = default)
  361. {
  362. if (!int.TryParse(groupId, out int mId))
  363. throw new UserFriendlyException("请输入数字");
  364. if (mId < 1 || mId > 50)
  365. throw new UserFriendlyException("分机组只允许在1-50范围内");
  366. #region 清除分机组设置
  367. await _newRockClient.ConfigExtGroup(new AssginConfigGroupRequest() { Attribute = "Assign", Group = new Group() { Id = groupId } }, newRockConfiguration.ReceiveKey, newRockConfiguration.Expired, cancellationToken);
  368. #endregion
  369. var list = await _telGroupRepository.QueryExtAsync(d => d.No == groupId, d => d.Includes(x => x.Tels));
  370. //检查是否上班
  371. List<string> exts = new List<string>();
  372. foreach (var ext in list[0].Tels)
  373. {
  374. var iswork = await _userCacheManager.IsWorkingByTelAsync(ext.No, cancellationToken);
  375. if (iswork)
  376. {
  377. var tel = _telCacheManager.GetTel(ext.No);
  378. if (tel.TelStatus == ETelStatus.Ready)
  379. {
  380. exts.Add(ext.No);
  381. }
  382. }
  383. }
  384. //查询所有正在休息的分机
  385. List<string> restexts = (await _telRestRepository.QueryAsync(x => x.EndTime == null)).Select(x => x.TelNo).ToList();
  386. if (restexts != null && restexts.Count > 0)
  387. {
  388. foreach (var item in restexts)
  389. {
  390. exts.Remove(item);
  391. }
  392. }
  393. //更新
  394. var groupModel = new Group()
  395. {
  396. Id = groupId,
  397. Voicefile = voicefile
  398. };
  399. switch (distribution)
  400. {
  401. case EDistribution.Sequential:
  402. groupModel.Distribution = "sequential";
  403. break;
  404. case EDistribution.Group:
  405. groupModel.Distribution = "group";
  406. break;
  407. case EDistribution.Circular:
  408. groupModel.Distribution = "circular";
  409. break;
  410. default:
  411. break;
  412. }
  413. groupModel.Ext = exts;
  414. await _newRockClient.ConfigExtGroup(
  415. new AssginConfigGroupRequest() { Attribute = "Assign", Group = groupModel, },
  416. newRockConfiguration.ReceiveKey,
  417. newRockConfiguration.Expired,
  418. cancellationToken
  419. );
  420. }
  421. /// <summary>
  422. /// 上班/下班
  423. /// </summary>
  424. /// <param name="telNo"></param>
  425. /// <param name="staffNo"></param>
  426. /// <param name="cancellationToken"></param>
  427. /// <returns></returns>
  428. public async Task UpdateStaffNoAsync(NewRockConfiguration newRockConfiguration, string telNo, string staffNo,string lineId, CancellationToken cancellationToken)
  429. {
  430. var telModel = await _newRockClient.QueryExt(new QueryExtRequest()
  431. {
  432. Attribute = "Query",
  433. Ext = new Ext() { Id = telNo }
  434. }, newRockConfiguration.ReceiveKey,
  435. newRockConfiguration.Expired,
  436. cancellationToken);
  437. if (telModel == null)
  438. throw new UserFriendlyException("未知分机");
  439. await _newRockClient.ConfigExt(
  440. new AssginConfigExtRequest() { Attribute = "Assign", Ext = new ConfigExt() { Id = telNo,Lineid = lineId, Staffid = staffNo } },
  441. newRockConfiguration.ReceiveKey,
  442. newRockConfiguration.Expired,
  443. cancellationToken);
  444. }
  445. #endregion
  446. #region 通话控制
  447. /// <summary>
  448. /// 保持通话
  449. /// </summary>
  450. /// <param name="telNo">分机号</param>
  451. /// <param name="cancellationToken"></param>
  452. /// <returns></returns>
  453. public async Task HoldAsync(NewRockConfiguration newRockConfiguration, string telNo, CancellationToken cancellationToken)
  454. {
  455. await _newRockClient.HoldOrUnHold(
  456. new HoldSetRequest() { Attribute = "Hold", Ext = new Ext() { Id = telNo } }, newRockConfiguration.ReceiveKey,
  457. newRockConfiguration.Expired,
  458. cancellationToken);
  459. }
  460. /// <summary>
  461. /// 恢复通话(解除hold状态)
  462. /// </summary>
  463. /// <param name="telNo">分机号</param>
  464. /// <param name="cancellationToken"></param>
  465. /// <returns></returns>
  466. public async Task UnHoldAsync(NewRockConfiguration newRockConfiguration, string telNo, CancellationToken cancellationToken)
  467. {
  468. await _newRockClient.HoldOrUnHold(
  469. new HoldSetRequest() { Attribute = "Unhold", Ext = new Ext() { Id = telNo } }, newRockConfiguration.ReceiveKey,
  470. newRockConfiguration.Expired,
  471. cancellationToken);
  472. }
  473. /// <summary>
  474. /// 静音开启
  475. /// </summary>
  476. /// <param name="telNo">分机号</param>
  477. /// <param name="cancellationToken"></param>
  478. /// <returns></returns>
  479. public async Task MuteAsync(NewRockConfiguration newRockConfiguration, string telNo, CancellationToken cancellationToken)
  480. {
  481. await _newRockClient.MuteOrUnMute(
  482. new MuteSetRequest() { Attribute = "Mute", Ext = new Ext() { Id = telNo } }, newRockConfiguration.ReceiveKey,
  483. newRockConfiguration.Expired,
  484. cancellationToken);
  485. }
  486. /// <summary>
  487. /// 解除静音
  488. /// </summary>
  489. /// <param name="telNo">分机号</param>
  490. /// <param name="cancellationToken"></param>
  491. /// <returns></returns>
  492. public async Task UnMuteAsync(NewRockConfiguration newRockConfiguration, string telNo, CancellationToken cancellationToken)
  493. {
  494. await _newRockClient.MuteOrUnMute(
  495. new MuteSetRequest() { Attribute = "Unmute", Ext = new Ext() { Id = telNo } },
  496. newRockConfiguration.ReceiveKey,
  497. newRockConfiguration.Expired,
  498. cancellationToken);
  499. }
  500. /// <summary>
  501. /// 强拆分机
  502. /// </summary>
  503. /// <param name="extId"></param>
  504. /// <param name="cancellationToken"></param>
  505. /// <returns></returns>
  506. public async Task ClearExtAsync(NewRockConfiguration newRockConfiguration, string extId, CancellationToken cancellationToken)
  507. {
  508. await _newRockClient.ClearCall(new ClearCallRequest()
  509. {
  510. Attribute = "Clear",
  511. Ext = new Ext()
  512. {
  513. Id = extId
  514. }
  515. }, newRockConfiguration.ReceiveKey,
  516. newRockConfiguration.Expired,
  517. cancellationToken);
  518. }
  519. /// <summary>
  520. /// 强拆来电
  521. /// </summary>
  522. /// <param name="visitorId"></param>
  523. /// <param name="cancellationToken"></param>
  524. /// <returns></returns>
  525. public async Task ClearVisitorAsync(NewRockConfiguration newRockConfiguration, string visitorId, CancellationToken cancellationToken)
  526. {
  527. await _newRockClient.ClearCall(new ClearCallRequest()
  528. {
  529. Attribute = "Clear",
  530. Visitor = new ClearCallVisitor() { Id = visitorId }
  531. }, newRockConfiguration.ReceiveKey,
  532. newRockConfiguration.Expired,
  533. cancellationToken);
  534. }
  535. /// <summary>
  536. /// 强拆去电
  537. /// </summary>
  538. /// <param name="outerId"></param>
  539. /// <param name="cancellationToken"></param>
  540. /// <returns></returns>
  541. public async Task ClearOuterAsync(NewRockConfiguration newRockConfiguration, string outerId, CancellationToken cancellationToken)
  542. {
  543. await _newRockClient.ClearCall(new ClearCallRequest()
  544. {
  545. Attribute = "Clear",
  546. Outer = new ClearCallOuter() { Id = outerId }
  547. }, newRockConfiguration.ReceiveKey,
  548. newRockConfiguration.Expired,
  549. cancellationToken);
  550. }
  551. /// <summary>
  552. /// 来电受理
  553. /// </summary>
  554. /// <param name="visitorId"></param>
  555. /// <param name="cancellationToken"></param>
  556. /// <returns></returns>
  557. public async Task AcceptVisitorAsync(NewRockConfiguration newRockConfiguration, string visitorId, CancellationToken cancellationToken)
  558. {
  559. await _newRockClient.AcceptVisitor(new AcceptVisitorRequest()
  560. {
  561. Attribute = "Accept",
  562. Visitor = new AcceptVisitorModel() { Id = visitorId }
  563. }, newRockConfiguration.ReceiveKey,
  564. newRockConfiguration.Expired,
  565. cancellationToken);
  566. }
  567. #endregion
  568. #region 连接呼叫
  569. /// <summary>
  570. /// 分机呼分机
  571. /// </summary>
  572. /// <param name="from">主叫分机号</param>
  573. /// <param name="to">被叫分机号</param>
  574. /// <param name="cancellationToken"></param>
  575. /// <returns></returns>
  576. public async Task ExtToExtAsync(NewRockConfiguration newRockConfiguration, string from, string to, CancellationToken cancellationToken)
  577. {
  578. await _newRockClient.ExtensionToExtension(
  579. new ExtensionToExtensionRequest()
  580. {
  581. Attribute = "Connect",
  582. Exts = new List<ExtToExtExt>() { new ExtToExtExt() { Id = from }, new ExtToExtExt() { Id = to } }
  583. }, newRockConfiguration.ReceiveKey,
  584. newRockConfiguration.Expired,
  585. cancellationToken);
  586. }
  587. /// <summary>
  588. /// 分机呼外部电话
  589. /// </summary>
  590. /// <param name="from">分机号</param>
  591. /// <param name="to">外部电话,外地电话加拨0</param>
  592. /// <param name="cancellationToken"></param>
  593. /// <param name="trunkid">指定中继线路(可为空),为空时默认由OM分配</param>
  594. /// <returns></returns>
  595. public async Task ExtToOuterAsync(NewRockConfiguration newRockConfiguration, string from, string to, CancellationToken cancellationToken, string trunkid = "")
  596. {
  597. await _newRockClient.ExtToOuter(
  598. new ExtToOuterRequest()
  599. {
  600. Attribute = "Connect",
  601. Ext = new ExtToOuterExtRequest() { Id = from },
  602. Outer = new ExtToOuterOuterRequest() { To = to },
  603. Trunk = new ExtToOuterTrunkRequest() { Id = trunkid }
  604. },
  605. newRockConfiguration.ReceiveKey,
  606. newRockConfiguration.Expired,
  607. cancellationToken);
  608. }
  609. /// <summary>
  610. /// 来电转分机
  611. /// </summary>
  612. /// <param name="visitorId">来电会话ID</param>
  613. /// <param name="telNo">分机号</param>
  614. /// <param name="cancellationToken"></param>
  615. /// <returns></returns>
  616. public async Task VisitorToExtAsync(NewRockConfiguration newRockConfiguration, string visitorId, string telNo, CancellationToken cancellationToken)
  617. {
  618. await _newRockClient.VisitorToExt(new VisitorToExtRequest()
  619. {
  620. Attribute = "Connect",
  621. Visitor = new VisitorToExtVisitor() { Id = visitorId },
  622. Ext = new VisitorToExtExt() { Id = telNo }
  623. }, newRockConfiguration.ReceiveKey,
  624. newRockConfiguration.Expired,
  625. cancellationToken);
  626. }
  627. /// <summary>
  628. /// 来电转外部电话
  629. /// </summary>
  630. /// <param name="visitorId">来电会话ID</param>
  631. /// <param name="outerPhoneNum">外部电话,外地电话加拨0</param>
  632. /// <param name="cancellationToken"></param>
  633. /// <param name="display">来电号码,用来透传主叫号码,使去电方的来电显示号码为实际来电号码。</param>
  634. /// <returns></returns>
  635. public async Task VisitorToOuterAsync(NewRockConfiguration newRockConfiguration, string visitorId, string outerPhoneNum, CancellationToken cancellationToken,
  636. string display = "")
  637. {
  638. await _newRockClient.VisitorToOuter(new VisitorToOuterRequest()
  639. {
  640. Attribute = "Connect",
  641. Visitor = new VisitorToOuterVisitor() { Id = visitorId },
  642. Outer = new VisitorToOuterOuter() { To = outerPhoneNum, Display = display },
  643. }, newRockConfiguration.ReceiveKey,
  644. newRockConfiguration.Expired,
  645. cancellationToken);
  646. }
  647. /// <summary>
  648. /// 来电转语音菜单
  649. /// </summary>
  650. /// <param name="visitorId">来电会话ID</param>
  651. /// <param name="menuId">菜单ID</param>
  652. /// <param name="cancellationToken"></param>
  653. /// <returns></returns>
  654. public async Task VisitorToMenuAsync(NewRockConfiguration newRockConfiguration, string visitorId, string menuId, CancellationToken cancellationToken)
  655. {
  656. await _newRockClient.VisitorToMenu(new VisitorToMenuRequest()
  657. {
  658. Attribute = "Connect",
  659. Visitor = new VisitorToMenuVisitor() { Id = visitorId },
  660. Menu = new VisitorToMenuMenu() { Id = menuId }
  661. }, newRockConfiguration.ReceiveKey,
  662. newRockConfiguration.Expired,
  663. cancellationToken);
  664. }
  665. /// <summary>
  666. /// 来电转分机组
  667. /// </summary>
  668. /// <param name="visitorId"></param>
  669. /// <param name="groupId"></param>
  670. /// <param name="cancellationToken"></param>
  671. /// <returns></returns>
  672. public async Task VisitorToGroupAsync(NewRockConfiguration newRockConfiguration, string visitorId, string groupId, CancellationToken cancellationToken)
  673. {
  674. await _newRockClient.VisitorToGroupQueue(new VisitorToGroupQueueRequest()
  675. {
  676. Attribute = "Queue",
  677. Visitor = new VisitorToGroupQueueVisitor() { Id = visitorId },
  678. Group = new VisitorToGroupQueueGroup() { Id = groupId }
  679. }, newRockConfiguration.ReceiveKey,
  680. newRockConfiguration.Expired,
  681. cancellationToken);
  682. }
  683. /// <summary>
  684. /// 去电转分机
  685. /// </summary>
  686. /// <param name="outerId">去电会话ID</param>
  687. /// <param name="telNo">分机号</param>
  688. /// <param name="cancellationToken"></param>
  689. /// <returns></returns>
  690. public async Task OuterToExtAsync(NewRockConfiguration newRockConfiguration, string outerId, string telNo, CancellationToken cancellationToken)
  691. {
  692. await _newRockClient.OuterToExt(new OuterToExtRequest()
  693. {
  694. Attribute = "Connect",
  695. Outer = new OuterToExtOuter() { Id = outerId },
  696. Ext = new OuterToExtExt() { Id = telNo }
  697. },
  698. newRockConfiguration.ReceiveKey,
  699. newRockConfiguration.Expired,
  700. cancellationToken);
  701. }
  702. /// <summary>
  703. /// 去电转外部电话
  704. /// </summary>
  705. /// <param name="outerId">去电会话ID</param>
  706. /// <param name="outerPhoneNum">外部电话,外地电话加拨0</param>
  707. /// <param name="cancellationToken"></param>
  708. /// <returns></returns>
  709. public async Task OuterToOuterAsync(NewRockConfiguration newRockConfiguration, string outerId, string outerPhoneNum, CancellationToken cancellationToken)
  710. {
  711. await _newRockClient.OuterToOuter(new OuterToOuterRequest()
  712. {
  713. Attribute = "Connect",
  714. Outer = new List<OuterToOuterOuterModel>()
  715. {
  716. new OuterToOuterOuterModel() { Id = outerId },
  717. new OuterToOuterOuterModel() { To = outerPhoneNum }
  718. },
  719. }, newRockConfiguration.ReceiveKey,
  720. newRockConfiguration.Expired,
  721. cancellationToken);
  722. }
  723. /// <summary>
  724. /// 语音菜单呼叫分机
  725. /// </summary>
  726. /// <param name="menuId">语音菜单ID</param>
  727. /// <param name="telNo">分机号</param>
  728. /// <param name="cancellationToken"></param>
  729. /// <returns></returns>
  730. public async Task MenuToExtAsync(NewRockConfiguration newRockConfiguration, string menuId, string telNo, CancellationToken cancellationToken)
  731. {
  732. await _newRockClient.MenuToExt(new MenuToExtRequest()
  733. {
  734. Attribute = "Connect",
  735. Menu = new MenuToExtMenu() { Id = menuId },
  736. Ext = new MenuToExtExt() { Id = telNo }
  737. }, newRockConfiguration.ReceiveKey,
  738. newRockConfiguration.Expired,
  739. cancellationToken);
  740. }
  741. /// <summary>
  742. /// 语音菜单呼外部电话
  743. /// </summary>
  744. /// <param name="menuId">语音菜单ID</param>
  745. /// <param name="outerPhoneNum">外部电话,外地电话加拨0</param>
  746. /// <param name="cancellationToken"></param>
  747. /// <returns></returns>
  748. public async Task MenuToOuterAsync(NewRockConfiguration newRockConfiguration, string menuId, string outerPhoneNum, CancellationToken cancellationToken)
  749. {
  750. await _newRockClient.MenuToOuter(new MenuToOuterRequest()
  751. {
  752. Attribute = "Connect",
  753. Menu = new MenuToOuterMenu() { Id = menuId },
  754. Outer = new MenuToOuterOuter() { To = outerPhoneNum }
  755. }, newRockConfiguration.ReceiveKey,
  756. newRockConfiguration.Expired,
  757. cancellationToken);
  758. }
  759. /// <summary>
  760. /// 双向呼叫(回拨)
  761. /// </summary>
  762. /// <param name="outerOne">主叫外部电话,外地电话加拨0</param>
  763. /// <param name="outerTwo">被叫外部电话,外地电话加拨0</param>
  764. /// <param name="cancellationToken"></param>
  765. /// <returns></returns>
  766. public async Task TwoWayOuterAsync(NewRockConfiguration newRockConfiguration, string outerOne, string outerTwo, CancellationToken cancellationToken)
  767. {
  768. await _newRockClient.TwoWayOuter(new TwoWayOuterRequest()
  769. {
  770. Attribute = "Connect",
  771. Outer = new List<TwoWayOuterOuter>()
  772. {
  773. new TwoWayOuterOuter(){ To = outerOne},
  774. new TwoWayOuterOuter(){ To = outerTwo}
  775. }
  776. }, newRockConfiguration.ReceiveKey,
  777. newRockConfiguration.Expired,
  778. cancellationToken);
  779. }
  780. /// <summary>
  781. /// 语音插播(分机)
  782. /// </summary>
  783. /// <param name="voiceFileName">语音名称</param>
  784. /// <param name="telNo">分机号</param>
  785. /// <param name="cancellationToken"></param>
  786. /// <returns></returns>
  787. public async Task VoiceNewsFlashExtAsync(NewRockConfiguration newRockConfiguration, string voiceFileName, string telNo, CancellationToken cancellationToken)
  788. {
  789. await _newRockClient.VoiceNewsFlash(new VoiceNewsFlashRequest
  790. {
  791. Attribute = "Connect",
  792. VoiceFile = voiceFileName,
  793. Ext = new VoiceNewsFlashExt() { Id = telNo }
  794. }, newRockConfiguration.ReceiveKey,
  795. newRockConfiguration.Expired,
  796. cancellationToken);
  797. }
  798. /// <summary>
  799. /// 语音插播(来电)
  800. /// </summary>
  801. /// <param name="voiceFileName">语音名称</param>
  802. /// <param name="visitorId">来电会话ID</param>
  803. /// <param name="cancellationToken"></param>
  804. /// <returns></returns>
  805. public async Task VoiceNewsFlashVisitorAsync(NewRockConfiguration newRockConfiguration, string voiceFileName, string visitorId,
  806. CancellationToken cancellationToken)
  807. {
  808. await _newRockClient.VoiceNewsFlash(
  809. new VoiceNewsFlashRequest
  810. {
  811. Attribute = "Connect",
  812. VoiceFile = voiceFileName,
  813. Visitor = new VoiceNewsFlashVisitor() { Id = visitorId }
  814. }, newRockConfiguration.ReceiveKey,
  815. newRockConfiguration.Expired,
  816. cancellationToken);
  817. }
  818. /// <summary>
  819. /// 语音插播(去电)
  820. /// </summary>
  821. /// <param name="voiceFileName">语音名称</param>
  822. /// <param name="outerId">去电会话ID</param>
  823. /// <param name="cancellationToken"></param>
  824. /// <returns></returns>
  825. public async Task VoiceNewsFlashOuterAsync(NewRockConfiguration newRockConfiguration, string voiceFileName, string outerId, CancellationToken cancellationToken)
  826. {
  827. await _newRockClient.VoiceNewsFlash(
  828. new VoiceNewsFlashRequest
  829. {
  830. Attribute = "Connect",
  831. VoiceFile = voiceFileName,
  832. Outer = new VoiceNewsFlashOuter() { Id = outerId }
  833. }, newRockConfiguration.ReceiveKey,
  834. newRockConfiguration.Expired,
  835. cancellationToken);
  836. }
  837. /// <summary>
  838. /// 会议
  839. /// </summary>
  840. /// <param name="telNo">发起方分机号</param>
  841. /// <param name="cancellationToken"></param>
  842. /// <returns></returns>
  843. public async Task ConferenceMeetingAsync(NewRockConfiguration newRockConfiguration, string telNo, CancellationToken cancellationToken)
  844. {
  845. await _newRockClient.ConferenceMeeting(new ConferenceMeetingRequest()
  846. {
  847. Attribute = "Conference",
  848. Ext = new ConferenceMeetingExt() { Id = telNo }
  849. }, newRockConfiguration.ReceiveKey,
  850. newRockConfiguration.Expired,
  851. cancellationToken);
  852. }
  853. /// <summary>
  854. /// 处理IVR响应
  855. /// </summary>
  856. /// <param name="callDetail"></param>
  857. /// <param name="ivrAnswer"></param>
  858. /// <param name="cancellationToken"></param>
  859. /// <returns></returns>
  860. public async Task HandleIvrAnswerAsync(NewRockConfiguration newRockConfiguration, CallDetail callDetail, IvrAnswer ivrAnswer, CancellationToken cancellationToken)
  861. {
  862. if (string.IsNullOrEmpty(ivrAnswer.Content))
  863. throw new UserFriendlyException("无效IVR应答参数");
  864. //获取是来电或去电
  865. var model = await _callRepository.GetAsync(x => x.Id == callDetail.CallId, cancellationToken);
  866. }
  867. #endregion
  868. #region 监听和插播
  869. /// <summary>
  870. /// 监听分机
  871. /// </summary>
  872. /// <param name="firstTelNo">监听方</param>
  873. /// <param name="secondTelNo">被监听方</param>
  874. /// <param name="cancellationToken"></param>
  875. /// <returns></returns>
  876. public async Task MonitorExtAsync(NewRockConfiguration newRockConfiguration, string firstTelNo, string secondTelNo, CancellationToken cancellationToken)
  877. {
  878. await _newRockClient.MonitorExt(new MonitorExtRequest()
  879. {
  880. Attribute = "Monitor",
  881. Exts = new List<Ext>() { new Ext() { Id=firstTelNo },new Ext() { Id=secondTelNo } }
  882. }, newRockConfiguration.ReceiveKey,
  883. newRockConfiguration.Expired,
  884. cancellationToken) ;
  885. }
  886. /// <summary>
  887. /// 从监听到插播状态变换
  888. /// 1. 已知:分机 A 在监听分机 B 与其通话方的通话;
  889. /// 2. 执行分机 A 的从监听到插播状态变换的 API;
  890. /// 3. 执行成功时,分机 A 与分机 B 建立通话,分机 B 的原通话方听保持音。
  891. /// </summary>
  892. /// <param name="telNo"></param>
  893. /// <param name="cancellationToken"></param>
  894. /// <returns></returns>
  895. public async Task MonitorExtToTalkAsync(NewRockConfiguration newRockConfiguration, string telNo, CancellationToken cancellationToken)
  896. {
  897. await _newRockClient.MonitorExtToTalk(new MonitorExtToTalkRequest()
  898. {
  899. Attribute = "Talk",
  900. Ext = new Ext() { Id = telNo }
  901. }, newRockConfiguration.ReceiveKey,
  902. newRockConfiguration.Expired,
  903. cancellationToken) ;
  904. }
  905. /// <summary>
  906. /// 从插播到监听状态变换
  907. /// 1. 已知:分机 A 在插播分机 B 的通话;
  908. /// 2. 执行分机 A 的从插播到监听状态变换的 API;
  909. /// 3. 执行成功时,分机 A 监听分机 B 及其原通话方的通话。
  910. /// </summary>
  911. /// <param name="telNo"></param>
  912. /// <param name="cancellationToken"></param>
  913. /// <returns></returns>
  914. public async Task MonitorExtToListenAsync(NewRockConfiguration newRockConfiguration, string telNo, CancellationToken cancellationToken)
  915. {
  916. await _newRockClient.MonitorExtToListen(new MonitorExtToListenRequest
  917. {
  918. Attribute = "Listen",
  919. Ext = new Ext() { Id = telNo }
  920. }, newRockConfiguration.ReceiveKey,
  921. newRockConfiguration.Expired,
  922. cancellationToken);
  923. }
  924. #endregion
  925. #region 强插
  926. /// <summary>
  927. /// 强插
  928. /// 1. 已知:分机 A 当前空闲,分机 B 正在通话中;
  929. /// 2. 执行分机 A 强插分机 B 的 API;
  930. /// 3. 执行成功时,分机 A 振铃,摘机后即可形成三方通话。
  931. /// </summary>
  932. /// <param name="firstTelNo"></param>
  933. /// <param name="secondTelNo"></param>
  934. /// <param name="cancellationToken"></param>
  935. /// <returns></returns>
  936. public async Task BargeinExtAsync(NewRockConfiguration newRockConfiguration, string firstTelNo,string secondTelNo,CancellationToken cancellationToken)
  937. {
  938. await _newRockClient.BargeinExt(new BargeinExtRequest()
  939. {
  940. Attribute = "Bargein",
  941. Exts = new List<Ext>() { new Ext() { Id = firstTelNo },new Ext() { Id=secondTelNo } }
  942. }, newRockConfiguration.ReceiveKey,
  943. newRockConfiguration.Expired,
  944. cancellationToken);
  945. }
  946. #endregion
  947. }
  948. }