Bladeren bron

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

# Conflicts:
#	mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveBroadcastRoomServiceImpl.java
zouxuan 3 jaren geleden
bovenliggende
commit
63d103f76b

+ 2 - 2
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ImLiveBroadcastRoomDto.java

@@ -28,7 +28,7 @@ public class ImLiveBroadcastRoomDto implements Serializable {
     @ApiModelProperty(value = "主讲人id/老师id")
     private Integer speakerId;
 
-    @Size(max = 13, message = "房间标题最多12个字!")
+    @Size(max = 12, message = "房间标题最多12个字!")
     @NotBlank(message = "房间标题不能为空")
     @ApiModelProperty(value = "房间标题/最多12个字")
     private String roomTitle;
@@ -37,7 +37,7 @@ public class ImLiveBroadcastRoomDto implements Serializable {
     @ApiModelProperty(value = "直播开始时间")
     private Date liveStartTime;
 
-    @Size(max = 13, message = "直播内容最多200个字!")
+    @Size(max = 200, message = "直播内容最多200个字!")
     @NotBlank(message = "直播内容不能为空")
     @ApiModelProperty(value = "直播内容/最多200个字")
     private String liveRemark;

+ 10 - 5
mec-biz/src/main/java/com/ym/mec/biz/dal/vo/RoomUserInfoVo.java

@@ -14,6 +14,8 @@ public class RoomUserInfoVo implements Serializable {
 
     private String userName;
 
+    private Integer tenantId;
+
     //累计观看时长
     private Integer totalViewTime;
 
@@ -29,11 +31,6 @@ public class RoomUserInfoVo implements Serializable {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date lastOutTime;
 
-    /**
-     * 状态:0:online 上线、1:offline 离线、2:logout 登出  3:退出直播间
-     */
-    private String status;
-
     public Integer getUserId() {
         return userId;
     }
@@ -81,4 +78,12 @@ public class RoomUserInfoVo implements Serializable {
     public void setLastOutTime(Date lastOutTime) {
         this.lastOutTime = lastOutTime;
     }
+
+    public Integer getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Integer tenantId) {
+        this.tenantId = tenantId;
+    }
 }

+ 3 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/ImLiveBroadcastRoomMemberService.java

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ym.mec.biz.dal.dao.ImLiveBroadcastRoomMemberDao;
 import com.ym.mec.biz.dal.entity.ImLiveBroadcastRoomMember;
 import com.ym.mec.biz.dal.vo.ImLiveBroadcastRoomDetailVo;
 import com.ym.mec.biz.dal.vo.ImLiveBroadcastRoomMemberVo;
@@ -16,6 +17,8 @@ import java.util.Map;
  */
 public interface ImLiveBroadcastRoomMemberService extends IService<ImLiveBroadcastRoomMember> {
 
+    ImLiveBroadcastRoomMemberDao getDao();
+
     /**
      * 查询房间详情
      */

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

@@ -37,8 +37,16 @@ public interface ImLiveBroadcastRoomService extends IService<ImLiveBroadcastRoom
 
     void quitRoom(List<ImUserState> userState);
 
+    void speakerJoinRoom(String roomUid);
+
     void joinRoom(String roomUid, Integer userId);
 
+    void startLive(String roomUid,Integer userId);
+
+    void closeLive(String roomUid,Integer userId);
+
+    void createLiveRoom();
+
     void test();
 
     /**

+ 5 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveBroadcastRoomMemberServiceImpl.java

@@ -24,6 +24,11 @@ public class ImLiveBroadcastRoomMemberServiceImpl extends ServiceImpl<ImLiveBroa
 
     private final static Logger log = LoggerFactory.getLogger(ImLiveBroadcastRoomMemberServiceImpl.class);
 
+    @Override
+    public ImLiveBroadcastRoomMemberDao getDao(){
+        return this.baseMapper;
+    }
+
     /**
      * 查询直播详情
      */

+ 331 - 75
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveBroadcastRoomServiceImpl.java

@@ -1,6 +1,8 @@
 package com.ym.mec.biz.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -10,9 +12,13 @@ import com.ym.mec.biz.dal.dao.ImLiveBroadcastRoomDao;
 import com.ym.mec.biz.dal.dao.SysConfigDao;
 import com.ym.mec.biz.dal.dto.ImLiveBroadcastRoomDto;
 import com.ym.mec.biz.dal.entity.ImLiveBroadcastRoom;
+import com.ym.mec.biz.dal.entity.ImLiveBroadcastRoomData;
+import com.ym.mec.biz.dal.entity.ImLiveBroadcastRoomMember;
 import com.ym.mec.biz.dal.enums.MessageTypeEnum;
 import com.ym.mec.biz.dal.vo.ImLiveBroadcastRoomVo;
 import com.ym.mec.biz.dal.vo.RoomUserInfoVo;
+import com.ym.mec.biz.service.ImLiveBroadcastRoomDataService;
+import com.ym.mec.biz.service.ImLiveBroadcastRoomMemberService;
 import com.ym.mec.biz.service.ImLiveBroadcastRoomService;
 import com.ym.mec.biz.service.SysConfigService;
 import com.ym.mec.biz.service.SysMessageService;
@@ -38,6 +44,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
+import java.io.Serializable;
 import java.util.*;
 
 /**
@@ -61,6 +68,10 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
     private SysMessageService sysMessageService;
     @Autowired
     private SysConfigDao sysConfigDao;
+    @Autowired
+    private ImLiveBroadcastRoomMemberService liveBroadcastRoomMemberService;
+    @Autowired
+    private ImLiveBroadcastRoomDataService liveBroadcastRoomDataService;
 
     public static final String USER_ID = "${userId}";
     public static final String ROOM_UID = "${roomUid}";
@@ -69,6 +80,8 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
     public static final String LIVE_ROOM_USER_LIST = "IM:LIVE_ROOM_USER_LIST:" + ROOM_UID;
     //直播间累计用户信息-指只要进入到该房间的用户都要记录
     public static final String LIVE_ROOM_TOTAL_USER_LIST = "IM:LIVE_ROOM_TOTAL_USER_LIST:" + ROOM_UID;
+    //主讲人信息
+    public static final String LIVE_SPEAKER_INFO = "IM:LIVE_SPEAKER_INFO:" + USER_ID;
     //用户对应的直播间Uid
     public static final String LIVE_USER_ROOM = "IM:LIVE_ROOM_USER:" + USER_ID;
     //房间点赞数
@@ -167,9 +180,12 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
     public void update(ImLiveBroadcastRoomDto dto) {
         ImLiveBroadcastRoom obj = this.getById(dto.getId());
         if (obj.getLiveState() == 1) {
-            throw new BizException("直播已经开始,无法修改");
+            obj.setRoomTitle(dto.getRoomTitle());
+        } else {
+            BeanUtils.copyProperties(dto, obj);
         }
-        BeanUtils.copyProperties(dto, obj);
+        obj.setUpdatedBy(getSysUser().getId());
+        obj.setUpdatedTime(new Date());
         log.info("update room  >>>  :{}", JSONObject.toJSONString(obj));
         this.updateById(obj);
     }
@@ -187,6 +203,8 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         }
         obj.setId(id);
         obj.setRoomState(1);
+        obj.setUpdatedBy(getSysUser().getId());
+        obj.setUpdatedTime(new Date());
         this.updateById(obj);
     }
 
@@ -210,12 +228,13 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
             log.error(e.getMessage(), e.getCause());
             throw new BizException(e.getMessage());
         }
-
-        //todo 将房间redis的数据写入数据库后在删除缓存
+        //获取所有直播间缓存数据并写入数据库
+        insertLiveAllData(room.getRoomUid(), room.getSpeakerId());
 
         //将房间状态改为已销毁
         Date date = new Date();
         room.setRoomState(2);
+        room.setLiveState(2);
         room.setUpdatedBy(getSysUser().getId());
         room.setUpdatedTime(date);
         room.setLiveEndTime(date);
@@ -229,12 +248,45 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         imFeignService.publishRoomMsg(message);
     }
 
+    //获取该直播间所有数据
+    private void insertLiveAllData(String roomUid, Integer userId) {
+        //获取直播间所有人数据写入 im_live_broadcast_room_member
+        RMap<Integer, RoomUserInfoVo> roomTotalUser = redissonClient.getMap(LIVE_ROOM_TOTAL_USER_LIST.replace(ROOM_UID, roomUid));
+        List<ImLiveBroadcastRoomMember> memberList = new ArrayList<>();
+        roomTotalUser.forEach((k, v) -> {
+            ImLiveBroadcastRoomMember member = new ImLiveBroadcastRoomMember();
+            member.setTenantId(v.getTenantId());
+            member.setRoomUid(roomUid);
+            member.setUserId(userId);
+            member.setJoinTime(v.getFirstJoinTime());
+            member.setTotalTime(v.getTotalViewTime());
+            memberList.add(member);
+        });
+        liveBroadcastRoomMemberService.getDao().insertBatch(memberList);
+
+        //获取直播间数据
+        ImLiveBroadcastRoomVo roomVo = queryRoomInfo(roomUid);
+        //获取直播间主讲人信息
+        RBucket<RoomSpeakerInfo> speakerCache = redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, roomVo.getSpeakerId().toString()));
+        RoomSpeakerInfo speakerInfo = speakerCache.get();
+        //获取直播间数据写入im_live_broadcast_room_data
+        ImLiveBroadcastRoomData liveData = new ImLiveBroadcastRoomData();
+        liveData.setTenantId(speakerInfo.getTenantId());
+        liveData.setRoomUid(roomUid);
+        liveData.setLikeNum(roomVo.getLikeNum());
+        liveData.setTotalUserNum(roomVo.getTotalLookNum());
+        liveData.setUpdatedTime(new Date());
+        liveData.setLiveTime(speakerInfo.getTotalLiveTime());
+        liveBroadcastRoomDataService.save(liveData);
+    }
+
     /**
      * 同步点赞数量
      *
      * @param roomUid 房间uid
      * @param likeNum 点赞数
      */
+    @Override
     public void syncLike(String roomUid, Integer likeNum) {
         redissonClient.getBucket(LIVE_ROOM_LIKE.replace(ROOM_UID, roomUid)).set(likeNum);
     }
@@ -244,31 +296,38 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
      *
      * @param userState 用户状态数据
      */
+    @Override
     public void quitRoom(List<ImUserState> userState) {
         userState.forEach(user -> {
+            log.info("quitRoom>>>> {}", JSONObject.toJSONString(user));
             if (StringUtils.isBlank(user.getStatus()) || user.getStatus().equals("0")) {
                 return;
             }
+            Integer userId = Integer.valueOf(user.getUserid());
+            Date now = new Date();
+            //查询userId,如果是主讲人退出房间,那么不做后面操作
+            RBucket<RoomSpeakerInfo> speakerCache = redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, user.getUserid()));
+            if (speakerCache.isExists()) {
+                RoomSpeakerInfo speakerInfo = speakerCache.get();
+                speakerInfo.setState(2);//主讲人退出房间后房间为暂停直播状态(超过半小时还未开播则自动清算)
+                speakerInfo.setExitRoomTime(now);
+                speakerCache.set(speakerInfo);
+                //主讲人退出房间关闭录像
+                closeLive(speakerInfo.getRoomUid(), userId);
+                log.info("quitRoom>>>> speakerCache {}", JSONObject.toJSONString(speakerInfo));
+                return;
+            }
+
             //获取当前用户所在房间的uid
             RBucket<String> userRoom = redissonClient.getBucket(LIVE_USER_ROOM.replace(USER_ID, user.getUserid()));
             if (!userRoom.isExists()) {
                 return;
             }
             String roomUid = userRoom.get();
-            Integer userId = Integer.valueOf(user.getUserid());
-
-            //只有离线-发送退出房间消息给主讲人
-            if (user.getStatus().equals("1")) {
-                ImRoomMessage message = new ImRoomMessage();
-                message.setFromUserId(userId.toString());
-                message.setToChatroomId(roomUid);
-                message.setObjectName(ImRoomMessage.LOOKER_LOGIN_OUT);
-                imFeignService.publishRoomMsg(message);
-            }
 
             //从房间累计用户信息中查询该用户的信息
             RMap<Integer, RoomUserInfoVo> roomTotalUser = redissonClient.getMap(LIVE_ROOM_TOTAL_USER_LIST.replace(ROOM_UID, roomUid));
-            Date now = new Date();
+
             RoomUserInfoVo userInfo;
             //该房间未查询到用户数据则不处理
             if (!roomTotalUser.containsKey(userId)) {
@@ -276,8 +335,20 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
             }
             //查询到用户数据
             userInfo = roomTotalUser.get(userId);
-            //将用户从该房间当前直播间用户列表移除
-            redissonClient.getList(LIVE_ROOM_USER_LIST.replace(ROOM_UID, roomUid)).remove(userInfo);
+            //查询该房间当前直播间用户列表
+            RList<Object> roomUserCache = redissonClient.getList(LIVE_ROOM_USER_LIST.replace(ROOM_UID, roomUid));
+            if (roomUserCache.contains(userInfo)) {
+                //只有在房间的时候并且是杀进程那么融云会发送用户离线消息-此刻就发送退出房间消息给主讲人
+                if (user.getStatus().equals("1")) {
+                    ImRoomMessage message = new ImRoomMessage();
+                    message.setFromUserId(userId.toString());
+                    message.setToChatroomId(roomUid);
+                    message.setObjectName(ImRoomMessage.LOOKER_LOGIN_OUT);
+                    imFeignService.publishRoomMsg(message);
+                }
+                //从该房间当前直播间用户列表中移除
+                roomUserCache.remove(userInfo);
+            }
             //每次退出房间计算当前用户观看时长
             int minutesBetween = getMinutesBetween(userInfo.getDynamicJoinTime(), now);
             userInfo.setTotalViewTime(userInfo.getTotalViewTime() + minutesBetween);
@@ -288,6 +359,34 @@ 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();
+        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("还未开启直播间");
+        }
+    }
+
     /**
      * 进入房间-修改用户对应的房间号信息
      *
@@ -299,12 +398,15 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         redissonClient.getBucket(LIVE_USER_ROOM.replace(USER_ID, userId.toString())).set(roomUid);
         //房间累计用户信息-指只要进入到该房间的用户都要记录
         RMap<Integer, RoomUserInfoVo> roomTotalUser = redissonClient.getMap(LIVE_ROOM_TOTAL_USER_LIST.replace(ROOM_UID, roomUid));
+        //查询直播间当前用户数据缓存
+        RList<RoomUserInfoVo> roomUserCacheList = redissonClient.getList(LIVE_ROOM_USER_LIST.replace(ROOM_UID, roomUid));
         //判断是否第一次进房间
-        Date now = new Date();
         RoomUserInfoVo userInfo;
+        Date now = new Date();
         if (roomTotalUser.containsKey(userId)) {
             //多次进入更新动态进入时间
             userInfo = roomTotalUser.get(userId);
+            roomUserCacheList.remove(userInfo);
         } else {
             //第一次进该房间 写入用户首次进入时间
             userInfo = getUserInfo(userId);
@@ -313,28 +415,48 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         }
         userInfo.setDynamicJoinTime(now);
         roomTotalUser.put(userId, userInfo);
-        //添加到直播间当前用户数据缓存中
-        redissonClient.getList(LIVE_ROOM_USER_LIST.replace(ROOM_UID, roomUid)).add(userInfo);
+        //将数据添加到当前直播间
+        roomUserCacheList.add(userInfo);
     }
 
     /**
-     * 开始直播
+     * 开始直播-录像
      *
-     * @param roomUid
+     * @param roomUid 房间uid
      */
-    public void startLive(String roomUid) {
-        //开始录制视频
-        imFeignService.startRecord(roomUid);
+    public void startLive(String roomUid, Integer userId) {
+        //查询房间信息是否允许录像
+        RBucket<RoomSpeakerInfo> speakerCache = redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, userId.toString()));
+        RoomSpeakerInfo roomSpeakerInfo = speakerCache.get();
+        if (roomSpeakerInfo.getWhetherVideo() == 0) {
+            //开始录制视频
+            imFeignService.startRecord(roomUid);
+        }
+        //开始直播
+        roomSpeakerInfo.setState(0);
+        roomSpeakerInfo.setStartLiveTime(new Date());
+        speakerCache.set(roomSpeakerInfo);
     }
 
     /**
-     * 关闭直播
+     * 关闭直播-录像
      *
-     * @param roomUid
+     * @param roomUid 房间uid
      */
-    public void closeLive(String roomUid) {
-        //停止录制视频
-        imFeignService.stopRecord(roomUid);
+    public void closeLive(String roomUid, Integer userId) {
+        //关闭直播
+        RBucket<RoomSpeakerInfo> speakerCache = redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, userId.toString()));
+        RoomSpeakerInfo roomSpeakerInfo = speakerCache.get();
+        roomSpeakerInfo.setState(1);
+        if (roomSpeakerInfo.getWhetherVideo() == 0) {
+            //停止录制视频
+            imFeignService.stopRecord(roomUid);
+        }
+        //计算时长
+        int minutesBetween = getMinutesBetween(roomSpeakerInfo.getStartLiveTime(), new Date());
+        int i = Objects.isNull(roomSpeakerInfo.getTotalLiveTime()) ? 0 : roomSpeakerInfo.getTotalLiveTime();
+        roomSpeakerInfo.setTotalLiveTime(i + minutesBetween);
+        speakerCache.set(roomSpeakerInfo);
     }
 
     /**
@@ -343,12 +465,11 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
      */
     public void createLiveRoom() {
         Date now = new Date();
-        Date startTime = DateUtil.addMinutes(now, 29);
-        Date endTime = DateUtil.addMinutes(now, 31);
+        Date endTime = DateUtil.addMinutes(now, 30);
         List<ImLiveBroadcastRoom> list = this.list(new WrapperUtil<ImLiveBroadcastRoom>()
                 .hasEq("live_state_", 0)
                 .hasEq("room_state_", 0)
-                .hasGe("live_start_time_", startTime)
+                .hasGe("live_start_time_", now)
                 .hasLe("live_start_time_", endTime)
                 .queryWrapper());
         if (CollectionUtils.isEmpty(list)) {
@@ -357,55 +478,45 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         list.forEach(this::createLiveRoom);
     }
 
-    //移除
-    private void removeUserCache(Integer userId, String lodRoomUid) {
-
-    }
-
-    private RoomUserInfoVo getUserInfo(Integer userId) {
-        RoomUserInfoVo userInfo = new RoomUserInfoVo();
-        userInfo.setUserId(userId);
-        SysUser sysUser = sysUserFeignService.queryUserById(userId);
-        String name = userId.toString();
-        if (Objects.nonNull(sysUser)) {
-            if (StringUtils.isNotBlank(sysUser.getRealName())) {
-                name = sysUser.getRealName();
-            } else {
-                name = sysUser.getPhone();
-            }
-        }
-        userInfo.setUserName(name);
-        return userInfo;
-    }
-
-    //计算时间差-分钟数不满一分钟为0
-    private int getMinutesBetween(Date startDT, Date endDT) {
-        if (Objects.isNull(startDT) || Objects.isNull(endDT)) {
-            return 0;
-        }
-        //课程结束时间-课程开始时间
-        long durationTime = endDT.getTime() - startDT.getTime();
-        //相差多少分钟
-        return new Long(durationTime / 1000 / 60).intValue();
-    }
-
     /**
      * 去融云创建房间
      */
     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());
+
+            //查询房间信息是否允许录像
+            ImLiveBroadcastRoom one = this.getOne(new QueryWrapper<ImLiveBroadcastRoom>().eq("room_uid_", room.getRoomUid()));
+            Optional.ofNullable(one.getRoomConfig())
+                    .map(c -> JSON.parseObject(c, ImLiveBroadcastRoomDto.RoomConfig.class))
+                    .filter(c -> Objects.nonNull(c.getWhether_video()))
+                    .filter(c -> c.getWhether_video() == 0)
+                    .ifPresent(c -> speakerInfo.setWhetherVideo(0));//可以录制视频
+            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);
+
             //去融云创建房间
