瀏覽代碼

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

zouxuan 3 年之前
父節點
當前提交
6ebff419fb

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/MessageTypeEnum.java

@@ -228,6 +228,8 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
 
     //直播推送
     JIGUANG_LIVE_RESERVATION("IM_LIVE_RESERVATION","直播开播预约提醒-极光推送"),
+    JIGUANG_LIVE_CREATED("IM_LIVE_CREATED","创建直播间-极光推送"),
+    JIGUANG_LIVE_STARTED("IM_LIVE_STARTED","直播已经开始-极光推送"),
 
     //小小训练营-训练营开始训练推送
     JIGUANG_TEMP_LITTLE_ARTIST_START_TRAIN("JIGUANG_TEMP_LITTLE_ARTIST_START_TRAIN","训练营开始训练推送-极光推送"),

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

@@ -37,6 +37,14 @@ public interface ImLiveBroadcastRoomService extends IService<ImLiveBroadcastRoom
 
     void whetherChat(Integer id, Integer whetherChat);
 
+    /**
+     * 关闭房间-融云
+     * 获取所有直播间缓存数据并写入数据库后并清理缓存
+     *
+     * @param roomUid 直播间Uid
+     */
+    void roomDestroy(String roomUid);
+
     void roomDestroy(Integer id);
 
     void delete(Integer id);
@@ -70,7 +78,7 @@ public interface ImLiveBroadcastRoomService extends IService<ImLiveBroadcastRoom
 
     void createLiveRoom();
 
