|
@@ -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;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
}
|