浏览代码

增加直播部分功能

hgw 3 年之前
父节点
当前提交
6e0483f2af

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImLiveBroadcastRoom.java

@@ -64,7 +64,7 @@ public class ImLiveBroadcastRoom implements Serializable {
     private Integer liveState;
 
     @TableField("room_state_")
-    @ApiModelProperty(value = "房间状态 0正常 1已删除")
+    @ApiModelProperty(value = "房间状态 0正常 1已删除 2销毁")
     private Integer roomState;
 
     @TableField("created_by_")

+ 37 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/vo/ImLiveBroadcastRoomVo.java

@@ -65,6 +65,19 @@ public class ImLiveBroadcastRoomVo implements Serializable {
     @ApiModelProperty(value = "房间配置json格式-是否允许点赞-是否允许聊天互动-是否允许保存直播回放")
     private String roomConfig;
 
+    @ApiModelProperty(value = "imToken")
+    private String imToken;
+
+    @ApiModelProperty(value = "播出端")
+    private String os = "pc";
+
+    @ApiModelProperty(value = "点赞数")
+    private Integer likeNum;
+    @ApiModelProperty(value = "当前观看人数")
+    private Integer lookNum;
+    @ApiModelProperty(value = "累计观看人数")
+    private Integer totalLookNum;
+
     public Integer getId() {
         return id;
     }
@@ -192,5 +205,29 @@ public class ImLiveBroadcastRoomVo implements Serializable {
     public void setSpeakerPic(String speakerPic) {
         this.speakerPic = speakerPic;
     }
+
+    public String getImToken() {
+        return imToken;
+    }
+
+    public void setImToken(String imToken) {
+        this.imToken = imToken;
+    }
+
+    public String getOs() {
+        return os;
+    }
+
+    public void setOs(String os) {
+        this.os = os;
+    }
+
+    public Integer getLikeNum() {
+        return likeNum;
+    }
+
+    public void setLikeNum(Integer likeNum) {
+        this.likeNum = likeNum;
+    }
 }
 

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

@@ -20,14 +20,20 @@ public interface ImLiveBroadcastRoomService extends IService<ImLiveBroadcastRoom
 
     ImLiveBroadcastRoomVo queryRoom(String roomUid, Integer userId);
 
+    ImLiveBroadcastRoomVo queryRoomInfo(String roomUid);
+
     void add(ImLiveBroadcastRoomDto dto);
 
     void update(ImLiveBroadcastRoomDto dto);
 
+    void roomDestroy(Integer id);
+
     void delete(Integer id);
 
     void syncLike(String roomUid, Integer likeNum);
 
+    void joinRoom(String roomUid, Integer userId);
+
     void test();
 
     /**

+ 129 - 11
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveBroadcastRoomServiceImpl.java

@@ -9,19 +9,19 @@ import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.ImLiveBroadcastRoomDao;
 import com.ym.mec.biz.dal.dto.ImLiveBroadcastRoomDto;
 import com.ym.mec.biz.dal.entity.ImLiveBroadcastRoom;
-import com.ym.mec.biz.dal.enums.ImSendTypeEnum;
 import com.ym.mec.biz.dal.enums.MessageTypeEnum;
 import com.ym.mec.biz.dal.vo.ImLiveBroadcastRoomVo;
 import com.ym.mec.biz.service.ImLiveBroadcastRoomService;
-import com.ym.mec.biz.service.SysConfigService;
 import com.ym.mec.biz.service.SysMessageService;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.PageUtil;
+import com.ym.mec.common.page.WrapperUtil;
 import com.ym.mec.common.tenant.TenantContextHolder;
 import com.ym.mec.im.ImFeignService;
 import com.ym.mec.util.date.DateUtil;
 import com.ym.mec.util.http.HttpUtil;
+import org.redisson.api.RBucket;
 import org.redisson.api.RedissonClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -52,12 +52,31 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
     @Autowired
     private SysMessageService sysMessageService;
 
+    public static final String USER_ID = "${userId}";
+    public static final String ROOM_UID = "${roomUid}";
+
+    //用户对应的直播间Uid
+    public static final String LIVE_ROOM_USER = "IM:LIVE_ROOM_USER:" + USER_ID;
+    //用户进入房间时间
+    public static final String LIVE_ROOM_USER_JOIN_TIME = "IM:LIVE_ROOM_USER_JOIN_TIME:" + USER_ID;
+    //用户退出房间时间
+    public static final String LIVE_ROOM_USER_QUIT_TIME = "IM:LIVE_ROOM_USER_QUIT_TIME:" + USER_ID;
+    //房间信息
+    public static final String LIVE_ROOM_INFO = "IM:LIVE_ROOM_INFO:" + ROOM_UID;
+    //房间当前人数
+    public static final String LIVE_ROOM_LOOK = "IM:LIVE_ROOM_LOOK:" + ROOM_UID;
+    //房间累计人数
+    public static final String LIVE_ROOM_TOTAL_LOOK = "IM:LIVE_ROOM_TOTAL_LOOK:" + ROOM_UID;
+    //房间点赞数
+    public static final String LIVE_ROOM_LIKE = "IM:LIVE_ROOM_LIKE:" + ROOM_UID;
+
     /**
      * 进入直播间检查数据
      *
      * @param roomUid 房间uid
      * @param userId  用户id
      */
+    @Override
     public ImLiveBroadcastRoomVo queryRoom(String roomUid, Integer userId) {
         SysUser sysUser;
         if (Objects.isNull(userId)) {
@@ -73,7 +92,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
                 .orElseThrow(() -> new BizException("您不是该直播机构学员,不可观看!"));
         optional.filter(r -> r.getRoomState() != 1).orElseThrow(() -> new BizException("直播间不存在"));
         ImLiveBroadcastRoomVo room = optional.get();
-        if (room.getLiveState() == 0 || room.getLiveStartTime().getTime() < new Date().getTime()) {
+        if (room.getLiveState() == 0) {
             throw new BizException("直播未开始,直播开启的时间是 "
                     + DateUtil.format(room.getLiveStartTime(), DateUtil.EXPANDED_DATE_TIME_FORMAT));
         }
@@ -88,7 +107,8 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
      *
      * @param roomUid 直播间uid
      */
-    private ImLiveBroadcastRoomVo queryRoomInfo(String roomUid) {
+    @Override
+    public ImLiveBroadcastRoomVo queryRoomInfo(String roomUid) {
         List<ImLiveBroadcastRoomVo> list = baseMapper.queryPage(new HashMap<String, Object>() {{
             put("roomUid", roomUid);
         }});
@@ -146,6 +166,39 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
     }
 
     /**
+     * 关闭房间
+     *
+     * @param id 直播房间表id
+     */
+    @Override
+    public void roomDestroy(Integer id) {
+        ImLiveBroadcastRoom room = this.getById(id);
+        if (Objects.isNull(room)) {
+            return;
+        }
+        if (room.getLiveState() == 0) {
+            throw new BizException("直播未开始");
+        }
+        try {
+            imFeignService.destroyLiveRoom(room.getRoomUid());
+        } catch (Exception e) {
+            log.error(e.getMessage(), e.getCause());
+            throw new BizException(e.getMessage());
+        }
+        //todo 向聊天室发自定义消息提出所有学生
+
+        //todo 将房间redis的数据写入数据库后在删除缓存
+
+        //将房间状态改为已销毁
+        Date date = new Date();
+        room.setRoomState(2);
+        room.setUpdatedBy(getSysUser().getId());
+        room.setUpdatedTime(date);
+        room.setLiveEndTime(date);
+        this.updateById(room);
+    }
+
+    /**
      * 删除直播间
      *
      * @param id 直播间id
@@ -153,6 +206,9 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
     @Override
     public void delete(Integer id) {
         ImLiveBroadcastRoom obj = new ImLiveBroadcastRoom();
+        if (obj.getLiveState() == 1) {
+            throw new BizException("直播已经开始,无法删除");
+        }
         obj.setId(id);
         obj.setRoomState(1);
         this.updateById(obj);
@@ -165,16 +221,78 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
      * @param likeNum 点赞数
      */
     public void syncLike(String roomUid, Integer likeNum) {
+        redissonClient.getBucket(LIVE_ROOM_LIKE.replace(ROOM_UID, roomUid)).set(likeNum);
+    }
 
+    /**
+     * 进入房间-修改用户对应的房间号信息
+     *
+     * @param roomUid 房间uid
+     * @param userId  用户id
+     */
+    public void joinRoom(String roomUid, Integer userId) {
+        //查询有没有这个房间
+//        RList<Object> roomInfoCache = redissonClient.getList(LIVE_ROOM_INFO.replace(ROOM_UID, roomUid));
+//        roomInfoCache.contains()
+
+        //用户对应的直播间信息
+        RBucket<String> roomUserCache = redissonClient.getBucket(LIVE_ROOM_USER.replace(USER_ID, userId.toString()));
+        //获取原有房间信息
+        if (roomUserCache.isExists()) {
+            //原有的房间uid
+            String lodRoomUid = roomUserCache.get();
+            //如果房间相同直接返回
+            if (roomUid.equals(lodRoomUid)) {
+                return;
+            } else {
+                //如果不同就把原房间的当前人员数量-1
+                redissonClient.getAtomicLong(LIVE_ROOM_LOOK.replace(ROOM_UID, lodRoomUid)).decrementAndGet();
+            }
+        }
+        //写入用户房间uid
+        roomUserCache.set(roomUid);
+        //写入用户进入房间时间缓存
+        redissonClient.getBucket(LIVE_ROOM_USER_JOIN_TIME.replace(USER_ID, userId.toString())).set(new Date());
+        //添加房间中用户数量
+        redissonClient.getAtomicLong(LIVE_ROOM_LOOK.replace(ROOM_UID, roomUid)).incrementAndGet();
+        //添加房间中累计总用户数量
+        redissonClient.getAtomicLong(LIVE_ROOM_TOTAL_LOOK.replace(ROOM_UID, roomUid)).incrementAndGet();
     }
 
     /**
      * 定时任务,每分钟执行
      * 提前30分钟主动去融云注册并创建房间
      */
-    public void createRoom() {
-        List<ImLiveBroadcastRoomVo> imLiveBroadcastRoomVos = baseMapper.queryPage(new HashMap<>());
-        imFeignService.createLiveRoom("", "");
+    public void createLiveRoom() {
+        Date now = new Date();
+        Date startTime = DateUtil.addMinutes(now, 29);
+        Date endTime = DateUtil.addMinutes(now, 31);
+        List<ImLiveBroadcastRoom> list = this.list(new WrapperUtil<ImLiveBroadcastRoom>()
+                .hasEq("live_state_", 0)
+                .hasEq("room_state_", 0)
+                .hasGe("live_start_time_", startTime)
+                .hasLe("live_start_time_", endTime)
+                .queryWrapper());
+        if (CollectionUtils.isEmpty(list)) {
+            return;
+        }
+        list.forEach(this::createLiveRoom);
+    }
+
+    private void createLiveRoom(ImLiveBroadcastRoom room) {
+        try {
+            //去融云创建房间
+            Object liveRoom = imFeignService.createLiveRoom(room.getRoomUid(), room.getRoomTitle());
+        } catch (Exception e) {
+
+        }
+
+
+        //创建房间缓存
+        RBucket<Object> roomInfoCache = redissonClient.getBucket(LIVE_ROOM_INFO.replace(ROOM_UID, room.getRoomUid()));
+
+        //修改房间状态
+
     }
 
     private SysUser getSysUser(Integer userId) {
@@ -197,15 +315,15 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
     }
 
     @Override
-    public void shareGroup(String roomUid,String groupIds) {
+    public void shareGroup(String roomUid, String groupIds) {
         ImLiveBroadcastRoomVo imLiveBroadcastRoomVo = queryRoomInfo(roomUid);
         if (imLiveBroadcastRoomVo == null) {
             throw new BizException("直播间信息异常!");
         }
         SysUser sysUser = sysUserFeignService.queryUserInfo();
-        sysMessageService.batchSendImMessage(MessageTypeEnum.IM_SHARE_LIVE_URL,sysUser.getId().toString(),null,groupIds.split(","),null,
-                imLiveBroadcastRoomVo.getTenantName(),imLiveBroadcastRoomVo.getRoomTitle(),imLiveBroadcastRoomVo.getSpeakerName(),
-                DateUtil.format(imLiveBroadcastRoomVo.getLiveStartTime(),DateUtil.CHINESE_DATA_FORMAT_1),
+        sysMessageService.batchSendImMessage(MessageTypeEnum.IM_SHARE_LIVE_URL, sysUser.getId().toString(), null, groupIds.split(","), null,
+                imLiveBroadcastRoomVo.getTenantName(), imLiveBroadcastRoomVo.getRoomTitle(), imLiveBroadcastRoomVo.getSpeakerName(),
+                DateUtil.format(imLiveBroadcastRoomVo.getLiveStartTime(), DateUtil.CHINESE_DATA_FORMAT_1),
                 imLiveBroadcastRoomVo.getLiveRemark(), HttpUtil.getSortUrl("https://test.dayaedu.com/"));
     }
 }

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

@@ -61,6 +61,7 @@
         left join sys_user AS b on a.speaker_id_ = b.id_
         left join sys_user AS c on a.created_by_ = b.id_
         <where>
+            a.room_state_ = 0
             <if test="param.search != null ">
                 AND (
                 a.`room_uid_` LIKE CONCAT('%', #{param.search},'%')

+ 1 - 1
mec-web/src/main/java/com/ym/mec/web/config/ResourceServerConfig.java

@@ -39,7 +39,7 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
                         "/oaContracts/*", "/eduStudent/organStudentOverView", "/activity/countCloudTeacherActive",
                         "/activity/organDoubleEleven2021Statis", "/activity/doubleEleven2021Statis", "/questionnaireTopic/getDetail", "/questionnaireUserResult/add",
                         "/tenantInfo/info/*", "/tenantInfo/checkInfo/*", "/tenantInfo/pay/*","/tenantInfo/testCheck", "/tenantInfo/getContract/*",
-                        "/tenantPreJoin/add"
+                        "/tenantPreJoin/add","imLiveBroadcastRoom/queryRoomInfo"
                 )
                 .permitAll().anyRequest().authenticated().and().httpBasic();
     }

+ 26 - 1
mec-web/src/main/java/com/ym/mec/web/controller/ImLiveBroadcastRoomController.java

@@ -52,6 +52,12 @@ public class ImLiveBroadcastRoomController extends BaseController {
         return succeed(imLiveBroadcastRoomService.queryRoom(roomUid, userId));
     }
 
+    @ApiOperation("查询房间信息")
+    @GetMapping("/queryRoomInfo")
+    public HttpResponseResult<ImLiveBroadcastRoomVo> queryRoomInfo(@ApiParam(value = "房间uid", required = true) String roomUid) {
+        return succeed(imLiveBroadcastRoomService.queryRoomInfo(roomUid));
+    }
+
     @ApiOperation("创建直播间")
     @PostMapping("/add")
 //    @PreAuthorize("@pcs.hasPermissions('imLiveBroadcastRoom/add')")
@@ -68,6 +74,19 @@ public class ImLiveBroadcastRoomController extends BaseController {
         return succeed();
     }
 
+    /**
+     * 关闭直播间
+     *
+     * @param id 房间表id
+     */
+    @ApiOperation("关闭直播间")
+    @GetMapping(value = "/roomDestroy/{id}")
+//    @PreAuthorize("@pcs.hasPermissions('imLiveBroadcastRoom/roomDestroy')")
+    public HttpResponseResult roomDestroy(@ApiParam(value = "房间表id", required = true) @PathVariable("id") Integer id) {
+        imLiveBroadcastRoomService.roomDestroy(id);
+        return succeed();
+    }
+
     @ApiImplicitParams({
             @ApiImplicitParam(name = "id", dataType = "Integer", value = "房间id"),
     })
@@ -88,7 +107,13 @@ public class ImLiveBroadcastRoomController extends BaseController {
         return succeed();
     }
 
-    @GetMapping("/shareRoom")
+    @ApiOperation("进入房间")
+    @GetMapping("/joinRoom")
+    public void joinRoom(String roomUid, Integer userId) {
+        imLiveBroadcastRoomService.joinRoom(roomUid, userId);
+    }
+
+    @GetMapping("/test")
     public HttpResponseResult test() {
         imLiveBroadcastRoomService.test();
         return succeed();