-    Map<String, Object> test(String roomUid);
+    Map<String, Object> test(String roomUid,String userFlag);
 
     /**
      * @param roomUid 直播间uid

+ 153 - 39
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveBroadcastRoomServiceImpl.java

@@ -2,7 +2,6 @@ package com.ym.mec.biz.service.impl;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -32,6 +31,7 @@ import com.ym.mec.common.page.PageUtil;
 import com.ym.mec.common.page.WrapperUtil;
 import com.ym.mec.common.tenant.TenantContextHolder;
 import com.ym.mec.im.ImFeignService;
+import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
 import com.ym.mec.util.excel.POIUtil;
@@ -133,31 +133,56 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
                 .map(this::getSysUser)
                 .orElseGet(this::getSysUser);
         osType = Optional.ofNullable(osType).orElse(1);
-        return queryRoomAndCheck(roomUid, sysUser, osType);
+        if (osType == 1) {
+            //学生端
+            return studentQueryRoomAndCheck(roomUid, sysUser);
+        } else if (osType == 2) {
+            //老师端
+            return teacherQueryRoomAndCheck(roomUid, sysUser);
+        }
+        return queryRoomAndCheck(roomUid, sysUser);
     }
 
-    public ImLiveBroadcastRoomVo queryRoomAndCheck(String roomUid, SysUser sysUser, Integer osType) {
-        Optional<ImLiveBroadcastRoomVo> optional;
+    public ImLiveBroadcastRoomVo studentQueryRoomAndCheck(String roomUid, SysUser sysUser) {
         //如果是学生端,则需要检查是否有权限进入
-        if (Objects.equals(osType, 1)) {
-            Map<String, Object> param = new HashMap<>();
-            param.put("roomUid", roomUid);
-            optional = Optional.of(param).map(this::getImLiveBroadcastRoomVo);
-            optional.orElseThrow(() -> new BizException("您无法观看该直播"));
-        } else {
-            optional = Optional.ofNullable(roomUid).map(this::queryRoomInfo);
-            optional.orElseThrow(() -> new BizException("直播间不存在"));
+        Map<String, Object> param = new HashMap<>();
+        param.put("roomUid", roomUid);
+        ImLiveBroadcastRoomVo vo = Optional.of(param).map(this::getImLiveBroadcastRoomVo)
+                .orElseThrow(() -> new BizException("您无法观看该直播"));
+        if (vo.getSpeakerId().equals(sysUser.getId())) {
+            throw new BizException("您是该直播间的主讲人,请从直播端进入");
         }
+        if (vo.getLiveState() == 0) {
+            throw new BizException("直播尚未开始");
+        }
+        return queryRoomAndCheck(vo, sysUser);
+    }
+
+    public ImLiveBroadcastRoomVo teacherQueryRoomAndCheck(String roomUid, SysUser sysUser) {
+        ImLiveBroadcastRoomVo vo = Optional.ofNullable(roomUid).map(this::queryRoomInfo)
+                .orElseThrow(() -> new BizException("直播间不存在"));
+        if (vo.getOs().equals("pc")) {
+            throw new BizException("该直播间仅可在电脑端直播");
+        }
+        return queryRoomAndCheck(vo, sysUser);
+    }
+
+    public ImLiveBroadcastRoomVo queryRoomAndCheck(String roomUid, SysUser sysUser) {
+        ImLiveBroadcastRoomVo vo = Optional.ofNullable(roomUid).map(this::queryRoomInfo)
+                .orElseThrow(() -> new BizException("直播间不存在"));
+        return queryRoomAndCheck(vo, sysUser);
+    }
+
+    public ImLiveBroadcastRoomVo queryRoomAndCheck(ImLiveBroadcastRoomVo room, SysUser sysUser) {
         //直播间信息校验
-        optional.filter(r -> r.getTenantId().equals(sysUser.getTenantId()))
-                .orElseThrow(() -> new BizException("您不是该直播机构人员,不可观看!"));
-        optional.filter(r -> r.getRoomState() != 1).orElseThrow(() -> new BizException("直播间不存在"));
-        ImLiveBroadcastRoomVo room = optional.get();
+        if (!room.getTenantId().equals(sysUser.getTenantId())) {
+            throw new BizException("您不是该直播机构人员,不可观看!");
+        }
+        if (room.getRoomState() == 1) {
+            throw new BizException("直播间不存在");
+        }
         if (room.getLiveState() == 0) {
             Date liveStartTime = DateUtil.addMinutes(room.getLiveStartTime(), -PRE_LIVE_TIME_MINUTE);
-            if (osType == 1) {
-                throw new BizException("直播尚未开始");
-            }
             throw new BizException(DateUtil.format(liveStartTime, "yyyy年MM月dd日 HH点mm分") + " 可进入直播间准备");
         }
         if (room.getLiveState() == 2) {
@@ -172,7 +197,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         room.setBlacklistFlag(0);
         //黑名单查询-查询当前用户是否在黑名单中
         int count = imLiveRoomBlackService.count(Wrappers.<ImLiveRoomBlack>lambdaQuery()
-                .eq(ImLiveRoomBlack::getRoomUid, roomUid)
+                .eq(ImLiveRoomBlack::getRoomUid, room.getRoomUid())
                 .eq(ImLiveRoomBlack::getUserId, sysUser.getId()));
         if (count > 0) {
             room.setBlacklistFlag(1);
@@ -266,6 +291,8 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         obj.setCreatedBy(getSysUser().getId());
         obj.setCreatedTime(now);
         this.save(obj);
+        //推送老师端-直播已经创建
+        sendRoomLiveState(sysUser, obj, MessageTypeEnum.JIGUANG_LIVE_CREATED);
     }
 
     /**
@@ -387,6 +414,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         PageInfo<ImLiveBroadcastRoomVo> pageInfo = imLiveRoomReservationService.queryPageStudent(param);
         List<ImLiveBroadcastRoomVo> list = pageInfo.getRows();
         if (CollectionUtils.isNotEmpty(list)) {
+            getRoomData(list.get(0));
             return list.get(0);
         }
         return null;
@@ -478,11 +506,28 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
      * 关闭房间-融云
      * 获取所有直播间缓存数据并写入数据库后并清理缓存
      *
+     * @param roomUid 直播间Uid
+     */
+    @Override
+    public void roomDestroy(String roomUid) {
+        ImLiveBroadcastRoom room = this.getOne(Wrappers.<ImLiveBroadcastRoom>lambdaQuery()
+                .eq(ImLiveBroadcastRoom::getRoomUid, roomUid));
+        opsRoomDestroy(room);
+    }
+
+    /**
+     * 关闭房间-融云
+     * 获取所有直播间缓存数据并写入数据库后并清理缓存
+     *
      * @param id 直播房间表id
      */
     @Override
     public void roomDestroy(Integer id) {
         ImLiveBroadcastRoom room = this.getById(id);
+        opsRoomDestroy(room);
+    }
+
+    private void opsRoomDestroy(ImLiveBroadcastRoom room) {
         if (Objects.isNull(room)) {
             return;
         }
@@ -781,6 +826,10 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
                 }
             }
         }
