|
@@ -14,6 +14,7 @@ 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.biz.dal.support.WrapperUtil;
|
|
|
import com.yonge.cooleshow.common.exception.BizException;
|
|
|
import com.yonge.toolset.utils.date.DateUtil;
|
|
|
import org.apache.commons.collections.CollectionUtils;
|
|
@@ -29,7 +30,7 @@ import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
import java.util.*;
|
|
|
import java.util.concurrent.TimeUnit;
|
|
|
-import java.util.function.Function;
|
|
|
+import java.util.function.BiFunction;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
import static com.yonge.cooleshow.biz.dal.constant.SysConfigConstant.DESTROY_EXPIRED_LIVE_ROOM_MINUTE;
|
|
@@ -65,15 +66,15 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
|
|
|
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 = String.join(":", COOLESHOW, "LIVE_ROOM_TOTAL_USER_LIST" + ROOM_UID);
|
|
|
//用户当前对应的直播间Uid
|
|
|
- public static final String LIVE_USER_ROOM = COOLESHOW + ":LIVE_ROOM_USER:" + USER_ID;
|
|
|
+ public static final String LIVE_USER_ROOM = String.join(":", 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 = String.join(":", COOLESHOW, "LIVE_ROOM_LIKE", ROOM_UID);
|
|
|
//生成房间UID
|
|
|
- public static Function<Long, String> GenRoomUid = (userId) -> COOLESHOW + "-" + userId + "-" + new Date().getTime();
|
|
|
+ public static BiFunction<Long, RoomTypeEnum, String> GenRoomUid = (userId, en) -> String.join("-", COOLESHOW, en.getCode(), userId.toString(), new Date().getTime() + "");
|
|
|
//房间的信息
|
|
|
- public static final String LIVE_ROOM_INFO = COOLESHOW + ":LIVE_ROOM_INFO:" + ROOM_UID;
|
|
|
+ public static final String LIVE_ROOM_INFO = String.join(":", COOLESHOW, "LIVE_ROOM_INFO", ROOM_UID);
|
|
|
|
|
|
@Override
|
|
|
public LiveRoomDao getDao() {
|
|
@@ -81,19 +82,10 @@ 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("该课程没有直播间");
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
* 定时任务创建直播间
|
|
|
*/
|
|
|
@Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
public void createCourseLiveRoom() {
|
|
|
Date now = new Date();
|
|
|
//查询房间提前创建的时间
|
|
@@ -120,31 +112,24 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
|
|
|
.filter(Objects::nonNull)
|
|
|
.collect(Collectors.toMap(CourseGroup::getId, CourseGroup::getName));
|
|
|
//生成课程对应的房间
|
|
|
+ RoomTypeEnum en = RoomTypeEnum.LIVE;
|
|
|
courseScheduleList.forEach(c -> {
|
|
|
LiveRoom room = new LiveRoom();
|
|
|
room.setCourseGroupId(c.getCourseGroupId());
|
|
|
room.setCourseId(c.getId());
|
|
|
- room.setRoomUid(GenRoomUid.apply(c.getTeacherId()));
|
|
|
+ room.setRoomUid(GenRoomUid.apply(c.getTeacherId(), en));
|
|
|
room.setRoomTitle(titleMap.get(c.getCourseGroupId()));
|
|
|
room.setSpeakerId(c.getTeacherId());
|
|
|
room.setLiveStartTime(c.getStartTime());
|
|
|
room.setLiveEndTime(c.getEndTime());
|
|
|
room.setLiveState(0);
|
|
|
room.setRoomState(0);
|
|
|
- room.setType(RoomTypeEnum.LIVE.getCode());
|
|
|
+ room.setType(en.getCode());
|
|
|
room.setCreatedBy(-2L);
|
|
|
room.setCreatedTime(now);
|
|
|
this.save(room);
|
|
|
- try {
|
|
|
- //生成主讲人信息
|
|
|
- createRoomInfoCache(room);
|
|
|
- //去融云创建房间
|
|
|
- createLiveRoom(room.getRoomUid(), room.getRoomTitle());
|
|
|
- } catch (Exception e) {
|
|
|
- //为什么要删除,因为如果融云创建失败,那么就不会有房间了,需要删除
|
|
|
- this.removeById(room.getId());
|
|
|
- log.error("创建直播间失败", e.getCause());
|
|
|
- }
|
|
|
+ //去融云创建房间及创建房间缓存信息
|
|
|
+ createLiveRoomInfo(room);
|
|
|
});
|
|
|
|
|
|
}
|
|
@@ -154,20 +139,47 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
|
|
|
*/
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
- public void createTempLiveRoom(LiveRoom room) {
|
|
|
+ public void createTempLiveRoom(Map<String, Object> param) {
|
|
|
+ String roomTitle = WrapperUtil.toStr(param, "roomTitle", "房间标题不能为空!");
|
|
|
+ String liveRemark = WrapperUtil.toStr(param, "liveRemark", "直播间描述不能为空!");
|
|
|
+ String coverPic = WrapperUtil.toStr(param, "coverPic", "直播间封面不能为空!");
|
|
|
//查询主讲人信息
|
|
|
SysUser sysUser = getSysUser();
|
|
|
-
|
|
|
- room.setCourseGroupId(0L);
|
|
|
- room.setCourseId(0L);
|
|
|
- room.setType(RoomTypeEnum.TEMP.getCode());
|
|
|
- room.setRoomUid(GenRoomUid.apply(sysUser.getId()));
|
|
|
+ Long id = sysUser.getId();
|
|
|
+ Date now = new Date();
|
|
|
+ RoomTypeEnum en = RoomTypeEnum.TEMP;
|
|
|
+ LiveRoom room = new LiveRoom();
|
|
|
+ room.setCourseGroupId(-1L);
|
|
|
+ room.setCourseId(-1L);
|
|
|
+ room.setRoomUid(GenRoomUid.apply(id, en));
|
|
|
+ room.setRoomTitle(roomTitle);
|
|
|
+ room.setLiveRemark(liveRemark);
|
|
|
+ room.setCoverPic(coverPic);
|
|
|
+ room.setSpeakerId(id);
|
|
|
+ room.setLiveStartTime(now);
|
|
|
+ room.setLiveState(0);
|
|
|
+ room.setRoomState(0);
|
|
|
+ room.setCreatedBy(id);
|
|
|
+ room.setCreatedTime(now);
|
|
|
+ room.setType(en.getCode());
|
|
|
this.save(room);
|
|
|
log.info("createTempLiveRoom>>>>>>room:{}", room.getRoomUid());
|
|
|
- //生成主讲人信息到缓存
|
|
|
- createRoomInfoCache(room, sysUser);
|
|
|
- //去融云创建房间
|
|
|
- createLiveRoom(room.getRoomUid(), room.getRoomTitle());
|
|
|
+ //去融云创建房间及创建房间缓存信息
|
|
|
+ createLiveRoomInfo(room);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 去融云创建房间及创建房间缓存信息-直播间
|
|
|
+ */
|
|
|
+ private void createLiveRoomInfo(LiveRoom room) {
|
|
|
+ try {
|
|
|
+ //生成主讲人信息
|
|
|
+ createRoomInfoCache(room);
|
|
|
+ //去融云创建房间
|
|
|
+ createLiveRoom(room.getRoomUid(), room.getRoomTitle());
|
|
|
+ } catch (Exception e) {
|
|
|
+ throw new BizException("创建直播间失败!", e.getCause());
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
//生成主讲人信息
|
|
@@ -231,8 +243,10 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
|
|
|
Date now = new Date();
|
|
|
//查询已经开始并且没有删除及销毁的直播间
|
|
|
List<LiveRoom> list = this.list(new QueryWrapper<LiveRoom>().lambda()
|
|
|
+ .eq(LiveRoom::getRoomState, 0)
|
|
|
+ .eq(LiveRoom::getLiveState, 1)
|
|
|
.eq(LiveRoom::getType, RoomTypeEnum.LIVE.getCode())
|
|
|
- .ge(LiveRoom::getLiveEndTime, now));
|
|
|
+ .le(LiveRoom::getLiveEndTime, now));
|
|
|
if (CollectionUtils.isEmpty(list)) {
|
|
|
return;
|
|
|
}
|
|
@@ -283,10 +297,11 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
|
|
|
} else {
|
|
|
throw new BizException("房间不存在!");
|
|
|
}
|
|
|
+ Date now = new Date();
|
|
|
//进入房间的是主讲人
|
|
|
if (roomInfo.getSpeakerId().equals(userId)) {
|
|
|
roomInfo.setSpeakerState(0);
|
|
|
- roomInfo.setJoinRoomTime(new Date());
|
|
|
+ roomInfo.setJoinRoomTime(now);
|
|
|
roomInfoCache.set(roomInfo, 2L, TimeUnit.DAYS);
|
|
|
return;
|
|
|
}
|
|
@@ -296,7 +311,6 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
|
|
|
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);
|