|
@@ -103,6 +103,8 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
public static final String LIVE_USER_STATE_TIME = "IM:LIVE_USER_STATE_TIME:" + USER_ID;
|
|
|
//当前房间主讲人心跳
|
|
|
public static final String LIVE_ROOM_SPEAKER_HEART_BEAT = "IM:LIVE_ROOM_SPEAKER_HEART_BEAT:" + ROOM_UID;
|
|
|
+ //主讲人最近一次加入房间的clientIp
|
|
|
+ public static final String LIVE_SPEAKER_LAST_CLIENT_IP = "IM:LIVE_SPEAKER_LAST_CLIENT_IP:" + USER_ID;
|
|
|
//房间点赞数
|
|
|
public static final String LIVE_ROOM_LIKE = "IM:LIVE_ROOM_LIKE:" + ROOM_UID;
|
|
|
//计算人员观看时长锁
|
|
@@ -200,14 +202,17 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
param.put("tenantId", TenantContextHolder.getTenantId());
|
|
|
//查询该人员分部 及 分部下包含的学校(合作单位)
|
|
|
SysUser sysUser = getSysUser();
|
|
|
+ //分部
|
|
|
+ String organIds = null;
|
|
|
//如果是超管就查询当前机构所有的直播间
|
|
|
if (sysUser.getTenantId() == -1 || sysUser.getIsSuperAdmin()) {
|
|
|
param.put("allRoom", 1);
|
|
|
} else {
|
|
|
Employee employee = employeeService.get(sysUser.getId());
|
|
|
if (Objects.nonNull(employee) && Objects.nonNull(employee.getOrganIdList())) {
|
|
|
- param.put("organIds", employee.getOrganIdList());
|
|
|
- String schoolIds = baseMapper.querySchoolIds(employee.getOrganIdList());
|
|
|
+ organIds = employee.getOrganIdList();
|
|
|
+ param.put("organIds", organIds);
|
|
|
+ String schoolIds = baseMapper.querySchoolIds(organIds);
|
|
|
if (StringUtils.isNotBlank(schoolIds)) {
|
|
|
param.put("schoolIds", schoolIds);
|
|
|
}
|
|
@@ -440,6 +445,11 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
RBucket<RoomSpeakerInfo> speakerCache = redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, room.getSpeakerId().toString()));
|
|
|
if (speakerCache.isExists()) {
|
|
|
RoomSpeakerInfo speakerInfo = speakerCache.get();
|
|
|
+ //查询用户是否在线
|
|
|
+ if (imFeignService.checkOnline(speakerInfo.getSpeakerId().toString())) {
|
|
|
+ log.info("roomDestroy destroyExpiredLiveRoom is online >>>> roomId:{} speakerId:{}", room.getId(), speakerInfo.getSpeakerId());
|
|
|
+ return;
|
|
|
+ }
|
|
|
//校验房间心跳是否过期没续租
|
|
|
RBucket<Date> lastRoomHeartbeatCache = redissonClient.getBucket(LIVE_ROOM_SPEAKER_HEART_BEAT.replace(ROOM_UID, room.getRoomUid()));
|
|
|
if (lastRoomHeartbeatCache.isExists()) {
|
|
@@ -449,6 +459,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
Date lastRoomDateExpired = DateUtil.addMinutes(lastDate, expiredMinute);
|
|
|
//当前时间 小于 房间心跳过期时间 则不销毁
|
|
|
if (now.getTime() <= lastRoomDateExpired.getTime()) {
|
|
|
+ log.info("roomDestroy destroyExpiredLiveRoom last room heartbeat >>>> roomId:{} speakerId:{}", room.getId(), speakerInfo.getSpeakerId());
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
@@ -761,13 +772,33 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
return false;
|
|
|
}
|
|
|
RoomSpeakerInfo speakerInfo = speakerCache.get();
|
|
|
+ //最后一次进入房间的clientIp
|
|
|
+ RBucket<String> lastClientIp = redissonClient.getBucket(LIVE_SPEAKER_LAST_CLIENT_IP.replace(USER_ID, userid));
|
|
|
//主讲人进入房间
|
|
|
if (user.getStatus().equals("0")) {
|
|
|
speakerInfo.setJoinRoomTime(now);
|
|
|
log.info("opsRoom>>>> join speakerCache {}", JSONObject.toJSONString(speakerInfo));
|
|
|
speakerCache.set(speakerInfo);
|
|
|
+ //将本次进入房间的clientIp添加到主讲人最后一次clientIp缓存中
|
|
|
+ if (StringUtils.isNotBlank(user.getClientIp())) {
|
|
|
+ lastClientIp.set(user.getClientIp());
|
|
|
+ }
|
|
|
return true;
|
|
|
}
|
|
|
+ //校验本次退出直播间的clientIp 是不是上次进入房间的clientIp
|
|
|
+ if (StringUtils.isNotBlank(user.getClientIp())) {
|
|
|
+ if (lastClientIp.isExists()) {
|
|
|
+ //如果是上次进入房间的clientIp和本次退出房间的clientIp不相同,则直接忽略
|
|
|
+ if (!user.getClientIp().equals(lastClientIp.get())) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //经过上面的判断得知clientIp相同,在继续校验主讲人是否在线,如果在线则不允许退出
|
|
|
+ if (imFeignService.checkOnline(userid)) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
//主讲人退出房间关闭录像
|
|
|
closeLive(speakerInfo);
|
|
|
speakerInfo.setExitRoomTime(now);
|
|
@@ -965,7 +996,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
if (onlineUserInfoExists && onlineUserInfo.containsKey(id)) {
|
|
|
if (type.equals(1)) {
|
|
|
//开启直播后对当前在房间的用户写入观看时间
|
|
|
- userInfo.setDynamicLookTime(new Date());
|
|
|
+ userInfo.setDynamicLookTime(now);
|
|
|
} else if (type.equals(2)) {
|
|
|
userInfo.setTotalViewTime(getLookMinutes(userInfo.getDynamicLookTime(), now, userInfo.getTotalViewTime()));
|
|
|
userInfo.setDynamicLookTime(null);
|