+        //如果退出时间大于进入时间就无需再次退出-直接返回
+        if (compareDate.apply(speakerInfo.getExitRoomTime(), speakerInfo.getJoinRoomTime())) {
+            return true;
+        }
         //主讲人退出房间关闭录像
         closeLive(speakerInfo);
         speakerInfo.setExitRoomTime(now);
@@ -796,10 +845,11 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
      */
     public ImLiveBroadcastRoomVo speakerJoinRoom(String roomUid, String os) {
         SysUser sysUser = getSysUser();
-        ImLiveBroadcastRoomVo roomVo = queryRoomAndCheck(roomUid, sysUser, null);
-        if (!os.equals(roomVo.getOs())) {
-            String ex = roomVo.getOs().equals("pc") ? "电脑": "手机";
-            throw new BizException("该直播间仅可在"+ex+"端直播");
+        ImLiveBroadcastRoomVo roomVo;
+        if (os.equals("mobile")) {
+            roomVo = teacherQueryRoomAndCheck(roomUid, sysUser);
+        } else {
+            roomVo = queryRoomAndCheck(roomUid, sysUser);
         }
         Integer userId = sysUser.getId();
         if (!userId.equals(roomVo.getSpeakerId())) {
@@ -1042,6 +1092,8 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
             imFeignService.createLiveRoom(room.getRoomUid(), room.getRoomTitle());
             //推送预约直播间消息
             imLiveRoomReservationService.push(room);
+            //推送直播开始消息
+            sendRoomLiveState(sysUser, room, MessageTypeEnum.JIGUANG_LIVE_STARTED);
         } catch (Exception e) {
             log.error(">>>>>>>>>> createLiveRoom error roomUid:{} msg:{}", room.getRoomUid(), e.getMessage());
         }
@@ -1058,9 +1110,8 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         speakerInfo.setTenantId(sysUser.getTenantId());
         speakerInfo.setTotalLiveTime(0);
 
-        //查询房间信息是否允许录像
-        ImLiveBroadcastRoom one = this.getOne(new QueryWrapper<ImLiveBroadcastRoom>().eq("room_uid_", room.getRoomUid()));
-        boolean video = getRoomConfig(one.getRoomConfig())
+        //获取是否允许录像
+        boolean video = getRoomConfig(room.getRoomConfig())
                 .filter(c -> Objects.nonNull(c.getWhether_video()))
                 .map(c -> c.getWhether_video() == 0)
                 .orElse(false);
@@ -1071,6 +1122,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
             //不可以录制视频
             speakerInfo.setWhetherVideo(1);
         }
+        speakerInfo.setOs(room.getOs());
         //写入主讲人信息
         getRoomSpeakerInfoCache(room.getRoomUid(), room.getSpeakerId().toString()).set(speakerInfo);
 
@@ -1089,6 +1141,50 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
                 .map(c -> JSON.parseObject(c, ImLiveBroadcastRoomDto.RoomConfig.class));
     }
 