-            Object liveRoom = imFeignService.createLiveRoom(room.getRoomUid(), room.getRoomTitle());
+            imFeignService.createLiveRoom(room.getRoomUid(), room.getRoomTitle());
+
         } catch (Exception e) {
-            throw new BizException(e.getMessage());
+            log.error(">>>>>>>>>> createLiveRoom error roomUid:{} msg:{}", room.getRoomUid(), e.getMessage());
         }
-        //生成0点赞
-        redissonClient.getBucket(LIVE_ROOM_LIKE.replace(ROOM_UID, room.getRoomUid())).set(0);
-        //todo 修改房间状态
-        room.setLiveState(1);
-        room.setUpdatedTime(new Date());
-        room.setUpdatedBy(-1);
-        baseMapper.updateById(room);
     }
 
     private void getRoomData(ImLiveBroadcastRoomVo roomVo) {
@@ -437,9 +548,10 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
     }
 
     /**
-     * 分享直播间
+     * 测试
      */
     public void test() {
+
     }
 
     @Override
@@ -466,5 +578,149 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         return redissonClient.getList(LIVE_ROOM_USER_LIST.replace(ROOM_UID, roomUid));
     }
 
+    private RoomUserInfoVo getUserInfo(Integer userId) {
+        RoomUserInfoVo userInfo = new RoomUserInfoVo();
+        userInfo.setUserId(userId);
+        SysUser sysUser = sysUserFeignService.queryUserById(userId);
+        String name = userId.toString();
+        if (Objects.nonNull(sysUser)) {
+            if (StringUtils.isNotBlank(sysUser.getRealName())) {
+                name = sysUser.getRealName();
+            } else {
+                name = sysUser.getPhone();
+            }
+        }
+        userInfo.setUserName(name);
+        userInfo.setTenantId(sysUser.getTenantId());
+        return userInfo;
+    }
+
+    //计算时间差-分钟数不满一分钟为0
+    private int getMinutesBetween(Date startDT, Date endDT) {
+        if (Objects.isNull(startDT) || Objects.isNull(endDT)) {
+            return 0;
+        }
+        //课程结束时间-课程开始时间
+        long durationTime = endDT.getTime() - startDT.getTime();
+        //相差多少分钟
+        return new Long(durationTime / 1000 / 60).intValue();
+    }
+
+    /**
+     * 主讲人信息
+     */
+    public static class RoomSpeakerInfo implements Serializable {
+        //主讲人id
+        private Integer speakerId;
+        //主讲人名称
+        private String speakerName;
+        //直播状态 0 直播中 1关闭直播 2暂停直播(直接断开退出直播间后超过半小时还未开播则自动清算)
+        private Integer state;
+        //房间uid
+        private String roomUid;
+        //房间创建时间
+        private Date createRoomTime;
+        //进入房间时间
+        private Date joinRoomTime;
+        //开始直播时间
+        private Date startLiveTime;
+        //退出房间时间
+        private Date exitRoomTime;
+        //总直播时间
+        private Integer totalLiveTime = 0;
+        //是否录像 0允许 1不允许
+        private Integer whetherVideo;
+        //机构
+        private Integer tenantId;
+
+        public Integer getSpeakerId() {
+            return speakerId;
+        }
+
+        public void setSpeakerId(Integer speakerId) {
+            this.speakerId = speakerId;
+        }
+
+        public String getSpeakerName() {
+            return speakerName;
+        }
+
+        public void setSpeakerName(String speakerName) {
+            this.speakerName = speakerName;
+        }
+
+        public Integer getState() {
+            return state;
+        }
+
+        public void setState(Integer state) {
+            this.state = state;
+        }
+
+        public String getRoomUid() {
+            return roomUid;
+        }
+
+        public void setRoomUid(String roomUid) {
+            this.roomUid = roomUid;
+        }
+
+        public Date getJoinRoomTime() {
+            return joinRoomTime;
+        }
+
+        public void setJoinRoomTime(Date joinRoomTime) {
+            this.joinRoomTime = joinRoomTime;
+        }
+
+        public Date getStartLiveTime() {
+            return startLiveTime;
+        }
+
+        public void setStartLiveTime(Date startLiveTime) {
+            this.startLiveTime = startLiveTime;
+        }
+
+        public Integer getTotalLiveTime() {
+            return totalLiveTime;
+        }
+
+        public void setTotalLiveTime(Integer totalLiveTime) {
+            this.totalLiveTime = totalLiveTime;
+        }
+
+        public Date getCreateRoomTime() {
+            return createRoomTime;
+        }
+
+        public void setCreateRoomTime(Date createRoomTime) {
+            this.createRoomTime = createRoomTime;
+        }
+
+        public Date getExitRoomTime() {
+            return exitRoomTime;
+        }
+
+        public void setExitRoomTime(Date exitRoomTime) {
+            this.exitRoomTime = exitRoomTime;
+        }
+
+        public Integer getWhetherVideo() {
+            return whetherVideo;
+        }
+
+        public void setWhetherVideo(Integer whetherVideo) {
+            this.whetherVideo = whetherVideo;
+        }
+
+        public Integer getTenantId() {
+            return tenantId;
+        }
+
+        public void setTenantId(Integer tenantId) {
+            this.tenantId = tenantId;
+        }
+    }
+
 }
 

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

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

