Browse Source

增加:直播相关功能

hgw 3 years ago
parent
commit
0e133cba7f
39 changed files with 731 additions and 140 deletions
  1. 1 1
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/dal/dao/SysUserDao.java
  2. 12 2
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/impl/SysUserServiceImpl.java
  3. 7 2
      mec-auth/mec-auth-server/src/main/resources/config/mybatis/SysUserMapper.xml
  4. 101 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/vo/ImLiveBroadcastRoomDetailVo.java
  5. 80 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/vo/ImLiveBroadcastRoomMemberVo.java
  6. 79 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/vo/RoomUserInfoVo.java
  7. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ImLiveBroadcastRoomMemberService.java
  8. 8 1
      mec-biz/src/main/java/com/ym/mec/biz/service/ImLiveBroadcastRoomService.java
  9. 10 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveBroadcastRoomMemberServiceImpl.java
  10. 192 98
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveBroadcastRoomServiceImpl.java
  11. 7 0
      mec-client-api/src/main/java/com/ym/mec/im/ImFeignService.java
  12. 6 5
      mec-client-api/src/main/java/com/ym/mec/im/fallback/ImFeignServiceFallback.java
  13. 1 1
      mec-common/common-core/src/main/java/com/ym/mec/common/entity/BaseMessage.java
  14. 67 0
      mec-common/common-core/src/main/java/com/ym/mec/common/entity/ImRoomMessage.java
  15. 1 1
      mec-common/common-core/src/main/java/com/ym/mec/common/entity/ImUserState.java
  16. 11 2
      mec-im/src/main/java/com/ym/controller/LiveRoomController.java
  17. 13 2
      mec-im/src/main/java/com/ym/controller/UserController.java
  18. 50 0
      mec-im/src/main/java/com/ym/mec/im/IMHelper.java
  19. 1 1
      mec-im/src/main/java/com/ym/mec/im/message/ApplyForSpeechMessage.java
  20. 1 1
      mec-im/src/main/java/com/ym/mec/im/message/AssistantTransferMessage.java
  21. 1 1
      mec-im/src/main/java/com/ym/mec/im/message/ControlDeviceNotifyMessage.java
  22. 1 1
      mec-im/src/main/java/com/ym/mec/im/message/DeviceStateChangedMessage.java
  23. 1 1
      mec-im/src/main/java/com/ym/mec/im/message/DisplayMessage.java
  24. 1 1
      mec-im/src/main/java/com/ym/mec/im/message/ExamSongDownloadMessageMessage.java
  25. 1 1
      mec-im/src/main/java/com/ym/mec/im/message/ExamSongDownloadStatusMessage.java
  26. 1 1
      mec-im/src/main/java/com/ym/mec/im/message/MemberChangedMessage.java
  27. 1 1
      mec-im/src/main/java/com/ym/mec/im/message/MetronomeMessageMessage.java
  28. 1 1
      mec-im/src/main/java/com/ym/mec/im/message/MusicScoreDownloadMessageMessage.java
  29. 1 1
      mec-im/src/main/java/com/ym/mec/im/message/MusicScoreDownloadStatusMessage.java
  30. 1 1
      mec-im/src/main/java/com/ym/mec/im/message/RoleChangedMessage.java
  31. 1 1
      mec-im/src/main/java/com/ym/mec/im/message/SpeechResultMessage.java
  32. 1 1
      mec-im/src/main/java/com/ym/mec/im/message/TicketExpiredMessage.java
  33. 1 1
      mec-im/src/main/java/com/ym/mec/im/message/TurnPageMessage.java
  34. 1 1
      mec-im/src/main/java/com/ym/mec/im/message/UpgradeRoleMessage.java
  35. 1 1
      mec-im/src/main/java/com/ym/mec/im/message/WhiteboardMessage.java
  36. 22 0
      mec-im/src/main/java/com/ym/service/Impl/LiveRoomServiceImpl.java
  37. 4 0
      mec-im/src/main/java/com/ym/service/LiveRoomService.java
  38. 12 4
      mec-web/src/main/java/com/ym/mec/web/controller/ImLiveBroadcastRoomController.java
  39. 25 2
      mec-web/src/main/java/com/ym/mec/web/controller/ImLiveBroadcastRoomMemberController.java

+ 1 - 1
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/dal/dao/SysUserDao.java

@@ -119,5 +119,5 @@ public interface SysUserDao extends BaseDAO<Integer, SysUser> {
      *
      * @param search 关键字
      */
-    List<SysUser> queryLikeByPhoneOrName(@Param("search") String search);
+    List<SysUser> queryLikeByPhoneOrName(@Param("search") String search,@Param("tenantId") Integer tenantId);
 }

+ 12 - 2
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/impl/SysUserServiceImpl.java

@@ -9,8 +9,10 @@ import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.entity.ImResult;
 import com.ym.mec.common.entity.ImUserModel;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
+import com.ym.mec.common.tenant.TenantContextHolder;
 import com.ym.mec.im.ImFeignService;
 import com.ym.mec.web.WebFeignService;
+import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -19,6 +21,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 @Service
 public class SysUserServiceImpl extends BaseServiceImpl<Integer, SysUser> implements SysUserService {
@@ -177,11 +180,18 @@ public class SysUserServiceImpl extends BaseServiceImpl<Integer, SysUser> implem
         if (StringUtils.isBlank(search.trim())) {
             return new ArrayList<>();
         }
-        return sysUserDao.queryLikeByPhoneOrName(search);
+        List<SysUser> sysUsers = sysUserDao.queryLikeByPhoneOrName(search, TenantContextHolder.getTenantId());
+        if (CollectionUtils.isEmpty(sysUsers)) {
+            return new ArrayList<>();
+        }
+        //只查询管理及老师
+        return sysUsers.stream()
+                .filter(u -> u.getUserType().contains("SYSTEM") || u.getUserType().contains("TEACHER"))
+                .collect(Collectors.toList());
     }
 
     @Override
