|
@@ -10,6 +10,7 @@ import com.microsvc.toolkit.middleware.rtc.RTCRoomPluginService;
|
|
|
import com.microsvc.toolkit.middleware.rtc.enums.EMemberAction;
|
|
|
import com.microsvc.toolkit.middleware.rtc.impl.TencentCloudRTCPlugin;
|
|
|
import com.microsvc.toolkit.middleware.rtc.message.ImGroupMemberWrapper;
|
|
|
+import com.microsvc.toolkit.middleware.rtc.message.RTCRoomConfig;
|
|
|
import com.microsvc.toolkit.middleware.rtc.message.RTCRoomMessage;
|
|
|
import com.yonge.cooleshow.auth.api.entity.SysUser;
|
|
|
import com.yonge.cooleshow.biz.dal.dao.ImNetworkRoomDao;
|
|
@@ -23,8 +24,10 @@ import com.yonge.cooleshow.biz.dal.service.*;
|
|
|
import com.yonge.cooleshow.biz.dal.support.IMHelper;
|
|
|
import com.yonge.cooleshow.biz.dal.vo.TeacherVo;
|
|
|
import com.yonge.cooleshow.common.constant.SysConfigConstant;
|
|
|
+import com.yonge.cooleshow.common.entity.BaseResponse;
|
|
|
import com.yonge.cooleshow.common.entity.HttpResponseResult;
|
|
|
import com.yonge.cooleshow.common.enums.EStatus;
|
|
|
+import com.yonge.cooleshow.common.enums.ErrorEnum;
|
|
|
import com.yonge.toolset.base.exception.BizException;
|
|
|
import com.yonge.toolset.utils.date.DateUtil;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
@@ -84,6 +87,12 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
|
|
|
|
|
|
@Autowired
|
|
|
private ImGroupService imGroupService;
|
|
|
+ @Autowired
|
|
|
+ private RoomService roomService;
|
|
|
+ @Autowired
|
|
|
+ private ImNetworkRoomMemberStatusService imNetworkRoomMemberStatusService;
|
|
|
+ @Autowired
|
|
|
+ private ImService imService;
|
|
|
|
|
|
private String QUIT_ROOM_SUCCESS = "quitRoomSuccess:";
|
|
|
|
|
@@ -94,8 +103,7 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
|
|
|
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
- public HttpResponseResult<ImNetworkRoomResult> joinRoom(Long courseScheduleId, ClientEnum clientType) throws Exception {
|
|
|
-
|
|
|
+ public BaseResponse<ImNetworkRoomResult> joinRoom(Long courseScheduleId, ClientEnum clientType) throws Exception {
|
|
|
// 当前登录用户ID
|
|
|
Long userId = sysUserService.getUserId();
|
|
|
CourseSchedule courseSchedule = Optional.ofNullable(courseScheduleService.getById(courseScheduleId)).
|
|
@@ -113,65 +121,50 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
|
|
|
courseSchedule.setUpdatedTime(now);
|
|
|
//是否提前进入教室
|
|
|
if (roomNotStart(courseSchedule)) {
|
|
|
- return HttpResponseResult.failed(ImNetworkRoomErrorEnum.ROOM_NOT_START.getRemark());
|
|
|
+ return BaseResponse.failed(ErrorEnum.ROOM_NOT_START);
|
|
|
}
|
|
|
String roomId = courseScheduleId.toString();
|
|
|
ImNetworkRoomResult joinRoomResult = new ImNetworkRoomResult();
|
|
|
//初始化房间信息
|
|
|
- ImNetworkRoom room = this.initRoom(roomId,courseScheduleId,userRole,sysUser.getUserId(),now);
|
|
|
+ ImNetworkRoom room = roomService.initRoom(roomId,userRole,sysUser.getUserId());
|
|
|
BeanUtils.copyProperties(room,joinRoomResult);
|
|
|
//定时销毁房间
|
|
|
//初始化房间用户信息
|
|
|
- ImNetworkRoomMember roomMember = imNetworkRoomMemberService.initRoomMember(roomId,sysUser,userRole);
|
|
|
+ ImNetworkRoomMember roomMember = imNetworkRoomMemberService.initRoomMember(roomId,sysUser,userRole,!courseSchedule.getMuteAll());
|
|
|
joinRoomResult.setRoomMember(roomMember);
|
|
|
//获取教室剩余时长
|
|
|
joinRoomResult.setSurplusTime(DateUtil.secondsBetween(now, courseSchedule.getEndTime()));
|
|
|
//获取房间所有成员
|
|
|
- List<ImNetworkRoomMember> roomMemberList = imNetworkRoomMemberService.getDao().queryByRoomId(roomId);
|
|
|
- for (ImNetworkRoomMember item : roomMemberList) {
|
|
|
- if (EStatus.ENABLE.match(item.getRole())) {
|
|
|
- // 老师
|
|
|
- item.setImUserId(imGroupService.getImUserId(String.valueOf(item.getUserId()),ClientEnum.TEACHER.name()));
|
|
|
- } else {
|
|
|
- // 学生
|
|
|
- item.setImUserId(imGroupService.getImUserId(String.valueOf(item.getUserId()),ClientEnum.STUDENT.name()));
|
|
|
- }
|
|
|
- }
|
|
|
+ List<ImNetworkRoomMember> roomMemberList = imNetworkRoomMemberService.queryByRoomId(roomId);
|
|
|
+
|
|
|
joinRoomResult.setRoomMemberList(roomMemberList);
|
|
|
- //如果是老师,重置节拍器数据
|
|
|
+ //如果是老师,
|
|
|
if(userRole == RoleEnum.RoleTeacher){
|
|
|
- courseScheduleStudentPaymentService.getDao().cleanPlayMidi(courseScheduleId);
|
|
|
+ //重置节拍器数据
|
|
|
+ imNetworkRoomMemberStatusService.lambdaUpdate().set(ImNetworkRoomMemberStatus::getPlayMidi,null)
|
|
|
+ .eq(ImNetworkRoomMemberStatus::getRoomId,roomId).update();
|
|
|
//获取所有学员的伴奏下载详情
|
|
|
setMusicSheetList(roomMemberList,courseScheduleId);
|
|
|
}else {
|
|
|
//获取节拍器信息
|
|
|
- joinRoomResult.setMidiJson(courseScheduleStudentPaymentService.getMemberMidi(courseScheduleId, sysUser.getUserId()));
|
|
|
+ joinRoomResult.setMidiJson(imNetworkRoomMemberStatusService.getMemberMidi(roomId, sysUser.getUserId()));
|
|
|
}
|
|
|
//课程结束后关闭教室的时间
|
|
|
joinRoomResult.setAutoCloseNetworkRoomTime(sysConfigDao.findConfigValue(SysConfigConstant.DESTROY_EXPIRED_PRACTICE_ROOM_MINUTE));
|
|
|
|
|
|
- // IM用户ID
|
|
|
- String imUserId = imGroupService.getImUserId(sysUser.getUserId(),userRole);
|
|
|
- roomMember.setImUserId(imUserId);
|
|
|
// 创建IM群聊
|
|
|
- this.joinImGroup(roomId, courseSchedule.getTeacherId().intValue(), courseSchedule);
|
|
|
- RTCRoomPluginService pluginService = rtcRoomPluginContext.getPluginService(courseSchedule.getServiceProvider());
|
|
|
- if (TencentCloudRTCPlugin.PLUGIN_NAME.equals(pluginService.pluginName())) {
|
|
|
- // 腾讯云RTC
|
|
|
- // 用户IM帐号创建
|
|
|
- String userSig = "";
|
|
|
- try {
|
|
|
- userSig = pluginService.register(String.valueOf(sysUser.getUserId()), sysUser.getRealName(), sysUser.getAvatar());
|
|
|
- } catch (Exception e) {
|
|
|
- log.error("直播房间用户注册失败: userId={}", sysUser.getUserId(), e);
|
|
|
- }
|
|
|
-
|
|
|
- // 返回配置参数
|
|
|
- joinRoomResult.setUserSig(userSig);
|
|
|
- joinRoomResult.setRtcRoomConfig(rtcRoomPluginContext.getPluginService().getRTCRoomConfig(String.valueOf(sysUser.getUserId())));
|
|
|
- joinRoomResult.setGroupId(roomId);
|
|
|
- }
|
|
|
- return HttpResponseResult.succeed(joinRoomResult);
|
|
|
+ //获取老师基本信息
|
|
|
+ BasicUserInfo basicUserInfo = teacherDao.getBasicUserInfo(courseSchedule.getTeacherId());
|
|
|
+ //获取学员列表
|
|
|
+ List<CourseScheduleStudentPayment> studentPayments = courseScheduleStudentPaymentService.getDao().queryByCourseId(courseScheduleId);
|
|
|
+ List<Long> studentIds = studentPayments.stream().map(e -> e.getUserId()).collect(Collectors.toList());
|
|
|
+ //创建并加入群组
|
|
|
+ imGroupService.joinImGroup(roomId, basicUserInfo,
|
|
|
+ courseSchedule.getServiceProvider(), studentIds);
|
|
|
+ //获取腾讯所需基本信息配置
|
|
|
+ joinRoomResult.setRtcRoomConfig(roomService.getRtcRoomConfig(courseSchedule.getServiceProvider(),sysUser));
|
|
|
+ joinRoomResult.setGroupId(roomId);
|
|
|
+ return BaseResponse.success(joinRoomResult);
|
|
|
}
|
|
|
|
|
|
private void setMusicSheetList(List<ImNetworkRoomMember> roomMemberList,Long courseScheduleId){
|
|
@@ -192,14 +185,12 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
public void joinRoomSuccess(String roomId, String imUserId) throws Exception {
|
|
|
-
|
|
|
+ log.info("joinRoomSuccess: roomId={}, imUserId={}", roomId, imUserId);
|
|
|
// 用户ID
|
|
|
Long userId = Long.parseLong(imGroupService.analysisImUserId(imUserId));
|
|
|
-
|
|
|
// 客户端类型
|
|
|
ClientEnum clientType = ClientEnum.valueOf(imGroupService.analysisImUserClient(imUserId));
|
|
|
|
|
|
- log.info("joinRoomSuccess: roomId={}, userId={}", roomId, userId);
|
|
|
CourseSchedule courseSchedule = Optional.ofNullable(courseScheduleService.getById(roomId)).
|
|
|
orElseThrow(()->new BizException("房间信息不存在"));
|
|
|
BasicUserInfo sysUser = Optional.ofNullable(teacherDao.getBasicUserInfo(userId)).
|
|
@@ -214,54 +205,15 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
|
|
|
}else {
|
|
|
studentAttendanceService.signIn(userId,courseSchedule);
|
|
|
}
|
|
|
- Date now = new Date();
|
|
|
//获取房间信息
|
|
|
- ImNetworkRoom room = this.initRoom(roomId, Long.parseLong(roomId), userRole, userId, now);
|
|
|
+ ImNetworkRoom room = roomService.initRoom(roomId, userRole, userId);
|
|
|
//获取房间用户信息
|
|
|
- ImNetworkRoomMember roomMember = imNetworkRoomMemberService.initRoomMember(roomId,sysUser,userRole);
|
|
|
- // IM用户ID
|
|
|
- roomMember.setImUserId(imUserId);
|
|
|
+ ImNetworkRoomMember roomMember = imNetworkRoomMemberService.initRoomMember(roomId,sysUser,userRole,!courseSchedule.getMuteAll());
|
|
|
//发送人员变动消息
|
|
|
// 获取RTC服务提供方
|
|
|
- String rtcServiceProvider = Optional.ofNullable(courseSchedule.getServiceProvider()).orElse("rongCloud");
|
|
|
-
|
|
|
- RTCRoomPluginService pluginService = rtcRoomPluginContext.getPluginService(rtcServiceProvider);
|
|
|
- if (rtcServiceProvider.equals(TencentCloudRTCPlugin.PLUGIN_NAME)) {
|
|
|
- // 腾讯云RTC服务
|
|
|
- RTCRoomMessage.MessageContent.MessageContentBuilder action = RTCRoomMessage.MessageContent.builder()
|
|
|
- .action(EMemberAction.JOIN.getValue());
|
|
|
-
|
|
|
- if (userRole == RoleEnum.RoleTeacher) {
|
|
|
- action.role(userRole.getValue());
|
|
|
- } else {
|
|
|
- action.role(userRole.getValue());
|
|
|
- }
|
|
|
- action.handUpOn(roomMember.isHandFlag())
|
|
|
- .microphone(roomMember.isMicFlag())
|
|
|
- .timestamp(now.getTime())
|
|
|
- .camera(true)
|
|
|
- .sendUserInfo(getSendUser(sysUserService.findUserById(userId),userRole));
|
|
|
-
|
|
|
- // 开启全员静音,重置学员状态
|
|
|
- if (courseSchedule.getMuteAll()) {
|
|
|
- action.microphone(false);
|
|
|
- }
|
|
|
-
|
|
|
- RTCRoomMessage roomMessage = RTCRoomMessage.builder()
|
|
|
- .objectName(RTCRoomMessage.MEMBER_CHANGE_MESSAGE)
|
|
|
- .fromUserId(userId.toString())
|
|
|
- .content(action.build())
|
|
|
- .toChatRoomId(roomId)
|
|
|
- .isPersisted(1)
|
|
|
- .isIncludeSender(1)
|
|
|
- .build();
|
|
|
-
|
|
|
- pluginService.sendChatRoomMessage(roomMessage);
|
|
|
- } else {
|
|
|
- publishMemberChangedMessage(roomMember);
|
|
|
- }
|
|
|
+ imService.publishMemberChangedMessage(roomMember,courseSchedule.getServiceProvider());
|
|
|
//sendDisplay
|
|
|
- this.sendDisplay(imUserId, room);
|
|
|
+ imService.sendDisplay(imUserId, room,courseSchedule.getServiceProvider());
|
|
|
}
|
|
|
|
|
|
private RTCRoomMessage.MessageUser getSendUser(SysUser sysUser,RoleEnum role) {
|
|
@@ -277,17 +229,6 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
|
|
|
return build;
|
|
|
}
|
|
|
|
|
|
- //发送人员变动消息
|
|
|
- private void publishMemberChangedMessage(ImNetworkRoomMember roomMember) throws Exception {
|
|
|
- ImNetworkRoomMemberChangedMessage msg = new ImNetworkRoomMemberChangedMessage(roomMember,ImNetworkRoomMemberChangedEnum.JOIN);
|
|
|
- //获取节拍器信息
|
|
|
- ImNetworkCustomMessage imNetworkCustomMessage = courseScheduleStudentPaymentService.getMemberMidi(Long.parseLong(roomMember.getRoomId()), roomMember.getUserId());
|
|
|
- msg.setMetronomeSwitch(imNetworkCustomMessage.getEnable());
|
|
|
- //获取伴奏信息
|
|
|
- ImNetworkRoomMusicSheetDownloadData musicSheetDownloadData = courseScheduleStudentPaymentService.getMemberExamSong(Long.parseLong(roomMember.getRoomId()), roomMember.getUserId());
|
|
|
- msg.setExamSongSwitch(musicSheetDownloadData.getEnable());
|
|
|
- imHelper.publishMessage(roomMember.getImUserId(), roomMember.getRoomId(), msg);
|
|
|
- }
|
|
|
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
@@ -310,17 +251,12 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
public void quitRoomSuccess(String roomId, String imUserId) throws Exception {
|
|
|
-
|
|
|
// 用户ID
|
|
|
Long userId = Long.parseLong(imGroupService.analysisImUserId(imUserId));
|
|
|
-
|
|
|
// 客户端类型
|
|
|
ClientEnum clientType = ClientEnum.valueOf(imGroupService.analysisImUserClient(imUserId));
|
|
|
-
|
|
|
-
|
|
|
// 客户端类型
|
|
|
UserRoleEnum userRole = UserRoleEnum.convert(clientType);
|
|
|
-
|
|
|
log.info("quitRoomSuccess: roomId={}, userId={}", roomId, userId);
|
|
|
//防止幂等
|
|
|
StringBuffer sb = new StringBuffer(QUIT_ROOM_SUCCESS).append(roomId).append(userId);
|
|
@@ -333,115 +269,44 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
|
|
|
if(Objects.isNull(roomMember)){
|
|
|
return;
|
|
|
}
|
|
|
- // 设置IM用户ID
|
|
|
- roomMember.setImUserId(imUserId);
|
|
|
|
|
|
CourseSchedule courseSchedule = Optional.ofNullable(courseScheduleService.getById(roomId))
|
|
|
.orElseThrow(()->new BizException("房间信息不存在"));
|
|
|
Long courseScheduleId = courseSchedule.getId();
|
|
|
- UserRoleEnum roleEnum = UserRoleEnum.STUDENT;
|
|
|
+ RoleEnum roleEnum = RoleEnum.RoleStudent;
|
|
|
if(Objects.equals(courseSchedule.getTeacherId(),userId)
|
|
|
&& ClientEnum.TEACHER == clientType){
|
|
|
-
|
|
|
- roleEnum = UserRoleEnum.TEACHER;
|
|
|
+ roleEnum = RoleEnum.RoleTeacher;
|
|
|
teacherAttendanceService.signOut(userId,courseSchedule);
|
|
|
}else {
|
|
|
//记录考勤签退
|
|
|
studentAttendanceService.signOut(userId,courseSchedule);
|
|
|
}
|
|
|
- ImNetworkRoom room = baseMapper.findByRoomId(roomId);
|
|
|
- if (roleEnum == UserRoleEnum.TEACHER){
|
|
|
- //如果老师退出房间,关闭伴奏
|
|
|
- courseScheduleStudentMusicSheetService.getDao().closePlayStatus(courseScheduleId,null);
|
|
|
- courseScheduleStudentPaymentService.getDao().adjustPlayMidi(courseScheduleId, null, null);
|
|
|
- courseScheduleStudentPaymentService.getDao().adjustExamSong(courseScheduleId, null, null);
|
|
|
- if (isUserDisplay(room.getDisplay(), userId)) {
|
|
|
- room.setDisplay("");
|
|
|
- this.updateDisplay(imUserId,room);
|
|
|
- }
|
|
|
- //老师退出房间,初始化节拍器和伴奏播放配置
|
|
|
- courseScheduleStudentPaymentService.adjustPlayMidiAndMusicSheet(courseSchedule.getId(), null, null,"");
|
|
|
- }
|
|
|
- int memberNum = imNetworkRoomMemberService.getDao().countByRoomId(roomId);
|
|
|
- if (memberNum <= 1) {
|
|
|
- imHelper.dismiss(imUserId, roomId);
|
|
|
- courseScheduleStudentMusicSheetService.getDao().closePlayStatus(courseSchedule.getId(),null);
|
|
|
- log.info("leaveRoomSuccess dismiss the room: {},userId: {}", roomId, userId);
|
|
|
- } else {
|
|
|
- ImNetworkRoomMemberChangedMessage msg = new ImNetworkRoomMemberChangedMessage(roomMember,ImNetworkRoomMemberChangedEnum.LEAVE);
|
|
|
- imHelper.publishMessage(imUserId, roomId, msg);
|
|
|
- imHelper.quit(new String[]{imUserId}, roomId);
|
|
|
- log.info("leaveRoomSuccess quit group: roomId={},userId: {}", roomId, userId);
|
|
|
- }
|
|
|
- //删房间用户信息
|
|
|
- imNetworkRoomMemberService.getDao().deleteById(roomMember.getId());
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- private String getImUserId(Long userId,ClientEnum clientEnum){
|
|
|
- String imUserId = String.valueOf(userId);
|
|
|
- if (ClientEnum.STUDENT == clientEnum) {
|
|
|
- imUserId = imGroupService.getImUserId( imUserId, ClientEnum.STUDENT.name());
|
|
|
- }
|
|
|
- return imUserId;
|
|
|
- }
|
|
|
|
|
|
- private String getImUserId(Long userId,RoleEnum clientEnum){
|
|
|
- String imUserId = String.valueOf(userId);
|
|
|
- if (RoleEnum.RoleStudent == clientEnum) {
|
|
|
- imUserId = imGroupService.getImUserId(imUserId, ClientEnum.STUDENT.name());
|
|
|
+ if (roleEnum == RoleEnum.RoleTeacher || imNetworkRoomMemberService.getDao().countByRoomId(roomId) <= 1){
|
|
|
+ //如果老师退出房间,初始化节拍器和伴奏播放配置
|
|
|
+ courseScheduleStudentMusicSheetService.getDao().closePlayStatus(courseScheduleId,null);
|
|
|
}
|
|
|
- return imUserId;
|
|
|
+ //退出房间
|
|
|
+ roomService.quitRoomSuccess(roleEnum,roomMember,courseSchedule.getServiceProvider());
|
|
|
}
|
|
|
|
|
|
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
public void sendImPlayMidiMessage(ImNetworkCustomMessage customMessage) throws Exception {
|
|
|
- SysUser user = sysUserService.getUser();
|
|
|
- Long userId = user.getId();
|
|
|
- Long roomId = customMessage.getRoomId();
|
|
|
- log.info("sendImPlayMidiMessage: roomId={}, userId={}", roomId, userId);
|
|
|
- ImNetworkMetronomeMessage displayMessage = new ImNetworkMetronomeMessage(customMessage);
|
|
|
-
|
|
|
- String imUserId = imGroupService.getImUserId(userId,customMessage.getClientType());
|
|
|
- ImNetworkRoomMember roomMember = imNetworkRoomMemberService.lambdaQuery().eq(ImNetworkRoomMember::getUserId, userId)
|
|
|
- .eq(ImNetworkRoomMember::getRoomId, roomId).last("LIMIT 1").one();
|
|
|
- // 获取RTC服务提供方
|
|
|
- CourseSchedule courseSchedule = courseScheduleService.getById(roomId);
|
|
|
- RTCRoomPluginService pluginService = rtcRoomPluginContext.getPluginService(courseSchedule.getServiceProvider());
|
|
|
- if (TencentCloudRTCPlugin.PLUGIN_NAME.equals(pluginService.pluginName())) {
|
|
|
-
|
|
|
- // 腾讯云RTC服务
|
|
|
- RTCRoomMessage.MessageContent messageContent = RTCRoomMessage.MessageContent
|
|
|
- .builder()
|
|
|
- .enable(customMessage.getEnable())
|
|
|
- .rate(customMessage.getRate())
|
|
|
- .customType(customMessage.getCustomType())
|
|
|
- .userId(customMessage.getUserId())
|
|
|
- .playVolume(customMessage.getPlayVolume())
|
|
|
- .sendUserInfo(getSendUser(user, RoleEnum.getEnumByValue(roomMember.getRole())))
|
|
|
- .build();
|
|
|
-
|
|
|
- RTCRoomMessage roomMessage = RTCRoomMessage.builder()
|
|
|
- .objectName(RTCRoomMessage.PLAY_MIDI_MESSAGE)
|
|
|
- .content(messageContent)
|
|
|
- .toChatRoomId(roomMember.getRoomId())
|
|
|
- .fromUserId(imUserId)
|
|
|
- .isIncludeSender(1)
|
|
|
- .isPersisted(1)
|
|
|
- .build();
|
|
|
-
|
|
|
- pluginService.sendChatRoomMessage(roomMessage);
|
|
|
- } else {
|
|
|
- imHelper.publishMessage(imUserId, roomId.toString(), displayMessage, 1);
|
|
|
- }
|
|
|
-
|
|
|
+ customMessage.setCurrentUserId(sysUserService.getUserId());
|
|
|
+ CourseSchedule courseSchedule = courseScheduleService.getById(customMessage.getRoomId());
|
|
|
+ customMessage.setServiceProvider(courseSchedule.getServiceProvider());
|
|
|
+ //发送节拍器消息
|
|
|
+ imService.sendImPlayMidiMessage(customMessage);
|
|
|
//记录节拍器信息
|
|
|
String collect = Arrays.stream(customMessage.getUserId().split(","))
|
|
|
.map(x -> x.split(":")[0]).collect(Collectors.joining(","));
|
|
|
-
|
|
|
- courseScheduleStudentPaymentService.getDao().adjustPlayMidi(roomId, collect, customMessage.toString());
|
|
|
+ imNetworkRoomMemberStatusService.lambdaUpdate()
|
|
|
+ .eq(ImNetworkRoomMemberStatus::getRoomId,customMessage.getRoomId())
|
|
|
+ .in(ImNetworkRoomMemberStatus::getUserId,collect)
|
|
|
+ .set(ImNetworkRoomMemberStatus::getPlayMidi,customMessage.toString());
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -523,35 +388,10 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
|
|
|
public void display(ImNetworkDisplayDataDto displayData) throws Exception {
|
|
|
log.info("display in data = {}", displayData);
|
|
|
Long userId = sysUserService.getUserId();
|
|
|
-
|
|
|
- StringBuffer display = new StringBuffer("display://type=").append(displayData.getType().ordinal()).append("?userId=");
|
|
|
- switch (displayData.getType()) {
|
|
|
- case NONE:
|
|
|
- //清空当前 room 的 display
|
|
|
- display = new StringBuffer();
|
|
|
- break;
|
|
|
- case TEACHER:
|
|
|
- Long teacherId = Optional.ofNullable(courseScheduleService.getById(displayData.getRoomId())).
|
|
|
- map(CourseSchedule::getTeacherId).
|
|
|
- orElseThrow(()->new BizException("房间信息不存在"));
|
|
|
- display.append(teacherId).append("?uri=");
|
|
|
- break;
|
|
|
- case SCREEN:
|
|
|
- display.append(userId).append("?uri=");
|
|
|
- break;
|
|
|
- case STUDENT:
|
|
|
- display.append(displayData.getUserId()).append("?uri=").append(displayData.getUri());
|
|
|
- break;
|
|
|
- default:
|
|
|
- display.append(userId).append("?uri=").append(displayData.getUri());
|
|
|
- break;
|
|
|
- }
|
|
|
- ImNetworkRoom room = baseMapper.findByRoomId(displayData.getRoomId());
|
|
|
- room.setDisplay(display.toString());
|
|
|
-
|
|
|
- String imUserId = imGroupService.getImUserId(userId,displayData.getClientType());
|
|
|
-
|
|
|
- this.updateDisplay(imUserId,room);
|
|
|
+ CourseSchedule courseSchedule = courseScheduleService.getById(displayData.getRoomId());
|
|
|
+ displayData.setUserId(userId);
|
|
|
+ displayData.setTeacherId(courseSchedule.getTeacherId());
|
|
|
+ roomService.display(displayData,courseSchedule.getServiceProvider());
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -644,7 +484,7 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
|
|
|
deviceResourceMessage.setUserId(imUserId);
|
|
|
switch (deviceControl.getDeviceType()) {
|
|
|
case EXAM_SONG:
|
|
|
- ImNetworkRoomMusicSheetDownloadData msg = courseScheduleStudentPaymentService.getMemberExamSong(scheduleId, userId);
|
|
|
+ ImNetworkRoomMusicSheetDownloadData msg = imNetworkRoomMemberStatusService.getMemberExamSong(roomId, userId);
|
|
|
msg.setEnable(enable);
|
|
|
courseScheduleStudentPaymentService.getDao().adjustExamSong(scheduleId,userId, JSON.toJSONString(msg));
|
|
|
|
|
@@ -727,7 +567,7 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
|
|
|
roomMember.setMusicModeFlag(deviceControl.getEnable());
|
|
|
break;
|
|
|
case EXAM_SONG:
|
|
|
- ImNetworkRoomMusicSheetDownloadData msg = courseScheduleStudentPaymentService.getMemberExamSong(scheduleId, userId);
|
|
|
+ ImNetworkRoomMusicSheetDownloadData msg = imNetworkRoomMemberStatusService.getMemberExamSong(roomId, userId);
|
|
|
msg.setEnable(deviceControl.getEnable());
|
|
|
courseScheduleStudentPaymentService.getDao().adjustExamSong(scheduleId,userId, JSON.toJSONString(msg));
|
|
|
break;
|
|
@@ -779,7 +619,7 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
|
|
|
break;
|
|
|
case EXAM_SONG:
|
|
|
long scheduleId = Long.parseLong(deviceControl.getRoomId());
|
|
|
- ImNetworkRoomMusicSheetDownloadData msg = courseScheduleStudentPaymentService.getMemberExamSong(scheduleId, sysUser.getId());
|
|
|
+ ImNetworkRoomMusicSheetDownloadData msg = imNetworkRoomMemberStatusService.getMemberExamSong(roomMember.getRoomId(), sysUser.getId());
|
|
|
msg.setEnable(deviceControl.getEnable());
|
|
|
courseScheduleStudentPaymentService.getDao().adjustExamSong(scheduleId, sysUser.getId(), JSON.toJSONString(msg));
|
|
|
break;
|
|
@@ -879,7 +719,7 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
|
|
|
break;
|
|
|
case EXAM_SONG:
|
|
|
long scheduleId = Long.parseLong(deviceStatusSync.getRoomId());
|
|
|
- ImNetworkRoomMusicSheetDownloadData msg = courseScheduleStudentPaymentService.getMemberExamSong(scheduleId, userId);
|
|
|
+ ImNetworkRoomMusicSheetDownloadData msg = imNetworkRoomMemberStatusService.getMemberExamSong(deviceStatusSync.getRoomId(), userId);
|
|
|
msg.setEnable(deviceStatusSync.getEnable());
|
|
|
courseScheduleStudentPaymentService.getDao().adjustExamSong(scheduleId, userId, JSON.toJSONString(msg));
|
|
|
break;
|
|
@@ -1021,75 +861,12 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
|
|
|
return courseSchedule.getStartTime().compareTo(addMinutes) > 0;
|
|
|
}
|
|
|
|
|
|
- public ImNetworkRoom initRoom(String roomId,Long courseId,RoleEnum userRole,Long userId,Date now) throws Exception {
|
|
|
- ImNetworkRoom room = baseMapper.findByRoomId(roomId);
|
|
|
- String display = "";
|
|
|
- if (userRole == RoleEnum.RoleTeacher) {
|
|
|
- display = "display://type=0?userId=" + userId + "?uri=";
|
|
|
- }
|
|
|
- if(Objects.isNull(room)){
|
|
|
- room = new ImNetworkRoom();
|
|
|
- //创建房间
|
|
|
- room.setCourseScheduleId(courseId);
|
|
|
- room.setRoomId(roomId);
|
|
|
- room.setCreateTime(now);
|
|
|
- room.setUpdateTime(now);
|
|
|
- room.setDisplay(display);
|
|
|
- baseMapper.insert(room);
|
|
|
- IMApiResultInfo resultInfo = imHelper.createGroup(new String[]{userId.toString()}, roomId, roomId);
|
|
|
- if(resultInfo.getCode() != 200){
|
|
|
- log.error("创建群聊失败 resultInfo:{}",resultInfo);
|
|
|
- }
|
|
|
- }else {
|
|
|
- if(userRole == RoleEnum.RoleTeacher){
|
|
|
- room.setDisplay(display);
|
|
|
- baseMapper.updateById(room);
|
|
|
- }
|
|
|
- }
|
|
|
- return room;
|
|
|
- }
|
|
|
|
|
|
//修改节拍器
|
|
|
- public void updateDisplay(String imUserId,ImNetworkRoom room) throws Exception {
|
|
|
- baseMapper.updateById(room);
|
|
|
- // IM发送用户消息
|
|
|
- ImNetworkRoomMember roomMember = imNetworkRoomMemberService.lambdaQuery().eq(ImNetworkRoomMember::getUserId, imUserId)
|
|
|
- .eq(ImNetworkRoomMember::getRoomId, room.getRoomId()).last("LIMIT 1").one();
|
|
|
- CourseSchedule courseSchedule = courseScheduleService.getById(room.getRoomId());
|
|
|
- if (TencentCloudRTCPlugin.PLUGIN_NAME.equals(courseSchedule.getServiceProvider())) {
|
|
|
- sendDisplayMessage(room.getDisplay(), roomMember);
|
|
|
- } else {
|
|
|
- this.sendDisplay(imUserId,room);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- private void sendDisplayMessage(String display, ImNetworkRoomMember roomMember) throws Exception {
|
|
|
- // 获取RTC服务提供方
|
|
|
- RTCRoomPluginService pluginService = rtcRoomPluginContext.getPluginService(TencentCloudRTCPlugin.PLUGIN_NAME);
|
|
|
- // 腾讯云RTC服务
|
|
|
- RTCRoomMessage.MessageUser sendUser = getSendUser(sysUserService.findUserById(roomMember.getUserId()), RoleEnum.getEnumByValue(roomMember.getRole()));
|
|
|
- RTCRoomMessage.MessageContent.MessageContentBuilder action = RTCRoomMessage.MessageContent.builder()
|
|
|
- .display(display)
|
|
|
- .sendUserInfo(sendUser);
|
|
|
-
|
|
|
-
|
|
|
- RTCRoomMessage roomMessage = RTCRoomMessage.builder()
|
|
|
- .objectName(RTCRoomMessage.DISPLAY_MESSAGE)
|
|
|
- .content(action.build())
|
|
|
- .toChatRoomId(roomMember.getRoomId())
|
|
|
- .fromUserId(sendUser.getSendUserId())
|
|
|
- .isIncludeSender(1)
|
|
|
- .isPersisted(1)
|
|
|
- .build();
|
|
|
-
|
|
|
- pluginService.sendChatRoomMessage(roomMessage);
|
|
|
- }
|
|
|
-
|
|
|
- public void sendDisplay(String imUserId,ImNetworkRoom room) throws Exception {
|
|
|
- //发送display改动通知
|
|
|
- ImNetworkDisplayMessage displayMessage = new ImNetworkDisplayMessage(room.getDisplay());
|
|
|
-
|
|
|
- imHelper.publishMessage(imUserId, room.getRoomId(), displayMessage, 0);
|
|
|
+ public void updateDisplay(String imUserId,ImNetworkRoom room,String serviceProvider) throws Exception {
|
|
|
+ roomService.updateById(room);
|
|
|
+ //节拍器修改消息发送
|
|
|
+ imService.sendDisplay(imUserId,room,serviceProvider);
|
|
|
}
|
|
|
|
|
|
public boolean isUserDisplay(String display, Long userId) {
|
|
@@ -1101,72 +878,4 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
|
|
|
}
|
|
|
return result;
|
|
|
}
|
|
|
-
|
|
|
- private void joinImGroup(String roomId, Integer actualTeacherId, CourseSchedule courseSchedule) throws Exception {
|
|
|
-
|
|
|
- String joinImGroupKey = "joinImGroup:" + roomId;
|
|
|
- // VIP课或网络课,IM群聊已创建标识
|
|
|
- Boolean exists = redisTemplate.opsForValue().setIfAbsent(joinImGroupKey, roomId, 1L, TimeUnit.DAYS);
|
|
|
-
|
|
|
- RTCRoomPluginService pluginService = rtcRoomPluginContext.getPluginService(courseSchedule.getServiceProvider());
|
|
|
- if (Optional.ofNullable(exists).orElse(false)) {
|
|
|
-
|
|
|
- try {
|
|
|
- // 创建群组
|
|
|
- log.info("createImGroup: roomId = {}, userId = {}", roomId, actualTeacherId);
|
|
|
- if (TencentCloudRTCPlugin.PLUGIN_NAME.equals(pluginService.pluginName())) {
|
|
|
-
|
|
|
- // 群组帐号注册
|
|
|
- TeacherVo teacherVo = teacherDao.detail(courseSchedule.getTeacherId());
|
|
|
- if (Objects.nonNull(teacherVo)) {
|
|
|
- try {
|
|
|
- pluginService.register(courseSchedule.getTeacherId().toString(), teacherVo.getRealName(), teacherVo.getAvatar());
|
|
|
- } catch (Exception e) {
|
|
|
- log.error("直播房间群主注册失败: userId={}", courseSchedule.getTeacherId(), e);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // 生成群组
|
|
|
- pluginService.chatRoomCreate(roomId, roomId, courseSchedule.getTeacherId().toString());
|
|
|
-
|
|
|
- // 群组老师信息
|
|
|
- List<ImGroupMemberWrapper.ImGroupMember> groupMembers = Lists.newArrayList(ImGroupMemberWrapper.ImGroupMember
|
|
|
- .builder()
|
|
|
- .userId(Long.valueOf(actualTeacherId))
|
|
|
- .imUserIdFormat(false)
|
|
|
- .build());
|
|
|
-
|
|
|
- List<CourseScheduleStudentPayment> payments = courseScheduleStudentPaymentService.getByCourseId(Long.parseLong(roomId.substring(1)));
|
|
|
- // 群组学生信息
|
|
|
- if (org.apache.commons.collections.CollectionUtils.isNotEmpty(payments)) {
|
|
|
- for (CourseScheduleStudentPayment item : payments) {
|
|
|
- groupMembers.add(ImGroupMemberWrapper.ImGroupMember
|
|
|
- .builder()
|
|
|
- .userId(Long.valueOf(item.getUserId()))
|
|
|
- .imUserIdFormat(false)
|
|
|
- .build());
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // 加入群组成员
|
|
|
- log.info("joinImGroup: roomId = {}, serviceProvider={}, userIds = {}", roomId, courseSchedule.getServiceProvider(), groupMembers);
|
|
|
- pluginService.chatRoomGroupJoin(roomId, roomId, groupMembers);
|
|
|
- } else {
|
|
|
-
|
|
|
- List<CourseScheduleStudentPayment> payments = courseScheduleStudentPaymentService.getByCourseId(Long.parseLong(roomId.substring(1)));
|
|
|
- List<String> collect = payments.stream().map(e -> e.getUserId().toString()).collect(Collectors.toList());
|
|
|
- collect.add(actualTeacherId.toString());
|
|
|
- String[] integers = collect.toArray(new String[]{});
|
|
|
- imHelper.joinGroup(integers, roomId, roomId);
|
|
|
- }
|
|
|
-
|
|
|
- } catch (Exception e) {
|
|
|
-
|
|
|
- redisTemplate.delete(joinImGroupKey);
|
|
|
- // 异常抛出,删除缓存标识
|
|
|
- throw e;
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- }
|
|
|
}
|