Eric %!s(int64=2) %!d(string=hai) anos
pai
achega
c0aec2a28c

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

@@ -89,15 +89,15 @@ public class ImLiveBroadcastRoom implements Serializable {
 
     @TableField("speaker_status_")
     @ApiModelProperty(value = "主播状态: 0离开;1在播")
-    private String speakerStatus;
+    private Integer speakerStatus;
 
     @TableField("push_status_")
     @ApiModelProperty(value = "推流状态: 0 暂停; 1在播")
-    private String pushStatus;
+    private Integer pushStatus;
 
     @TableField("ban_status_")
     @ApiModelProperty(value = "禁言状态: 0 取消;1禁言")
-    private String banStatus;
+    private Integer banStatus;
 
     @TableField("created_by_")
     @ApiModelProperty(value = "创建人")
@@ -295,27 +295,27 @@ public class ImLiveBroadcastRoom implements Serializable {
         this.popularizeType = popularizeType;
     }
 
-    public String getSpeakerStatus() {
+    public Integer getSpeakerStatus() {
         return speakerStatus;
     }
 
-    public void setSpeakerStatus(String speakerStatus) {
+    public void setSpeakerStatus(Integer speakerStatus) {
         this.speakerStatus = speakerStatus;
     }
 
-    public String getPushStatus() {
+    public Integer getPushStatus() {
         return pushStatus;
     }
 
-    public void setPushStatus(String pushStatus) {
+    public void setPushStatus(Integer pushStatus) {
         this.pushStatus = pushStatus;
     }
 
-    public String getBanStatus() {
+    public Integer getBanStatus() {
         return banStatus;
     }
 
-    public void setBanStatus(String banStatus) {
+    public void setBanStatus(Integer banStatus) {
         this.banStatus = banStatus;
     }
 }

+ 47 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImLiveBroadcastRoomMember.java

@@ -43,6 +43,22 @@ public class ImLiveBroadcastRoomMember implements Serializable {
     @ApiModelProperty(value = "累计观看时间/以分钟为单位")
     private Integer totalTime;
 
+    @TableField("online_status_")
+    @ApiModelProperty(value = "在线状态;0离线;1在线")
+    private Integer onlineStatus;
+
+    @TableField("ban_status_")
+    @ApiModelProperty(value = "禁言状态:0取消;1禁言")
+    private Integer banStatus;
+
+    @TableField("live_room_status_")
+    @ApiModelProperty(value = "直播状态: 0离开;1观看")
+    private Integer liveRoomStatus;
+
+    @TableField("create_time_")
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+
     private static final long serialVersionUID = 1L;
 
     public Integer getId() {
@@ -93,5 +109,36 @@ public class ImLiveBroadcastRoomMember implements Serializable {
         this.totalTime = totalTime;
     }
 
+    public Integer getOnlineStatus() {
+        return onlineStatus;
+    }
+
+    public void setOnlineStatus(Integer onlineStatus) {
+        this.onlineStatus = onlineStatus;
+    }
+
+    public Integer getBanStatus() {
+        return banStatus;
+    }
+
+    public void setBanStatus(Integer banStatus) {
+        this.banStatus = banStatus;
+    }
+
+    public Integer getLiveRoomStatus() {
+        return liveRoomStatus;
+    }
+
+    public void setLiveRoomStatus(Integer liveRoomStatus) {
+        this.liveRoomStatus = liveRoomStatus;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
 }
 

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

@@ -106,15 +106,15 @@ public class ImLiveBroadcastRoomVo implements Serializable {
 
     @TableField("speaker_status_")
     @ApiModelProperty(value = "主播状态: 0离开;1在播")
-    private String speakerStatus;
+    private Integer speakerStatus;
 
     @TableField("push_status_")
     @ApiModelProperty(value = "推流状态: 0 暂停; 1在播")
-    private String pushStatus;
+    private Integer pushStatus;
 
     @TableField("ban_status_")
     @ApiModelProperty(value = "禁言状态: 0 取消;1禁言")
-    private String banStatus;
+    private Integer banStatus;
 
     public String getServiceProvider() {
         return serviceProvider;
@@ -364,27 +364,27 @@ public class ImLiveBroadcastRoomVo implements Serializable {
         return this;
     }
 
-    public String getSpeakerStatus() {
+    public Integer getSpeakerStatus() {
         return speakerStatus;
     }
 
-    public void setSpeakerStatus(String speakerStatus) {
+    public void setSpeakerStatus(Integer speakerStatus) {
         this.speakerStatus = speakerStatus;
     }
 
-    public String getPushStatus() {
+    public Integer getPushStatus() {
         return pushStatus;
     }
 
-    public void setPushStatus(String pushStatus) {
+    public void setPushStatus(Integer pushStatus) {
         this.pushStatus = pushStatus;
     }
 
-    public String getBanStatus() {
+    public Integer getBanStatus() {
         return banStatus;
     }
 
-    public void setBanStatus(String banStatus) {
+    public void setBanStatus(Integer banStatus) {
         this.banStatus = banStatus;
     }
 }

+ 78 - 14
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveBroadcastRoomServiceImpl.java

@@ -44,6 +44,7 @@ import com.ym.mec.util.http.HttpUtil;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.jetbrains.annotations.NotNull;
 import org.joda.time.DateTime;
 import org.redisson.api.RBucket;
 import org.redisson.api.RLock;
@@ -590,19 +591,26 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         log.info("roomDestroy>>>> insertAndCleanLiveData {}", JSONObject.toJSONString(room));
 
         //将房间状态改为已销毁
+        ImLiveBroadcastRoom liveRoomUpdate = new ImLiveBroadcastRoom();
+        liveRoomUpdate.setId(room.getId());
+
         Date date = new Date();
-        room.setRoomState(2);
-        room.setLiveState(2);
+        liveRoomUpdate.setRoomState(2);
+        liveRoomUpdate.setLiveState(2);
         Integer userId = -1;
         try {
             userId = getSysUser().getId();
         } catch (Exception ignored) {
         }
-        room.setUpdatedBy(userId);
-        room.setUpdatedTime(date);
-        room.setLiveEndTime(date);
-        room.setPopularize(0);//销毁直播间后要关闭推广
-        this.updateById(room);
+        liveRoomUpdate.setSpeakerStatus(0);
+        liveRoomUpdate.setPushStatus(0);
+        liveRoomUpdate.setUpdatedBy(userId);
+        liveRoomUpdate.setUpdatedTime(date);
+        liveRoomUpdate.setLiveEndTime(date);
+        //销毁直播间后要关闭推广
+        liveRoomUpdate.setPopularize(0);
+
+        this.updateById(liveRoomUpdate);
 
         //下架商品
         liveGoodsMapperDao.updateStatus(room.getRoomUid(), null, false);
@@ -917,8 +925,11 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         //获取直播间信息
         RBucket<RoomSpeakerInfo> speakerCache = getRoomSpeakerInfoCache(roomUid, userId.toString());
         if (!speakerCache.isExists()) {
+
             //没有主讲人信息则生成一个
             createSpeakerInfo(this.getById(roomVo.getId()), sysUser);
+
+            // 查询主播缓存信息
             speakerCache = getRoomSpeakerInfoCache(roomUid, userId.toString());
         }
         RoomSpeakerInfo speakerInfo = speakerCache.get();
@@ -926,6 +937,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         speakerCache.set(speakerInfo);
         //记录用户当前房间uid
         redissonClient.getBucket(LIVE_USER_ROOM.replace(USER_ID, userId.toString())).set(roomUid, 12L, TimeUnit.HOURS);
+
         return roomVo;
     }
 
@@ -952,11 +964,30 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         if (roomTotalUser.containsKey(userId)) {
             //多次进入更新动态进入时间
             userInfo = JSONObject.toJavaObject(JSONObject.parseObject(roomTotalUser.get(userId)), RoomUserInfoVo.class);
+
+            ImLiveBroadcastRoomMember liveRoomMember = liveBroadcastRoomMemberService.lambdaQuery()
+                    .eq(ImLiveBroadcastRoomMember::getTenantId, userInfo.getTenantId())
+                    .eq(ImLiveBroadcastRoomMember::getRoomUid, imLiveBroadcastRoomVo.getRoomUid())
+                    .eq(ImLiveBroadcastRoomMember::getUserId, userInfo.getUserId())
+                    .list().stream().findFirst().orElse(null);
+
+            if (Objects.isNull(liveRoomMember)) {
+
+                // 初次进入房间
+                getLiveRoomUserInfo(userId, imLiveBroadcastRoomVo, now);
+            } else {
+                // 更新直播间用户信息
+                ImLiveBroadcastRoomMember roomMember = new ImLiveBroadcastRoomMember();
+                roomMember.setId(liveRoomMember.getId());
+                roomMember.setOnlineStatus(1);
+                roomMember.setLiveRoomStatus(1);
+
+                liveBroadcastRoomMemberService.updateById(roomMember);
+            }
+
         } else {
             //第一次进该房间 写入用户首次进入时间
-            userInfo = getUserInfo(userId);
-            userInfo.setFirstJoinTime(now);
-            userInfo.setTotalViewTime(0);
+            userInfo = getLiveRoomUserInfo(userId, imLiveBroadcastRoomVo, now);
         }
         //查询主讲人信息
         RBucket<RoomSpeakerInfo> speakerCache = getRoomSpeakerInfoCache(roomUid, imLiveBroadcastRoomVo.getSpeakerId().toString());
@@ -979,6 +1010,37 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
     }
 
     /**
+     * 获取直播间用户信息
+     * @param userId 用户id
+     * @param imLiveBroadcastRoomVo 直播间信息
+     * @param now 当前时间
+     * @return RoomUserInfoVo
+     */
+    @NotNull
+    private RoomUserInfoVo getLiveRoomUserInfo(Integer userId, ImLiveBroadcastRoomVo imLiveBroadcastRoomVo, Date now) {
+
+        RoomUserInfoVo userInfo = getUserInfo(userId);
+        userInfo.setFirstJoinTime(now);
+        userInfo.setTotalViewTime(0);
+
+        // 记录直播间用户信息
+        ImLiveBroadcastRoomMember roomMember = new ImLiveBroadcastRoomMember();
+        roomMember.setTenantId(userInfo.getTenantId());
+        roomMember.setRoomUid(imLiveBroadcastRoomVo.getRoomUid());
+        roomMember.setUserId(userInfo.getUserId());
+        roomMember.setJoinTime(DateTime.now().toDate());
+        roomMember.setTotalTime(0);
+        roomMember.setOnlineStatus(1);
+        roomMember.setBanStatus(0);
+        roomMember.setLiveRoomStatus(1);
+
+        // 保存直播间用户信息
+        liveBroadcastRoomMemberService.save(roomMember);
+
+        return userInfo;
+    }
+
+    /**
      * 开始直播-录像
      *
      * @param roomUid 房间uid
@@ -1245,10 +1307,12 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         redissonClient.getBucket(LIVE_ROOM_LIKE.replace(ROOM_UID, room.getRoomUid())).set(0);
 
         //修改房间状态为开始
-        room.setLiveState(1);
-        room.setUpdatedTime(now);
-        room.setUpdatedBy(-2);
-        baseMapper.updateById(room);
+        ImLiveBroadcastRoom liveRoomUpdate = new ImLiveBroadcastRoom();
+        liveRoomUpdate.setLiveState(1);
+        liveRoomUpdate.setUpdatedTime(now);
+        liveRoomUpdate.setUpdatedBy(-2);
+        liveRoomUpdate.setSpeakerStatus(1);
+        baseMapper.updateById(liveRoomUpdate);
     }
 
     private Optional<ImLiveBroadcastRoomDto.RoomConfig> getRoomConfig(String roomConfig) {

+ 2 - 2
mec-biz/src/main/resources/config/mybatis/ImLiveBroadcastRoomMemberMapper.xml

@@ -17,11 +17,11 @@
 
     <insert id="insertBatch" keyColumn="id_" keyProperty="id" useGeneratedKeys="true"
             parameterType="com.ym.mec.biz.dal.entity.ImLiveBroadcastRoomMember">
-        insert into im_live_broadcast_room_member(tenant_id_, room_uid_, user_id_, join_time_, total_time_)
-        values
+        insert into im_live_broadcast_room_member(tenant_id_, room_uid_, user_id_, join_time_, total_time_) values
         <foreach collection="entities" item="entity" separator=",">
             (#{entity.tenantId}, #{entity.roomUid}, #{entity.userId}, #{entity.joinTime}, #{entity.totalTime})
         </foreach>
+        ON DUPLICATE KEY UPDATE join_time_ = VALUES(join_time_), total_time_ = VALUES(total_time_)
     </insert>
 
     <select id="queryMemberPage" resultType="com.ym.mec.biz.dal.vo.ImLiveBroadcastRoomMemberVo">