TrApplication.cs 6.5 KB

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