UserDomainService.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. using Hotline.Caching.Interfaces;
  2. using Hotline.CallCenter.Devices;
  3. using Hotline.CallCenter.Tels;
  4. using Hotline.Share.Dtos.CallCenter;
  5. using Hotline.Share.Dtos.Users;
  6. using MapsterMapper;
  7. using XF.Domain.Cache;
  8. using XF.Domain.Dependency;
  9. using XF.Domain.Exceptions;
  10. using XF.Domain.Repository;
  11. namespace Hotline.Users
  12. {
  13. public class UserDomainService : IUserDomainService, IScopeDependency
  14. {
  15. private readonly IRepository<User> _userRepository;
  16. private readonly IWorkRepository _workRepository;
  17. private readonly IDeviceManager _deviceManager;
  18. private readonly IUserCacheManager _userCacheManager;
  19. private readonly ITelCacheManager _telCacheManager;
  20. private readonly ITypedCache<Work> _cacheWork;
  21. private readonly IMapper _mapper;
  22. public UserDomainService(
  23. IRepository<User> userRepository,
  24. IWorkRepository workRepository,
  25. IDeviceManager deviceManager,
  26. ITypedCache<Work> cacheWork,
  27. IUserCacheManager userCacheManager,
  28. IMapper mapper, ITelCacheManager telCacheManager)
  29. {
  30. _userRepository = userRepository;
  31. _workRepository = workRepository;
  32. _deviceManager = deviceManager;
  33. _userCacheManager = userCacheManager;
  34. _cacheWork = cacheWork;
  35. _mapper = mapper;
  36. _telCacheManager = telCacheManager;
  37. }
  38. /// <summary>
  39. /// 上班
  40. /// </summary>
  41. /// <param name="userId">userId</param>
  42. /// <param name="tel"></param>
  43. /// <param name="cancellationToken"></param>
  44. /// <returns></returns>
  45. public async Task OnDutyAsync(string userId, Tel tel, CancellationToken cancellationToken)
  46. {
  47. var user = await _userRepository.GetAsync(userId, cancellationToken);
  48. if (user is null)
  49. throw UserFriendlyException.SameMessage("无效的用户编号");
  50. var workingTel = await _workRepository.GetCurrentWorkByUserAsync(userId, cancellationToken);
  51. if (workingTel is not null)
  52. throw UserFriendlyException.SameMessage($"当前用户已上班,userId:{userId}");
  53. var telIsWorking = await _workRepository.AnyAsync(d => d.TelId == tel.Id && !d.EndTime.HasValue, cancellationToken);
  54. if (telIsWorking)
  55. throw UserFriendlyException.SameMessage("当前分机已被占用");
  56. var work = new Work(userId, user.Name, tel.Id, tel.No);
  57. await _workRepository.AddAsync(work, cancellationToken);
  58. if (!string.IsNullOrEmpty(user.StaffNo))
  59. await _deviceManager.UpdateStaffNoAsync(tel.No, user.StaffNo, tel.LineId, cancellationToken);
  60. //更新分机组
  61. foreach (var group in tel.Groups)
  62. {
  63. await _deviceManager.AssginConfigGroupAsync(group.No,group.Distribution,new List<string>() {tel.No }, group.Voice, cancellationToken);
  64. }
  65. }
  66. /// <summary>
  67. /// 下班
  68. /// </summary>
  69. /// <param name="userId"></param>
  70. /// <param name="cancellationToken"></param>
  71. /// <returns></returns>
  72. public async Task<WorkDto?> OffDutyAsync(string userId, CancellationToken cancellationToken)
  73. {
  74. var work = _userCacheManager.GetWorkByUser(userId);
  75. var tel = _telCacheManager.GetTel(work.TelNo);
  76. work.OffDuty();
  77. await _workRepository.UpdateAsync(work, cancellationToken);
  78. await _deviceManager.UpdateStaffNoAsync(work.TelNo, string.Empty, tel.LineId, cancellationToken);
  79. _cacheWork.Remove(work.GetKey(KeyMode.UserId));
  80. _cacheWork.Remove(work.GetKey(KeyMode.TelNo));
  81. #region 初始化话机
  82. //初始化解除静音
  83. await _deviceManager.UnMuteAsync(tel.No, cancellationToken);
  84. foreach (var group in tel.Groups)
  85. {
  86. await _deviceManager.ModifyGroupExtAsync(group.No, group.Distribution, group.Voice, "", false, cancellationToken);
  87. }
  88. #endregion
  89. return _mapper.Map<WorkDto>(work);
  90. }
  91. }
  92. }