Browse Source

Merge remote-tracking branch 'origin/master_saas' into master_saas

zouxuan 3 năm trước cách đây
mục cha
commit
52f7463f40

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/ImLiveBroadcastRoomService.java

@@ -41,7 +41,7 @@ public interface ImLiveBroadcastRoomService extends IService<ImLiveBroadcastRoom
 
     void quitRoom(List<ImUserState> userState);
 
-    void speakerJoinRoom(String roomUid);
+    ImLiveBroadcastRoomVo speakerJoinRoom(String roomUid);
 
     void joinRoom(String roomUid, Integer userId);
 

+ 91 - 73
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveBroadcastRoomServiceImpl.java

@@ -43,6 +43,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.io.Serializable;
 import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 /**
@@ -97,12 +98,16 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         } else {
             sysUser = getSysUser(userId);
         }
+        return queryRoomAndCheck(roomUid, sysUser);
+    }
+
+    public ImLiveBroadcastRoomVo queryRoomAndCheck(String roomUid, SysUser sysUser) {
         //直播间信息校验
         Optional<ImLiveBroadcastRoomVo> optional = Optional.ofNullable(roomUid)
                 .map(this::queryRoomInfo);
         optional.orElseThrow(() -> new BizException("直播间不存在"));
         optional.filter(r -> r.getTenantId().equals(sysUser.getTenantId()))
-                .orElseThrow(() -> new BizException("您不是该直播机构员,不可观看!"));
+                .orElseThrow(() -> new BizException("您不是该直播机构员,不可观看!"));
         optional.filter(r -> r.getRoomState() != 1).orElseThrow(() -> new BizException("直播间不存在"));
         ImLiveBroadcastRoomVo room = optional.get();
         if (room.getLiveState() == 0) {
@@ -115,6 +120,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         return room;
     }
 
+
     /**
      * 查询直播间信息
      *
@@ -141,6 +147,9 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         Page<ImLiveBroadcastRoomVo> pageInfo = PageUtil.getPageInfo(param);
         pageInfo.setDesc("a.created_time_");
         param.put("tenantId", TenantContextHolder.getTenantId());
+        Function<String, Optional<String>> timeFun = (s) -> Optional.ofNullable(param.get(s)).map(String::valueOf);
+        timeFun.apply("startTime").ifPresent(s -> param.put("startTime", s + " 00:00:00"));
+        timeFun.apply("endTime").ifPresent(s -> param.put("endTime", s + " 23:59:59"));
         IPage<ImLiveBroadcastRoomVo> page = baseMapper.queryPage(pageInfo, param);
         return PageUtil.pageInfo(page);
     }
@@ -261,20 +270,29 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
             RoomSpeakerInfo speakerInfo = speakerCache.get();
             //过期时间= 房间正式开始时间+expiredMinute 分钟
             Date expiredTime = DateUtil.addMinutes(room.getCreatedTime(), expiredMinute);
-            //当前时间 大于(创建房间时填入的开播时间 + 设置的过期分钟数)并且 主播没有进入房间
-            if (now.getTime() >= expiredTime.getTime() && Objects.isNull(speakerInfo.getJoinRoomTime())) {
-                roomDestroy(room);
-                log.info("roomDestroy not joinRoom >>>> roomId:{}", room.getId());
-                return;
-            }
+            //先决条件 当前时间 大于(创建房间时填入的开播时间 + 设置的过期分钟数)
+            if (now.getTime() >= expiredTime.getTime()) {
 
-            if (Objects.nonNull(speakerInfo.getExitRoomTime())) {
-                Date comparedTime = DateUtil.addMinutes(speakerInfo.getExitRoomTime(), expiredMinute);
-                //当前时间 大于 创建房间时填入的开播时间 并且 当前时间 大于  (主播退出时间 + 设置的过期分钟数) 并且 是直播中断状态
-                if (now.getTime() >= room.getCreatedTime().getTime() && now.getTime() >= comparedTime.getTime() && speakerInfo.getState() != 0) {
+                //1.主播没有进入房间,则直接销毁房间
+                if (Objects.isNull(speakerInfo.getJoinRoomTime())) {
                     roomDestroy(room);
-                    log.info("roomDestroy exitRoom >>>> roomId:{}", room.getId());
+                    log.info("roomDestroy not joinRoom >>>> roomId:{}", room.getId());
+                    return;
                 }
+
+                //如果主播已经进入了房间 就判断是否退出过房间
+                if (Objects.nonNull(speakerInfo.getExitRoomTime())) {
+                    //如果退出过房间 判断退出时间是否大于进入时间
+                    if (speakerInfo.getExitRoomTime().getTime() > speakerInfo.getJoinRoomTime().getTime()) {
+                        //如果退出时间大于进入时间,就将退出时间+expiredMinute分钟
+                        Date exitExpiredTime = DateUtil.addMinutes(speakerInfo.getExitRoomTime(), expiredMinute);
+                        if (now.getTime() >= exitExpiredTime.getTime()) {
+                            roomDestroy(room);
+                            log.info("roomDestroy exitExpiredTime >>>> roomId:{}", room.getId());
+                        }
+                    }
+                }
+
             }
         }
     }
@@ -301,8 +319,18 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         log.error("roomDestroy>>>> room : {}", JSONObject.toJSONString(room));
         String roomUid = room.getRoomUid();
         Integer speakerId = room.getSpeakerId();
+
         try {
+            //向聊天室发自定义消息踢出所有人
+            ImRoomMessage message = new ImRoomMessage();
+            message.setFromUserId(speakerId.toString());
+            message.setToChatroomId(roomUid);
+            message.setObjectName(ImRoomMessage.FORCED_OFFLINE);
+            imFeignService.publishRoomMsg(message);
+            log.info("roomDestroy>>>> FORCED_OFFLINE {}", JSONObject.toJSONString(message));
+            //销毁直播间
             imFeignService.destroyLiveRoom(roomUid);
+            log.info("roomDestroy>>>> destroyLiveRoom {}", JSONObject.toJSONString(message));
         } catch (Exception e) {
             log.error("roomDestroy>>>> errorMsg{}", e.getMessage(), e.getCause());
         }
@@ -324,18 +352,6 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         room.setUpdatedTime(date);
         room.setLiveEndTime(date);
         this.updateById(room);
-
-        //向聊天室发自定义消息踢出所有人
-        ImRoomMessage message = new ImRoomMessage();
-        message.setFromUserId(speakerId.toString());
-        message.setToChatroomId(roomUid);
-        message.setObjectName(ImRoomMessage.FORCED_OFFLINE);
-        try {
-            imFeignService.publishRoomMsg(message);
-        } catch (Exception e) {
-            log.error("roomDestroy>>>> publishRoomErrorMsg{}", e.getMessage(), e.getCause());
-        }
-        log.info("roomDestroy>>>> FORCED_OFFLINE {}", JSONObject.toJSONString(message));
     }
 
     //获取该直播间所有数据写入数据库-并清理缓存
@@ -482,27 +498,25 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
      *
      * @param roomUid
      */