+ 9 - 4
mec-client-api/src/main/java/com/ym/mec/task/TaskRemoteService.java

@@ -1,10 +1,9 @@
 package com.ym.mec.task;
 
-import org.springframework.cloud.openfeign.FeignClient;
-import org.springframework.web.bind.annotation.GetMapping;
-
 import com.ym.mec.common.config.FeignConfiguration;
 import com.ym.mec.task.fallback.TaskRemoteServiceFallback;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
 
 @FeignClient(name = "web-server", contextId = "TaskRemoteService", configuration = { FeignConfiguration.class }, fallback = TaskRemoteServiceFallback.class)
 public interface TaskRemoteService {
@@ -242,5 +241,11 @@ public interface TaskRemoteService {
 
 	/** 查询老师协议签订状态 */
 	@GetMapping("task/queryTeacherContractSignStatus")
-	public void queryTeacherContractSignStatus();
+	void queryTeacherContractSignStatus();
+
+    /**
+     * 每分钟-查询是否有直播间需要创建
+     */
+    @GetMapping("task/createLiveRoom")
+    void createLiveRoom();
 }

+ 5 - 0
mec-client-api/src/main/java/com/ym/mec/task/fallback/TaskRemoteServiceFallback.java

@@ -294,4 +294,9 @@ public class TaskRemoteServiceFallback implements TaskRemoteService {
 	public void queryTeacherContractSignStatus() {
 		logger.error("查询老师协议签订状态失败");
 	}
+
+    @Override
+    public void createLiveRoom() {
+        logger.error("直播间创建失败");
+    }
 }

+ 24 - 0
mec-task/src/main/java/com/ym/mec/task/jobs/CreateLiveRoomTask.java

@@ -0,0 +1,24 @@
+package com.ym.mec.task.jobs;
+
+import com.ym.mec.task.TaskRemoteService;
+import com.ym.mec.task.core.BaseTask;
+import com.ym.mec.task.core.TaskException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author hgw
+ * Created by 2022年3月1日
+ */
+@Service
+public class CreateLiveRoomTask extends BaseTask {
+
+    @Autowired
+    private TaskRemoteService taskRemoteService;
+
+    @Override
+    public void execute() throws TaskException {
+        taskRemoteService.createLiveRoom();
+    }
+
+}

+ 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","/imLiveBroadcastRoom/queryRoomInfo"
+                        "/tenantPreJoin/add","/imLiveBroadcastRoom/queryRoomInfo","/imLiveBroadcastRoom/test"
                 )
                 .permitAll().anyRequest().authenticated().and().httpBasic();
     }

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

