|
@@ -134,10 +134,9 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
if (room.getLiveState() == 2) {
|
|
|
//如果直播结束了还是推广状态则将推广修改为取消
|
|
|
if (room.getPopularize() == 1) {
|
|
|
- ImLiveBroadcastRoom imLiveBroadcastRoom = new ImLiveBroadcastRoom();
|
|
|
- imLiveBroadcastRoom.setId(room.getId());
|
|
|
- imLiveBroadcastRoom.setPopularize(0);
|
|
|
- this.updateById(imLiveBroadcastRoom);
|
|
|
+ this.update(Wrappers.<ImLiveBroadcastRoom>lambdaUpdate()
|
|
|
+ .set(ImLiveBroadcastRoom::getPopularize, 0)
|
|
|
+ .eq(ImLiveBroadcastRoom::getId, room.getId()));
|
|
|
}
|
|
|
throw new BizException("直播已结束!");
|
|
|
}
|
|
@@ -302,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);
|
|
@@ -450,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());
|
|
@@ -570,22 +581,21 @@ 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;
|
|
|
}
|
|
@@ -701,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);
|
|
@@ -726,9 +734,11 @@ 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));
|
|
@@ -835,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());
|
|
@@ -853,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);
|
|
@@ -1048,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());
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -1062,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());
|
|
|
}
|
|
|
|
|
@@ -1074,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));
|
|
|
}
|
|
|
|