+    /**
+     * 推送老师端-直播已经创建/开始的消息
+     *
+     * @param user 用户信息
+     * @param room 房间信息
+     * @param en   直播列表地址
+     *             <P> /#/liveRoomList?t=0 未开始
+     *             <P>/#/liveRoomList 直播中
+     */
+    private void sendRoomLiveState(SysUser user, ImLiveBroadcastRoom room, MessageTypeEnum en) {
+        String teacherBaseUrl = sysConfigDao.findConfigValue(SysConfigService.TEACHER_BASE_URL);
+        if (StringUtils.isBlank(teacherBaseUrl)) {
+            log.error("sendRoomState error: teacherBaseUrl is null");
+            return;
+        }
+        teacherBaseUrl = teacherBaseUrl + "7?";
+        Map<Integer, String> pushMap = new HashMap<>();
+        pushMap.put(user.getId(), user.getId().toString());
+        String memo;
+        Object[] objs;
+        try {
+            String liveDateStr = DateUtil.format(room.getLiveStartTime(), "yyyy年MM月dd日 HH点mm分");
+            //创建直播间
+            if (en.equals(MessageTypeEnum.JIGUANG_LIVE_CREATED)) {
+                //创建直播间-发送消息-跳到未开始页面
+                memo = teacherBaseUrl + "/#/liveRoomList?t=0";
+                SysUser createUser = getSysUser(room.getCreatedBy());
+                objs = new Object[]{createUser.getUsername(), liveDateStr, room.getLiveRemark()};
+            } else if (en.equals(MessageTypeEnum.JIGUANG_LIVE_STARTED)) {
+                //直播开始-发送消息-跳到直播中页面
+                memo = teacherBaseUrl + "/#/liveRoomList";
+                objs = new Object[]{liveDateStr, room.getRoomTitle()};
+            } else {
+                log.error("sendRoomState error: MessageTypeEnum error " + en);
+                return;
+            }
+            //发送消息
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, en, pushMap,
+                    null, 0, memo, "TEACHER", objs);
+        } catch (Exception e) {
+            log.error("sendRoomState error ", e.getCause());
+        }
+    }
+
     private void getRoomData(ImLiveBroadcastRoomVo roomVo) {
         //点赞数
         Object like = redissonClient.getBucket(LIVE_ROOM_LIKE.replace(ROOM_UID, roomVo.getRoomUid())).get();
@@ -1127,21 +1223,14 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
                 .orElseThrow(() -> new BizException("用户不存在."));
     }
 
-    @Autowired
-    private ImLiveRoomPurviewService imLiveRoomPurviewService;
-
     /**
      * 测试
      */
     public Map<String, Object> test(String roomUid) {
-//        Map<String, Object> map = new HashMap<>();
-//        TenantContextHolder.setTenantId(1);
-//        map.put("roomUid", roomUid);
-//        map.put("groupIds", "22053019304300001,1141,1");
-//        map.put("subjectIds", "2,5,4");
-//        PageInfo<SysUserDto> sysUserDtoPageInfo = imLiveRoomPurviewService.selectRoomPurviewStudent(map);
-//        System.out.println(sysUserDtoPageInfo);
+        return test(roomUid, null);
+    }
 
+    public Map<String, Object> test(String roomUid, String userFlag) {
         //test
         Map<String, Object> result = new HashMap<>();
         //校验房间心跳是否过期没续租
@@ -1180,12 +1269,14 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         if (CollectionUtils.isNotEmpty(totalUserInfo)) {
             if (CollectionUtils.isNotEmpty(inRoomUserInfo)) {
                 look = inRoomUserInfo.size();
-//                result.put("正在观看的人员信息", inRoomUserInfo);
+                Optional.ofNullable(userFlag)
+                        .ifPresent(a -> result.put("正在观看的人员信息", inRoomUserInfo));
             } else {
                 result.put("正在观看的人员信息", "没有正在观看的人员数据");
             }
             totalLook = totalUserInfo.size();
-//            result.put("总人员数据", totalUserInfo);
+            Optional.ofNullable(userFlag)
+                    .ifPresent(a -> result.put("总人员数据", totalUserInfo));
         } else {
             result.put("总人员数据", "没有人员数据");
         }
@@ -1462,6 +1553,19 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
     }
 
     /**
+     * 对比时间,2个时间一个为空返回false,否则对比时间大小
+     * <p>- date1 时间1
+     * <p>- date2 时间2
+     */
+    private final BiFunction<Date, Date, Boolean> compareDate = (date1, date2) -> {
+        if (Objects.nonNull(date1) && Objects.nonNull(date2)) {
+            return date1.getTime() > date2.getTime();
+        } else {
+            return false;
+        }
+    };
+
+    /**
      * 主讲人信息
      */
     public static class RoomSpeakerInfo implements Serializable {
@@ -1493,6 +1597,8 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         private Integer whetherVideo;
         //机构
         private Integer tenantId;
+        //播出端-  pc网页端 移动端mobile
+        private String os = "pc";
 
         public Integer getSpeakerId() {
             return speakerId;
@@ -1595,6 +1701,14 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         public void setEndLiveTime(Date endLiveTime) {
             this.endLiveTime = endLiveTime;
         }
+
+        public String getOs() {
+            return os;
+        }
+
+        public void setOs(String os) {
+            this.os = os;
+        }
     }
 
 }

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

