Просмотр исходного кода

修改用户观看时长算法
增加首页推广设置
增加首页推广直播间的查询

hgw 3 лет назад
Родитель
Сommit
6415f03e1b

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

@@ -67,6 +67,10 @@ public class ImLiveBroadcastRoom implements Serializable {
     @ApiModelProperty(value = "房间状态 0正常 1已删除 2销毁")
     private Integer roomState;
 
+    @TableField("popularize_")
+    @ApiModelProperty(value = "是否在首页推广 0否 1是 - 每个机构只能有一个直播间在首页推广")
+    private Integer popularize;
+
     @TableField("created_by_")
     @ApiModelProperty(value = "创建人")
     private Integer createdBy;
@@ -181,6 +185,14 @@ public class ImLiveBroadcastRoom implements Serializable {
         this.roomState = roomState;
     }
 
+    public Integer getPopularize() {
+        return popularize;
+    }
+
+    public void setPopularize(Integer popularize) {
+        this.popularize = popularize;
+    }
+
     public Integer getCreatedBy() {
         return createdBy;
     }

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

@@ -71,6 +71,9 @@ public class ImLiveBroadcastRoomVo implements Serializable {
     @ApiModelProperty(value = "播出端")
     private String os = "pc";
 
+    @ApiModelProperty(value = "是否在首页推广 0否 1是 - 每个机构只能有一个直播间在首页推广")
+    private Integer popularize;
+
     @ApiModelProperty(value = "点赞数")
     private Integer likeNum;
     @ApiModelProperty(value = "当前观看人数")
@@ -245,5 +248,13 @@ public class ImLiveBroadcastRoomVo implements Serializable {
     public void setTotalLookNum(Integer totalLookNum) {
         this.totalLookNum = totalLookNum;
     }
+
+    public Integer getPopularize() {
+        return popularize;
+    }
+
+    public void setPopularize(Integer popularize) {
+        this.popularize = popularize;
+    }
 }
 

+ 6 - 18
mec-biz/src/main/java/com/ym/mec/biz/dal/vo/RoomUserInfoVo.java

@@ -23,13 +23,9 @@ public class RoomUserInfoVo implements Serializable {
     @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;
+    private Date dynamicLookTime;
 
     //0:在房间 1:不在房间
     private Integer state;
@@ -66,20 +62,12 @@ public class RoomUserInfoVo implements Serializable {
         this.firstJoinTime = firstJoinTime;
     }
 
-    public Date getDynamicJoinTime() {
-        return dynamicJoinTime;
-    }
-
-    public void setDynamicJoinTime(Date dynamicJoinTime) {
-        this.dynamicJoinTime = dynamicJoinTime;
-    }
-
-    public Date getLastOutTime() {
-        return lastOutTime;
+    public Date getDynamicLookTime() {
+        return dynamicLookTime;
     }
 
-    public void setLastOutTime(Date lastOutTime) {
-        this.lastOutTime = lastOutTime;
+    public void setDynamicLookTime(Date dynamicLookTime) {
+        this.dynamicLookTime = dynamicLookTime;
     }
 
     public Integer getTenantId() {

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

@@ -35,6 +35,19 @@ public interface ImLiveBroadcastRoomService extends IService<ImLiveBroadcastRoom
 
     void delete(Integer id);
 
+    /**
+     * 推广直播间-每个机构只能有一个直播间在首页推广
+     *
+     * @param id         直播间id
+     * @param popularize 是否在首页推广 0否 1是
+     */
+    void opsPopularize(Integer id, Integer popularize);
+
+    /**
+     * 查询该机构目前推广的直播间
+     */
+    ImLiveBroadcastRoomVo queryPopularizeRoom();
+
     void destroyExpiredLiveRoom();
 
     void syncLike(String roomUid, Integer likeNum);
@@ -45,22 +58,22 @@ public interface ImLiveBroadcastRoomService extends IService<ImLiveBroadcastRoom
 
     void joinRoom(String roomUid, Integer userId);
 
-    void startLive(String roomUid,Integer userId);
+    void startLive(String roomUid, Integer userId);
 
-    void closeLive(String roomUid,Integer userId);
+    void closeLive(String roomUid, Integer userId);
 
     void createLiveRoom();
 
-    Map<String, Object> test(String roomUid, Integer userId);
+    Map<String, Object> test(String roomUid);
 
     /**
-    * @description: 分享直播链接
      * @param roomUid
-    * @return void
-    * @author zx
-    * @date 2022/2/23 16:17
-    */
-    void shareGroup(String roomUid,String groupIds);
+     * @return void
+     * @description: 分享直播链接
+     * @author zx
+     * @date 2022/2/23 16:17
+     */
+    void shareGroup(String roomUid, String groupIds);
 
     List<RoomUserInfoVo> queryRoomUserInfo(String roomUid);
 }

+ 144 - 32
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveBroadcastRoomServiceImpl.java

@@ -4,6 +4,7 @@ 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.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fasterxml.jackson.annotation.JsonFormat;
@@ -45,6 +46,7 @@ import java.io.Serializable;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.function.BiConsumer;
+import java.util.function.BiFunction;
 import java.util.stream.Collectors;
 
 /**
@@ -125,7 +127,6 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         return room;
     }
 
-
     /**
      * 查询直播间信息
      *
@@ -239,6 +240,55 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
     }
 
     /**
+     * 推广直播间-每个机构只能有一个直播间在首页推广
+     *
+     * @param id         直播间id
+     * @param popularize 是否在首页推广 0否 1是
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void opsPopularize(Integer id, Integer popularize) {
+        if (!WrapperUtil.checkInObj(popularize, 0, 1)) {
+            throw new BizException("参数错误");
+        }
+        Optional<ImLiveBroadcastRoom> roomOptional = Optional.ofNullable(id)
+                .map(this::getById);
+        roomOptional.orElseThrow(() -> new BizException("直播间不存在"));
+        roomOptional.filter(room -> room.getRoomState() == 0)
+                .orElseThrow(() -> new BizException("直播间已经删除,无法设置推广"));
+        roomOptional.filter(room -> room.getLiveState() != 2)
+                .orElseThrow(() -> new BizException("直播已结束,无法设置推广"));
+        ImLiveBroadcastRoom obj = roomOptional.get();
+        if (Objects.equals(obj.getPopularize(), popularize)) {
+            return;
+        }
+        //推广该直播间,先清除其该机构他直播间的推广状态
+        if (popularize == 1) {
+            this.update(Wrappers.<ImLiveBroadcastRoom>lambdaUpdate()
+                    .set(ImLiveBroadcastRoom::getPopularize, 0)
+                    .eq(ImLiveBroadcastRoom::getTenantId, obj.getTenantId()));
+        }
+        //更新直播间推广状态
+        obj.setPopularize(popularize);
+        this.updateById(obj);
+    }
+
+    /**
+     * 查询该机构目前推广的直播间
+     */
+    @Override
+    public ImLiveBroadcastRoomVo queryPopularizeRoom() {
+        Map<String, Object> param = new HashMap<>();
+        param.put("tenantId", TenantContextHolder.getTenantId());
+        param.put("popularize", 1);
+        List<ImLiveBroadcastRoomVo> list = baseMapper.queryPage(param);
+        if (CollectionUtils.isNotEmpty(list)) {
+            return list.get(0);
+        }
+        return null;
+    }
+
+    /**
      * 定时任务,每分钟执行
      * 销毁主讲人退出超过30分钟的直播间
      */
@@ -281,7 +331,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
 
                 //1.主播没有进入房间,则直接销毁房间
                 if (Objects.isNull(speakerInfo.getJoinRoomTime())) {
-                    log.info("roomDestroy not joinRoom >>>> cache : {}", JSONObject.toJSONString(test(room.getRoomUid(), room.getSpeakerId())));
+                    log.info("roomDestroy not joinRoom >>>> cache : {}", JSONObject.toJSONString(test(room.getRoomUid())));
                     roomDestroy(room);
                     return;
                 }
@@ -293,7 +343,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
                         //如果退出时间大于进入时间,就将退出时间+expiredMinute分钟
                         Date exitExpiredTime = DateUtil.addMinutes(speakerInfo.getExitRoomTime(), expiredMinute);
                         if (now.getTime() >= exitExpiredTime.getTime()) {
-                            log.info("roomDestroy exitExpiredTime >>>> cache : {}", JSONObject.toJSONString(test(room.getRoomUid(), room.getSpeakerId())));
+                            log.info("roomDestroy exitExpiredTime >>>> cache : {}", JSONObject.toJSONString(test(room.getRoomUid())));
                             roomDestroy(room);
                         }
                     }
@@ -360,19 +410,19 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         room.setUpdatedBy(userId);
         room.setUpdatedTime(date);
         room.setLiveEndTime(date);
+        room.setPopularize(0);//销毁直播间后要关闭推广
         this.updateById(room);
     }
 
     //获取该直播间所有数据写入数据库-并清理缓存
     private void insertAndCleanLiveData(String roomUid, Integer speakerId) {
         //总观看人数
-        int totalLookNum = 0;
+        List<ImLiveBroadcastRoomMember> memberList = new ArrayList<>();
         //获取直播间所有人数据写入 im_live_broadcast_room_member
         RMap<Integer, RoomUserInfoVo> roomTotalUserCache = redissonClient.getMap(LIVE_ROOM_TOTAL_USER_LIST.replace(ROOM_UID, roomUid));
         if (roomTotalUserCache.isExists()) {
             List<RoomUserInfoVo> roomTotalUser = new ArrayList<>(roomTotalUserCache.values());
-            List<ImLiveBroadcastRoomMember> memberList = new ArrayList<>();
-            roomTotalUser.forEach(v -> {
+            for (RoomUserInfoVo v : roomTotalUser) {
                 ImLiveBroadcastRoomMember member = new ImLiveBroadcastRoomMember();
                 member.setTenantId(v.getTenantId());
                 member.setRoomUid(roomUid);
@@ -380,10 +430,6 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
                 member.setJoinTime(v.getFirstJoinTime());
                 member.setTotalTime(v.getTotalViewTime());
                 memberList.add(member);
-            });
-            if (CollectionUtils.isNotEmpty(memberList)) {
-                liveBroadcastRoomMemberService.getDao().insertBatch(memberList);
-                totalLookNum = roomTotalUser.size();
             }
             //删除用户对应的直播间关系缓存
             roomTotalUser.stream()
@@ -402,7 +448,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
             //删除房间点赞数据
             likeCache.delete();
         }
-
+        int speakerLiveTime = 0;
         //获取直播间主讲人信息 写入im_live_broadcast_room_data
         RBucket<RoomSpeakerInfo> speakerCache = redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, speakerId.toString()));
         if (speakerCache.isExists()) {
@@ -411,14 +457,25 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
             liveData.setTenantId(speakerInfo.getTenantId());
             liveData.setRoomUid(roomUid);
             liveData.setLikeNum(like);
-            liveData.setTotalUserNum(totalLookNum);
+            liveData.setTotalUserNum(CollectionUtils.isNotEmpty(memberList) ? memberList.size() : 0);
             liveData.setUpdatedTime(new Date());
             liveData.setLiveTime(speakerInfo.getTotalLiveTime());
             liveBroadcastRoomDataService.save(liveData);
             //删除房间主讲人数据
             speakerCache.delete();
+            //获取主讲人直播时长
+            speakerLiveTime = speakerInfo.getTotalLiveTime();
         }
 
+        //写入im_live_broadcast_room_member表,校验用户观看时长,不能大于主讲人直播时长
+        if (CollectionUtils.isNotEmpty(memberList)) {
+            for (ImLiveBroadcastRoomMember member : memberList) {
+                if (member.getTotalTime() > speakerLiveTime) {
+                    member.setTotalTime(speakerLiveTime);
+                }
+            }
+            liveBroadcastRoomMemberService.getDao().insertBatch(memberList);
+        }
     }
 
     /**
@@ -461,7 +518,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
                 }
             }
             //将最新的时间写入缓存
-            userStateTimeCache.set(userStateTime,5L, TimeUnit.MINUTES);
+            userStateTimeCache.set(userStateTime, 5L, TimeUnit.MINUTES);
             //查询主讲人userId,若是主讲人
             RBucket<RoomSpeakerInfo> speakerCache = redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, userid));
             if (speakerCache.isExists()) {
@@ -514,16 +571,16 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
                 }
                 log.info("opsRoom>>>> looker LOOKER_LOGIN_OUT : {}", JSONObject.toJSONString(userInfo));
             }
-            //每次退出房间计算当前用户观看时长
-            int minutesBetween = getMinutesBetween(userInfo.getDynamicJoinTime(), now);
-            userInfo.setTotalViewTime(userInfo.getTotalViewTime() + minutesBetween);
+            //只有在主播开播后用户才有观看时间,才需要计算当前用户观看时长
+            if (Objects.nonNull(userInfo.getDynamicLookTime())) {
+                int minutesBetween = getMinutesBetween(userInfo.getDynamicLookTime(), now);
+                userInfo.setTotalViewTime(userInfo.getTotalViewTime() + minutesBetween);
+            }
             //记录退出时间 并写入缓存
-            userInfo.setLastOutTime(now);
             userInfo.setState(1);
             roomTotalUser.fastPut(userId, userInfo);
             log.info("opsRoom>>>> looker userInfo: {}", JSONObject.toJSONString(userInfo));
         });
-
     }
 
     /**
@@ -576,7 +633,6 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
             userInfo.setTotalViewTime(0);
         }
         userInfo.setState(0);//0 进入/在房间
-        userInfo.setDynamicJoinTime(now);
         roomTotalUser.fastPut(userId, userInfo);
         log.info("joinRoom>>>> userInfo: {}", JSONObject.toJSONString(userInfo));
     }
@@ -587,9 +643,17 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
      * @param roomUid 房间uid
      */
     public void startLive(String roomUid, Integer userId) {
-        //查询房间信息是否允许录像
+        //查询房间信息
         RBucket<RoomSpeakerInfo> speakerCache = redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, userId.toString()));
+        if (!speakerCache.isExists()) {
+            return;
+        }
         RoomSpeakerInfo roomSpeakerInfo = speakerCache.get();
+        //已是直播状态则直接返回
+        if (Objects.nonNull(roomSpeakerInfo.getState()) && roomSpeakerInfo.getState() == 0) {
+            return;
+        }
+        //是否允许录像
         if (Objects.nonNull(roomSpeakerInfo.getWhetherVideo()) && roomSpeakerInfo.getWhetherVideo() == 0) {
             //开始录制视频
             try {
@@ -598,11 +662,26 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
                 log.error("startRecord error: {}", e.getMessage());
             }
         }
+        Date now = new Date();
         //开始直播
         roomSpeakerInfo.setState(0);
-        roomSpeakerInfo.setStartLiveTime(new Date());
+        roomSpeakerInfo.setStartLiveTime(now);
         speakerCache.set(roomSpeakerInfo);
         log.info("startLive>>>> roomSpeakerInfo: {}", JSONObject.toJSONString(roomSpeakerInfo));
+
+        //主播开启直播,查询所有在直播间的用户并写入观看时间
+        RMap<Integer, RoomUserInfoVo> roomTotalUser = redissonClient.getMap(LIVE_ROOM_TOTAL_USER_LIST.replace(ROOM_UID, roomSpeakerInfo.getRoomUid()));
+        if (!roomTotalUser.isExists()) {
+            return;
+        }
+        roomTotalUser.forEach((id, userInfo) -> {
+            //对在房间的用户
+            if (Objects.nonNull(userInfo.getState()) && userInfo.getState() == 0) {
+                userInfo.setDynamicLookTime(now);
+                roomTotalUser.fastPut(id, userInfo);
+            }
+        });
+
     }
 
     /**
@@ -613,6 +692,9 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
     public void closeLive(String roomUid, Integer userId) {
         //查询房间主播信息
         RBucket<RoomSpeakerInfo> speakerCache = redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, userId.toString()));
+        if (!speakerCache.isExists()) {
+            return;
+        }
         RoomSpeakerInfo roomSpeakerInfo = speakerCache.get();
         //关闭直播
         closeLive(roomSpeakerInfo);
@@ -620,24 +702,46 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
     }
 
     private void closeLive(RoomSpeakerInfo roomSpeakerInfo) {
+        //直播状态 true 直播中 false关闭直播
         boolean stateFlag = Objects.nonNull(roomSpeakerInfo.getState()) && roomSpeakerInfo.getState() == 0;
-        if (Objects.nonNull(roomSpeakerInfo.getWhetherVideo()) && roomSpeakerInfo.getWhetherVideo() == 0
-                && stateFlag) {
-            //停止录制视频
+        //是否录像 true允许 false不允许
+        boolean whetherVideoFlag = Objects.nonNull(roomSpeakerInfo.getWhetherVideo()) && roomSpeakerInfo.getWhetherVideo() == 0;
+        //允许录像并在直播中
+        if (whetherVideoFlag && stateFlag) {
             try {
+                //停止录制视频
                 imFeignService.stopRecord(roomSpeakerInfo.getRoomUid());
             } catch (Exception e) {
                 log.error("stopRecord error: {}", e.getMessage());
             }
         }
+        //直播状态 true 直播中
         if (stateFlag) {
             Date now = new Date();
             roomSpeakerInfo.setEndLiveTime(now);
             roomSpeakerInfo.setState(1);
-            //计算时长
-            int minutesBetween = getMinutesBetween(roomSpeakerInfo.getStartLiveTime(), now);
-            int i = Objects.isNull(roomSpeakerInfo.getTotalLiveTime()) ? 0 : roomSpeakerInfo.getTotalLiveTime();
-            roomSpeakerInfo.setTotalLiveTime(i + minutesBetween);
+            //计算时长方法
+            BiFunction<Date, Integer, Integer> getLookMinutes = (startDate, nowMinutes) -> {
+                int minutesBetween = getMinutesBetween(startDate, new Date());
+                minutesBetween += Objects.isNull(nowMinutes) ? 0 : nowMinutes;
+                return Math.max(minutesBetween, 0);
+            };
+            //写入本次直播时长
+            int lookMinutes = getLookMinutes.apply(roomSpeakerInfo.getStartLiveTime(), roomSpeakerInfo.getTotalLiveTime());
+            roomSpeakerInfo.setTotalLiveTime(lookMinutes);
+            //主播关闭直播,查询所有在直播间的用户并计算观看时长
+            RMap<Integer, RoomUserInfoVo> roomTotalUser = redissonClient.getMap(LIVE_ROOM_TOTAL_USER_LIST.replace(ROOM_UID, roomSpeakerInfo.getRoomUid()));
+            if (!roomTotalUser.isExists()) {
+                return;
+            }
+            roomTotalUser.forEach((id, userInfo) -> {
+                //对在房间的用户计算观看时长
+                if (Objects.nonNull(userInfo.getState()) && userInfo.getState() == 0) {
+                    Integer userLookMinutes = getLookMinutes.apply(userInfo.getDynamicLookTime(), userInfo.getTotalViewTime());
+                    userInfo.setTotalViewTime(userLookMinutes);
+                    roomTotalUser.fastPut(id, userInfo);
+                }
+            });
         }
         log.info("closeLive>>>> roomSpeakerInfo: {}", JSONObject.toJSONString(roomSpeakerInfo));
     }
@@ -754,7 +858,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
     /**
      * 测试
      */
