| 
					
				 | 
			
			
				@@ -12,18 +12,28 @@ import com.yonge.cooleshow.biz.dal.enums.RoomTypeEnum; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.yonge.cooleshow.biz.dal.service.CourseGroupService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.yonge.cooleshow.biz.dal.service.CourseScheduleService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.yonge.cooleshow.biz.dal.service.LiveRoomService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.yonge.cooleshow.biz.dal.service.SysConfigService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.yonge.cooleshow.biz.dal.support.IMHelper; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.yonge.cooleshow.common.exception.BizException; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.yonge.toolset.utils.date.DateUtil; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.apache.commons.collections.CollectionUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.apache.commons.lang3.StringUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.redisson.api.RBucket; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.redisson.api.RMap; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.redisson.api.RedissonClient; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.slf4j.Logger; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.slf4j.LoggerFactory; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.beans.factory.annotation.Autowired; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.stereotype.Service; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.transaction.annotation.Transactional; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.util.*; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.concurrent.TimeUnit; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.util.function.Function; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.stream.Collectors; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import static com.yonge.cooleshow.biz.dal.constant.SysConfigConstant.DESTROY_EXPIRED_LIVE_ROOM_MINUTE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import static com.yonge.cooleshow.biz.dal.constant.SysConfigConstant.PRE_CREATE_LIVE_ROOM_MINUTE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * 直播房间与课程的关系表表(LiveRoom)表服务实现类 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -45,22 +55,25 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private CourseGroupService courseGroupService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Autowired 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private CourseScheduleService courseScheduleService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Autowired 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private SysConfigService sysConfigService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     //替换的字符串 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     public static final String USER_ID = "${userId}"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     public static final String ROOM_UID = "${roomUid}"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //缓存排头 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     public static final String COOLESHOW = "COOLESHOW"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     //直播间累计用户信息-指只要进入到该房间的用户都要记录 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     public static final String LIVE_ROOM_TOTAL_USER_LIST = COOLESHOW + ":LIVE_ROOM_TOTAL_USER_LIST:" + ROOM_UID; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    //主讲人信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    public static final String LIVE_SPEAKER_INFO = COOLESHOW + ":LIVE_SPEAKER_INFO:" + USER_ID; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    //用户对应的直播间Uid 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //用户当前对应的直播间Uid 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     public static final String LIVE_USER_ROOM = COOLESHOW + ":LIVE_ROOM_USER:" + USER_ID; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     //房间点赞数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     public static final String LIVE_ROOM_LIKE = COOLESHOW + ":LIVE_ROOM_LIKE:" + ROOM_UID; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     //生成房间UID 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     public static Function<Long, String> GenRoomUid = (userId) -> COOLESHOW + "-" + userId + "-" + new Date().getTime(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //房间的信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public static final String LIVE_ROOM_INFO = COOLESHOW + ":LIVE_ROOM_INFO:" + ROOM_UID; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     public LiveRoomDao getDao() { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -68,12 +81,29 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 根据课程id查询直播间信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public void getLiveRoomByCourseId(Long courseId) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        CourseSchedule course = courseScheduleService.getById(courseId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (Objects.isNull(course)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            throw new BizException("该课程没有直播间"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * 定时任务创建直播间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    public void createLiveRoom() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public void createCourseLiveRoom() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         Date now = new Date(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        Date endTime = DateUtil.addMinutes(now, 30); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        //查询课时表生成直播间 这里错了 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //查询房间提前创建的时间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        String preCreateRoomMinute = sysConfigService.findConfigValue(PRE_CREATE_LIVE_ROOM_MINUTE); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (StringUtils.isEmpty(preCreateRoomMinute)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            log.info("roomDestroy>>>> 未查询到配置:{}", PRE_CREATE_LIVE_ROOM_MINUTE); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Date endTime = DateUtil.addMinutes(now, Integer.parseInt(preCreateRoomMinute)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //查询课时表生成直播间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         List<CourseSchedule> courseScheduleList = courseScheduleService.list(new QueryWrapper<CourseSchedule>().lambda() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 .eq(CourseSchedule::getType, CourseScheduleTypeEnum.LIVE.getCode()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 .eq(CourseSchedule::getLock, 0) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -82,11 +112,20 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if (CollectionUtils.isEmpty(courseScheduleList)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //获取课程组名称 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Map<Long, String> titleMap = courseScheduleList.stream() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .map(CourseSchedule::getCourseGroupId) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .distinct() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .map(courseGroupService::getById) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .filter(Objects::nonNull) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .collect(Collectors.toMap(CourseGroup::getId, CourseGroup::getName)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //生成课程对应的房间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         courseScheduleList.forEach(c -> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             LiveRoom room = new LiveRoom(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             room.setCourseGroupId(c.getCourseGroupId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             room.setCourseId(c.getId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             room.setRoomUid(GenRoomUid.apply(c.getTeacherId())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            room.setRoomTitle(titleMap.get(c.getCourseGroupId())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             room.setSpeakerId(c.getTeacherId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             room.setLiveStartTime(c.getStartTime()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             room.setLiveEndTime(c.getEndTime()); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -96,11 +135,16 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             room.setCreatedBy(-2L); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             room.setCreatedTime(now); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             this.save(room); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            //生成主讲人信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            createSpeakerInfo(room); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            // 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            //去融云创建房间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            createLiveRoom(room.getRoomUid(), room.getRoomTitle()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //生成主讲人信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                createRoomInfoCache(room); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //去融云创建房间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                createLiveRoom(room.getRoomUid(), room.getRoomTitle()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } catch (Exception e) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //为什么要删除,因为如果融云创建失败,那么就不会有房间了,需要删除 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                this.removeById(room.getId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                log.error("创建直播间失败", e.getCause()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -108,52 +152,51 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * 创建临时房间-直播间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Transactional(rollbackFor = Exception.class) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     public void createTempLiveRoom(LiveRoom room) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        log.info("createLiveRoom>>>>>>roomUid:{}", room.getRoomUid()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //查询主讲人信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        SysUser sysUser = getSysUser(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            //临时课程没有课程组和课表 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (room.getType().equals(RoomTypeEnum.TEMP.getCode())) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                room.setCourseGroupId(0L); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                room.setCourseId(0L); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            //查询主讲人信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            SysUser sysUser = getSysUser(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (Objects.isNull(sysUser)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            room.setRoomUid(GenRoomUid.apply(sysUser.getId())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            this.save(room); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            //生成主讲人信息到缓存 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            createSpeakerInfo(room, sysUser); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            //去融云创建房间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            createLiveRoom(room.getRoomUid(), room.getRoomTitle()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } catch (Exception e) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            log.error(">>>>>>>>>> createLiveRoom error roomUid:{} msg:{}", room.getRoomUid(), e.getMessage()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        room.setCourseGroupId(0L); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        room.setCourseId(0L); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        room.setType(RoomTypeEnum.TEMP.getCode()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        room.setRoomUid(GenRoomUid.apply(sysUser.getId())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        this.save(room); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        log.info("createTempLiveRoom>>>>>>room:{}", room.getRoomUid()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //生成主讲人信息到缓存 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        createRoomInfoCache(room, sysUser); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //去融云创建房间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        createLiveRoom(room.getRoomUid(), room.getRoomTitle()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     //生成主讲人信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    private void createSpeakerInfo(LiveRoom room) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private void createRoomInfoCache(LiveRoom room) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         //查询主讲人信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         SysUser sysUser = getSysUser(room.getSpeakerId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (Objects.isNull(sysUser)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        createSpeakerInfo(room, sysUser); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        createRoomInfoCache(room, sysUser); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    private void createSpeakerInfo(LiveRoom room, SysUser sysUser) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        RoomSpeakerInfo speakerInfo = new RoomSpeakerInfo(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        speakerInfo.setSpeakerId(sysUser.getId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        speakerInfo.setSpeakerName(sysUser.getRealName()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        speakerInfo.setCreateRoomTime(new Date()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        speakerInfo.setRoomUid(room.getRoomUid()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        speakerInfo.setRoomType(room.getType()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        //写入主讲人信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, room.getSpeakerId().toString())).set(speakerInfo); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //生成主讲人信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private void createRoomInfoCache(LiveRoom room, SysUser sysUser) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        RoomInfoCache roomCache = new RoomInfoCache(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        roomCache.setSpeakerId(sysUser.getId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        roomCache.setSpeakerName(sysUser.getRealName()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        roomCache.setSpeakerState(1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        roomCache.setRoomUid(room.getRoomUid()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        roomCache.setLiveStartTime(room.getLiveStartTime()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        roomCache.setLiveEndTime(room.getLiveEndTime()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        roomCache.setCreateRoomTime(new Date()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        String configValue = sysConfigService.findConfigValue(PRE_CREATE_LIVE_ROOM_MINUTE); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        roomCache.setExpiredMinute(Integer.parseInt(configValue)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        roomCache.setRoomType(room.getType()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //写入房间信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        redissonClient.getBucket(LIVE_ROOM_INFO.replace(ROOM_UID, room.getRoomUid())) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .set(roomCache, 2L, TimeUnit.DAYS); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         //生成0点赞 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        redissonClient.getBucket(LIVE_ROOM_LIKE.replace(ROOM_UID, room.getRoomUid())).set(0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        redissonClient.getBucket(LIVE_ROOM_LIKE.replace(ROOM_UID, room.getRoomUid())) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .set(0, 2L, TimeUnit.DAYS); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /** 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -162,20 +205,45 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * @param roomId   房间Uid 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * @param roomName 房间名称 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    private IMApiResultInfo createLiveRoom(String roomId, String roomName) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private void createLiveRoom(String roomId, String roomName) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         IMApiResultInfo resultInfo; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             resultInfo = imHelper.createChatRoom(roomId, roomName); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } catch (Exception e) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            log.error("create chatRoom error >>>", e.getCause()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            throw new RuntimeException("创建聊天室失败!"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            throw new BizException("创建聊天室失败!" + e.getMessage()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if (!resultInfo.isSuccess()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            log.error("create chatRoom error: {}", resultInfo.getErrorMessage()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            throw new RuntimeException("创建聊天室失败!"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            throw new BizException("创建聊天室失败!" + resultInfo.getErrorMessage()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         log.info("create chatRoom success: {}", roomId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return resultInfo; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 定时任务-清理过期的房间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public void destroyExpiredLiveRoom() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //查询房间过期时间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        String expiredMinuteStr = sysConfigService.findConfigValue(DESTROY_EXPIRED_LIVE_ROOM_MINUTE); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (StringUtils.isEmpty(expiredMinuteStr)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            log.info("roomDestroy>>>> 未查询到配置:{}", DESTROY_EXPIRED_LIVE_ROOM_MINUTE); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Date now = new Date(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //查询已经开始并且没有删除及销毁的直播间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<LiveRoom> list = this.list(new QueryWrapper<LiveRoom>().lambda() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .eq(LiveRoom::getType, RoomTypeEnum.LIVE.getCode()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .ge(LiveRoom::getLiveEndTime, now)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (CollectionUtils.isEmpty(list)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        list.forEach(room -> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Date expiredDate = DateUtil.addMinutes(room.getLiveEndTime(), Integer.parseInt(expiredMinuteStr)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //当前时间 大于(结束播时间 + 设置的过期分钟数) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (now.getTime() >= expiredDate.getTime()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //删除房间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                destroyLiveRoom(room.getRoomUid()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /** 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -183,7 +251,7 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * @param roomId 房间Uid 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    private IMApiResultInfo destroyLiveRoom(String roomId) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private void destroyLiveRoom(String roomId) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         //删除服务器房间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         List<String> deleteRoomIds = new ArrayList<String>() {{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             add(roomId); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -192,13 +260,58 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             resultInfo = imHelper.deleteChrm(deleteRoomIds); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } catch (Exception e) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            throw new RuntimeException("关闭聊天室失败!"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            throw new BizException("关闭聊天室失败!" + e.getMessage()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if (!resultInfo.isSuccess()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            log.error("destroy chatRoom error: {}", resultInfo.getErrorMessage()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            throw new RuntimeException("关闭聊天室失败!"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            throw new BizException("关闭聊天室失败!" + resultInfo.getErrorMessage()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return resultInfo; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        log.info("destroyLiveRoom success: {}", roomId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 进入房间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @param roomUid 房间uid 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @param userId  用户id 主讲人或者用户的id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public void joinRoom(String roomUid, Long userId) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //校验房间是否存在 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        RBucket<RoomInfoCache> roomInfoCache = redissonClient.getBucket(LIVE_ROOM_INFO.replace(ROOM_UID, roomUid)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        RoomInfoCache roomInfo; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (roomInfoCache.isExists()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            roomInfo = roomInfoCache.get(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            throw new BizException("房间不存在!"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //进入房间的是主讲人 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (roomInfo.getSpeakerId().equals(userId)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            roomInfo.setSpeakerState(0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            roomInfo.setJoinRoomTime(new Date()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            roomInfoCache.set(roomInfo, 2L, TimeUnit.DAYS); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //进入房间的是学生 记录用户对应的当前房间uid 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        redissonClient.getBucket(LIVE_USER_ROOM.replace(USER_ID, userId.toString())).set(roomUid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //房间累计用户信息-指只要进入到该房间的用户都要记录 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        RMap<Long, RoomUserInfoCache> roomTotalUser = redissonClient.getMap(LIVE_ROOM_TOTAL_USER_LIST.replace(ROOM_UID, roomUid)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //判断是否第一次进房间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        RoomUserInfoCache userInfo; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Date now = new Date(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (roomTotalUser.containsKey(userId)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //多次进入更新动态进入时间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            userInfo = roomTotalUser.get(userId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //第一次进该房间 写入用户首次进入时间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            SysUser sysUser = getSysUser(userId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            userInfo = new RoomUserInfoCache(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            userInfo.setUserId(sysUser.getId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            userInfo.setUserName(sysUser.getRealName()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            userInfo.setFirstJoinTime(now); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        userInfo.setState(0);//0 进入/在房间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        userInfo.setDynamicJoinTime(now); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        roomTotalUser.fastPut(userId, userInfo); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        log.info("joinRoom>>>> userInfo: {}", JSONObject.toJSONString(userInfo)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /** 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -206,19 +319,19 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * @param message 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    private IMApiResultInfo publishRoomMessage(ImRoomMessage message) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        log.info("publishRoomMessage message : {}", JSONObject.toJSONString(message)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private void publishRoomMessage(ImRoomMessage message) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        String msgStr = JSONObject.toJSONString(message); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        log.info("publishRoomMessage message : {}", msgStr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         IMApiResultInfo resultInfo; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             resultInfo = imHelper.publishRoomMessage(message.getFromUserId(), message.getToChatroomId(), message); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } catch (Exception e) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            throw new RuntimeException("消息发送失败" + e.getMessage()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            throw new BizException("消息发送失败" + e.getMessage()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if (!resultInfo.isSuccess()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            log.error("publishRoomMessage chatRoom error: {}", resultInfo.getErrorMessage()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            throw new RuntimeException("消息发送失败!"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            throw new BizException("消息发送失败!" + resultInfo.getErrorMessage()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return resultInfo; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        log.info("publishRoomMessage success: {}", msgStr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /** 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -238,16 +351,15 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             resultInfo = imHelper.isInChartRoom(chatroomId, userId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } catch (Exception e) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            throw new RuntimeException("查询失败" + e.getMessage()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            throw new BizException("查询失败" + e.getMessage()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if (!resultInfo.isSuccess()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             log.error("userExistInRoom  chatroomId : {}  userId : {}", chatroomId, userId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            throw new RuntimeException("查询失败!"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            throw new BizException("查询失败!"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return resultInfo.isSuccess() && resultInfo.getInChrm(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private SysUser getSysUser(Long userId) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return Optional.ofNullable(userId) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 .map(sysUserFeignService::queryUserById) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -255,10 +367,33 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private SysUser getSysUser() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        //修改机构基础信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return Optional.ofNullable(sysUserFeignService.queryUserInfo()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 .orElseThrow(() -> new BizException("用户不存在")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 查询在观看直播的用户信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @param roomUid 直播间uid 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public List<RoomUserInfoCache> queryRoomUserInfo(String roomUid) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<RoomUserInfoCache> roomUserInfoVos = queryTotalRoomUserInfo(roomUid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return queryRoomUserInfo(roomUserInfoVos); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private List<RoomUserInfoCache> queryRoomUserInfo(List<RoomUserInfoCache> totalUserInfo) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return totalUserInfo.stream() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .filter(o -> Objects.nonNull(o.getState()) && o.getState() == 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .collect(Collectors.toList()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private List<RoomUserInfoCache> queryTotalRoomUserInfo(String roomUid) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        RMap<Integer, RoomUserInfoCache> roomTotalUser = redissonClient.getMap(LIVE_ROOM_TOTAL_USER_LIST.replace(ROOM_UID, roomUid)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return roomTotalUser.values().stream() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .filter(Objects::nonNull) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .collect(Collectors.toList()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 |