-    public String queryClientByPhone(String phone){
+    public String queryClientByPhone(String phone) {
         SysUser sysUser = queryByPhone(phone);
         if (sysUser == null) {
             return null;

+ 7 - 2
mec-auth/mec-auth-server/src/main/resources/config/mybatis/SysUserMapper.xml

@@ -229,8 +229,13 @@
     <select id="queryLikeByPhoneOrName" resultMap="SysUser">
         select *
         from sys_user
-        where phone_ like CONCAT('%', #{search}, '%')
-           or real_name_ like CONCAT('%', #{search}, '%')
+        where tenant_id_ = #{tenantId}
+          and lock_flag_ = 0
+          and del_flag_ = 0
+          and (
+                    phone_ like CONCAT('%', #{search}, '%')
+                or real_name_ like CONCAT('%', #{search}, '%')
+            )
     </select>
 
 </mapper>

+ 101 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/vo/ImLiveBroadcastRoomDetailVo.java

@@ -0,0 +1,101 @@
+package com.ym.mec.biz.dal.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author hgw
+ * Created by 2022-02-25
+ */
+public class ImLiveBroadcastRoomDetailVo implements Serializable {
+
+    @ApiModelProperty(value = "房间编号")
+    private String roomUid;
+
+    @ApiModelProperty(value = "房间标题/最多12个字")
+    private String roomTitle;
+
+    @ApiModelProperty(value = "主讲人名称")
+    private String speakerName;
+
+    @ApiModelProperty(value = "直播内容/最多200个字")
+    private String liveRemark;
+
+    @ApiModelProperty(value = "参与人员数量")
+    private Integer totalLookNum;
+
+    @ApiModelProperty(value = "点赞数")
+    private Integer totalLikeNum;
+
+    @ApiModelProperty(value = "直播时长")
+    private Integer totalLiveTime;
+
+    @ApiModelProperty(value = "参与人员列表")
+    private List<ImLiveBroadcastRoomMemberVo> list;
+
+    public String getRoomUid() {
+        return roomUid;
+    }
+
+    public void setRoomUid(String roomUid) {
+        this.roomUid = roomUid;
+    }
+
+    public String getRoomTitle() {
+        return roomTitle;
+    }
+
+    public void setRoomTitle(String roomTitle) {
+        this.roomTitle = roomTitle;
+    }
+
+    public String getSpeakerName() {
+        return speakerName;
+    }
+
+    public void setSpeakerName(String speakerName) {
+        this.speakerName = speakerName;
+    }
+
+    public String getLiveRemark() {
+        return liveRemark;
+    }
+
+    public void setLiveRemark(String liveRemark) {
+        this.liveRemark = liveRemark;
+    }
+
+    public Integer getTotalLookNum() {
+        return totalLookNum;
+    }
+
+    public void setTotalLookNum(Integer totalLookNum) {
+        this.totalLookNum = totalLookNum;
+    }
+
+    public Integer getTotalLikeNum() {
+        return totalLikeNum;
+    }
+
+    public void setTotalLikeNum(Integer totalLikeNum) {
+        this.totalLikeNum = totalLikeNum;
+    }
+
+    public Integer getTotalLiveTime() {
+        return totalLiveTime;
+    }
+
+    public void setTotalLiveTime(Integer totalLiveTime) {
+        this.totalLiveTime = totalLiveTime;
+    }
+
+    public List<ImLiveBroadcastRoomMemberVo> getList() {
+        return list;
+    }
+
+    public void setList(List<ImLiveBroadcastRoomMemberVo> list) {
+        this.list = list;
+    }
+}

+ 80 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/vo/ImLiveBroadcastRoomMemberVo.java

@@ -0,0 +1,80 @@
+package com.ym.mec.biz.dal.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Date;
+
+/**
+ * @author hgw
+ * Created by 2022-02-25
+ */
+public class ImLiveBroadcastRoomMemberVo implements java.io.Serializable {
+
+    @ApiModelProperty(value = "学生编号")
+    private Integer studentId;
+
+    @ApiModelProperty(value = "学生姓名")
+    private String studentName;
+
+    @ApiModelProperty(value = "手机号")
+    private String phone;
+
+    @ApiModelProperty(value = "声部名称")
+    private String subName;
+
+    @ApiModelProperty(value = "进入房间时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date joinTime;
+
+    @ApiModelProperty(value = "累计观看时长")
+    private Integer totalViewTime;
+
+    public Integer getStudentId() {
+        return studentId;
+    }
+
+    public void setStudentId(Integer studentId) {
+        this.studentId = studentId;
+    }
+
+    public String getStudentName() {
+        return studentName;
+    }
+
+    public void setStudentName(String studentName) {
+        this.studentName = studentName;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public String getSubName() {
+        return subName;
+    }
+
+    public void setSubName(String subName) {
+        this.subName = subName;
+    }
+
+    public Date getJoinTime() {
+        return joinTime;
+    }
+
+    public void setJoinTime(Date joinTime) {
+        this.joinTime = joinTime;
+    }
+
+    public Integer getTotalViewTime() {
+        return totalViewTime;
+    }
+
+    public void setTotalViewTime(Integer totalViewTime) {
+        this.totalViewTime = totalViewTime;
+    }
+}

+ 79 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/vo/RoomUserInfoVo.java

@@ -0,0 +1,79 @@
+package com.ym.mec.biz.dal.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @author hgw
+ * Created by 2022-02-24
+ */
+public class RoomUserInfoVo implements Serializable {
+    private Integer userId;
+
+    private String userName;
+
+    //累计观看时长
+    private Integer totalViewTime;
+
+    //首次进入时间
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date firstJoinTime;
+
+    //动态进入房间时间  多次进入房间每次进入更新
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date dynamicJoinTime;
+
+    //最后一次退出时间 该字段是为了控制连续退出的 如果2次退出时间间隔不足1分钟则不处理
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date lastOutTime;
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public Integer getTotalViewTime() {
+        return totalViewTime;
+    }
+
+    public void setTotalViewTime(Integer totalViewTime) {
+        this.totalViewTime = totalViewTime;
+    }
+
+    public Date getFirstJoinTime() {
+        return firstJoinTime;
+    }
+
+    public void setFirstJoinTime(Date firstJoinTime) {
+        this.firstJoinTime = firstJoinTime;
+    }
+
+    public Date getDynamicJoinTime() {
+        return dynamicJoinTime;
+    }
+
+    public void setDynamicJoinTime(Date dynamicJoinTime) {
+        this.dynamicJoinTime = dynamicJoinTime;
+    }
+
+    public Date getLastOutTime() {
+        return lastOutTime;
+    }
+
+    public void setLastOutTime(Date lastOutTime) {
+        this.lastOutTime = lastOutTime;
+    }
+}

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

@@ -2,6 +2,9 @@ package com.ym.mec.biz.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ym.mec.biz.dal.entity.ImLiveBroadcastRoomMember;
+import com.ym.mec.biz.dal.vo.ImLiveBroadcastRoomDetailVo;
+
+import java.util.Map;
 
 /**
  * 直播间人员关系表(ImLiveBroadcastRoomMember)表服务接口
@@ -11,5 +14,7 @@ import com.ym.mec.biz.dal.entity.ImLiveBroadcastRoomMember;
  */
 public interface ImLiveBroadcastRoomMemberService extends IService<ImLiveBroadcastRoomMember> {
 
+    ImLiveBroadcastRoomDetailVo queryRoomDetail(Map<String, Object> param);
+
 }
 

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

@@ -4,8 +4,11 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.ym.mec.biz.dal.dto.ImLiveBroadcastRoomDto;
 import com.ym.mec.biz.dal.entity.ImLiveBroadcastRoom;
 import com.ym.mec.biz.dal.vo.ImLiveBroadcastRoomVo;
+import com.ym.mec.biz.dal.vo.RoomUserInfoVo;
+import com.ym.mec.common.entity.ImUserState;
 import com.ym.mec.common.page.PageInfo;
 
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -18,7 +21,7 @@ public interface ImLiveBroadcastRoomService extends IService<ImLiveBroadcastRoom
 
     PageInfo<ImLiveBroadcastRoomVo> queryPage(Map<String, Object> param);
 
-    ImLiveBroadcastRoomVo queryRoom(String roomUid, Integer userId);
+    ImLiveBroadcastRoomVo queryRoomAndCheck(String roomUid, Integer userId);
 
     ImLiveBroadcastRoomVo queryRoomInfo(String roomUid);
 
@@ -32,6 +35,8 @@ public interface ImLiveBroadcastRoomService extends IService<ImLiveBroadcastRoom
 
     void syncLike(String roomUid, Integer likeNum);
 
+    void quitRoom(List<ImUserState> userState);
+
     void joinRoom(String roomUid, Integer userId);
 
     void test();
@@ -44,5 +49,7 @@ public interface ImLiveBroadcastRoomService extends IService<ImLiveBroadcastRoom
     * @date 2022/2/23 16:17
     */
     void shareGroup(String roomUid,String groupIds);
+
+    List<RoomUserInfoVo> queryRoomUserInfo(String roomUid);
 }
 

+ 10 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveBroadcastRoomMemberServiceImpl.java

@@ -3,11 +3,13 @@ package com.ym.mec.biz.service.impl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 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.service.ImLiveBroadcastRoomMemberService;
-import org.springframework.stereotype.Service;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import java.util.Map;
 
 /**
  * 直播间人员关系表(ImLiveBroadcastRoomMember)表服务实现类
@@ -20,6 +22,12 @@ public class ImLiveBroadcastRoomMemberServiceImpl extends ServiceImpl<ImLiveBroa
 
     private final static Logger log = LoggerFactory.getLogger(ImLiveBroadcastRoomMemberServiceImpl.class);
 
+    /**
+     * 查询直播详情
+     */
+    public ImLiveBroadcastRoomDetailVo queryRoomDetail(Map<String, Object> param) {
+        return new ImLiveBroadcastRoomDetailVo();
+    }
 
 }
 

+ 192 - 98
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveBroadcastRoomServiceImpl.java

@@ -11,8 +11,11 @@ import com.ym.mec.biz.dal.dto.ImLiveBroadcastRoomDto;
 import com.ym.mec.biz.dal.entity.ImLiveBroadcastRoom;
 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.ImLiveBroadcastRoomService;
 import com.ym.mec.biz.service.SysMessageService;
+import com.ym.mec.common.entity.ImRoomMessage;
+import com.ym.mec.common.entity.ImUserState;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.PageUtil;
@@ -24,6 +27,7 @@ import com.ym.mec.util.http.HttpUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.redisson.api.RBucket;
 import org.redisson.api.RList;
+import org.redisson.api.RMap;
 import org.redisson.api.RedissonClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -32,7 +36,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
-import java.io.Serializable;
 import java.util.*;
 
 /**
@@ -60,18 +63,12 @@ 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;
     //用户对应的直播间Uid
     public static final String LIVE_USER_ROOM = "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;
+    //房间主讲人id
+    public static final String LIVE_ROOM_SPEAKERID = "IM:LIVE_ROOM_SPEAKERID:" + ROOM_UID;
     //房间点赞数
     public static final String LIVE_ROOM_LIKE = "IM:LIVE_ROOM_LIKE:" + ROOM_UID;
 
@@ -82,7 +79,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
      * @param userId  用户id
      */
     @Override
-    public ImLiveBroadcastRoomVo queryRoom(String roomUid, Integer userId) {
+    public ImLiveBroadcastRoomVo queryRoomAndCheck(String roomUid, Integer userId) {
         SysUser sysUser;
         if (Objects.isNull(userId)) {
             sysUser = getSysUser();
@@ -104,6 +101,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         if (room.getLiveState() == 2) {
             throw new BizException("直播已结束!");
         }
+        getRoomData(room);
         return room;
     }
 
@@ -120,7 +118,9 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         if (CollectionUtils.isEmpty(list)) {
             return null;
         }
-        return list.get(0);
+        ImLiveBroadcastRoomVo roomVo = list.get(0);
+        getRoomData(roomVo);
+        return roomVo;
     }
 
     /**
@@ -164,13 +164,32 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
      */
     @Override
     public void update(ImLiveBroadcastRoomDto dto) {
-        ImLiveBroadcastRoom obj = new ImLiveBroadcastRoom();
+        ImLiveBroadcastRoom obj = this.getById(dto.getId());
+        if (obj.getLiveState() == 1) {
+            throw new BizException("直播已经开始,无法修改");
+        }
         BeanUtils.copyProperties(dto, obj);
         log.info("update room  >>>  :{}", JSONObject.toJSONString(obj));
         this.updateById(obj);
     }
 
     /**
+     * 删除直播间
+     *
+     * @param id 直播间id
+     */
+    @Override
+    public void delete(Integer id) {
+        ImLiveBroadcastRoom obj = this.getById(id);
+        if (obj.getLiveState() == 1) {
+            throw new BizException("直播已经开始,无法删除");
+        }
+        obj.setId(id);
+        obj.setRoomState(1);
+        this.updateById(obj);
+    }
+
+    /**
      * 关闭房间
      *
      * @param id 直播房间表id
@@ -190,7 +209,6 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
             log.error(e.getMessage(), e.getCause());
             throw new BizException(e.getMessage());
         }
-        //todo 向聊天室发自定义消息提出所有学生
 
         //todo 将房间redis的数据写入数据库后在删除缓存
 
@@ -201,26 +219,17 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         room.setUpdatedTime(date);
         room.setLiveEndTime(date);
         this.updateById(room);
-    }
 
-    /**
-     * 删除直播间
-     *
-     * @param id 直播间id
-     */
-    @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);
+        //向聊天室发自定义消息踢出所有人
+        ImRoomMessage message = new ImRoomMessage();
+        message.setFromUserId(room.getSpeakerId().toString());
+        message.setToChatroomId(room.getRoomUid());
+        message.setObjectName(ImRoomMessage.FORCED_OFFLINE);
+        imFeignService.publishRoomMsg(message);
     }
 
     /**
-     * 同步点赞数量-修改房间信息
+     * 同步点赞数量
      *
      * @param roomUid 房间uid
      * @param likeNum 点赞数
@@ -230,81 +239,115 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
     }
 
     /**
+     * 退出房间-修改用户对应的房间号信息
+     *
+     * @param userState 用户状态数据
+     */
+    public void quitRoom(List<ImUserState> userState) {
+        userState.forEach(user -> {
+            //获取当前用户所在房间的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());
+
+            //发送退出房间消息给主讲人
+            ImRoomMessage message = new ImRoomMessage();
+            message.setFromUserId(userId.toString());
+            message.setToChatroomId(roomUid);
+            message.setObjectName(ImRoomMessage.LOOKER_LOGIN_OUT);
+            imFeignService.publishRoomMsg(message);
+
+            //将用户从该房间当前用户列表移除
+            removeUserCache(userId, roomUid);
+
+            //从房间累计用户信息中查询该用户的信息
+            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)) {
+                //查询到用户数据
+                userInfo = roomTotalUser.get(userId);
+            } else {
+                //未查询到用户数据则新建立用户数据  如果没有观看时长则取开播时间
+                userInfo = getUserInfo(userId);
+                ImLiveBroadcastRoomVo imLiveBroadcastRoomVo = queryRoomInfo(roomUid);
+                userInfo.setFirstJoinTime(imLiveBroadcastRoomVo.getLiveStartTime());
+                userInfo.setDynamicJoinTime(imLiveBroadcastRoomVo.getLiveStartTime());
+            }
+            //每次退出房间计算当前用户观看时长
+            int minutesBetween = getMinutesBetween(userInfo.getDynamicJoinTime(), now);
+            userInfo.setTotalViewTime(userInfo.getTotalViewTime() + minutesBetween);
+            //记录退出时间 并写入缓存
+            userInfo.setLastOutTime(now);
+            roomTotalUser.put(userId, userInfo);
+        });
+    }
+
+    /**
      * 进入房间-修改用户对应的房间号信息
      *
      * @param roomUid 房间uid
      * @param userId  用户id
      */
     public void joinRoom(String roomUid, Integer userId) {
-        //用户对应的直播间信息
+        //查询用户当前对应的直播间信息
         RBucket<String> roomUserCache = redissonClient.getBucket(LIVE_USER_ROOM.replace(USER_ID, userId.toString()));
-        //获取原有房间信息
+        //获取当前房间信息,如果当前有房间
         if (roomUserCache.isExists()) {
-            //原有的房间uid
+            //查出原有的房间uid
             String lodRoomUid = roomUserCache.get();
             //如果房间相同直接返回
             if (roomUid.equals(lodRoomUid)) {
                 return;
             } else {
-                //如果不同就把原房间的当前人员数量-1
-                redissonClient.getAtomicLong(LIVE_ROOM_LOOK.replace(ROOM_UID, lodRoomUid)).decrementAndGet();
-                //将用户数据从老直播间用户列表删除
-                RList<UserInfo> list = redissonClient.getList(LIVE_ROOM_USER_LIST.replace(ROOM_UID, lodRoomUid));
-                UserInfo userInfo = getUserInfo(userId);
-                list.remove(userInfo);
+                //如果不同就把原房间的当前人员移除
+                removeUserCache(userId, lodRoomUid);
             }
         }
-        //写入用户房间uid
+        //记录用户当前房间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();
-        //将用户数据写入直播间
-        RList<UserInfo> list = redissonClient.getList(LIVE_ROOM_USER_LIST.replace(ROOM_UID, roomUid));
-        UserInfo userInfo = getUserInfo(userId);
-        list.add(userInfo);
-        //如果是主播,录制视频
-//        imFeignService.startRecord(roomUid);
-    }
-
-    private UserInfo getUserInfo(Integer userId) {
-        UserInfo userInfo = new UserInfo();
-        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();
-            }
+        //房间累计用户信息-指只要进入到该房间的用户都要记录
+        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)) {
+            //多次进入更新动态进入时间
+            userInfo = roomTotalUser.get(userId);
+        } else {
+            //第一次进该房间 写入用户首次进入时间
+            userInfo = getUserInfo(userId);
+            userInfo.setFirstJoinTime(now);
+            userInfo.setTotalViewTime(0);
         }
-        userInfo.setUserName(name);
-        return userInfo;
+        userInfo.setDynamicJoinTime(now);
+        roomTotalUser.put(userId, userInfo);
+        //添加到直播间当前用户数据缓存中
+        redissonClient.getList(LIVE_ROOM_USER_LIST.replace(ROOM_UID, roomUid)).add(userInfo);
     }
 
-    static class UserInfo implements Serializable {
-        private Integer userId;
-        private String userName;
-
-        public Integer getUserId() {
-            return userId;
-        }
-
-        public void setUserId(Integer userId) {
-            this.userId = userId;
-        }
-
-        public String getUserName() {
-            return userName;
-        }
+    /**
+     * 开始直播
+     *
+     * @param roomUid
+     */
+    public void startLive(String roomUid) {
+        //开始录制视频
+        imFeignService.startRecord(roomUid);
+    }
 
-        public void setUserName(String userName) {
-            this.userName = userName;
-        }
+    /**
+     * 关闭直播
+     *
+     * @param roomUid
+     */
+    public void closeLive(String roomUid) {
+        //停止录制视频
+        imFeignService.stopRecord(roomUid);
     }
 
     /**
@@ -327,6 +370,41 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         list.forEach(this::createLiveRoom);
     }
 
+    //移除
+    private void removeUserCache(Integer userId, String lodRoomUid) {
+        //将用户数据从直播间用户列表删除
+        RList<RoomUserInfoVo> list = redissonClient.getList(LIVE_ROOM_USER_LIST.replace(ROOM_UID, lodRoomUid));
+        RoomUserInfoVo userInfo = getUserInfo(userId);
+        list.remove(userInfo);
+    }
+
+    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();
+    }
+
     /**
      * 去融云创建房间
      */
@@ -335,11 +413,26 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
             //去融云创建房间
             Object liveRoom = imFeignService.createLiveRoom(room.getRoomUid(), room.getRoomTitle());
         } catch (Exception e) {
-
+            throw new BizException(e.getMessage());
         }
-        //初始化房间数据  点赞 人数 等 为0
-        //修改房间状态
+        //生成0点赞
+        redissonClient.getAtomicLong(LIVE_ROOM_LIKE.replace(ROOM_UID, room.getRoomUid())).set(0);
+        //主讲人id
+        redissonClient.getBucket(LIVE_ROOM_SPEAKERID.replace(ROOM_UID, room.getRoomUid())).set(room.getSpeakerId());
+        //todo 修改房间状态
+
+    }
 
