UserDomainService.cs 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. using Hotline.Caching.Interfaces;
  2. using Hotline.CallCenter.Devices;
  3. using Hotline.CallCenter.Tels;
  4. using Hotline.Share.Dtos.Users;
  5. using MapsterMapper;
  6. using Hotline.CallCenter.Configs;
  7. using Microsoft.Extensions.Options;
  8. using XF.Domain.Authentications;
  9. using XF.Domain.Cache;
  10. using XF.Domain.Dependency;
  11. using XF.Domain.Exceptions;
  12. using XF.Domain.Repository;
  13. using Microsoft.Extensions.DependencyInjection;
  14. using Hotline.Configurations;
  15. namespace Hotline.Users
  16. {
  17. public class UserDomainService : IUserDomainService, IScopeDependency
  18. {
  19. private readonly IRepository<User> _userRepository;
  20. private readonly IWorkRepository _workRepository;
  21. private readonly INewRockDeviceManager _newRockDeviceManager;
  22. private readonly IUserCacheManager _userCacheManager;
  23. private readonly ITelCacheManager _telCacheManager;
  24. private readonly ITypedCache<Work> _cacheWork;
  25. private readonly IMapper _mapper;
  26. private readonly ISystemSettingCacheManager _systemSettingCacheManager;
  27. private readonly ISessionContext _sessionContext;
  28. private readonly IOptionsSnapshot<AppConfiguration> _appOptions;
  29. private readonly IOptionsSnapshot<CallCenterConfiguration> _callcenterOptions;
  30. public UserDomainService(
  31. IServiceProvider serviceProvider,
  32. IRepository<User> userRepository,
  33. IWorkRepository workRepository,
  34. ITypedCache<Work> cacheWork,
  35. IUserCacheManager userCacheManager,
  36. IMapper mapper,
  37. ITelCacheManager telCacheManager,
  38. ISystemSettingCacheManager systemSettingCacheManager,
  39. ISessionContext sessionContext,
  40. IOptionsSnapshot<AppConfiguration> appOptions,
  41. IOptionsSnapshot<CallCenterConfiguration> callcenterOptions)
  42. {
  43. _userRepository = userRepository;
  44. _workRepository = workRepository;
  45. _userCacheManager = userCacheManager;
  46. _cacheWork = cacheWork;
  47. _mapper = mapper;
  48. _telCacheManager = telCacheManager;
  49. _systemSettingCacheManager = systemSettingCacheManager;
  50. _sessionContext = sessionContext;
  51. _appOptions = appOptions;
  52. _callcenterOptions = callcenterOptions;
  53. if (appOptions.Value.GetDefaultAppScopeConfiguration().CallCenterType == AppDefaults.CallCenterType.XunShi)
  54. {
  55. _newRockDeviceManager = serviceProvider.GetRequiredService<INewRockDeviceManager>();
  56. }
  57. }
  58. /// <summary>
  59. /// 上班
  60. /// </summary>
  61. /// <param name="userId">userId</param>
  62. /// <param name="tel"></param>
  63. /// <param name="cancellationToken"></param>
  64. /// <returns></returns>
  65. public async Task OnDutyAsync(string userId, Tel tel, CancellationToken cancellationToken)
  66. {
  67. var user = await _userRepository.GetAsync(userId, cancellationToken);
  68. if (user is null)
  69. throw UserFriendlyException.SameMessage("无效的用户编号");
  70. var workingTel = await _workRepository.GetCurrentWorkByUserAsync(userId, cancellationToken);
  71. if (workingTel is not null)
  72. throw UserFriendlyException.SameMessage($"当前用户已上班,userId:{userId}");
  73. var telIsWorking = await _workRepository.AnyAsync(d => d.TelId == tel.Id && !d.EndTime.HasValue, cancellationToken);
  74. if (telIsWorking)
  75. throw UserFriendlyException.SameMessage("当前分机已被占用");
  76. var work = new Work(userId, user.Name, tel.Id, tel.No);
  77. await _workRepository.AddAsync(work, cancellationToken);
  78. if (!string.IsNullOrEmpty(user.StaffNo))
  79. await _newRockDeviceManager.UpdateStaffNoAsync(_callcenterOptions.Value.NewRock, tel.No, user.StaffNo, tel.LineId, cancellationToken);
  80. //更新分机组
  81. foreach (var group in tel.Groups)
  82. {
  83. await _newRockDeviceManager.AssginConfigGroupAsync(_callcenterOptions.Value.NewRock, group.No, group.Distribution, new List<string>() { tel.No }, group.Voice, cancellationToken);
  84. }
  85. }
  86. /// <summary>
  87. /// 下班
  88. /// </summary>
  89. /// <param name="userId"></param>
  90. /// <param name="cancellationToken"></param>
  91. /// <returns></returns>
  92. public async Task<WorkDto?> OffDutyAsync(string userId, CancellationToken cancellationToken)
  93. {
  94. var work = _userCacheManager.GetWorkByUser(userId);
  95. var tel = _telCacheManager.GetTel(work.TelNo);
  96. work.OffDuty();
  97. await _workRepository.UpdateAsync(work, cancellationToken);
  98. await _newRockDeviceManager.UpdateStaffNoAsync(_callcenterOptions.Value.NewRock, work.TelNo, string.Empty, tel.LineId, cancellationToken);
  99. _cacheWork.Remove(work.GetKey(KeyMode.UserId));
  100. _cacheWork.Remove(work.GetKey(KeyMode.TelNo));
  101. #region 初始化话机
  102. //初始化解除静音
  103. await _newRockDeviceManager.UnMuteAsync(_callcenterOptions.Value.NewRock, tel.No, cancellationToken);
  104. foreach (var group in tel.Groups)
  105. {
  106. await _newRockDeviceManager.ModifyGroupExtAsync(_callcenterOptions.Value.NewRock, group.No, group.Distribution, group.Voice, "", false, cancellationToken);
  107. }
  108. #endregion
  109. return _mapper.Map<WorkDto>(work);
  110. }
  111. #region 添添呼
  112. /// <summary>
  113. /// 下班
  114. /// </summary>
  115. /// <param name="userId"></param>
  116. /// <param name="cancellationToken"></param>
  117. /// <returns></returns>
  118. public async Task TrOffDutyAsync(string userId, CancellationToken cancellationToken)
  119. {
  120. var work = _userCacheManager.GetWorkByUser(userId);
  121. if(work is null) return;
  122. work.OffDuty();
  123. await _workRepository.UpdateAsync(work, cancellationToken);
  124. _cacheWork.Remove(work.GetKey(KeyMode.UserId));
  125. _cacheWork.Remove(work.GetKey(KeyMode.TelNo));
  126. }
  127. #endregion
  128. }
  129. }