-    public Map<String, Object> test(String roomUid, Integer userId) {
+    public Map<String, Object> test(String roomUid) {
         //test
         Map<String, Object> result = new HashMap<>();
         //点赞数
@@ -784,9 +888,15 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         } else {
             result.put("总人员数据", "没有人员数据");
         }
+        String userId = "";
+        try {
+            String[] split = roomUid.split("-");
+            userId = split[1];
+        } catch (Exception ignored) {
+        }
 
         //获取主讲人信息
-        RBucket<RoomSpeakerInfo> speakerCache = redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, userId.toString()));
+        RBucket<RoomSpeakerInfo> speakerCache = redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, userId));
         if (speakerCache.isExists()) {
             result.put("主讲人信息", speakerCache.get());
         } else {
@@ -805,11 +915,10 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         }
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         String baseApiUrl = sysConfigDao.findConfigValue(SysConfigService.BASE_API_URL);
-        StringBuffer pushUrl = new StringBuffer(baseApiUrl).append("/#/liveClassTransfer?roomUid=").append(roomUid);
         sysMessageService.batchSendImGroupMessage(MessageTypeEnum.IM_SHARE_LIVE_URL, sysUser.getId().toString(), null, groupIds.split(","), null,
                 imLiveBroadcastRoomVo.getTenantName(), imLiveBroadcastRoomVo.getRoomTitle(), imLiveBroadcastRoomVo.getSpeakerName(),
                 DateUtil.format(imLiveBroadcastRoomVo.getLiveStartTime(), DateUtil.CHINESE_DATA_FORMAT_1),
-                imLiveBroadcastRoomVo.getLiveRemark(), HttpUtil.getSortUrl(pushUrl.toString()));
+                imLiveBroadcastRoomVo.getLiveRemark(), HttpUtil.getSortUrl(baseApiUrl + "/#/liveClassTransfer?roomUid=" + roomUid));
     }
 
     /**
@@ -861,6 +970,9 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         if (Objects.isNull(startDT) || Objects.isNull(endDT)) {
             return 0;
         }
+        if (startDT.getTime() > endDT.getTime()) {
+            return 0;
+        }
         //课程结束时间-课程开始时间
         long durationTime = endDT.getTime() - startDT.getTime();
         //相差多少分钟

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

@@ -14,6 +14,7 @@
         <result column="room_config_" jdbcType="VARCHAR" property="roomConfig"/>
         <result column="live_state_" jdbcType="INTEGER" property="liveState"/>
         <result column="room_state_" jdbcType="INTEGER" property="roomState"/>
+        <result column="popularize_" jdbcType="INTEGER" property="popularize"/>
         <result column="created_by_" jdbcType="INTEGER" property="createdBy"/>
         <result column="created_time_" jdbcType="TIMESTAMP" property="createdTime"/>
         <result column="updated_by_" jdbcType="INTEGER" property="updatedBy"/>
@@ -22,19 +23,19 @@
 
     <sql id="Base_Column_List">
         id_
-        , tenant_id_, speaker_id_, room_uid_, room_title_, live_start_time_, live_end_time_, live_remark_, pre_template_, room_config_, live_state_, room_state_, created_by_, created_time_, updated_by_, updated_time_
+        , tenant_id_, speaker_id_, room_uid_, room_title_, live_start_time_, live_end_time_, live_remark_, pre_template_, room_config_, live_state_, room_state_, popularize_, created_by_, created_time_, updated_by_, updated_time_
     </sql>
 
     <insert id="insertBatch" keyColumn="id_" keyProperty="id" useGeneratedKeys="true"
             parameterType="com.ym.mec.biz.dal.entity.ImLiveBroadcastRoom">
         insert into im_live_broadcast_room(tenant_id_, speaker_id_, room_uid_, room_title_, live_start_time_,
-        live_end_time_, live_remark_, pre_template_, room_config_, live_state_, room_state_, created_by_, created_time_,
+        live_end_time_, live_remark_, pre_template_, room_config_, live_state_, room_state_, popularize_, created_by_, created_time_,
         updated_by_, updated_time_)
         values
         <foreach collection="entities" item="entity" separator=",">
             (#{entity.tenantId}, #{entity.speakerId}, #{entity.roomUid}, #{entity.roomTitle}, #{entity.liveStartTime},
             #{entity.liveEndTime}, #{entity.liveRemark}, #{entity.preTemplate}, #{entity.roomConfig},
-            #{entity.liveState}, #{entity.roomState}, #{entity.createdBy}, #{entity.createdTime}, #{entity.updatedBy},
+            #{entity.liveState}, #{entity.roomState}, #{entity.popularize}, #{entity.createdBy}, #{entity.createdTime}, #{entity.updatedBy},
             #{entity.updatedTime})
         </foreach>
     </insert>
@@ -56,7 +57,8 @@
         a.room_state_ AS roomState,
         c.real_name_ AS createdByName,
         a.pre_template_ AS preTemplate,
-        a.room_config_ AS roomConfig
+        a.room_config_ AS roomConfig,
+        a.popularize_ AS popularize
         from im_live_broadcast_room as a
         left join tenant_info AS t on a.tenant_id_ = t.id_
         left join sys_user AS b on a.speaker_id_ = b.id_
@@ -84,7 +86,9 @@
             <if test="param.endTime != null">
                 <![CDATA[ AND a.live_start_time_  <= #{param.endTime} ]]>
             </if>
-
+            <if test="param.popularize != null">
+                and a.a.popularize_ = 1
+            </if>
         </where>
 
     </select>

+ 38 - 0
mec-student/src/main/java/com/ym/mec/student/controller/ImLiveBroadcastRoomController.java

@@ -0,0 +1,38 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.biz.dal.vo.ImLiveBroadcastRoomVo;
+import com.ym.mec.biz.service.ImLiveBroadcastRoomService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * 直播房间管理表(ImLiveBroadcastRoom)表控制层
+ *
+ * @author hgw
+ * @since 2022-02-17 20:52:04
+ */
+@Api(tags = "直播房间管理表")
+@RestController
+@RequestMapping("/imLiveBroadcastRoom")
+public class ImLiveBroadcastRoomController extends BaseController {
+    /**
+     * 服务对象
+     */
+    @Resource
+    private ImLiveBroadcastRoomService imLiveBroadcastRoomService;
+
+    @ApiOperation("查询该机构目前推广的直播间")
+    @GetMapping(value = "/queryPopularizeRoom")
+    public HttpResponseResult<ImLiveBroadcastRoomVo> queryPopularizeRoom() {
+        return succeed(imLiveBroadcastRoomService.queryPopularizeRoom());
+    }
+
+}
+

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

