| 
					
				 | 
			
			
				@@ -132,6 +132,12 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             throw new BizException(DateUtil.format(liveStartTime, "yyyy年MM月dd日 HH点mm分") + " 可进入直播间准备"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if (room.getLiveState() == 2) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //如果直播结束了还是推广状态则将推广修改为取消 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (room.getPopularize() == 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                this.update(Wrappers.<ImLiveBroadcastRoom>lambdaUpdate() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        .set(ImLiveBroadcastRoom::getPopularize, 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        .eq(ImLiveBroadcastRoom::getId, room.getId())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             throw new BizException("直播已结束!"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return room; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -295,6 +301,16 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     public ImLiveBroadcastRoomVo queryPopularizeRoom() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //查询该学生信息-获取分部 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        SysUser user = getSysUser(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //查询哪些分部无法推广直播间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        String popularizeOrgan = sysConfigDao.findConfigValue("live_popularize_organ"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (StringUtils.isNotBlank(popularizeOrgan)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            List<String> organList = WrapperUtil.toList(popularizeOrgan); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (organList.contains(user.getOrganId().toString())) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         Map<String, Object> param = new HashMap<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         param.put("tenantId", TenantContextHolder.getTenantId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         param.put("popularize", 1); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -443,9 +459,11 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         //总观看人数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         List<ImLiveBroadcastRoomMember> memberList = new ArrayList<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         //获取直播间所有人数据写入 im_live_broadcast_room_member 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        RMap<Integer, RoomUserInfoVo> roomTotalUserCache = getTotalUserCache(roomUid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        RMap<Integer, String> roomTotalUserCache = getTotalUserCache(roomUid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if (roomTotalUserCache.isExists()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            List<RoomUserInfoVo> roomTotalUser = new ArrayList<>(roomTotalUserCache.values()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            List<RoomUserInfoVo> roomTotalUser = roomTotalUserCache.values().parallelStream() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    .map(a -> JSONObject.toJavaObject(JSONObject.parseObject(a), RoomUserInfoVo.class)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    .collect(Collectors.toList()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             for (RoomUserInfoVo v : roomTotalUser) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 ImLiveBroadcastRoomMember member = new ImLiveBroadcastRoomMember(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 member.setTenantId(v.getTenantId()); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -563,47 +581,32 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             Integer userId = Integer.valueOf(userid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             //从房间累计用户信息中查询该用户的信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            RMap<Integer, RoomUserInfoVo> roomTotalUser = getTotalUserCache(roomUid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            RMap<Integer, String> roomTotalUser = getTotalUserCache(roomUid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             //该房间未查询到用户数据则不处理 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if (!roomTotalUser.isExists() && !roomTotalUser.containsKey(userId)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             //查询用户数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            RoomUserInfoVo userInfo = roomTotalUser.get(userId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            RoomUserInfoVo userInfo = JSONObject.toJavaObject(JSONObject.parseObject(roomTotalUser.get(userId)), RoomUserInfoVo.class); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             //如果有动态观看时间则证明主播开播过,需要计算当前用户观看时长 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if (Objects.nonNull(userInfo.getDynamicLookTime())) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 userInfo.setTotalViewTime(getLookMinutes(userInfo.getDynamicLookTime(), userInfo.getTotalViewTime())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 userInfo.setDynamicLookTime(null); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            roomTotalUser.fastPut(userId, userInfo); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            roomTotalUser.fastPut(userId, JSONObject.toJSONString(userInfo)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             //查询在线人员列表 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            RMap<Integer, BaseRoomUserVo> onlineUserInfo = getOnlineUserCache(roomUid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            RMap<Integer, String> onlineUserInfo = getOnlineUserCache(roomUid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if (!onlineUserInfo.isExists()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            //发消息给主播 告知现在人数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            int size = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            ImRoomMessage message = new ImRoomMessage(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            message.setIsIncludeSender(1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            message.setObjectName(ImRoomMessage.MEMBER_COUNT); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            message.setToChatroomId(roomUid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //在线人数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            int count = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             //大于1就发送实际人数,如果是最后一个人离开房间则发送一条0人数消息给主播 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if (onlineUserInfo.size() > 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                size = onlineUserInfo.size(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            HashMap<String, Integer> sendMap = new HashMap<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            sendMap.put("count", size); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            message.setFromUserId(userId.toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            message.setContent(sendMap); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            //发送消息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                imFeignService.publishRoomMsg(message); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                log.info("opsRoom>>>> sendLiveOnlineNum>>>> speakerId  room:{}", JSONObject.toJSONString(message)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } catch (Exception e) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                log.error("opsRoom>>>> sendLiveOnlineNum>>>>  speakerId error {}", e.getMessage()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                log.error("opsRoom>>>> sendLiveOnlineNum>>>>  speakerId sendMessage {} :", JSONObject.toJSONString(message)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                count = onlineUserInfo.size(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //向直播间发送当前在线人数消息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            this.sendOnlineUserCount(roomUid, userId, count); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             //从在线人员列表删除该人员 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             onlineUserInfo.fastRemove(userId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             log.info("opsRoom>>>> looker userInfo: {}", JSONObject.toJSONString(userInfo)); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -611,27 +614,60 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 向直播间发送当前在线人数消息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @param roomUid    房间uid 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @param fromUserId 发送人id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @param count      人数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private void sendOnlineUserCount(String roomUid, Integer fromUserId, Integer count) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //校验传入参数,房间uid和发送人id不能为空 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (!WrapperUtil.checkObj(roomUid, fromUserId, count)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            log.info(" sendOnlineUserCount>>>> param is null   roomUid: {}  fromUserId:{}  count:{}", roomUid, fromUserId, count); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ImRoomMessage message = new ImRoomMessage(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        message.setIsIncludeSender(1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        message.setObjectName(ImRoomMessage.MEMBER_COUNT); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        message.setToChatroomId(roomUid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        HashMap<String, Integer> sendMap = new HashMap<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        sendMap.put("count", count); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        message.setFromUserId(fromUserId.toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        message.setContent(sendMap); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //发送消息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            imFeignService.publishRoomMsg(message); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            log.info(" sendOnlineUserCount>>>> message: {}", JSONObject.toJSONString(message)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } catch (Exception e) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            log.error("sendOnlineUserCount>>>> error {}", e.getMessage()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            log.error("sendOnlineUserCount>>>> sendMessage {} :", JSONObject.toJSONString(message)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * 查询userId是不是主讲人 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @return true 是主讲人 false 不是主讲人 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private boolean isSpeaker(ImUserState user, Date now, String userid) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         RBucket<RoomSpeakerInfo> speakerCache = redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, userid)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (speakerCache.isExists()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            RoomSpeakerInfo speakerInfo = speakerCache.get(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            //主讲人进入房间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (user.getStatus().equals("0")) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                speakerInfo.setJoinRoomTime(now); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                log.info("opsRoom>>>> join speakerCache {}", JSONObject.toJSONString(speakerInfo)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                speakerCache.set(speakerInfo); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                return true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            //主讲人退出房间关闭录像 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            closeLive(speakerInfo); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            speakerInfo.setExitRoomTime(now); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            log.info("opsRoom>>>> exit speakerCache {}", JSONObject.toJSONString(speakerInfo)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (!speakerCache.isExists()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        RoomSpeakerInfo speakerInfo = speakerCache.get(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //主讲人进入房间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (user.getStatus().equals("0")) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            speakerInfo.setJoinRoomTime(now); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            log.info("opsRoom>>>> join speakerCache {}", JSONObject.toJSONString(speakerInfo)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             speakerCache.set(speakerInfo); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             return true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //主讲人退出房间关闭录像 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        closeLive(speakerInfo); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        speakerInfo.setExitRoomTime(now); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        log.info("opsRoom>>>> exit speakerCache {}", JSONObject.toJSONString(speakerInfo)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        speakerCache.set(speakerInfo); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /** 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -675,16 +711,14 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         //记录用户当前房间uid 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         redissonClient.getBucket(LIVE_USER_ROOM.replace(USER_ID, userId.toString())).set(roomUid, 12L, TimeUnit.HOURS); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        //在线人员列表 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        RMap<Integer, BaseRoomUserVo> onlineUserInfo = getOnlineUserCache(roomUid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         //房间累计用户信息-指只要进入到该房间的用户都要记录 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        RMap<Integer, RoomUserInfoVo> roomTotalUser = getTotalUserCache(roomUid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        RMap<Integer, String> roomTotalUser = getTotalUserCache(roomUid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         //判断是否第一次进房间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         RoomUserInfoVo userInfo; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         Date now = new Date(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if (roomTotalUser.containsKey(userId)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             //多次进入更新动态进入时间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            userInfo = roomTotalUser.get(userId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            userInfo = JSONObject.toJavaObject(JSONObject.parseObject(roomTotalUser.get(userId)), RoomUserInfoVo.class); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             //第一次进该房间 写入用户首次进入时间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             userInfo = getUserInfo(userId); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -700,9 +734,13 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 userInfo.setDynamicLookTime(now); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        roomTotalUser.fastPut(userId, userInfo); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        roomTotalUser.fastPut(userId, JSONObject.toJSONString(userInfo)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //在线人员列表 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        RMap<Integer, String> onlineUserInfo = getOnlineUserCache(roomUid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         //进入房间写如在线人员列表 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        onlineUserInfo.fastPut(userId, userInfo); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        onlineUserInfo.fastPut(userId, JSONObject.toJSONString(userInfo)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //向直播间发送当前在线人数消息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        this.sendOnlineUserCount(roomUid, userId, count); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         log.info("joinRoom>>>> userInfo: {}", JSONObject.toJSONString(userInfo)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -807,15 +845,17 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         //加锁-避免快速点击开启直播和关闭直后异步执行后直播数据错误 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         boolean b = this.runIfLockCanGet(LIVE_LOOK_LOCK.replace(ROOM_UID, roomUid), () -> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             //查询所有在直播间的用户并计算观看时长 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            RMap<Integer, RoomUserInfoVo> roomTotalUser = getTotalUserCache(roomUid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            RMap<Integer, String> roomTotalUser = getTotalUserCache(roomUid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if (!roomTotalUser.isExists()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             //查询在线人员列表 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            RMap<Integer, BaseRoomUserVo> onlineUserInfo = getOnlineUserCache(roomUid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            roomTotalUser.forEach((id, userInfo) -> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            RMap<Integer, String> onlineUserInfo = getOnlineUserCache(roomUid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            boolean onlineUserInfoExists = onlineUserInfo.isExists(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            roomTotalUser.forEach((id, userInfoStr) -> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                RoomUserInfoVo userInfo = JSONObject.toJavaObject(JSONObject.parseObject(userInfoStr), RoomUserInfoVo.class); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 //获取当前用户是否在房间状态 true在 false不在 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if (onlineUserInfo.isExists() && onlineUserInfo.containsKey(id)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (onlineUserInfoExists && onlineUserInfo.containsKey(id)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     if (type.equals(1)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         //开启直播后对当前在房间的用户写入观看时间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         userInfo.setDynamicLookTime(new Date()); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -825,7 +865,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    roomTotalUser.fastPut(id, userInfo); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    roomTotalUser.fastPut(id, JSONObject.toJSONString(userInfo)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         }, 2, 1, TimeUnit.MINUTES); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1020,11 +1060,11 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     public List<BaseRoomUserVo> queryRoomLimitOnlineUserInfo(String roomUid) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        RMap<Integer, BaseRoomUserVo> onlineUserCache = getOnlineUserCache(roomUid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return onlineUserCache.values().stream() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                .filter(Objects::nonNull) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                .limit(200) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                .collect(Collectors.toList()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        RMap<Integer, String> onlineUserCache = getOnlineUserCache(roomUid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return onlineUserCache.values().parallelStream() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        .map(a -> JSONObject.toJavaObject(JSONObject.parseObject(a), BaseRoomUserVo.class)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        .limit(200) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        .collect(Collectors.toList()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /** 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1034,9 +1074,9 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     public List<BaseRoomUserVo> queryRoomOnlineUserInfo(String roomUid) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        RMap<Integer, BaseRoomUserVo> onlineUserInfo = getOnlineUserCache(roomUid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return onlineUserInfo.values().stream() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                .filter(Objects::nonNull) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        RMap<Integer, String> onlineUserInfo = getOnlineUserCache(roomUid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return onlineUserInfo.values().parallelStream() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .map(a -> JSONObject.toJavaObject(JSONObject.parseObject(a), BaseRoomUserVo.class)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 .collect(Collectors.toList()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1046,17 +1086,29 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * @param roomUid 直播间uid 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private List<RoomUserInfoVo> queryTotalRoomUserInfo(String roomUid) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        RMap<Integer, RoomUserInfoVo> roomTotalUser = getTotalUserCache(roomUid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return roomTotalUser.values().stream() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                .filter(Objects::nonNull) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        RMap<Integer, String> roomTotalUser = getTotalUserCache(roomUid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return roomTotalUser.values().parallelStream() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .map(a -> JSONObject.toJavaObject(JSONObject.parseObject(a), RoomUserInfoVo.class)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 .collect(Collectors.toList()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    private RMap<Integer, BaseRoomUserVo> getOnlineUserCache(String roomUid) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 获取直播间在线用户信息缓存 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @param roomUid 直播间uid 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @return RMap key:userId value:BaseRoomUserVo -> jsonToString 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private RMap<Integer, String> getOnlineUserCache(String roomUid) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return redissonClient.getMap(LIVE_ROOM_ONLINE_USER_LIST.replace(ROOM_UID, roomUid)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    private RMap<Integer, RoomUserInfoVo> getTotalUserCache(String roomUid) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 获取直播间所有用户信息缓存 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @param roomUid 直播间uid 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @return RMap key:userId value:RoomUserInfoVo -> jsonToString 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private RMap<Integer, String> getTotalUserCache(String roomUid) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return redissonClient.getMap(LIVE_ROOM_TOTAL_USER_LIST.replace(ROOM_UID, roomUid)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 |