+    private void getRoomData(ImLiveBroadcastRoomVo roomVo) {
+        //生成0点赞
+        long like = redissonClient.getAtomicLong(LIVE_ROOM_LIKE.replace(ROOM_UID, roomVo.getRoomUid())).get();
+        roomVo.setLikeNum((int) like);
+        //0用户数量
+        int size = redissonClient.getList(LIVE_ROOM_USER_LIST.replace(ROOM_UID, roomVo.getRoomUid())).size();
+        roomVo.setLookNum(size);
+        //0累计总用户数量
+        int totalLook = redissonClient.getMap(LIVE_ROOM_TOTAL_USER_LIST.replace(ROOM_UID, roomVo.getRoomUid())).size();
+        roomVo.setTotalLookNum(totalLook);
     }
 
     private SysUser getSysUser(Integer userId) {
@@ -358,15 +451,6 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
      * 分享直播间
      */
     public void test() {
-        //将用户数据写入直播间
-        RList<UserInfo> list = redissonClient.getList(LIVE_ROOM_USER_LIST.replace(ROOM_UID, "roomUid"));
-        UserInfo userInfo = new UserInfo();
-        userInfo.setUserId(1);
-        userInfo.setUserName("1");
-        boolean contains = list.contains(userInfo);
-        if (!contains) {
-            list.add(userInfo);
-        }
     }
 
     @Override
@@ -381,5 +465,15 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
                 DateUtil.format(imLiveBroadcastRoomVo.getLiveStartTime(), DateUtil.CHINESE_DATA_FORMAT_1),
                 imLiveBroadcastRoomVo.getLiveRemark(), HttpUtil.getSortUrl("https://test.dayaedu.com/"));
     }