@@ -15,7 +15,7 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
                         "/room/statusImMsg", "/group/batchDismiss", "/private/send", "/group/send",
                         "/group/dismiss", "/room/statusImMsg", "/history/get", "/user/statusImUser", "/liveRoom/recordSync",
                         "/liveRoom/publishRoomMsg", "/liveRoom/destroy", "/liveRoom/create", "/liveRoom/startRecord",
-                        "/liveRoom/stopRecord", "/liveRoom/userExistInRoom","/liveRoom/checkOnline")
+                        "/liveRoom/stopRecord", "/liveRoom/userExistInRoom","/liveRoom/checkOnline","/liveRoom/syncChatRoomStatus")
                 .permitAll().anyRequest().authenticated().and().csrf().disable();
     }
 }

+ 15 - 11
mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherImLiveBroadcastRoomController.java

@@ -73,9 +73,9 @@ public class TeacherImLiveBroadcastRoomController extends BaseController {
     }
 
     @ApiOperation("关闭直播间")
-    @GetMapping(value = "/roomDestroy/{id}")
-    public HttpResponseResult<Object> roomDestroy(@ApiParam(value = "房间表id", required = true) @PathVariable("id") Integer id) {
-        imLiveBroadcastRoomService.roomDestroy(id);
+    @GetMapping(value = "/roomDestroy")
+    public HttpResponseResult<Object> roomDestroy(@ApiParam(value = "房间Uid", required = true) String roomUid) {
+        imLiveBroadcastRoomService.roomDestroy(roomUid);
         return succeed();
     }
 
@@ -87,9 +87,18 @@ public class TeacherImLiveBroadcastRoomController extends BaseController {
         return succeed();
     }
 
-    @PostMapping("/quitRoom")
-    public HttpResponseResult<Object> quitRoom(@RequestBody List<ImUserState> userState) {
-        imLiveBroadcastRoomService.opsRoom(userState);
+    @ApiOperation("开启/关闭直播的录像")
+    @GetMapping("/opsLiveVideo")
+    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) {
+            imLiveBroadcastRoomService.closeLive(roomUid, userId);
+        } else {
+            failed("type参数错误");
+        }
         return succeed();
     }
 
@@ -99,11 +108,6 @@ public class TeacherImLiveBroadcastRoomController extends BaseController {
         return succeed(imLiveBroadcastRoomService.speakerJoinRoom(roomUid,"mobile"));
     }
 
-    @GetMapping("/test")
-    public Object test(String roomUid) {
-        return imLiveBroadcastRoomService.test(roomUid);
-    }
-
     @GetMapping("/shareGroup")
     public HttpResponseResult<Object> shareGroup(@ApiParam(value = "房间uid", required = true) String roomUid,
                                                  @ApiParam(value = "群编号", required = true) String groupIds) {

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

@@ -200,8 +200,8 @@ public class ImLiveBroadcastRoomController extends BaseController {
     }
 
     @GetMapping("/test")
-    public Object test(String roomUid) {
-        return imLiveBroadcastRoomService.test(roomUid);
+    public Object test(String roomUid, String userFlag) {
+        return imLiveBroadcastRoomService.test(roomUid, userFlag);
     }
 
     @GetMapping("/destroyExpiredLiveRoom")