@@ -50,7 +50,7 @@ public class ImLiveBroadcastRoomController extends BaseController {
     @ApiOperation("查询房间信息并校验房间是否合规")
     @GetMapping("/queryRoom")
     public HttpResponseResult<ImLiveBroadcastRoomVo> queryRoomAndCheck(@ApiParam(value = "房间uid", required = true) String roomUid,
-                                                               @ApiParam(value = "用户id", required = true) Integer userId) {
+                                                                       @ApiParam(value = "用户id", required = true) Integer userId) {
         return succeed(imLiveBroadcastRoomService.queryRoomAndCheck(roomUid, userId));
     }
 
@@ -109,12 +109,36 @@ public class ImLiveBroadcastRoomController extends BaseController {
         return succeed();
     }
 
+    @ApiOperation("主讲人进入房间")
+    @GetMapping("/speakerJoinRoom")
+    public HttpResponseResult speakerJoinRoom(String roomUid) {
+        imLiveBroadcastRoomService.speakerJoinRoom(roomUid);
+        return succeed();
+    }
+
     @ApiOperation("进入房间")
     @GetMapping("/joinRoom")
-    public void joinRoom(String roomUid, Integer userId) {
+    public HttpResponseResult joinRoom(String roomUid, Integer userId) {
         imLiveBroadcastRoomService.joinRoom(roomUid, userId);
+        return succeed();
     }
 
+    @ApiOperation("开启/关闭直播的录像")
+    @GetMapping("/opsLiveVideo")
+    public HttpResponseResult opsLiveVideo(@ApiParam(value = "房间uid", required = true) String roomUid,
+                                           @ApiParam(value = "用户id", required = true) Integer userId,
+                                           @ApiParam(value = "type 1:开始直播-开始录像     2:关闭直播关闭录像", required = true) Integer type) {
+        if (type == 1) {
+            imLiveBroadcastRoomService.startLive(roomUid, userId);
+        } else if (type == 2) {
+            imLiveBroadcastRoomService.closeLive(roomUid, userId);
+        } else {
+            failed("type参数错误");
+        }
+        return succeed();
+    }
+
+
     @GetMapping("/test")
     public HttpResponseResult test() {
         imLiveBroadcastRoomService.test();

+ 9 - 35
mec-web/src/main/java/com/ym/mec/web/controller/TaskController.java

@@ -1,5 +1,6 @@
 package com.ym.mec.web.controller;
 
+import com.ym.mec.biz.service.*;
 import io.swagger.annotations.ApiOperation;
 
 import java.io.File;
@@ -26,40 +27,6 @@ import com.ym.mec.biz.dal.entity.MusicGroupSchoolTermCourseDetail;
 import com.ym.mec.biz.dal.entity.TenantInfo;
 import com.ym.mec.biz.dal.enums.IndexDataType;
 import com.ym.mec.biz.event.source.CourseEventSource;
-import com.ym.mec.biz.service.AppRedemptionCodeService;
-import com.ym.mec.biz.service.ClassGroupService;
-import com.ym.mec.biz.service.CourseHomeworkService;
-import com.ym.mec.biz.service.CourseReviewService;
-import com.ym.mec.biz.service.CourseScheduleEvaluateService;
-import com.ym.mec.biz.service.CourseScheduleService;
-import com.ym.mec.biz.service.CourseScheduleTeacherSalaryService;
-import com.ym.mec.biz.service.CoursesGroupService;
-import com.ym.mec.biz.service.ExtracurricularExercisesService;
-import com.ym.mec.biz.service.GoodsService;
-import com.ym.mec.biz.service.IndexBaseMonthDataService;
-import com.ym.mec.biz.service.IndexErrDataRecordService;
-import com.ym.mec.biz.service.InspectionItemPlanService;
-import com.ym.mec.biz.service.MusicGroupPaymentCalenderDetailService;
-import com.ym.mec.biz.service.MusicGroupPaymentCalenderService;
-import com.ym.mec.biz.service.MusicGroupSchoolTermCourseDetailService;
-import com.ym.mec.biz.service.MusicGroupStudentFeeService;
-import com.ym.mec.biz.service.OperatingReportService;
-import com.ym.mec.biz.service.PracticeGroupService;
-import com.ym.mec.biz.service.StudentCourseHomeworkService;
-import com.ym.mec.biz.service.StudentGoodsSellService;
-import com.ym.mec.biz.service.StudentInstrumentService;
-import com.ym.mec.biz.service.StudentPaymentOrderService;
-import com.ym.mec.biz.service.StudentServeService;
-import com.ym.mec.biz.service.StudentService;
-import com.ym.mec.biz.service.SysMessageService;
-import com.ym.mec.biz.service.SysMusicCompareRecordService;
-import com.ym.mec.biz.service.TeacherAttendanceService;
-import com.ym.mec.biz.service.TeacherContractsService;
-import com.ym.mec.biz.service.TeacherCourseStatisticsService;
-import com.ym.mec.biz.service.TenantInfoService;
-import com.ym.mec.biz.service.TenantOrderRecordService;
-import com.ym.mec.biz.service.TenantPaymentOrderService;
-import com.ym.mec.biz.service.VipGroupService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.redis.service.RedisCache;
 import com.ym.mec.common.tenant.TenantContextHolder;
@@ -147,9 +114,10 @@ public class TaskController extends BaseController {
     private TenantOrderRecordService tenantOrderRecordService;
 	@Autowired
 	private AppRedemptionCodeService appRedemptionCodeService;
-	
 	@Autowired
 	private TeacherContractsService teacherContractsService;
+    @Autowired
+    private ImLiveBroadcastRoomService imLiveBroadcastRoomService;
 
 	@GetMapping(value = "/syncImHistoryMessageTask")
 	// 同步即时通讯聊天记录
@@ -599,4 +567,10 @@ public class TaskController extends BaseController {
     public void queryTeacherContractSignStatus(){
     	teacherContractsService.queryTeacherContractSignStatus();
     }
+
+    @ApiOperation("每分钟-查询是否有直播间需要创建")
+    @GetMapping(value = "/createLiveRoom")
+    public void createLiveRoom(){
+        imLiveBroadcastRoomService.createLiveRoom();
+    }
 }