+
+    /**
+     * 查询直播间用户信息
+     *
+     * @param roomUid 直播间uid
+     */
+    public List<RoomUserInfoVo> queryRoomUserInfo(String roomUid) {
+        return redissonClient.getList(LIVE_ROOM_USER_LIST.replace(ROOM_UID, roomUid));
+    }
+
 }
 

+ 7 - 0
mec-client-api/src/main/java/com/ym/mec/im/ImFeignService.java

@@ -162,4 +162,11 @@ public interface ImFeignService {
     */
     @PostMapping(value = "/liveRoom/stopRecord")
     void stopRecord(@RequestParam("roomId") String roomId);
+
+    /**
+     * 向直播间发送文本消息
+     */
+    @PostMapping(value = "/liveRoom/publishRoomMsg", consumes = MediaType.APPLICATION_JSON_VALUE)
+    Object publishRoomMsg(@RequestBody ImRoomMessage message);
+
 }

+ 6 - 5
mec-client-api/src/main/java/com/ym/mec/im/fallback/ImFeignServiceFallback.java

@@ -2,13 +2,9 @@ package com.ym.mec.im.fallback;
 
 import java.util.List;
 
+import com.ym.mec.common.entity.*;
 import org.springframework.stereotype.Component;
 
-import com.ym.mec.common.entity.ImGroupMessage;
-import com.ym.mec.common.entity.ImGroupModel;
-import com.ym.mec.common.entity.ImPrivateMessage;
-import com.ym.mec.common.entity.ImResult;
-import com.ym.mec.common.entity.ImUserModel;
 import com.ym.mec.im.ImFeignService;
 import com.ym.mec.im.entity.GroupModel;
 