-    public void speakerJoinRoom(String roomUid) {
-        ImLiveBroadcastRoomVo roomVo = Optional.ofNullable(roomUid)
-                .map(this::queryRoomInfo)
-                .orElseThrow(() -> new BizException("直播间不存在"));
-        Integer userId = getSysUser().getId();
+    public ImLiveBroadcastRoomVo speakerJoinRoom(String roomUid) {
+        SysUser sysUser = getSysUser();
+        ImLiveBroadcastRoomVo roomVo = queryRoomAndCheck(roomUid, sysUser);
+        Integer userId = sysUser.getId();
         if (!userId.equals(roomVo.getSpeakerId())) {
             throw new BizException("您不是该直播间的主讲人");
         }
         Date now = new Date();
         //获取直播间信息
         RBucket<RoomSpeakerInfo> speakerCache = redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, userId.toString()));
-        if (speakerCache.isExists()) {
-            //判断有没有是房间号的主讲人
-            RoomSpeakerInfo speakerInfo = speakerCache.get();
-            if (roomUid.equals(speakerInfo.getRoomUid())) {
-                speakerInfo.setJoinRoomTime(now);
-                speakerCache.set(speakerInfo);
-            }
-        } else {
-            throw new BizException("还未开启直播间");
-        }
+        if (!speakerCache.isExists()) {
+            //没有主讲人信息则生成一个
+            createSpeakerInfo(this.getById(roomVo.getId()), sysUser);
+            speakerCache = redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, userId.toString()));
+        }
+        RoomSpeakerInfo speakerInfo = speakerCache.get();
+        speakerInfo.setJoinRoomTime(now);
+        speakerCache.set(speakerInfo);
+        return roomVo;
     }
 
     /**
@@ -619,43 +633,10 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
      */
     private void createLiveRoom(ImLiveBroadcastRoom room) {
         log.info("createLiveRoom>>>>>>roomUid:{}", room.getRoomUid());
-        Date now = new Date();
         try {
             //生成主讲人信息到缓存
             SysUser sysUser = getSysUser(room.getSpeakerId());
-            RoomSpeakerInfo speakerInfo = new RoomSpeakerInfo();
-            speakerInfo.setSpeakerId(sysUser.getId());
-            speakerInfo.setSpeakerName(sysUser.getRealName());
-            speakerInfo.setCreateRoomTime(now);
-            speakerInfo.setRoomUid(room.getRoomUid());
-            speakerInfo.setTenantId(sysUser.getTenantId());
-            speakerInfo.setTotalLiveTime(0);
-
-            //查询房间信息是否允许录像
-            ImLiveBroadcastRoom one = this.getOne(new QueryWrapper<ImLiveBroadcastRoom>().eq("room_uid_", room.getRoomUid()));
-            boolean video = getRoomConfig(one.getRoomConfig())
-                    .filter(c -> Objects.nonNull(c.getWhether_video()))
-                    .map(c -> c.getWhether_video() == 0)
-                    .orElse(false);
-            if (video) {
-                //可以录制视频
-                speakerInfo.setWhetherVideo(0);
-            } else {
-                //不可以录制视频
-                speakerInfo.setWhetherVideo(1);
-            }
-            //写入主讲人信息
-            redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, room.getSpeakerId().toString())).set(speakerInfo);
-
-            //生成0点赞
-            redissonClient.getBucket(LIVE_ROOM_LIKE.replace(ROOM_UID, room.getRoomUid())).set(0);
-
-            //修改房间状态为开始
-            room.setLiveState(1);
-            room.setUpdatedTime(now);
-            room.setUpdatedBy(-1);
-            baseMapper.updateById(room);
-
+            createSpeakerInfo(room, sysUser);
             //去融云创建房间
             imFeignService.createLiveRoom(room.getRoomUid(), room.getRoomTitle());
         } catch (Exception e) {
@@ -663,6 +644,43 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         }
     }
 
