LiveConsultationRoomManager.cs 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. using System.Collections.Concurrent;
  2. using WingInterfaceLibrary.Enum;
  3. using WingInterfaceLibrary.LiveConsultation;
  4. using WingServerCommon.Interfaces.Cache;
  5. using WingServerCommon.Log;
  6. namespace WingLiveConsultationService
  7. {
  8. public class LiveConsultationRoomManager
  9. {
  10. protected ConcurrentDictionary<string, LiveConsultationRoom> _rooms = new ConcurrentDictionary<string, LiveConsultationRoom>();
  11. private Func<string, LiveConsultationRoom> OnCreateRoomFromDB;
  12. public LiveConsultationRoomManager(Func<string, LiveConsultationRoom> createRoomFromDB)
  13. {
  14. OnCreateRoomFromDB = createRoomFromDB;
  15. }
  16. public LiveConsultationRoom Get(string roomId)
  17. {
  18. return _rooms.GetValueOrDefault(roomId);
  19. }
  20. public bool Remove(string roomId)
  21. {
  22. return _rooms.TryRemove(roomId, out _);
  23. }
  24. public LiveConsultationRoom GetOrAdd(string roomId)
  25. {
  26. return _rooms.GetOrAdd(roomId, k =>
  27. {
  28. var room = OnCreateRoomFromDB.Invoke(roomId);
  29. Logger.WriteLineInfo($"LiveConsultationService Add room in cache, roomId:{roomId}, patientName:{room.PatientName}");
  30. return room;
  31. });
  32. }
  33. public void RefreshMemberInfosByToken(string roomId, string liveMemberId = "")
  34. {
  35. var room = Get(roomId);
  36. if (room != null)
  37. {
  38. var tokenManager = CacheMaintenance.Instance.Get<ITokensManager>();
  39. foreach (var liveMember in room.Members)
  40. {
  41. var id = liveMember.Id;
  42. if (!string.IsNullOrWhiteSpace(liveMemberId) && id != liveMemberId)
  43. {
  44. continue;
  45. }
  46. var userToken = tokenManager.Where(t => t.ClientId == id)?.OrderByDescending(x => x.IsOnline)?.FirstOrDefault();
  47. if (userToken != null)
  48. {
  49. var isBusy = IsBusy(id, roomId);
  50. var loginSource = (LoginSource)userToken.LoginSource;
  51. liveMember.LoginServerUrl = userToken.LoginServer;
  52. liveMember.LoginSource = (LoginSource)userToken.LoginSource;
  53. liveMember.IsOnline = userToken.IsOnline;
  54. liveMember.IsBusy = isBusy;
  55. }
  56. }
  57. }
  58. }
  59. public bool IsBusy(string clientId, string excludeRoomId)
  60. {
  61. var liveRoom = _rooms.Values.FirstOrDefault(r =>
  62. {
  63. if (excludeRoomId == r.RoomId)
  64. {
  65. return false;
  66. }
  67. if (r.Status == LiveConsultationRoomStatus.Connected || r.Status == LiveConsultationRoomStatus.Initiating)
  68. {
  69. if (r.Members.Any(d => d.Id == clientId && d.Status == LiveConsultationMemberStatus.Joined))
  70. {
  71. return true;
  72. }
  73. }
  74. return false;
  75. });
  76. return liveRoom != null;
  77. }
  78. /// <summary>
  79. /// 从缓存获取房间信息,通过设备code或者用户code
  80. /// </summary>
  81. /// <param name="deviceCode"></param>
  82. /// <param name="userCode"></param>
  83. public LiveConsultationRoom GetRoomInfoByConditionCode(string deviceCode, string userCode)
  84. {
  85. try
  86. {
  87. LiveConsultationRoom defaultRoom = null;
  88. if (_rooms?.Count > 0)
  89. {
  90. foreach (var tempRoom in _rooms.Values)
  91. {
  92. if (tempRoom != null && tempRoom != null && !string.IsNullOrEmpty(tempRoom.RoomId))
  93. {
  94. if (tempRoom.Status == LiveConsultationRoomStatus.Connected || tempRoom.Status == LiveConsultationRoomStatus.Initiating)
  95. {
  96. if (!string.IsNullOrEmpty(deviceCode) && !string.IsNullOrEmpty(userCode) &&
  97. tempRoom?.DeviceInfos?.Count(c => c.Id == deviceCode && c.Status == LiveConsultationMemberStatus.Joined) > 0 &&
  98. tempRoom?.UserInfos?.Count(c => c.Id == userCode && c.Status == LiveConsultationMemberStatus.Joined) > 0)
  99. {
  100. defaultRoom = tempRoom;
  101. break;
  102. }
  103. else if (!string.IsNullOrEmpty(deviceCode) && tempRoom?.DeviceInfos?.Count(c => c.Id == deviceCode && c.Status == LiveConsultationMemberStatus.Joined) > 0)
  104. {
  105. defaultRoom = tempRoom;
  106. break;
  107. }
  108. else if (!string.IsNullOrEmpty(userCode) && tempRoom?.UserInfos?.Count(c => c.Id == userCode && c.Status == LiveConsultationMemberStatus.Joined) > 0)
  109. {
  110. defaultRoom = tempRoom;
  111. break;
  112. }
  113. }
  114. }
  115. }
  116. }
  117. return defaultRoom;
  118. }
  119. catch (Exception ex)
  120. {
  121. return null;
  122. }
  123. }
  124. }
  125. }