@@ -97,6 +93,11 @@ public class ImFeignServiceFallback implements ImFeignService {
     }
 
     @Override
+    public Object publishRoomMsg(ImRoomMessage message) {
+        return null;
+    }
+
+    @Override
     public void stopRecord(String roomId) {
 
     }

+ 1 - 1
mec-im/src/main/java/com/ym/mec/im/BaseMessage.java → mec-common/common-core/src/main/java/com/ym/mec/common/entity/BaseMessage.java

@@ -1,4 +1,4 @@
-package com.ym.mec.im;
+package com.ym.mec.common.entity;
 
 import com.alibaba.fastjson.JSONObject;
 

+ 67 - 0
mec-common/common-core/src/main/java/com/ym/mec/common/entity/ImRoomMessage.java

@@ -0,0 +1,67 @@
+package com.ym.mec.common.entity;
+
+/**
+ * @author hgw
+ * Created by 2022-02-25
+ */
+public class ImRoomMessage extends BaseMessage {
+
+    //objectName 类型-将所有人强制踢出房间
+    public static final String FORCED_OFFLINE = "RC:ForcedOffline";
+
+    //objectName 类型-观看者退出房间
+    public static final String LOOKER_LOGIN_OUT = "RC:LookerLoginOut";
+
+    /**
+     * 消息类型
+     */
+    private String objectName;
+
+    /**
+     * 消息内容
+     */
+    private Object content;
+
+    /**
+     * 发送者id
+     */
+    private String fromUserId;
+
+    /**
+     * 发送到的房间uid
+     */
+    private String toChatroomId;
+
+    @Override
+    public String getObjectName() {
+        return objectName;
+    }
+
+    public void setObjectName(String objectName) {
+        this.objectName = objectName;
+    }
+
+    public Object getContent() {
+        return content;
+    }
+
+    public void setContent(Object content) {
+        this.content = content;
+    }
+
+    public String getFromUserId() {
+        return fromUserId;
+    }
+
+    public void setFromUserId(String fromUserId) {
+        this.fromUserId = fromUserId;
+    }
+
+    public String getToChatroomId() {
+        return toChatroomId;
+    }
+
+    public void setToChatroomId(String toChatroomId) {
+        this.toChatroomId = toChatroomId;
+    }
+}