@@ -65,14 +65,14 @@ public class ImLiveBroadcastRoomController extends BaseController {
     @ApiOperation("创建直播间")
     @PostMapping("/add")
     @PreAuthorize("@pcs.hasPermissions('imLiveBroadcastRoom/add')")
-    public HttpResponseResult add(@Valid @RequestBody ImLiveBroadcastRoomDto dto) {
+    public HttpResponseResult<Object> add(@Valid @RequestBody ImLiveBroadcastRoomDto dto) {
         imLiveBroadcastRoomService.add(dto);
         return succeed();
     }
 
     @ApiOperation("修改直播间信息-已开播无法修改")
     @PostMapping("/update")
-    public HttpResponseResult update(@Valid @RequestBody ImLiveBroadcastRoomDto dto) {
+    public HttpResponseResult<Object> update(@Valid @RequestBody ImLiveBroadcastRoomDto dto) {
         imLiveBroadcastRoomService.update(dto);
         return succeed();
     }
@@ -85,8 +85,8 @@ public class ImLiveBroadcastRoomController extends BaseController {
      */
     @ApiOperation("修改是否禁言")
     @GetMapping(value = "/whetherChat/{id}")
-    public HttpResponseResult whetherChat(@ApiParam(value = "房间表id", required = true) @PathVariable("id") Integer id,
-                                          @ApiParam(value = "是否允许聊天互动 0允许 1不允许", required = true) Integer whetherChat) {
+    public HttpResponseResult<Object> whetherChat(@ApiParam(value = "房间表id", required = true) @PathVariable("id") Integer id,
+                                                  @ApiParam(value = "是否允许聊天互动 0允许 1不允许", required = true) Integer whetherChat) {
         imLiveBroadcastRoomService.whetherChat(id, whetherChat);
         return succeed();
     }
@@ -98,7 +98,7 @@ public class ImLiveBroadcastRoomController extends BaseController {
      */
     @ApiOperation("关闭直播间")
     @GetMapping(value = "/roomDestroy/{id}")
-    public HttpResponseResult roomDestroy(@ApiParam(value = "房间表id", required = true) @PathVariable("id") Integer id) {
+    public HttpResponseResult<Object> roomDestroy(@ApiParam(value = "房间表id", required = true) @PathVariable("id") Integer id) {
         imLiveBroadcastRoomService.roomDestroy(id);
         return succeed();
     }
@@ -109,22 +109,31 @@ public class ImLiveBroadcastRoomController extends BaseController {
     @ApiOperation("删除直播间信息-已开播无法删除")
     @PostMapping("/delete")
     @PreAuthorize("@pcs.hasPermissions('imLiveBroadcastRoom/delete')")
-    public HttpResponseResult delete(@RequestBody Map<String, Object> param) {
+    public HttpResponseResult<Object> delete(@RequestBody Map<String, Object> param) {
         Integer id = WrapperUtil.toInt(param, "id", "请传入房间id");
         imLiveBroadcastRoomService.delete(id);
         return succeed();
     }
 
+    @ApiOperation("推广直播间-每个机构只能有一个直播间在首页推广")
+    @PostMapping("/opsPopularize")
+    @PreAuthorize("@pcs.hasPermissions('imLiveBroadcastRoom/opsPopularize')")
+    public HttpResponseResult<Object> opsPopularize(@ApiParam(value = "房间id", required = true) Integer id,
+                                                    @ApiParam(value = "是否在首页推广 0否 1是", required = true) Integer popularize) {
+        imLiveBroadcastRoomService.opsPopularize(id, popularize);
+        return succeed();
+    }
+
     @ApiOperation("同步点赞数量")
     @GetMapping("/syncLike")
-    public HttpResponseResult syncLike(@ApiParam(value = "房间uid", required = true) String roomUid,
-                                       @ApiParam(value = "点赞数", required = true) Integer likeNum) {
+    public HttpResponseResult<Object> syncLike(@ApiParam(value = "房间uid", required = true) String roomUid,
+                                               @ApiParam(value = "点赞数", required = true) Integer likeNum) {
         imLiveBroadcastRoomService.syncLike(roomUid, likeNum);
         return succeed();
     }
 
     @PostMapping("/quitRoom")
-    public HttpResponseResult quitRoom(@RequestBody List<ImUserState> userState) {
+    public HttpResponseResult<Object> quitRoom(@RequestBody List<ImUserState> userState) {
         imLiveBroadcastRoomService.opsRoom(userState);
         return succeed();
     }
@@ -137,16 +146,16 @@ public class ImLiveBroadcastRoomController extends BaseController {
 
     @ApiOperation("进入房间")
     @GetMapping("/joinRoom")
-    public HttpResponseResult joinRoom(String roomUid, Integer userId) {
+    public HttpResponseResult<Object> 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) {
+    public HttpResponseResult<Object> 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) {
@@ -158,8 +167,8 @@ public class ImLiveBroadcastRoomController extends BaseController {
     }
 
     @GetMapping("/test")
-    public Object test(String roomUid, Integer userId) {
-        return imLiveBroadcastRoomService.test(roomUid, userId);
+    public Object test(String roomUid) {
+        return imLiveBroadcastRoomService.test(roomUid);
     }
 
     @GetMapping("/destroyExpiredLiveRoom")
@@ -169,8 +178,8 @@ public class ImLiveBroadcastRoomController extends BaseController {
     }
 
     @GetMapping("/shareGroup")
-    public HttpResponseResult shareGroup(@ApiParam(value = "房间uid", required = true) String roomUid,
-                                         @ApiParam(value = "群编号", required = true) String groupIds) {
+    public HttpResponseResult<Object> shareGroup(@ApiParam(value = "房间uid", required = true) String roomUid,
+                                                 @ApiParam(value = "群编号", required = true) String groupIds) {
         imLiveBroadcastRoomService.shareGroup(roomUid, groupIds);
         return succeed();
     }