TrApplication.cs 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. using Hotline.Caching.Interfaces;
  2. using Hotline.CallCenter.Calls;
  3. using Hotline.CallCenter.Tels;
  4. using Hotline.Settings;
  5. using Hotline.Share.Dtos.CallCenter;
  6. using Hotline.Share.Dtos.TrCallCenter;
  7. using Hotline.Share.Enums.CallCenter;
  8. using Hotline.Users;
  9. using Microsoft.AspNetCore.Http;
  10. using Tr.Sdk;
  11. using XF.Domain.Authentications;
  12. using XF.Domain.Cache;
  13. using XF.Domain.Constants;
  14. using XF.Domain.Dependency;
  15. using XF.Domain.Exceptions;
  16. using XF.Domain.Repository;
  17. namespace Hotline.Application.CallCenter.Calls
  18. {
  19. public class TrApplication : ITrApplication, IScopeDependency
  20. {
  21. private readonly ITrClient _trClient;
  22. private readonly ISessionContext _sessionContext;
  23. private readonly IWorkRepository _workRepository;
  24. private readonly ISystemSettingCacheManager _systemSettingCacheManager;
  25. private readonly IUserCacheManager _userCacheManager;
  26. private readonly ITelRestRepository _telRestRepository;
  27. private readonly ITypedCache<Work> _cacheWork;
  28. private readonly IRepository<TelCallModel> _telCallModelRepository;
  29. private readonly IRepository<TelActionRecord> _telActionRecordRepository;
  30. public TrApplication(ITrClient trClient, ISessionContext sessionContext,IWorkRepository workRepository,ISystemSettingCacheManager systemSettingCacheManager,IUserCacheManager userCacheManager, ITelRestRepository telRestRepository, ITypedCache<Work> cacheWork,IRepository<TelCallModel> telCallModelRepository,IRepository<TelActionRecord> telActionRecordRepository)
  31. {
  32. _trClient = trClient;
  33. _sessionContext = sessionContext;
  34. _workRepository = workRepository;
  35. _systemSettingCacheManager = systemSettingCacheManager;
  36. _userCacheManager = userCacheManager;
  37. _telRestRepository = telRestRepository;
  38. _cacheWork = cacheWork;
  39. _telCallModelRepository = telCallModelRepository;
  40. _telActionRecordRepository = telActionRecordRepository;
  41. }
  42. /// <summary>
  43. /// 签入
  44. /// </summary>
  45. /// <param name="userId"></param>
  46. /// <param name="telNo"></param>
  47. /// <param name="cancellationToken"></param>
  48. /// <returns></returns>
  49. public async Task<TrOnDutyResponseDto> OnSign(string userId,string telNo,ETelModel telModelState,CancellationToken cancellationToken)
  50. {
  51. var work = _userCacheManager.GetWorkByUserNoExp(userId);
  52. if (work is not null)
  53. {
  54. if (work.TelNo != telNo)
  55. {
  56. throw UserFriendlyException.SameMessage("当前用户已签入其他分机");
  57. }
  58. }
  59. var telWork = _userCacheManager.GetWorkByTelNoExp(telNo);
  60. if (telWork is not null)
  61. {
  62. throw UserFriendlyException.SameMessage("当前分机已被占用");
  63. }
  64. var telModel = await _trClient.QueryTelsAsync(new Tr.Sdk.Tels.QueryTelRequest() { TelNo = telNo }, cancellationToken);
  65. if (telModel !=null && telModel.Count>0)
  66. {
  67. work = new Work(_sessionContext.UserId, _sessionContext.UserName, telModel[0].Id, telNo, telModel[0].Password, telModel[0].Description, telModel[0].QueueId,_sessionContext.StaffNo, telModelState);
  68. await _workRepository.AddAsync(work, cancellationToken);
  69. //记录签入日志
  70. var actionRecord = new TelActionRecord(work.UserId, work.UserName, work.TelNo, work.QueueId, EActionType.SignIn);
  71. await _telActionRecordRepository.AddAsync(actionRecord, cancellationToken);
  72. bool IsTelNeedVerify = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.IsTelNeedVerify).SettingValue[0]);
  73. string callOutQueueId = _systemSettingCacheManager.GetSetting(SettingConstants.CallOutQueueId).SettingValue[0];
  74. if (IsTelNeedVerify)
  75. {
  76. return new TrOnDutyResponseDto() { QueueCallOut = callOutQueueId,TelModel = telModelState, TelNo = telNo, TelPwd = "", Description = telModel[0].Description, QueueId = telModel[0].QueueId,StartTime = work.StartTime};
  77. }
  78. else
  79. {
  80. return new TrOnDutyResponseDto() { QueueCallOut = callOutQueueId, TelModel = telModelState, TelNo = telNo, TelPwd = telModel[0].Password, Description = telModel[0].Description, QueueId = telModel[0].QueueId,StartTime = work.StartTime };
  81. }
  82. }
  83. throw UserFriendlyException.SameMessage("签入异常,未查询到对应分机信息");
  84. }
  85. /// <summary>
  86. /// 查询当前用户的分机状态
  87. /// </summary>
  88. /// <param name="userId"></param>
  89. /// <returns></returns>
  90. public async Task<TrOnDutyResponseDto> TelState(string userId, CancellationToken cancellationToken)
  91. {
  92. var work = _userCacheManager.GetWorkByUserNoExp(userId);
  93. if (work is not null)
  94. {
  95. bool isRest = await _telRestRepository.AnyAsync(x => x.TelNo == work.TelNo && x.UserId == userId && !x.EndTime.HasValue,cancellationToken);
  96. bool isCallHold = await _telActionRecordRepository.AnyAsync(x => x.TelNo == work.TelNo && x.UserId == userId && x.ActionType == EActionType.CallHold && !x.EndTime.HasValue, cancellationToken);
  97. bool isCallEndArrange = await _telActionRecordRepository.AnyAsync(x => x.TelNo == work.TelNo && x.UserId == userId && x.ActionType == EActionType.CallEndArrange && !x.EndTime.HasValue, cancellationToken);
  98. bool isTelMute = await _telActionRecordRepository.AnyAsync(x => x.TelNo == work.TelNo && x.UserId == userId && x.ActionType == EActionType.TelMute && !x.EndTime.HasValue, cancellationToken);
  99. bool IsTelNeedVerify = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.IsTelNeedVerify).SettingValue[0]);
  100. string callOutQueueId = _systemSettingCacheManager.GetSetting(SettingConstants.CallOutQueueId).SettingValue[0];
  101. if (IsTelNeedVerify)
  102. {
  103. return new TrOnDutyResponseDto() { QueueCallOut= callOutQueueId, TelNo = work.TelNo, TelPwd = "", Description = work.Description, QueueId = work.QueueId, StartTime = work.StartTime, IsRest = isRest, TelModel = work.TelModel, IsCallHold = isCallHold, IsCallEndArrange = isCallEndArrange, IsTelMute = isTelMute };
  104. }
  105. else
  106. {
  107. return new TrOnDutyResponseDto() { QueueCallOut = callOutQueueId, TelNo = work.TelNo, TelPwd = work.TelPwd, Description = work.Description, QueueId = work.QueueId, StartTime = work.StartTime, IsRest = isRest, TelModel = work.TelModel, IsCallHold = isCallHold, IsCallEndArrange = isCallEndArrange,IsTelMute = isTelMute };
  108. }
  109. }
  110. return null;
  111. }
  112. /// <summary>
  113. /// 切换状态
  114. /// </summary>
  115. /// <param name="userId"></param>
  116. /// <returns></returns>
  117. public async Task ChangeTelModel(string userId,bool isCallOut, CancellationToken cancellationToken)
  118. {
  119. var work = _userCacheManager.GetWorkByUserNoExp(userId);
  120. if (work!=null)
  121. {
  122. if (isCallOut)
  123. {
  124. //切换外呼模式
  125. if (work.TelModel== ETelModel.CallOutModel)
  126. {
  127. throw UserFriendlyException.SameMessage("已是外呼模式,无需切换");
  128. }
  129. work.TelModel = ETelModel.CallOutModel;
  130. await _workRepository.UpdateAsync(work, cancellationToken);
  131. var telCallModel = new TelCallModel(work.TelId,work.TelNo,userId,work.UserName);
  132. await _telCallModelRepository.AddAsync(telCallModel,cancellationToken);
  133. }
  134. else
  135. {
  136. //切换普通模式
  137. if (work.TelModel == ETelModel.OrdinaryModel)
  138. {
  139. throw UserFriendlyException.SameMessage("已是普通模式,无需切换");
  140. }
  141. work.TelModel = ETelModel.OrdinaryModel;
  142. await _workRepository.UpdateAsync(work, cancellationToken);
  143. var telCallModel = await _telCallModelRepository.GetAsync(x => x.TelNo == work.TelNo && !x.EndTime.HasValue, cancellationToken);
  144. if (telCallModel!=null)
  145. {
  146. telCallModel.EndCallOut();
  147. await _telCallModelRepository.UpdateAsync(telCallModel, cancellationToken);
  148. }
  149. }
  150. _cacheWork.Remove(work.GetKey(KeyMode.UserId));
  151. _cacheWork.Remove(work.GetKey(KeyMode.TelNo));
  152. }
  153. else
  154. {
  155. throw UserFriendlyException.SameMessage("当前用户没有签入,不能切换状态");
  156. }
  157. }
  158. }
  159. }