+ 1 - 1
mec-im/src/main/java/com/ym/pojo/ImUserState.java → mec-common/common-core/src/main/java/com/ym/mec/common/entity/ImUserState.java

@@ -1,4 +1,4 @@
-package com.ym.pojo;
+package com.ym.mec.common.entity;
 
 import java.io.Serializable;
 

+ 11 - 2
mec-im/src/main/java/com/ym/controller/LiveRoomController.java

@@ -1,5 +1,7 @@
 package com.ym.controller;
 
+import com.ym.mec.common.entity.ImRoomMessage;
+import com.ym.pojo.IMApiResultInfo;
 import com.alibaba.fastjson.JSONObject;
 import com.ym.pojo.RecordNotify;
 import com.ym.service.LiveRoomService;
@@ -25,16 +27,23 @@ public class LiveRoomController {
 
     @ApiOperation("创建直播房间")
     @PostMapping(value = "/create")
-    public Object createLiveRoom(String roomId, String roomName) throws Exception {
+    public IMApiResultInfo createLiveRoom(String roomId, String roomName) throws Exception {
         return liveRoomService.createLiveRoom(roomId, roomName);
     }
 
     @ApiOperation("销毁直播房间")
     @PostMapping(value = "/destroy")
-    public Object destroyLiveRoom(String roomId) throws Exception {
+    public IMApiResultInfo destroyLiveRoom(String roomId) throws Exception {
         return liveRoomService.destroyLiveRoom(roomId);
     }
 
+    @ApiOperation("向房间发送消息")
+    @PostMapping(value = "/publishRoomMsg")
+    public IMApiResultInfo publishRoomTextMsg(ImRoomMessage message) {
+        return liveRoomService.publishRoomMessage(message);
+    }
+
+
     @ApiOperation("录制结果回调")
     @RequestMapping(value = "/recordSync")
     public void recordSync(@RequestBody String body){

+ 13 - 2
mec-im/src/main/java/com/ym/controller/UserController.java

@@ -2,22 +2,27 @@ package com.ym.controller;
 
 import com.alibaba.fastjson.JSONObject;
 import com.ym.common.BaseResponse;
-import com.ym.pojo.ImUserState;
+import com.ym.mec.biz.service.ImLiveBroadcastRoomService;
+import com.ym.mec.common.entity.ImUserState;
 import com.ym.service.UserService;
 import io.rong.models.user.UserModel;
+import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
+import java.util.stream.Collectors;
 
 @RestController
 @RequestMapping("/user")
 public class UserController {
     private static final Logger log = LoggerFactory.getLogger(UserController.class);
     @Autowired
-    UserService userService;
+    private UserService userService;
+    @Autowired
+    private ImLiveBroadcastRoomService imLiveBroadcastRoomService;
 
     @RequestMapping(value = "/register", method = RequestMethod.POST)
     public Object register(@RequestBody UserModel userModel) throws Exception {
@@ -37,6 +42,12 @@ public class UserController {
     @PostMapping(value = "/statusImUser")
     public BaseResponse statusImUser(@RequestBody List<ImUserState> userState) {
         log.info("statusImUser >>>>> : {}", JSONObject.toJSONString(userState));
+        //目前只监听用户不在线 退出 断开连接类型的状态
+        List<ImUserState> quitCollect = userState.stream()
+                .filter(user -> !"0".equals(user.getStatus()))
+                .collect(Collectors.toList());
+        log.info("statusImUser >>>>> quitCollect : {}", JSONObject.toJSONString(quitCollect));
+        imLiveBroadcastRoomService.quitRoom(quitCollect);
         return new BaseResponse<>();
     }
 }

+ 50 - 0
mec-im/src/main/java/com/ym/mec/im/IMHelper.java

@@ -2,11 +2,13 @@ package com.ym.mec.im;
 
 import com.alibaba.fastjson.JSON;
 import com.ym.http.HttpHelper;
+import com.ym.mec.common.entity.BaseMessage;
 import com.ym.mec.common.exception.BizException;
 import com.ym.pojo.IMApiResultInfo;
 import com.ym.pojo.IMTokenInfo;
 import io.rong.util.GsonUtil;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Component;
@@ -14,6 +16,7 @@ import org.springframework.stereotype.Component;
 import java.net.HttpURLConnection;
 import java.net.URLEncoder;
 import java.util.List;
+import java.util.Objects;
 
 /**
  * Created by weiqinxiao on 2019/2/28.
@@ -396,4 +399,51 @@ public class IMHelper {
 
     }
 
+    /**
+     * 发送房间消息
+     *
+     * @param fromUserId   发送人id
+     * @param toChatroomId 房间uid
+     * @param message      发送的消息
+     */
+    public IMApiResultInfo publishRoomMessage(String fromUserId, String toChatroomId, BaseMessage message) throws Exception {
+        String[] toChatroomIds = new String[1];
+        toChatroomIds[0] = toChatroomId;
+        return publishRoomMessage(fromUserId, toChatroomIds, message);
+    }
+
+    public IMApiResultInfo publishRoomMessage(String fromUserId, String[] toChatroomIds, BaseMessage message) throws Exception {
+        if (StringUtils.isBlank(fromUserId)) {
+            throw new BizException("发送人不能为空");
+        }
+        if (Objects.isNull(toChatroomIds)) {
+            throw new BizException("房间Uid不能为空");
+        }
+        if (Objects.isNull(message)) {
+            throw new BizException("消息不能为空");
+        }
+
+        StringBuilder sb = new StringBuilder();
+        sb.append("&fromUserId=").append(URLEncoder.encode(fromUserId, UTF8));
+
+        for (String child : toChatroomIds) {
+            sb.append("&toChatroomIds=").append(URLEncoder.encode(child, UTF8));
+        }
+
+        String msgStr = GsonUtil.toJson(message);
+        log.info("publish msg: {}", msgStr);
+        sb.append("&objectName=").append(URLEncoder.encode(message.getObjectName(), UTF8));
+        sb.append("&content=").append(URLEncoder.encode(msgStr, UTF8));
+
+        String body = sb.toString();
+        if (body.indexOf("&") == 0) {
+            body = body.substring(1);
+        }
+
+        HttpURLConnection conn = httpHelper
+                .createIMPostHttpConnection("/message/chatroom/publish.json", "application/x-www-form-urlencoded");
+        httpHelper.setBodyParameter(body, conn);
+
+        return (IMApiResultInfo) GsonUtil.fromJson(httpHelper.returnResult(conn), IMApiResultInfo.class);
+    }
 }

+ 1 - 1
mec-im/src/main/java/com/ym/mec/im/message/ApplyForSpeechMessage.java

@@ -1,6 +1,6 @@
 package com.ym.mec.im.message;
 
-import com.ym.mec.im.BaseMessage;
+import com.ym.mec.common.entity.BaseMessage;
 import lombok.Getter;
 import lombok.Setter;
 

+ 1 - 1
mec-im/src/main/java/com/ym/mec/im/message/AssistantTransferMessage.java

@@ -1,6 +1,6 @@
 package com.ym.mec.im.message;
 
-import com.ym.mec.im.BaseMessage;
+import com.ym.mec.common.entity.BaseMessage;
 import lombok.Getter;
 import lombok.Setter;
 

+ 1 - 1
mec-im/src/main/java/com/ym/mec/im/message/ControlDeviceNotifyMessage.java

@@ -1,6 +1,6 @@
 package com.ym.mec.im.message;
 
-import com.ym.mec.im.BaseMessage;
+import com.ym.mec.common.entity.BaseMessage;
 import lombok.Getter;
 import lombok.Setter;
 

+ 1 - 1
mec-im/src/main/java/com/ym/mec/im/message/DeviceStateChangedMessage.java

@@ -1,6 +1,6 @@
 package com.ym.mec.im.message;
 
-import com.ym.mec.im.BaseMessage;
+import com.ym.mec.common.entity.BaseMessage;
 import lombok.Getter;
 import lombok.Setter;
 

+ 1 - 1
mec-im/src/main/java/com/ym/mec/im/message/DisplayMessage.java

@@ -1,6 +1,6 @@
 package com.ym.mec.im.message;
 
-import com.ym.mec.im.BaseMessage;
+import com.ym.mec.common.entity.BaseMessage;
 import lombok.Getter;
 import lombok.Setter;
 

+ 1 - 1
mec-im/src/main/java/com/ym/mec/im/message/ExamSongDownloadMessageMessage.java

@@ -1,6 +1,6 @@
 package com.ym.mec.im.message;
 
-import com.ym.mec.im.BaseMessage;
+import com.ym.mec.common.entity.BaseMessage;
 import com.ym.pojo.ExamSongMessage;
 
 public class ExamSongDownloadMessageMessage extends BaseMessage {

+ 1 - 1
mec-im/src/main/java/com/ym/mec/im/message/ExamSongDownloadStatusMessage.java

@@ -1,6 +1,6 @@
 package com.ym.mec.im.message;
 
-import com.ym.mec.im.BaseMessage;
+import com.ym.mec.common.entity.BaseMessage;
 import lombok.Getter;
 import lombok.Setter;
 

+ 1 - 1
mec-im/src/main/java/com/ym/mec/im/message/MemberChangedMessage.java

@@ -1,6 +1,6 @@
 package com.ym.mec.im.message;
 
-import com.ym.mec.im.BaseMessage;
+import com.ym.mec.common.entity.BaseMessage;
 import lombok.Getter;
 import lombok.Setter;
 

+ 1 - 1
mec-im/src/main/java/com/ym/mec/im/message/MetronomeMessageMessage.java

@@ -1,6 +1,6 @@
 package com.ym.mec.im.message;
 
-import com.ym.mec.im.BaseMessage;
+import com.ym.mec.common.entity.BaseMessage;
 import com.ym.pojo.CustomMessage;
 import org.apache.commons.lang3.StringUtils;
 

+ 1 - 1
mec-im/src/main/java/com/ym/mec/im/message/MusicScoreDownloadMessageMessage.java

@@ -1,6 +1,6 @@
 package com.ym.mec.im.message;
 
-import com.ym.mec.im.BaseMessage;
+import com.ym.mec.common.entity.BaseMessage;
 import com.ym.pojo.MusicScoreMessage;
 
 public class MusicScoreDownloadMessageMessage extends BaseMessage {

+ 1 - 1
mec-im/src/main/java/com/ym/mec/im/message/MusicScoreDownloadStatusMessage.java

@@ -1,7 +1,7 @@
 package com.ym.mec.im.message;
 
 import com.ym.mec.biz.dal.entity.CourseScheduleStudentMusicScore;
-import com.ym.mec.im.BaseMessage;
+import com.ym.mec.common.entity.BaseMessage;
 import lombok.Getter;
 import lombok.Setter;
 

+ 1 - 1
mec-im/src/main/java/com/ym/mec/im/message/RoleChangedMessage.java

@@ -1,6 +1,6 @@
 package com.ym.mec.im.message;
 
-import com.ym.mec.im.BaseMessage;
+import com.ym.mec.common.entity.BaseMessage;
 import lombok.Getter;
 import lombok.Setter;
 

+ 1 - 1
mec-im/src/main/java/com/ym/mec/im/message/SpeechResultMessage.java

@@ -1,6 +1,6 @@
 package com.ym.mec.im.message;
 
-import com.ym.mec.im.BaseMessage;
+import com.ym.mec.common.entity.BaseMessage;
 import lombok.Getter;
 import lombok.Setter;
 

+ 1 - 1
mec-im/src/main/java/com/ym/mec/im/message/TicketExpiredMessage.java

@@ -1,6 +1,6 @@
 package com.ym.mec.im.message;
 
-import com.ym.mec.im.BaseMessage;
+import com.ym.mec.common.entity.BaseMessage;
 import lombok.Getter;
 import lombok.Setter;
 

+ 1 - 1
mec-im/src/main/java/com/ym/mec/im/message/TurnPageMessage.java

@@ -1,6 +1,6 @@
 package com.ym.mec.im.message;
 
-import com.ym.mec.im.BaseMessage;
+import com.ym.mec.common.entity.BaseMessage;
 import lombok.Getter;
 import lombok.Setter;
 

+ 1 - 1
mec-im/src/main/java/com/ym/mec/im/message/UpgradeRoleMessage.java

@@ -1,6 +1,6 @@
 package com.ym.mec.im.message;
 
-import com.ym.mec.im.BaseMessage;
+import com.ym.mec.common.entity.BaseMessage;
 import lombok.Getter;
 import lombok.Setter;
 

+ 1 - 1
mec-im/src/main/java/com/ym/mec/im/message/WhiteboardMessage.java

@@ -1,6 +1,6 @@
 package com.ym.mec.im.message;
 
-import com.ym.mec.im.BaseMessage;
+import com.ym.mec.common.entity.BaseMessage;
 import lombok.Getter;
 import lombok.Setter;
 

+ 22 - 0
mec-im/src/main/java/com/ym/service/Impl/LiveRoomServiceImpl.java

@@ -1,5 +1,6 @@
 package com.ym.service.Impl;
 
+import com.ym.mec.common.entity.ImRoomMessage;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -86,6 +87,27 @@ public class LiveRoomServiceImpl implements LiveRoomService {
         return resultInfo;
     }
 
+    /**
+     * 发送消息
+     *
+     * @param fromUserId   发送者id
+     * @param toChatroomId 房间id
+     * @param message
+     */
+    public IMApiResultInfo publishRoomMessage(ImRoomMessage message) {
+        IMApiResultInfo resultInfo;
+        try {
+            resultInfo = imHelper.publishRoomMessage(message.getFromUserId(), message.getToChatroomId(), message);
+        } catch (Exception e) {
+            throw new BizException("消息发送失败" + e.getMessage());
+        }
+        if (!resultInfo.isSuccess()) {
+            log.error("publishRoomMessage chatRoom error: {}", resultInfo.getErrorMessage());
+            throw new BizException("关闭聊天室失败!");
+        }
+        return resultInfo;
+    }
+
     @Override
     public void startRecord(String roomId) throws Exception {
         log.error("开始录制直播:roomId : {} ",roomId);

+ 4 - 0
mec-im/src/main/java/com/ym/service/LiveRoomService.java

@@ -1,5 +1,6 @@
 package com.ym.service;
 
+import com.ym.mec.common.entity.ImRoomMessage;
 import com.ym.pojo.IMApiResultInfo;
 import com.ym.pojo.RecordNotify;
 
@@ -13,6 +14,8 @@ public interface LiveRoomService {
 
     IMApiResultInfo destroyLiveRoom(String roomId) throws Exception;
 
+    IMApiResultInfo publishRoomMessage(ImRoomMessage message);
+
     /**
     * @description: 开始录制直播
      * @param roomId
@@ -39,4 +42,5 @@ public interface LiveRoomService {
     * @date 2022/2/25 11:49
     */
     void recordSync(RecordNotify recordNotify);
+
 }

+ 12 - 4
mec-web/src/main/java/com/ym/mec/web/controller/ImLiveBroadcastRoomController.java

@@ -3,6 +3,7 @@ package com.ym.mec.web.controller;
 
 import com.ym.mec.biz.dal.dto.ImLiveBroadcastRoomDto;
 import com.ym.mec.biz.dal.vo.ImLiveBroadcastRoomVo;
+import com.ym.mec.biz.dal.vo.RoomUserInfoVo;
 import com.ym.mec.biz.service.ImLiveBroadcastRoomService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
@@ -13,6 +14,7 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import javax.validation.Valid;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -45,11 +47,11 @@ public class ImLiveBroadcastRoomController extends BaseController {
         return succeed(imLiveBroadcastRoomService.queryPage(param));
     }
 
-    @ApiOperation("查询房间信息")
+    @ApiOperation("查询房间信息并校验房间是否合规")
     @GetMapping("/queryRoom")
-    public HttpResponseResult<ImLiveBroadcastRoomVo> queryRoom(@ApiParam(value = "房间uid", required = true) String roomUid,
+    public HttpResponseResult<ImLiveBroadcastRoomVo> queryRoomAndCheck(@ApiParam(value = "房间uid", required = true) String roomUid,
                                                                @ApiParam(value = "用户id", required = true) Integer userId) {
-        return succeed(imLiveBroadcastRoomService.queryRoom(roomUid, userId));
+        return succeed(imLiveBroadcastRoomService.queryRoomAndCheck(roomUid, userId));
     }
 
     @ApiOperation("查询房间信息")
@@ -122,9 +124,15 @@ public class ImLiveBroadcastRoomController extends BaseController {
     @GetMapping("/shareGroup")
     public HttpResponseResult shareGroup(@ApiParam(value = "房间uid", required = true) String roomUid,
                                          @ApiParam(value = "群编号", required = true) String groupIds) {
-        imLiveBroadcastRoomService.shareGroup(roomUid,groupIds);
+        imLiveBroadcastRoomService.shareGroup(roomUid, groupIds);
         return succeed();
     }
 
+    @ApiOperation("获取房间人员")
+    @GetMapping("/queryRoomUserInfo")
+    public HttpResponseResult<List<RoomUserInfoVo>> queryRoomUserInfo(@ApiParam(value = "房间uid", required = true) String roomUid) {
+        return succeed(imLiveBroadcastRoomService.queryRoomUserInfo(roomUid));
+    }
+
 }
 

+ 25 - 2
mec-web/src/main/java/com/ym/mec/web/controller/ImLiveBroadcastRoomMemberController.java

@@ -1,13 +1,24 @@
 package com.ym.mec.web.controller;
+import java.util.Date;
+import com.google.common.collect.Lists;
 
 
-import com.ym.mec.biz.dal.entity.ImLiveBroadcastRoomMember;
+import com.alibaba.fastjson.JSONObject;
+import com.ym.mec.biz.dal.vo.ImLiveBroadcastRoomDetailVo;
+import com.ym.mec.biz.dal.vo.ImLiveBroadcastRoomMemberVo;
 import com.ym.mec.biz.service.ImLiveBroadcastRoomMemberService;
-import org.springframework.web.bind.annotation.*;
 import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
+import java.util.Map;
 
 /**
  * 直播间人员关系表(ImLiveBroadcastRoomMember)表控制层
@@ -25,5 +36,17 @@ public class ImLiveBroadcastRoomMemberController extends BaseController {
     @Resource
     private ImLiveBroadcastRoomMemberService imLiveBroadcastRoomMemberService;
 
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "search", dataType = "String", value = "模糊搜索 学员编号姓名"),
+            @ApiImplicitParam(name = "roomUid", dataType = "String", value = "房间uid"),
+            @ApiImplicitParam(name = "page", dataType = "Integer", value = "页数"),
+            @ApiImplicitParam(name = "rows", dataType = "Integer", value = "每页数量"),
+    })
+    @ApiOperation("分页查询直播间详情")
+    @PostMapping("/queryRoomDetail")
+    public HttpResponseResult<ImLiveBroadcastRoomDetailVo> queryRoomDetail(Map<String, Object> param) {
+        return succeed(imLiveBroadcastRoomMemberService.queryRoomDetail(param));
+    }
+
 }