|
@@ -6,7 +6,6 @@ import com.alibaba.fastjson.serializer.SerializerFeature;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
import com.google.common.collect.Lists;
|
|
|
import com.microsvc.toolkit.middleware.rtc.RTCRoomPluginService;
|
|
|
-import com.microsvc.toolkit.middleware.rtc.impl.TencentCloudRTCPlugin;
|
|
|
import com.microsvc.toolkit.middleware.rtc.message.TencentRequest;
|
|
|
import com.yonge.cooleshow.auth.api.entity.SysUser;
|
|
|
import com.yonge.cooleshow.biz.dal.dao.ImNetworkRoomDao;
|
|
@@ -31,6 +30,7 @@ import org.springframework.beans.BeanUtils;
|
|
|
import org.springframework.data.redis.core.RedisTemplate;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
+import org.springframework.transaction.support.TransactionTemplate;
|
|
|
import org.springframework.util.CollectionUtils;
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
@@ -83,6 +83,8 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
|
|
|
private ImNetworkRoomMemberStatusService imNetworkRoomMemberStatusService;
|
|
|
@Resource
|
|
|
private ImService imService;
|
|
|
+ @Resource
|
|
|
+ private TransactionTemplate transactionTemplate;
|
|
|
|
|
|
@Override
|
|
|
public ImNetworkRoomDao getDao() {
|
|
@@ -90,17 +92,12 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- @Transactional(rollbackFor = Exception.class)
|
|
|
- public BaseResponse<ImNetworkRoomResult> joinRoom(String roomId, ClientEnum clientType) throws Exception {
|
|
|
+ public BaseResponse<ImNetworkRoomResult> joinRoom(String roomId, RoleEnum userRole) {
|
|
|
// 当前登录用户ID
|
|
|
Long userId = sysUserService.getUserId();
|
|
|
CourseSchedule courseSchedule = Optional.ofNullable(courseScheduleService.getById(roomId)).
|
|
|
orElseThrow(()->new BizException("房间信息不存在"));
|
|
|
|
|
|
- RoleEnum userRole = RoleEnum.RoleStudent;
|
|
|
- if(clientType == ClientEnum.TEACHER){
|
|
|
- userRole = RoleEnum.RoleTeacher;
|
|
|
- }
|
|
|
log.info("joinRoom params:roomId:{},userRole:{},userId:{}",roomId,userRole,userId);
|
|
|
BasicUserInfo sysUser = Optional.ofNullable(teacherDao.getBasicUserInfo(userId)).
|
|
|
orElseThrow(()-> new BizException("用户信息不存在"));
|
|
@@ -110,62 +107,77 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
|
|
|
if (roomNotStart(courseSchedule)) {
|
|
|
return BaseResponse.failed(ErrorEnum.ROOM_NOT_START);
|
|
|
}
|
|
|
+ //获取老师基本信息
|
|
|
+ BasicUserInfo basicUserInfo = teacherDao.getBasicUserInfo(courseSchedule.getTeacherId());
|
|
|
+ //XX分钟关闭房间
|
|
|
+ String configValue = sysConfigDao.findConfigValue(SysConfigConstant.DESTROY_EXPIRED_PRACTICE_ROOM_MINUTE);
|
|
|
+
|
|
|
ImNetworkRoomResult joinRoomResult = new ImNetworkRoomResult();
|
|
|
- //初始化房间信息
|
|
|
String imUserId = imGroupService.getImUserId(sysUser.getUserId(), userRole);
|
|
|
- ImNetworkRoom room = roomService.initRoom(roomId,userRole,imUserId);
|
|
|
- BeanUtils.copyProperties(room,joinRoomResult);
|
|
|
- //定时销毁房间
|
|
|
- //初始化房间用户信息
|
|
|
- ImNetworkRoomMember roomMember = imNetworkRoomMemberService.initRoomMember(roomId,sysUser,userRole,!courseSchedule.getMuteAll());
|
|
|
List<CourseScheduleStudentMusicSheetResult> studentMusicSheetResults =
|
|
|
- courseScheduleStudentMusicSheetService.getDao().queryBySheetIdAndCourseId(null, Long.parseLong(roomId), null, null, null);
|
|
|
- if(!CollectionUtils.isEmpty(studentMusicSheetResults)){
|
|
|
- List<CourseScheduleStudentMusicSheetResult> musicScores = studentMusicSheetResults.stream().
|
|
|
- filter(e -> e.getUserId().equals(userId)).collect(Collectors.toList());
|
|
|
- String toJSONString = JSON.toJSONString(musicScores, SerializerFeature.DisableCircularReferenceDetect);
|
|
|
- List<CourseScheduleStudentMusicSheetResult> lists = JSON.parseArray(toJSONString, CourseScheduleStudentMusicSheetResult.class);
|
|
|
- roomMember.setScheduleStudentMusicScores(lists);
|
|
|
- }
|
|
|
- ImNetworkRoomMemberResult memberResult = JSONObject.parseObject(JSONObject.toJSONString(roomMember), ImNetworkRoomMemberResult.class);
|
|
|
- memberResult.setJoinTime(roomMember.getJoinTime().getTime());
|
|
|
- memberResult.setCamera(roomMember.isCameraFlag());
|
|
|
- memberResult.setMicrophone(roomMember.isMicFlag());
|
|
|
- memberResult.setMusicModeOn(roomMember.isMusicModeFlag());
|
|
|
- memberResult.setHandUpOn(roomMember.isHandFlag());
|
|
|
- joinRoomResult.setUserInfo(memberResult);
|
|
|
- //获取教室剩余时长
|
|
|
- joinRoomResult.setSurplusTime(DateUtil.secondsBetween(now, courseSchedule.getEndTime()));
|
|
|
- //获取房间所有成员
|
|
|
- List<ImNetworkRoomMemberResult> members = imNetworkRoomMemberService.getDao().queryByRoomId(roomId);
|
|
|
- //如果是老师,
|
|
|
- if(userRole == RoleEnum.RoleTeacher){
|
|
|
- //重置节拍器数据
|
|
|
- imNetworkRoomMemberStatusService.lambdaUpdate().set(ImNetworkRoomMemberStatus::getPlayMidi,null)
|
|
|
- .eq(ImNetworkRoomMemberStatus::getRoomId,roomId).update();
|
|
|
- //获取所有学员的伴奏下载详情
|
|
|
- setMusicSheetList(members,Long.parseLong(roomId));
|
|
|
- }else {
|
|
|
- //获取节拍器信息
|
|
|
- joinRoomResult.setPlayMidiJson(imNetworkRoomMemberStatusService.getMemberMidi(roomMember));
|
|
|
- }
|
|
|
- joinRoomResult.setMembers(members);
|
|
|
- //课程结束后关闭教室的时间
|
|
|
- joinRoomResult.setAutoCloseNetworkRoomTime(sysConfigDao.findConfigValue(SysConfigConstant.DESTROY_EXPIRED_PRACTICE_ROOM_MINUTE));
|
|
|
-
|
|
|
- // 创建IM群聊
|
|
|
- //获取老师基本信息
|
|
|
- BasicUserInfo basicUserInfo = teacherDao.getBasicUserInfo(courseSchedule.getTeacherId());
|
|
|
+ courseScheduleStudentMusicSheetService.getDao().queryBySheetIdAndCourseId(null,
|
|
|
+ Long.parseLong(roomId), null, null, null);
|
|
|
//获取学员列表
|
|
|
List<CourseScheduleStudentPayment> studentPayments =
|
|
|
courseScheduleStudentPaymentService.lambdaQuery().eq(CourseScheduleStudentPayment::getCourseId,roomId).list();
|
|
|
List<Long> studentIds = studentPayments.stream().map(CourseScheduleStudentPayment::getUserId).collect(Collectors.toList());
|
|
|
- //创建并加入群组
|
|
|
- basicUserInfo.setImUserId(imGroupService.getImUserId(basicUserInfo.getUserId(),RoleEnum.RoleTeacher));
|
|
|
- imGroupService.joinImGroup(roomId, basicUserInfo,
|
|
|
- courseSchedule.getServiceProvider(), studentIds);
|
|
|
- //获取腾讯所需基本信息配置
|
|
|
- joinRoomResult.setRtcRoomConfig(roomService.getRtcRoomConfig(courseSchedule.getServiceProvider(),roomMember));
|
|
|
+ //事务处理
|
|
|
+ this.transaction(() -> {
|
|
|
+ //初始化房间信息
|
|
|
+ ImNetworkRoom room = null;
|
|
|
+ try {
|
|
|
+ room = roomService.initRoom(roomId,userRole,imUserId);
|
|
|
+ } catch (Exception e) {
|
|
|
+ throw new RuntimeException(e);
|
|
|
+ }
|
|
|
+ BeanUtils.copyProperties(room,joinRoomResult);
|
|
|
+ //定时销毁房间
|
|
|
+ //初始化房间用户信息
|
|
|
+ ImNetworkRoomMember roomMember = imNetworkRoomMemberService.initRoomMember(roomId,sysUser,userRole,!courseSchedule.getMuteAll());
|
|
|
+ if(!CollectionUtils.isEmpty(studentMusicSheetResults)){
|
|
|
+ List<CourseScheduleStudentMusicSheetResult> musicScores = studentMusicSheetResults.stream().
|
|
|
+ filter(e -> e.getUserId().equals(userId)).collect(Collectors.toList());
|
|
|
+ String toJSONString = JSON.toJSONString(musicScores, SerializerFeature.DisableCircularReferenceDetect);
|
|
|
+ roomMember.setScheduleStudentMusicScores(JSON.parseArray(toJSONString, CourseScheduleStudentMusicSheetResult.class));
|
|
|
+ }
|
|
|
+ ImNetworkRoomMemberResult memberResult = JSONObject.parseObject(JSONObject.toJSONString(roomMember), ImNetworkRoomMemberResult.class);
|
|
|
+ memberResult.setJoinTime(roomMember.getJoinTime().getTime());
|
|
|
+ memberResult.setCamera(roomMember.isCameraFlag());
|
|
|
+ memberResult.setMicrophone(roomMember.isMicFlag());
|
|
|
+ memberResult.setMusicModeOn(roomMember.isMusicModeFlag());
|
|
|
+ memberResult.setHandUpOn(roomMember.isHandFlag());
|
|
|
+ joinRoomResult.setUserInfo(memberResult);
|
|
|
+ //获取教室剩余时长
|
|
|
+ joinRoomResult.setSurplusTime(DateUtil.secondsBetween(now, courseSchedule.getEndTime()));
|
|
|
+ //获取房间所有成员
|
|
|
+ List<ImNetworkRoomMemberResult> members = imNetworkRoomMemberService.getDao().queryByRoomId(roomId);
|
|
|
+ //如果是老师,
|
|
|
+ if(userRole == RoleEnum.RoleTeacher){
|
|
|
+ //重置节拍器数据
|
|
|
+ imNetworkRoomMemberStatusService.lambdaUpdate().set(ImNetworkRoomMemberStatus::getPlayMidi,null)
|
|
|
+ .eq(ImNetworkRoomMemberStatus::getRoomId,roomId).update();
|
|
|
+ //获取所有学员的伴奏下载详情
|
|
|
+ setMusicSheetList(members,Long.parseLong(roomId));
|
|
|
+ }else {
|
|
|
+ //获取节拍器信息
|
|
|
+ joinRoomResult.setPlayMidiJson(imNetworkRoomMemberStatusService.getMemberMidi(roomMember));
|
|
|
+ }
|
|
|
+ joinRoomResult.setMembers(members);
|
|
|
+ //课程结束后关闭教室的时间
|
|
|
+ joinRoomResult.setAutoCloseNetworkRoomTime(configValue);
|
|
|
+ // 创建IM群聊
|
|
|
+ //创建并加入群组
|
|
|
+ basicUserInfo.setImUserId(imGroupService.getImUserId(basicUserInfo.getUserId(),RoleEnum.RoleTeacher));
|
|
|
+ try {
|
|
|
+ imGroupService.joinImGroup(roomId, basicUserInfo,
|
|
|
+ courseSchedule.getServiceProvider(), studentIds);
|
|
|
+ } catch (Exception e) {
|
|
|
+ throw new RuntimeException(e);
|
|
|
+ }
|
|
|
+ //获取腾讯所需基本信息配置
|
|
|
+ joinRoomResult.setRtcRoomConfig(roomService.getRtcRoomConfig(courseSchedule.getServiceProvider(),roomMember));
|
|
|
+ });
|
|
|
+
|
|
|
joinRoomResult.setGroupId(roomId);
|
|
|
joinRoomResult.setStudentNums(studentIds.size());
|
|
|
return BaseResponse.success(joinRoomResult);
|
|
@@ -304,15 +316,12 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- @Transactional(rollbackFor = Exception.class)
|
|
|
- public void quitRoomSuccess(String roomId, String imUserId) throws Exception {
|
|
|
+ public void quitRoomSuccess(String roomId, String imUserId) {
|
|
|
// 客户端类型
|
|
|
ClientEnum clientType = ClientEnum.valueOf(imGroupService.analysisImUserClient(imUserId));
|
|
|
// 网络教室用户身份
|
|
|
- RoleEnum userRole = RoleEnum.RoleTeacher;
|
|
|
- if (ClientEnum.STUDENT == clientType) {
|
|
|
- userRole = RoleEnum.RoleStudent;
|
|
|
- }
|
|
|
+ RoleEnum userRole = clientType == ClientEnum.TEACHER ? RoleEnum.RoleTeacher : RoleEnum.RoleStudent;
|
|
|
+
|
|
|
log.info("quitRoomSuccess: roomId={}, imUserId={}", roomId, imUserId);
|
|
|
//防止幂等
|
|
|
String QUIT_ROOM_SUCCESS = "quitRoomSuccess:";
|
|
@@ -321,33 +330,28 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
|
|
|
log.info("quitRoomSuccess break: roomId={}, imUserId={}", roomId, imUserId);
|
|
|
return;
|
|
|
}
|
|
|
- ImNetworkRoomMember roomMember = imNetworkRoomMemberService.lambdaQuery()
|
|
|
- .eq(ImNetworkRoomMember::getUserId, imUserId)
|
|
|
- .eq(ImNetworkRoomMember::getRoomId, roomId)
|
|
|
- .eq(ImNetworkRoomMember::getRole, userRole.getValue())
|
|
|
- .last("LIMIT 1").one();
|
|
|
- if(Objects.isNull(roomMember)){
|
|
|
- return;
|
|
|
- }
|
|
|
|
|
|
CourseSchedule courseSchedule = Optional.ofNullable(courseScheduleService.getById(roomId))
|
|
|
.orElseThrow(()->new BizException("房间信息不存在"));
|
|
|
Long courseScheduleId = courseSchedule.getId();
|
|
|
Long userId = Long.parseLong(imGroupService.analysisImUserId(imUserId));
|
|
|
- if(RoleEnum.RoleTeacher == userRole){
|
|
|
- teacherAttendanceService.signOut(userId,courseSchedule);
|
|
|
- }else {
|
|
|
- //记录考勤签退
|
|
|
- studentAttendanceService.signOut(userId,courseSchedule);
|
|
|
- }
|
|
|
|
|
|
- if (RoleEnum.RoleTeacher == userRole ||
|
|
|
- imNetworkRoomMemberService.lambdaQuery().eq(ImNetworkRoomMember::getRoomId,roomId).count() <= 1){
|
|
|
- //如果老师退出房间,初始化节拍器和伴奏播放配置
|
|
|
- courseScheduleStudentMusicSheetService.getDao().closePlayStatus(courseScheduleId,null);
|
|
|
- }
|
|
|
- //退出房间
|
|
|
- roomService.quitRoomSuccess(userRole,roomMember,courseSchedule.getServiceProvider());
|
|
|
+ this.transaction(()->{
|
|
|
+ if(RoleEnum.RoleTeacher == userRole){
|
|
|
+ teacherAttendanceService.signOut(userId,courseSchedule);
|
|
|
+ //如果老师退出房间,初始化节拍器和伴奏播放配置
|
|
|
+ courseScheduleStudentMusicSheetService.getDao().closePlayStatus(courseScheduleId,null);
|
|
|
+ }else {
|
|
|
+ //记录考勤签退
|
|
|
+ studentAttendanceService.signOut(userId,courseSchedule);
|
|
|
+ }
|
|
|
+ //退出房间
|
|
|
+ try {
|
|
|
+ roomService.quitRoomSuccess(userRole,imUserId,roomId,courseSchedule.getServiceProvider());
|
|
|
+ } catch (Exception e) {
|
|
|
+ throw new RuntimeException(e);
|
|
|
+ }
|
|
|
+ });
|
|
|
}
|
|
|
|
|
|
|
|
@@ -669,4 +673,11 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
|
|
|
Date addMinutes = DateUtil.addMinutes(courseSchedule.getStartTime(), Integer.parseInt(courseBeforeBufferTime));
|
|
|
return courseSchedule.getStartTime().compareTo(addMinutes) > 0;
|
|
|
}
|
|
|
+
|
|
|
+ public void transaction(Runnable runnable) {
|
|
|
+ transactionTemplate.execute(transactionStatus -> {
|
|
|
+ runnable.run();
|
|
|
+ return Boolean.TRUE;
|
|
|
+ });
|
|
|
+ }
|
|
|
}
|