|
@@ -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.CourseGroupService;
|
|
import com.yonge.cooleshow.biz.dal.service.CourseScheduleService;
|
|
import com.yonge.cooleshow.biz.dal.service.CourseScheduleService;
|
|
import com.yonge.cooleshow.biz.dal.service.LiveRoomService;
|
|
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.biz.dal.support.IMHelper;
|
|
import com.yonge.cooleshow.common.exception.BizException;
|
|
import com.yonge.cooleshow.common.exception.BizException;
|
|
import com.yonge.toolset.utils.date.DateUtil;
|
|
import com.yonge.toolset.utils.date.DateUtil;
|
|
import org.apache.commons.collections.CollectionUtils;
|
|
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.redisson.api.RedissonClient;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
import java.util.*;
|
|
import java.util.*;
|
|
|
|
+import java.util.concurrent.TimeUnit;
|
|
import java.util.function.Function;
|
|
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)表服务实现类
|
|
* 直播房间与课程的关系表表(LiveRoom)表服务实现类
|
|
@@ -45,22 +55,25 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
|
|
private CourseGroupService courseGroupService;
|
|
private CourseGroupService courseGroupService;
|
|
@Autowired
|
|
@Autowired
|
|
private CourseScheduleService courseScheduleService;
|
|
private CourseScheduleService courseScheduleService;
|
|
|
|
+ @Autowired
|
|
|
|
+ private SysConfigService sysConfigService;
|
|
|
|
|
|
//替换的字符串
|
|
//替换的字符串
|
|
public static final String USER_ID = "${userId}";
|
|
public static final String USER_ID = "${userId}";
|
|
public static final String ROOM_UID = "${roomUid}";
|
|
public static final String ROOM_UID = "${roomUid}";
|
|
|
|
+ //缓存排头
|
|
public static final String COOLESHOW = "COOLESHOW";
|
|
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_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_USER_ROOM = COOLESHOW + ":LIVE_ROOM_USER:" + USER_ID;
|
|
//房间点赞数
|
|
//房间点赞数
|
|
public static final String LIVE_ROOM_LIKE = COOLESHOW + ":LIVE_ROOM_LIKE:" + ROOM_UID;
|
|
public static final String LIVE_ROOM_LIKE = COOLESHOW + ":LIVE_ROOM_LIKE:" + ROOM_UID;
|
|
//生成房间UID
|
|
//生成房间UID
|
|
public static Function<Long, String> GenRoomUid = (userId) -> COOLESHOW + "-" + userId + "-" + new Date().getTime();
|
|
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
|
|
@Override
|
|
public LiveRoomDao getDao() {
|
|
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 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()
|
|
List<CourseSchedule> courseScheduleList = courseScheduleService.list(new QueryWrapper<CourseSchedule>().lambda()
|
|
.eq(CourseSchedule::getType, CourseScheduleTypeEnum.LIVE.getCode())
|
|
.eq(CourseSchedule::getType, CourseScheduleTypeEnum.LIVE.getCode())
|
|
.eq(CourseSchedule::getLock, 0)
|
|
.eq(CourseSchedule::getLock, 0)
|
|
@@ -82,11 +112,20 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
|
|
if (CollectionUtils.isEmpty(courseScheduleList)) {
|
|
if (CollectionUtils.isEmpty(courseScheduleList)) {
|
|
return;
|
|
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 -> {
|
|
courseScheduleList.forEach(c -> {
|
|
LiveRoom room = new LiveRoom();
|
|
LiveRoom room = new LiveRoom();
|
|
room.setCourseGroupId(c.getCourseGroupId());
|
|
room.setCourseGroupId(c.getCourseGroupId());
|
|
room.setCourseId(c.getId());
|
|
room.setCourseId(c.getId());
|
|
room.setRoomUid(GenRoomUid.apply(c.getTeacherId()));
|
|
room.setRoomUid(GenRoomUid.apply(c.getTeacherId()));
|
|
|
|
+ room.setRoomTitle(titleMap.get(c.getCourseGroupId()));
|
|
room.setSpeakerId(c.getTeacherId());
|
|
room.setSpeakerId(c.getTeacherId());
|
|
room.setLiveStartTime(c.getStartTime());
|
|
room.setLiveStartTime(c.getStartTime());
|
|
room.setLiveEndTime(c.getEndTime());
|
|
room.setLiveEndTime(c.getEndTime());
|
|
@@ -96,11 +135,16 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
|
|
room.setCreatedBy(-2L);
|
|
room.setCreatedBy(-2L);
|
|
room.setCreatedTime(now);
|
|
room.setCreatedTime(now);
|
|
this.save(room);
|
|
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) {
|
|
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());
|
|
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点赞
|
|
//生成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 roomId 房间Uid
|
|
* @param roomName 房间名称
|
|
* @param roomName 房间名称
|
|
*/
|
|
*/
|
|
- private IMApiResultInfo createLiveRoom(String roomId, String roomName) {
|
|
|
|
|
|
+ private void createLiveRoom(String roomId, String roomName) {
|
|
IMApiResultInfo resultInfo;
|
|
IMApiResultInfo resultInfo;
|
|
try {
|
|
try {
|
|
resultInfo = imHelper.createChatRoom(roomId, roomName);
|
|
resultInfo = imHelper.createChatRoom(roomId, roomName);
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
- log.error("create chatRoom error >>>", e.getCause());
|
|
|
|
- throw new RuntimeException("创建聊天室失败!");
|
|
|
|
|
|
+ throw new BizException("创建聊天室失败!" + e.getMessage());
|
|
}
|
|
}
|
|
if (!resultInfo.isSuccess()) {
|
|
if (!resultInfo.isSuccess()) {
|
|
- log.error("create chatRoom error: {}", resultInfo.getErrorMessage());
|
|
|
|
- throw new RuntimeException("创建聊天室失败!");
|
|
|
|
|
|
+ throw new BizException("创建聊天室失败!" + resultInfo.getErrorMessage());
|
|
}
|
|
}
|
|
log.info("create chatRoom success: {}", roomId);
|
|
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
|
|
* @param roomId 房间Uid
|
|
*/
|
|
*/
|
|
- private IMApiResultInfo destroyLiveRoom(String roomId) {
|
|
|
|
|
|
+ private void destroyLiveRoom(String roomId) {
|
|
//删除服务器房间
|
|
//删除服务器房间
|
|
List<String> deleteRoomIds = new ArrayList<String>() {{
|
|
List<String> deleteRoomIds = new ArrayList<String>() {{
|
|
add(roomId);
|
|
add(roomId);
|
|
@@ -192,13 +260,58 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
|
|
try {
|
|
try {
|
|
resultInfo = imHelper.deleteChrm(deleteRoomIds);
|
|
resultInfo = imHelper.deleteChrm(deleteRoomIds);
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
- throw new RuntimeException("关闭聊天室失败!");
|
|
|
|
|
|
+ throw new BizException("关闭聊天室失败!" + e.getMessage());
|
|
}
|
|
}
|
|
if (!resultInfo.isSuccess()) {
|
|
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
|
|
* @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;
|
|
IMApiResultInfo resultInfo;
|
|
try {
|
|
try {
|
|
resultInfo = imHelper.publishRoomMessage(message.getFromUserId(), message.getToChatroomId(), message);
|
|
resultInfo = imHelper.publishRoomMessage(message.getFromUserId(), message.getToChatroomId(), message);
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
- throw new RuntimeException("消息发送失败" + e.getMessage());
|
|
|
|
|
|
+ throw new BizException("消息发送失败" + e.getMessage());
|
|
}
|
|
}
|
|
if (!resultInfo.isSuccess()) {
|
|
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 {
|
|
try {
|
|
resultInfo = imHelper.isInChartRoom(chatroomId, userId);
|
|
resultInfo = imHelper.isInChartRoom(chatroomId, userId);
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
- throw new RuntimeException("查询失败" + e.getMessage());
|
|
|
|
|
|
+ throw new BizException("查询失败" + e.getMessage());
|
|
}
|
|
}
|
|
if (!resultInfo.isSuccess()) {
|
|
if (!resultInfo.isSuccess()) {
|
|
log.error("userExistInRoom chatroomId : {} userId : {}", chatroomId, userId);
|
|
log.error("userExistInRoom chatroomId : {} userId : {}", chatroomId, userId);
|
|
- throw new RuntimeException("查询失败!");
|
|
|
|
|
|
+ throw new BizException("查询失败!");
|
|
}
|
|
}
|
|
return resultInfo.isSuccess() && resultInfo.getInChrm();
|
|
return resultInfo.isSuccess() && resultInfo.getInChrm();
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
|
|
private SysUser getSysUser(Long userId) {
|
|
private SysUser getSysUser(Long userId) {
|
|
return Optional.ofNullable(userId)
|
|
return Optional.ofNullable(userId)
|
|
.map(sysUserFeignService::queryUserById)
|
|
.map(sysUserFeignService::queryUserById)
|
|
@@ -255,10 +367,33 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
|
|
}
|
|
}
|
|
|
|
|
|
private SysUser getSysUser() {
|
|
private SysUser getSysUser() {
|
|
- //修改机构基础信息
|
|
|
|
return Optional.ofNullable(sysUserFeignService.queryUserInfo())
|
|
return Optional.ofNullable(sysUserFeignService.queryUserInfo())
|
|
.orElseThrow(() -> new BizException("用户不存在"));
|
|
.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());
|
|
|
|
+ }
|
|
|
|
+
|
|
}
|
|
}
|
|
|
|
|