+    //生成主讲人信息
+    private void createSpeakerInfo(ImLiveBroadcastRoom room, SysUser sysUser) {
+        Date now = new Date();
+        RoomSpeakerInfo speakerInfo = new RoomSpeakerInfo();
+        speakerInfo.setSpeakerId(sysUser.getId());
+        speakerInfo.setSpeakerName(sysUser.getRealName());
+        speakerInfo.setCreateRoomTime(now);
+        speakerInfo.setRoomUid(room.getRoomUid());
+        speakerInfo.setTenantId(sysUser.getTenantId());
+        speakerInfo.setTotalLiveTime(0);
+
+        //查询房间信息是否允许录像
+        ImLiveBroadcastRoom one = this.getOne(new QueryWrapper<ImLiveBroadcastRoom>().eq("room_uid_", room.getRoomUid()));
+        boolean video = getRoomConfig(one.getRoomConfig())
+                .filter(c -> Objects.nonNull(c.getWhether_video()))
+                .map(c -> c.getWhether_video() == 0)
+                .orElse(false);
+        if (video) {
+            //可以录制视频
+            speakerInfo.setWhetherVideo(0);
+        } else {
+            //不可以录制视频
+            speakerInfo.setWhetherVideo(1);
+        }
+        //写入主讲人信息
+        redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, room.getSpeakerId().toString())).set(speakerInfo);
+
+        //生成0点赞
+        redissonClient.getBucket(LIVE_ROOM_LIKE.replace(ROOM_UID, room.getRoomUid())).set(0);
+
+        //修改房间状态为开始
+        room.setLiveState(1);
+        room.setUpdatedTime(now);
+        room.setUpdatedBy(-2);
+        baseMapper.updateById(room);
+    }
+
     private Optional<ImLiveBroadcastRoomDto.RoomConfig> getRoomConfig(String roomConfig) {
         return Optional.ofNullable(roomConfig)
                 .map(c -> JSON.parseObject(c, ImLiveBroadcastRoomDto.RoomConfig.class));

+ 1 - 1
mec-biz/src/main/resources/config/mybatis/ImLiveBroadcastRoomMapper.xml

@@ -65,7 +65,7 @@
             a.room_state_ in(0, 2)
             <if test="param.search != null ">
                 AND (
-                a.`room_uid_` LIKE CONCAT('%', #{param.search},'%')
+                a.`id_` LIKE CONCAT('%', #{param.search},'%')
                 OR a.`room_title_` LIKE CONCAT('%', #{param.search},'%')
                 )
             </if>

+ 2 - 3
mec-web/src/main/java/com/ym/mec/web/controller/ImLiveBroadcastRoomController.java

@@ -131,9 +131,8 @@ public class ImLiveBroadcastRoomController extends BaseController {
 
     @ApiOperation("主讲人进入房间")
     @GetMapping("/speakerJoinRoom")
-    public HttpResponseResult speakerJoinRoom(String roomUid) {
-        imLiveBroadcastRoomService.speakerJoinRoom(roomUid);
-        return succeed();
+    public HttpResponseResult<ImLiveBroadcastRoomVo> speakerJoinRoom(String roomUid) {
+        return succeed(imLiveBroadcastRoomService.speakerJoinRoom(roomUid));
     }
 
     @ApiOperation("进入房间")